summaryrefslogtreecommitdiff
path: root/src/scope.h
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2012-03-03 01:17:21 -0600
committerJohn Wiegley <johnw@newartisans.com>2012-03-05 05:03:51 -0600
commitc8c2a17e282c2cbf3c0edb1b756e16be58328331 (patch)
treedecf0c8d24db423a5415668727da26a6897800be /src/scope.h
parent35ace8816adb76e80e99afb947d66777b31ba43f (diff)
downloadfork-ledger-c8c2a17e282c2cbf3c0edb1b756e16be58328331.tar.gz
fork-ledger-c8c2a17e282c2cbf3c0edb1b756e16be58328331.tar.bz2
fork-ledger-c8c2a17e282c2cbf3c0edb1b756e16be58328331.zip
Fixed invocation of lambda expressions
foo = x, y, z -> print(x, y, z) foo(1, 2, 3) However, this still does not work: (x, y, z -> print(x, y, z))(1, 2, 3)
Diffstat (limited to 'src/scope.h')
-rw-r--r--src/scope.h24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/scope.h b/src/scope.h
index 90f9c37a..785ce284 100644
--- a/src/scope.h
+++ b/src/scope.h
@@ -227,15 +227,17 @@ private:
};
template <typename T>
-T * search_scope(scope_t * ptr)
+T * search_scope(scope_t * ptr, bool prefer_direct_parents = false)
{
if (T * sought = dynamic_cast<T *>(ptr))
return sought;
if (bind_scope_t * scope = dynamic_cast<bind_scope_t *>(ptr)) {
- if (T * sought = search_scope<T>(&scope->grandchild))
+ if (T * sought = search_scope<T>(prefer_direct_parents ?
+ scope->parent : &scope->grandchild))
return sought;
- return search_scope<T>(scope->parent);
+ return search_scope<T>(prefer_direct_parents ?
+ &scope->grandchild : scope->parent);
}
else if (child_scope_t * child_scope = dynamic_cast<child_scope_t *>(ptr)) {
return search_scope<T>(child_scope->parent);
@@ -244,9 +246,21 @@ T * search_scope(scope_t * ptr)
}
template <typename T>
-inline T& find_scope(child_scope_t& scope, bool skip_this = true)
+inline T& find_scope(child_scope_t& scope, bool skip_this = true,
+ bool prefer_direct_parents = false)
{
- if (T * sought = search_scope<T>(skip_this ? scope.parent : &scope))
+ if (T * sought = search_scope<T>(skip_this ? scope.parent : &scope,
+ prefer_direct_parents))
+ return *sought;
+
+ throw_(std::runtime_error, _("Could not find scope"));
+ return reinterpret_cast<T&>(scope); // never executed
+}
+
+template <typename T>
+inline T& find_scope(scope_t& scope, bool prefer_direct_parents = false)
+{
+ if (T * sought = search_scope<T>(&scope, prefer_direct_parents))
return *sought;
throw_(std::runtime_error, _("Could not find scope"));