summaryrefslogtreecommitdiff
path: root/src/scope.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/scope.h')
-rw-r--r--src/scope.h41
1 files changed, 24 insertions, 17 deletions
diff --git a/src/scope.h b/src/scope.h
index 785ce284..ccfc750b 100644
--- a/src/scope.h
+++ b/src/scope.h
@@ -70,8 +70,7 @@ struct symbol_t
TRACE_CTOR(symbol_t, "symbol_t::kind_t, string");
}
symbol_t(const symbol_t& sym)
- : kind(sym.kind), name(sym.name),
- definition(sym.definition) {
+ : kind(sym.kind), name(sym.name), definition(sym.definition) {
TRACE_CTOR(symbol_t, "copy");
}
~symbol_t() throw() {
@@ -81,6 +80,9 @@ struct symbol_t
bool operator<(const symbol_t& sym) const {
return kind < sym.kind || name < sym.name;
}
+ bool operator==(const symbol_t& sym) const {
+ return kind == sym.kind || name == sym.name;
+ }
#if defined(HAVE_BOOST_SERIALIZATION)
private:
@@ -97,10 +99,13 @@ private:
#endif // HAVE_BOOST_SERIALIZATION
};
+class empty_scope_t;
+
class scope_t
{
public:
- static scope_t * default_scope;
+ static scope_t * default_scope;
+ static empty_scope_t * empty_scope;
explicit scope_t() {
TRACE_CTOR(scope_t, "");
@@ -134,6 +139,17 @@ private:
#endif // HAVE_BOOST_SERIALIZATION
};
+class empty_scope_t : public scope_t
+{
+public:
+ virtual string description() {
+ return _("<empty>");
+ }
+ virtual expr_t::ptr_op_t lookup(const symbol_t::kind_t, const string&) {
+ return NULL;
+ }
+};
+
class child_scope_t : public noncopyable, public scope_t
{
public:
@@ -142,8 +158,7 @@ public:
explicit child_scope_t() : parent(NULL) {
TRACE_CTOR(child_scope_t, "");
}
- explicit child_scope_t(scope_t& _parent)
- : parent(&_parent) {
+ explicit child_scope_t(scope_t& _parent) : parent(&_parent) {
TRACE_CTOR(child_scope_t, "scope_t&");
}
virtual ~child_scope_t() {
@@ -229,6 +244,8 @@ private:
template <typename T>
T * search_scope(scope_t * ptr, bool prefer_direct_parents = false)
{
+ DEBUG("scope.search", "Searching scope " << ptr->description());
+
if (T * sought = dynamic_cast<T *>(ptr))
return sought;
@@ -274,7 +291,7 @@ class symbol_scope_t : public child_scope_t
optional<symbol_map> symbols;
public:
- explicit symbol_scope_t() {
+ explicit symbol_scope_t() : child_scope_t() {
TRACE_CTOR(symbol_scope_t, "");
}
explicit symbol_scope_t(scope_t& _parent) : child_scope_t(_parent) {
@@ -363,13 +380,8 @@ protected:
class call_scope_t : public context_scope_t
{
-#if defined(DEBUG_ON)
public:
-#endif
value_t args;
-#if defined(DEBUG_ON)
-private:
-#endif
mutable void * ptr;
value_t& resolve(const std::size_t index,
@@ -386,17 +398,12 @@ public:
: context_scope_t(_parent, _parent.type_context(),
_parent.type_required()),
ptr(NULL), locus(_locus), depth(_depth) {
- TRACE_CTOR(call_scope_t,
- "scope_t&, value_t::type_t, bool, expr_t::ptr_op_t *, int");
+ TRACE_CTOR(call_scope_t, "scope_t&, expr_t::ptr_op_t *, const int");
}
virtual ~call_scope_t() {
TRACE_DTOR(call_scope_t);
}
- virtual string description() {
- return context_scope_t::description();
- }
-
void set_args(const value_t& _args) {
args = _args;
}