From c31f87641ea8e335a8947c405c6acaa2c45d96ed Mon Sep 17 00:00:00 2001 From: Brad Roberts Date: Mon, 10 Sep 2007 07:36:51 +0000 Subject: [PATCH] phobos 2.004 --- internal/object.d | 99 ++++++++++++++++++++++++++++++++++++++++------- linux.mak | 11 ++++-- object.d | 35 +++++++++++++++++ std/hiddenfunc.d | 33 ++++++++++++++++ std/moduleinit.d | 8 ++-- std/outofmemory.d | 2 +- win32.mak | 11 ++++-- 7 files changed, 172 insertions(+), 27 deletions(-) create mode 100644 std/hiddenfunc.d diff --git a/internal/object.d b/internal/object.d index da0f6b57f..bb3345909 100644 --- a/internal/object.d +++ b/internal/object.d @@ -289,9 +289,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(string) xgetMembers; /************* * Search all modules for ClassInfo corresponding to classname. @@ -326,8 +328,23 @@ class ClassInfo : Object } return o; } + + /************************* + * Search for all members with the name 'name'. + * If name[] is null, return all members. + */ + const(MemberInfo[]) getMembers(string name) + { + if (flags & 16 && xgetMembers) + { + return xgetMembers(name); + } + return null; + } } +/* ========================================================================== */ + private import std.string; /** @@ -713,7 +730,7 @@ class TypeInfo_Function : TypeInfo return 0; // no size for functions } - TypeInfo next; + TypeInfo next; // function return type } class TypeInfo_Delegate : TypeInfo @@ -740,7 +757,7 @@ class TypeInfo_Delegate : TypeInfo uint flags() { return 1; } - TypeInfo next; + TypeInfo next; // delegate return type } class TypeInfo_Class : TypeInfo @@ -960,6 +977,8 @@ class TypeInfo_Struct : TypeInfo string function(const(void)*) xtoString; uint m_flags; + + const(MemberInfo[]) function(string) xgetMembers; } class TypeInfo_Tuple : TypeInfo @@ -1026,27 +1045,77 @@ class TypeInfo_Tuple : TypeInfo class TypeInfo_Const : TypeInfo { - string toString() { return "const " ~ base.toString(); } + override string toString() { return "const " ~ base.toString(); } - int opEquals(Object o) { return base.opEquals(o); } - hash_t getHash(in void *p) { return base.getHash(p); } - int 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 int opEquals(Object o) { return base.opEquals(o); } + override hash_t getHash(in void *p) { return base.getHash(p); } + override int 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 base.init(); } + 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 { - string toString() { return "invariant " ~ base.toString(); } + override string toString() { return "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; + } + + 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; + } + + 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; +} + + +/* ========================================================================== */ + /** * All recoverable exceptions should be derived from class Exception. @@ -1070,12 +1139,12 @@ class Exception : Object this.next = next; } - void print() + override void print() { printf("%.*s\n", toString()); } - string toString() { return msg; } + override string toString() { return msg; } } /** diff --git a/linux.mak b/linux.mak index 1d6e4b8c5..6ac67f847 100644 --- a/linux.mak +++ b/linux.mak @@ -14,8 +14,8 @@ LIB=libphobos2.a CFLAGS=-O -m32 #CFLAGS=-g -m32 -DFLAGS=-O -release -w -#DFLAGS=-unittest -w +DFLAGS=-O -release +#DFLAGS=-unittest CC=gcc #DMD=/dmd/bin/dmd @@ -61,7 +61,7 @@ OBJS = asserterror.o deh2.o switch.o complex.o gcstats.o \ perf.o openrj.o uni.o trace.o boxer.o \ demangle.o cover.o bitarray.o bind.o aApplyR.o \ signals.o cpuid.o traits.o typetuple.o loader.o \ - c_stdio.o \ + c_stdio.o hiddenfunc.o \ ti_wchar.o ti_uint.o ti_short.o ti_ushort.o \ ti_byte.o ti_ubyte.o ti_long.o ti_ulong.o ti_ptr.o \ ti_float.o ti_double.o ti_real.o ti_delegate.o \ @@ -98,7 +98,7 @@ SRC_STD= std/zlib.d std/zip.d std/stdint.d std/conv.d std/utf.d std/uri.d \ std/stdio.d std/format.d std/perf.d std/openrj.d std/uni.d \ std/boxer.d std/cstream.d std/demangle.d std/cover.d std/bitarray.d \ std/signals.d std/cpuid.d std/typetuple.d std/traits.d std/bind.d \ - std/metastrings.d + std/metastrings.d std/hiddenfunc.d SRC_STD_C= std/c/process.d std/c/stdlib.d std/c/time.d std/c/stdio.d \ std/c/math.d std/c/stdarg.d std/c/stddef.d std/c/fenv.d std/c/string.d \ @@ -357,6 +357,9 @@ format.o : std/format.d gc.o : std/gc.d $(DMD) -c $(DFLAGS) std/gc.d +hiddenfunc.o : std/hiddenfunc.d + $(DMD) -c $(DFLAGS) std/hiddenfunc.d + loader.o : std/loader.d $(DMD) -c $(DFLAGS) std/loader.d diff --git a/object.d b/object.d index 8ccb517e0..acc04b3f8 100644 --- a/object.d +++ b/object.d @@ -53,12 +53,15 @@ 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* defaultConstructor; // default Constructor + const(MemberInfo[]) function(string) xgetMembers; static ClassInfo find(string classname); Object create(); + const(MemberInfo[]) getMembers(string); } struct OffsetTypeInfo @@ -145,6 +148,8 @@ class TypeInfo_Struct : TypeInfo string function(const(void)*) xtoString; uint m_flags; + + const(MemberInfo[]) function(string) xgetMembers; } class TypeInfo_Tuple : TypeInfo @@ -161,6 +166,36 @@ class TypeInfo_Invariant : TypeInfo_Const { } +abstract class MemberInfo +{ + string name(); +} + +class MemberInfo_field : MemberInfo +{ + this(string name, TypeInfo ti, size_t offset); + + override string name(); + TypeInfo typeInfo(); + size_t offset(); +} + +class MemberInfo_function : MemberInfo +{ + enum + { Virtual = 1, + Member = 2, + Static = 4, + } + + this(string name, TypeInfo ti, void* fp, uint flags); + + override string name(); + TypeInfo typeInfo(); + void* fp(); + uint flags(); +} + // Recoverable errors class Exception : Object diff --git a/std/hiddenfunc.d b/std/hiddenfunc.d new file mode 100644 index 000000000..8f0eb7bf4 --- /dev/null +++ b/std/hiddenfunc.d @@ -0,0 +1,33 @@ +// Written in the D programming language + +module std.hiddenfunc; + +import std.stdio; + +class HiddenFuncError : Error +{ + private: + + this(ClassInfo ci) + { + super("hidden method called for " ~ ci.name); + } +} + +/******************************************** + * Called by the compiler generated module assert function. + * Builds an Assert exception and throws it. + */ + +extern (C) static void _d_hidden_func() +{ Object o; + asm + { + mov o, EAX; + } + + //printf("_d_hidden_func()\n"); + HiddenFuncError a = new HiddenFuncError(o.classinfo); + //printf("assertion %p created\n", a); + throw a; +} diff --git a/std/moduleinit.d b/std/moduleinit.d index 9c0957d1c..61b46c823 100644 --- a/std/moduleinit.d +++ b/std/moduleinit.d @@ -31,9 +31,11 @@ class ModuleInfo uint flags; // initialization state - void (*ctor)(); - void (*dtor)(); - void (*unitTest)(); + void (*ctor)(); // module static constructor + void (*dtor)(); // module static destructor + void (*unitTest)(); // module unit tests + + const(MemberInfo[]) function(string) xgetMembers; // module getMembers() function /****************** * Return collection of all modules in the program. diff --git a/std/outofmemory.d b/std/outofmemory.d index a59741794..43327e16b 100644 --- a/std/outofmemory.d +++ b/std/outofmemory.d @@ -27,7 +27,7 @@ class OutOfMemoryException : Exception super(s); } - string toString() + override string toString() { return s; } diff --git a/win32.mak b/win32.mak index 880dce39a..183a8e4a1 100644 --- a/win32.mak +++ b/win32.mak @@ -20,8 +20,8 @@ DIR=\dmd2 CFLAGS=-mn -6 -r #CFLAGS=-g -mn -6 -r -DFLAGS=-O -release -nofloat -w -#DFLAGS=-unittest -g -w +DFLAGS=-O -release -nofloat +#DFLAGS=-unittest -g #DFLAGS=-unittest -cov -g CC=dmc @@ -76,7 +76,7 @@ OBJS= asserterror.obj deh.obj switch.obj complex.obj gcstats.obj \ errno.obj boxer.obj cstream.obj charset.obj metastrings.obj \ gamma.obj demangle.obj cover.obj bitarray.obj aApplyR.obj \ signals.obj cpuid.obj typetuple.obj traits.obj bind.obj \ - c_stdio.obj \ + c_stdio.obj hiddenfunc.obj \ ti_Ag.obj ti_C.obj ti_int.obj ti_char.obj \ ti_wchar.obj ti_uint.obj ti_short.obj ti_ushort.obj \ ti_byte.obj ti_ubyte.obj ti_long.obj ti_ulong.obj ti_ptr.obj \ @@ -153,7 +153,7 @@ SRC_STD= std\zlib.d std\zip.d std\stdint.d std\conv.d std\utf.d std\uri.d \ std\stdio.d std\perf.d std\openrj.d std\uni.d std\boxer.d \ std\cstream.d std\demangle.d std\cover.d std\bitarray.d \ std\signals.d std\cpuid.d std\typetuple.d std\traits.d std\bind.d \ - std\metastrings.d + std\metastrings.d std\hiddenfunc.d SRC_STD_C= std\c\process.d std\c\stdlib.d std\c\time.d std\c\stdio.d \ std\c\math.d std\c\stdarg.d std\c\stddef.d std\c\fenv.d std\c\string.d \ @@ -386,6 +386,9 @@ format.obj : std\format.d gc.obj : std\gc.d $(DMD) -c $(DFLAGS) std\gc.d +hiddenfunc.obj : std\hiddenfunc.d + $(DMD) -c $(DFLAGS) std\hiddenfunc.d + loader.obj : std\loader.d $(DMD) -c $(DFLAGS) std\loader.d