mirror of
https://github.com/dlang/phobos.git
synced 2025-04-29 14:40:30 +03:00
phobos 2.004
This commit is contained in:
parent
d90858f401
commit
c31f87641e
7 changed files with 172 additions and 27 deletions
|
@ -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; }
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
11
linux.mak
11
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
|
||||
|
||||
|
|
35
object.d
35
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
|
||||
|
|
33
std/hiddenfunc.d
Normal file
33
std/hiddenfunc.d
Normal file
|
@ -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;
|
||||
}
|
|
@ -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.
|
||||
|
|
|
@ -27,7 +27,7 @@ class OutOfMemoryException : Exception
|
|||
super(s);
|
||||
}
|
||||
|
||||
string toString()
|
||||
override string toString()
|
||||
{
|
||||
return s;
|
||||
}
|
||||
|
|
11
win32.mak
11
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
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue