Corrected the way that scopes are found so that xact_t can also be found as an
item_t (which it also is).
This commit is contained in:
parent
db4ee1ec72
commit
5d41388ff3
1 changed files with 17 additions and 33 deletions
50
src/scope.h
50
src/scope.h
|
|
@ -56,28 +56,8 @@ public:
|
|||
else
|
||||
return NULL_VALUE;
|
||||
}
|
||||
|
||||
virtual optional<scope_t&> find_scope(const std::type_info&, bool = true) {
|
||||
return none;
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
inline T& find_scope(scope_t& scope, bool skip_this = true) {
|
||||
optional<scope_t&> found = scope.find_scope(typeid(T), skip_this);
|
||||
assert(found);
|
||||
return static_cast<T&>(*found);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline optional<T&> maybe_find_scope(scope_t& scope, bool skip_this = true) {
|
||||
optional<scope_t&> found = scope.find_scope(typeid(T), skip_this);
|
||||
if (found)
|
||||
return optional<T&>(static_cast<T&>(*found));
|
||||
else
|
||||
return none;
|
||||
}
|
||||
|
||||
class child_scope_t : public noncopyable, public scope_t
|
||||
{
|
||||
public:
|
||||
|
|
@ -99,21 +79,25 @@ public:
|
|||
return parent->lookup(name);
|
||||
return expr_t::ptr_op_t();
|
||||
}
|
||||
|
||||
virtual optional<scope_t&> find_scope(const std::type_info& type,
|
||||
bool skip_this = true) {
|
||||
for (scope_t * ptr = (skip_this ? parent : this); ptr; ) {
|
||||
if (typeid(*ptr) == type)
|
||||
return *ptr;
|
||||
if (child_scope_t * scope = dynamic_cast<child_scope_t *>(ptr))
|
||||
ptr = scope->parent;
|
||||
else
|
||||
ptr = NULL;
|
||||
}
|
||||
return none;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template <typename T>
|
||||
inline T& find_scope(child_scope_t& scope, bool skip_this = true)
|
||||
{
|
||||
for (scope_t * ptr = (skip_this ? scope.parent : &scope); ptr; ) {
|
||||
T * sought = dynamic_cast<T *>(ptr);
|
||||
if (sought)
|
||||
return *sought;
|
||||
if (child_scope_t * scope = dynamic_cast<child_scope_t *>(ptr))
|
||||
ptr = scope->parent;
|
||||
else
|
||||
ptr = NULL;
|
||||
}
|
||||
throw_(std::runtime_error, "Could not find scope");
|
||||
return reinterpret_cast<T&>(scope); // never executed
|
||||
}
|
||||
|
||||
class symbol_scope_t : public child_scope_t
|
||||
{
|
||||
typedef std::map<const string, expr_t::ptr_op_t> symbol_map;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue