X-Git-Url: https://git.llucax.com/software/druntime.git/blobdiff_plain/0b5d833e0947d44cd5bee6562c22ed4a14ca23bb..b29ba2914571d42232476d23c06a9f79291f7646:/src/compiler/dmd/object_.d diff --git a/src/compiler/dmd/object_.d b/src/compiler/dmd/object_.d index a0ac2a0..df5cfff 100644 --- a/src/compiler/dmd/object_.d +++ b/src/compiler/dmd/object_.d @@ -68,9 +68,9 @@ else alias size_t hash_t; alias int equals_t; -alias char[] string; -alias wchar[] wstring; -alias dchar[] dstring; +alias invariant(char)[] string; +alias invariant(wchar)[] wstring; +alias invariant(dchar)[] dstring; /** * All D class objects inherit from Object. @@ -160,9 +160,11 @@ class ClassInfo : Object // 2: // has no possible pointers into GC memory // 4: // has offTi[] member // 8: // has constructors + // 16: // has xgetMembers member void* deallocator; OffsetTypeInfo[] offTi; void function(Object) defaultConstructor; // default Constructor + const(MemberInfo[]) function(in char[]) xgetMembers; /** * Search all modules for ClassInfo corresponding to classname. @@ -197,6 +199,16 @@ class ClassInfo : Object } return o; } + /** + * Search for all members with the name 'name'. + * If name[] is null, return all members. + */ + const(MemberInfo[]) getMembers(in char[] name) + { + if (flags & 16 && xgetMembers) + return xgetMembers(name); + return null; + } } /** @@ -216,7 +228,7 @@ struct OffsetTypeInfo */ class TypeInfo { - hash_t toHash() + override hash_t toHash() { hash_t hash; foreach (char c; this.toString()) @@ -224,7 +236,7 @@ class TypeInfo return hash; } - int opCmp(Object o) + override int opCmp(Object o) { if (this is o) return 0; @@ -234,7 +246,7 @@ class TypeInfo return dstrcmp(this.toString(), ti.toString()); } - equals_t opEquals(Object o) + override equals_t opEquals(Object o) { /* TypeInfo instances are singletons, but duplicates can exist * across DLL's. Therefore, comparing for a name match is @@ -282,13 +294,17 @@ class TypeInfo /// Get type information on the contents of the type; null if not available OffsetTypeInfo[] offTi() { return null; } + /// Run the destructor on the object and all its sub-objects + void destroy(void* p) {} + /// Run the postblit on the object and all its sub-objects + void postblit(void* p) {} } class TypeInfo_Typedef : TypeInfo { - string toString() { return name; } + override string toString() { return name; } - equals_t opEquals(Object o) + override equals_t opEquals(Object o) { TypeInfo_Typedef c; return this is o || @@ -297,15 +313,15 @@ class TypeInfo_Typedef : TypeInfo this.base == c.base); } - hash_t getHash(in void* p) { return base.getHash(p); } - equals_t equals(in void* p1, in void* p2) { return base.equals(p1, p2); } - int compare(in void* p1, in void* p2) { return base.compare(p1, p2); } - size_t tsize() { return base.tsize(); } - void swap(void* p1, void* p2) { return base.swap(p1, p2); } + override hash_t getHash(in void* p) { return base.getHash(p); } + override equals_t equals(in void* p1, in void* p2) { return base.equals(p1, p2); } + override int compare(in void* p1, in void* p2) { return base.compare(p1, p2); } + override size_t tsize() { return base.tsize(); } + override void swap(void* p1, void* p2) { return base.swap(p1, p2); } - TypeInfo next() { return base.next(); } - uint flags() { return base.flags(); } - void[] init() { return m_init.length ? m_init : base.init(); } + override TypeInfo next() { return base.next(); } + override uint flags() { return base.flags(); } + override void[] init() { return m_init.length ? m_init : base.init(); } TypeInfo base; string name; @@ -319,9 +335,9 @@ class TypeInfo_Enum : TypeInfo_Typedef class TypeInfo_Pointer : TypeInfo { - string toString() { return m_next.toString() ~ "*"; } + override string toString() { return m_next.toString() ~ "*"; } - equals_t opEquals(Object o) + override equals_t opEquals(Object o) { TypeInfo_Pointer c; return this is o || @@ -329,17 +345,17 @@ class TypeInfo_Pointer : TypeInfo this.m_next == c.m_next); } - hash_t getHash(in void* p) + override hash_t getHash(in void* p) { return cast(hash_t)*cast(void**)p; } - equals_t equals(in void* p1, in void* p2) + override equals_t equals(in void* p1, in void* p2) { return *cast(void**)p1 == *cast(void**)p2; } - int compare(in void* p1, in void* p2) + override int compare(in void* p1, in void* p2) { if (*cast(void**)p1 < *cast(void**)p2) return -1; @@ -349,29 +365,29 @@ class TypeInfo_Pointer : TypeInfo return 0; } - size_t tsize() + override size_t tsize() { return (void*).sizeof; } - void swap(void* p1, void* p2) + override void swap(void* p1, void* p2) { void* tmp = *cast(void**)p1; *cast(void**)p1 = *cast(void**)p2; *cast(void**)p2 = tmp; } - TypeInfo next() { return m_next; } - uint flags() { return 1; } + override TypeInfo next() { return m_next; } + override uint flags() { return 1; } TypeInfo m_next; } class TypeInfo_Array : TypeInfo { - string toString() { return value.toString() ~ "[]"; } + override string toString() { return value.toString() ~ "[]"; } - equals_t opEquals(Object o) + override equals_t opEquals(Object o) { TypeInfo_Array c; return this is o || @@ -379,7 +395,7 @@ class TypeInfo_Array : TypeInfo this.value == c.value); } - hash_t getHash(in void* p) + override hash_t getHash(in void* p) { size_t sz = value.tsize(); hash_t hash = 0; @@ -389,7 +405,7 @@ class TypeInfo_Array : TypeInfo return hash; } - equals_t equals(in void* p1, in void* p2) + override equals_t equals(in void* p1, in void* p2) { void[] a1 = *cast(void[]*)p1; void[] a2 = *cast(void[]*)p2; @@ -404,7 +420,7 @@ class TypeInfo_Array : TypeInfo return true; } - int compare(in void* p1, in void* p2) + override int compare(in void* p1, in void* p2) { void[] a1 = *cast(void[]*)p1; void[] a2 = *cast(void[]*)p2; @@ -422,12 +438,12 @@ class TypeInfo_Array : TypeInfo return cast(int)a1.length - cast(int)a2.length; } - size_t tsize() + override size_t tsize() { return (void[]).sizeof; } - void swap(void* p1, void* p2) + override void swap(void* p1, void* p2) { void[] tmp = *cast(void[]*)p1; *cast(void[]*)p1 = *cast(void[]*)p2; @@ -436,23 +452,23 @@ class TypeInfo_Array : TypeInfo TypeInfo value; - TypeInfo next() + override TypeInfo next() { return value; } - uint flags() { return 1; } + override uint flags() { return 1; } } class TypeInfo_StaticArray : TypeInfo { - string toString() + override string toString() { - char [10] tmp = void; - return value.toString() ~ "[" ~ tmp.intToString(len) ~ "]"; + char[10] tmp = void; + return cast(string)(value.toString() ~ "[" ~ tmp.intToString(len) ~ "]"); } - equals_t opEquals(Object o) + override equals_t opEquals(Object o) { TypeInfo_StaticArray c; return this is o || @@ -461,7 +477,7 @@ class TypeInfo_StaticArray : TypeInfo this.value == c.value); } - hash_t getHash(in void* p) + override hash_t getHash(in void* p) { size_t sz = value.tsize(); hash_t hash = 0; @@ -470,7 +486,7 @@ class TypeInfo_StaticArray : TypeInfo return hash; } - equals_t equals(in void* p1, in void* p2) + override equals_t equals(in void* p1, in void* p2) { size_t sz = value.tsize(); @@ -482,7 +498,7 @@ class TypeInfo_StaticArray : TypeInfo return true; } - int compare(in void* p1, in void* p2) + override int compare(in void* p1, in void* p2) { size_t sz = value.tsize(); @@ -495,12 +511,12 @@ class TypeInfo_StaticArray : TypeInfo return 0; } - size_t tsize() + override size_t tsize() { return len * value.tsize(); } - void swap(void* p1, void* p2) + override void swap(void* p1, void* p2) { void* tmp; size_t sz = value.tsize(); @@ -522,9 +538,30 @@ class TypeInfo_StaticArray : TypeInfo delete pbuffer; } - void[] init() { return value.init(); } - TypeInfo next() { return value; } - uint flags() { return value.flags(); } + override void[] init() { return value.init(); } + override TypeInfo next() { return value; } + override uint flags() { return value.flags(); } + + override void destroy(void* p) + { + auto sz = value.tsize(); + p += sz * len; + foreach (i; 0 .. len) + { + p -= sz; + value.destroy(p); + } + } + + override void postblit(void* p) + { + auto sz = value.tsize(); + foreach (i; 0 .. len) + { + value.postblit(p); + p += sz; + } + } TypeInfo value; size_t len; @@ -532,12 +569,12 @@ class TypeInfo_StaticArray : TypeInfo class TypeInfo_AssociativeArray : TypeInfo { - string toString() + override string toString() { - return next.toString() ~ "[" ~ key.toString() ~ "]"; + return cast(string)(next.toString() ~ "[" ~ key.toString() ~ "]"); } - equals_t opEquals(Object o) + override equals_t opEquals(Object o) { TypeInfo_AssociativeArray c; return this is o || @@ -548,13 +585,13 @@ class TypeInfo_AssociativeArray : TypeInfo // BUG: need to add the rest of the functions - size_t tsize() + override size_t tsize() { return (char[int]).sizeof; } - TypeInfo next() { return value; } - uint flags() { return 1; } + override TypeInfo next() { return value; } + override uint flags() { return 1; } TypeInfo value; TypeInfo key; @@ -562,12 +599,12 @@ class TypeInfo_AssociativeArray : TypeInfo class TypeInfo_Function : TypeInfo { - string toString() + override string toString() { - return next.toString() ~ "()"; + return cast(string)(next.toString() ~ "()"); } - equals_t opEquals(Object o) + override equals_t opEquals(Object o) { TypeInfo_Function c; return this is o || @@ -577,7 +614,7 @@ class TypeInfo_Function : TypeInfo // BUG: need to add the rest of the functions - size_t tsize() + override size_t tsize() { return 0; // no size for functions } @@ -587,12 +624,12 @@ class TypeInfo_Function : TypeInfo class TypeInfo_Delegate : TypeInfo { - string toString() + override string toString() { - return next.toString() ~ " delegate()"; + return cast(string)(next.toString() ~ " delegate()"); } - equals_t opEquals(Object o) + override equals_t opEquals(Object o) { TypeInfo_Delegate c; return this is o || @@ -602,22 +639,22 @@ class TypeInfo_Delegate : TypeInfo // BUG: need to add the rest of the functions - size_t tsize() + override size_t tsize() { alias int delegate() dg; return dg.sizeof; } - uint flags() { return 1; } + override uint flags() { return 1; } TypeInfo next; } class TypeInfo_Class : TypeInfo { - string toString() { return info.name; } + override string toString() { return info.name; } - equals_t opEquals(Object o) + override equals_t opEquals(Object o) { TypeInfo_Class c; return this is o || @@ -625,13 +662,13 @@ class TypeInfo_Class : TypeInfo this.info.name == c.classinfo.name); } - hash_t getHash(in void* p) + override hash_t getHash(in void* p) { Object o = *cast(Object*)p; return o ? o.toHash() : 0; } - equals_t equals(in void* p1, in void* p2) + override equals_t equals(in void* p1, in void* p2) { Object o1 = *cast(Object*)p1; Object o2 = *cast(Object*)p2; @@ -639,7 +676,7 @@ class TypeInfo_Class : TypeInfo return (o1 is o2) || (o1 && o1.opEquals(o2)); } - int compare(in void* p1, in void* p2) + override int compare(in void* p1, in void* p2) { Object o1 = *cast(Object*)p1; Object o2 = *cast(Object*)p2; @@ -661,14 +698,14 @@ class TypeInfo_Class : TypeInfo return c; } - size_t tsize() + override size_t tsize() { return Object.sizeof; } - uint flags() { return 1; } + override uint flags() { return 1; } - OffsetTypeInfo[] offTi() + override OffsetTypeInfo[] offTi() { return (info.flags & 4) ? info.offTi : null; } @@ -678,9 +715,9 @@ class TypeInfo_Class : TypeInfo class TypeInfo_Interface : TypeInfo { - string toString() { return info.name; } + override string toString() { return info.name; } - equals_t opEquals(Object o) + override equals_t opEquals(Object o) { TypeInfo_Interface c; return this is o || @@ -688,7 +725,7 @@ class TypeInfo_Interface : TypeInfo this.info.name == c.classinfo.name); } - hash_t getHash(in void* p) + override hash_t getHash(in void* p) { Interface* pi = **cast(Interface ***)*cast(void**)p; Object o = cast(Object)(*cast(void**)p - pi.offset); @@ -696,7 +733,7 @@ class TypeInfo_Interface : TypeInfo return o.toHash(); } - equals_t equals(in void* p1, in void* p2) + override equals_t equals(in void* p1, in void* p2) { Interface* pi = **cast(Interface ***)*cast(void**)p1; Object o1 = cast(Object)(*cast(void**)p1 - pi.offset); @@ -706,7 +743,7 @@ class TypeInfo_Interface : TypeInfo return o1 == o2 || (o1 && o1.opCmp(o2) == 0); } - int compare(in void* p1, in void* p2) + override int compare(in void* p1, in void* p2) { Interface* pi = **cast(Interface ***)*cast(void**)p1; Object o1 = cast(Object)(*cast(void**)p1 - pi.offset); @@ -730,21 +767,21 @@ class TypeInfo_Interface : TypeInfo return c; } - size_t tsize() + override size_t tsize() { return Object.sizeof; } - uint flags() { return 1; } + override uint flags() { return 1; } ClassInfo info; } class TypeInfo_Struct : TypeInfo { - string toString() { return name; } + override string toString() { return name; } - equals_t opEquals(Object o) + override equals_t opEquals(Object o) { TypeInfo_Struct s; return this is o || @@ -753,7 +790,7 @@ class TypeInfo_Struct : TypeInfo this.init.length == s.init.length); } - hash_t getHash(in void* p) + override hash_t getHash(in void* p) { assert(p); if (xtoHash) @@ -768,7 +805,7 @@ class TypeInfo_Struct : TypeInfo // A sorry hash algorithm. // Should use the one for strings. // BUG: relies on the GC not moving objects - auto q = cast(ubyte*)p; + auto q = cast(const(ubyte)*)p; for (size_t i = 0; i < init.length; i++) { h = h * 9 + *q; @@ -778,7 +815,7 @@ class TypeInfo_Struct : TypeInfo } } - equals_t equals(in void* p1, in void* p2) + override equals_t equals(in void* p1, in void* p2) { if (p1 == p2) return true; @@ -791,7 +828,7 @@ class TypeInfo_Struct : TypeInfo return memcmp(p1, p2, init.length) == 0; } - int compare(in void* p1, in void* p2) + override int compare(in void* p1, in void* p2) { // Regard null references as always being "less than" if (p1 != p2) @@ -812,14 +849,26 @@ class TypeInfo_Struct : TypeInfo return 0; } - size_t tsize() + override size_t tsize() { return init.length; } - void[] init() { return m_init; } + override void[] init() { return m_init; } - uint flags() { return m_flags; } + override uint flags() { return m_flags; } + + override void destroy(void* p) + { + if (xdtor) + (*xdtor)(p); + } + + override void postblit(void* p) + { + if (xpostblit) + (*xpostblit)(p); + } string name; void[] m_init; // initializer; init.ptr == null if 0 initialize @@ -830,13 +879,17 @@ class TypeInfo_Struct : TypeInfo char[] function(in void*) xtoString; uint m_flags; + + const(MemberInfo[]) function(in char[]) xgetMembers; + void function(void*) xdtor; + void function(void*) xpostblit; } class TypeInfo_Tuple : TypeInfo { TypeInfo[] elements; - string toString() + override string toString() { string s = "("; foreach (i, element; elements) @@ -849,7 +902,7 @@ class TypeInfo_Tuple : TypeInfo return s; } - equals_t opEquals(Object o) + override equals_t opEquals(Object o) { if (this is o) return true; @@ -867,32 +920,115 @@ class TypeInfo_Tuple : TypeInfo return false; } - hash_t getHash(in void* p) + override hash_t getHash(in void* p) { assert(0); } - equals_t equals(in void* p1, in void* p2) + override equals_t equals(in void* p1, in void* p2) { assert(0); } - int compare(in void* p1, in void* p2) + override int compare(in void* p1, in void* p2) { assert(0); } - size_t tsize() + override size_t tsize() { assert(0); } - void swap(void* p1, void* p2) + override void swap(void* p1, void* p2) + { + assert(0); + } + + override void destroy(void* p) + { + assert(0); + } + + override void postblit(void* p) { assert(0); } } +class TypeInfo_Const : TypeInfo +{ + override string toString() + { + return cast(string) ("const(" ~ base.toString() ~ ")"); + } + + override equals_t opEquals(Object o) { return base.opEquals(o); } + override hash_t getHash(in void *p) { return base.getHash(p); } + override equals_t equals(in void *p1, in void *p2) { return base.equals(p1, p2); } + override int compare(in void *p1, in void *p2) { return base.compare(p1, p2); } + override size_t tsize() { return base.tsize(); } + override void swap(void *p1, void *p2) { return base.swap(p1, p2); } + + override TypeInfo next() { return base.next(); } + override uint flags() { return base.flags(); } + override void[] init() { return base.init(); } + + TypeInfo base; +} + +class TypeInfo_Invariant : TypeInfo_Const +{ + override string toString() + { + return cast(string) ("invariant(" ~ base.toString() ~ ")"); + } +} + +abstract class MemberInfo +{ + string name(); +} + +class MemberInfo_field : MemberInfo +{ + this(string name, TypeInfo ti, size_t offset) + { + m_name = name; + m_typeinfo = ti; + m_offset = offset; + } + + override string name() { return m_name; } + TypeInfo typeInfo() { return m_typeinfo; } + size_t offset() { return m_offset; } + + string m_name; + TypeInfo m_typeinfo; + size_t m_offset; +} + +class MemberInfo_function : MemberInfo +{ + this(string name, TypeInfo ti, void* fp, uint flags) + { + m_name = name; + m_typeinfo = ti; + m_fp = fp; + m_flags = flags; + } + + override string name() { return m_name; } + TypeInfo typeInfo() { return m_typeinfo; } + void* fp() { return m_fp; } + uint flags() { return m_flags; } + + string m_name; + TypeInfo m_typeinfo; + void* m_fp; + uint m_flags; +} + /////////////////////////////////////////////////////////////////////////////// // Exception @@ -927,7 +1063,7 @@ class Exception : Object this.info = traceContext(); } - string toString() + override string toString() { return msg; }