X-Git-Url: http://git.buserror.net/cgi-bin/gitweb.cgi?p=polintos%2Fscott%2Fpriv.git;a=blobdiff_plain;f=idlcomp%2Fidlc.h;h=56dfefea45e543e6b29657f24257bf7faf14e654;hp=651fae653592a0b42ae6b48f9538f7eeed99fca6;hb=139f54779f6395a1828261423cd8013ca940ff36;hpb=5d151caf35ee9a990dda9a3af370ca30a8b7f638 diff --git a/idlcomp/idlc.h b/idlcomp/idlc.h index 651fae6..56dfefe 100644 --- a/idlcomp/idlc.h +++ b/idlcomp/idlc.h @@ -30,6 +30,7 @@ #include #include #include +#include #include "compileddef.h" @@ -447,6 +448,8 @@ typedef Ref IDListRef; class NameSpace; class LangCallback; +typedef Ref NameSpaceRef; + // This is incremented when a chain of symbols is traversed to reset // detection of already-visited symbols. It is assumed that this // will not have to happen billions of times. @@ -456,6 +459,14 @@ extern int traversal; class Symbol : public RefCountable { NameSpace *ns; + void init() + { + ns = NULL; + external = false; + priv = false; + lang_priv = NULL; + } + public: StringRef name; @@ -470,31 +481,17 @@ public: bool priv; - // This is set to ::traversal when this symbol is visited along a chain. - // If a target needs more than 8 simultaneous chains, increase the size - // of the array. These traversals are reserved for language binding use. - - int traversed[8]; + // Reserved for language binding use. + Releasable *lang_priv; Symbol() { - ns = NULL; - external = false; - priv = false; - - memset(traversed, 0, sizeof(traversed)); + init(); } Symbol(const String *_name) : name(_name) { - if (_name) - name->retain(); - - ns = NULL; - external = false; - priv = false; - - memset(traversed, 0, sizeof(traversed)); + init(); } virtual ~Symbol(); @@ -588,8 +585,6 @@ struct InvalidArgument { struct UserError { }; -typedef Ref NameSpaceRef; - class NameSpace : public virtual Symbol { protected: // Filesystem path to the external symbol storage, or NULL @@ -620,23 +615,15 @@ protected: list imports; public: - // This is set in the destructor, so the contents of the namespace - // don't try to remove themselves from the namespace when destructed - // due to the destruction of map. - int dying; - // This is a counter for generating unique names for anonymous // members of the namespace. int anon; - NameSpace() : dying(0), anon(0) + NameSpace() : anon(0) { } - virtual ~NameSpace() - { - dying = 1; - } + virtual ~NameSpace(); // Return a description of the type of namespace, for // error messages. @@ -707,13 +694,12 @@ public: // SymbolNotFound is thrown if sym is not in this namespace. virtual void del(Symbol *sym) { - fprintf(stderr, "Removing symbol %s\n", - sym->get_fq_name()->flatten()->c_str()); - - if (tbl.erase(sym->name) == 0) + if (sym->ns != this) throw SymbolNotFound(); - + sym->ns = NULL; + int ret = tbl.erase(sym->name); + assert(ret != 0); } private: @@ -839,9 +825,9 @@ protected: CompiledDefHeader hdr; // sym is the symbol from which to get the path/name, and - // dir is true if it should be "name/.self" rather than + // is_dir is true if it should be "name/.self" rather than // "name". - void output_self(const char *dir, Symbol *sym, bool dir); + void output_self(const char *dir, Symbol *sym, bool is_dir); public: Def(const char *self, int self_len, CompiledDefHeader::Type type) : @@ -981,7 +967,6 @@ class Array : public RefCountable // lower is [0], upper is [1] StrListRef dcons[2]; - Con cons[2]; // Strings for error reporting on each constant. If the constant // is symbolic, then this is the fully qualified symbol name. @@ -992,6 +977,8 @@ class Array : public RefCountable StringRef strs[2]; public: + Con cons[2]; + // ca is not valid until after final_analysis() is called. CompiledArray ca; @@ -1018,8 +1005,6 @@ class Datum : public Symbol, public Def { bool const_init; // Datum's constant has been initialized; this is // true after a successful verify_const(). CompiledBasicType *cbt; - - ArrayRef array; int chain_traversed; @@ -1051,6 +1036,7 @@ class Datum : public Symbol, public Def { } public: + ArrayRef array; CompiledDatum def; TypeRef type; @@ -1283,7 +1269,7 @@ public: class Struct; typedef Ref StructRef; -extern Struct *System_VStruct; +extern StructRef System_VStruct; // FIXME: typedefed superstructs class Struct : public NameSpace, public Type, public Def { @@ -1292,6 +1278,9 @@ class Struct : public NameSpace, public Type, public Def { SymbolRef supersym; StrListRef supername; bool attrs_resolved; + + // 0 = unknown, 1 = yes, 2 = no + int plain_data; void add_elem(Datum *d); @@ -1465,6 +1454,10 @@ public: def.guid[0] = guid[0]; def.guid[1] = guid[1]; } + + // A struct is "plain data" if it contains no object references, + // no non-inline arrays or structs, and no inline non-plain structs. + bool is_plain_data(); }; class Param : public Symbol, public Def { @@ -1647,7 +1640,7 @@ typedef Ref MethodRef; class Interface; typedef Ref InterfaceRef; -extern Interface *System_Object; +extern InterfaceRef System_Object; // FIXME: typedefed superinterfaces class Interface : public NameSpace, public Type, public Def {