Mercurial > projects > ldc
view tango-0.99.8.patch @ 1479:4f7d50c744ed
Rewrite `StructLiteralExp::toElem` to store individual fields instead of
generating a constant to fill the entire struct with a single `store`.
This is much more efficient at compile time (fixing #320) and vastly reduces
the size of the emitted code. Since LLVM no longer needs to keep the data for
all fields in "registers" until the store happens, it should also be more
efficient at run time in cases where the fields aren't assigned with constants.
There's also some code clean-up by removing duplicated logic.
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Sat, 06 Jun 2009 20:16:13 +0200 |
parents | 2a8d4f98b543 |
children |
line wrap: on
line source
Index: object.di =================================================================== --- object.di (revision 4578) +++ object.di (working copy) @@ -35,15 +35,17 @@ Interface[] interfaces; ClassInfo base; void* destructor; - void(*classInvariant)(Object); + void* classInvariant; uint flags; // 1: // IUnknown // 2: // has no possible pointers into GC memory // 4: // has offTi[] member // 8: // has constructors + // 32: // has typeinfo void* deallocator; OffsetTypeInfo[] offTi; void* defaultConstructor; + TypeInfo typeinfo; static ClassInfo find(char[] classname); Object create(); @@ -127,10 +129,11 @@ char[] name; void[] m_init; - uint function(void*) xtoHash; - int function(void*,void*) xopEquals; - int function(void*,void*) xopCmp; - char[] function(void*) xtoString; + // These are ONLY for use as a delegate.funcptr! + hash_t function() xtoHash; + int function(void*) xopEquals; + int function(void*) xopCmp; + char[] function() xtoString; uint m_flags; } Index: lib/common/tango/core/Thread.d =================================================================== --- lib/common/tango/core/Thread.d (revision 4578) +++ lib/common/tango/core/Thread.d (working copy) @@ -295,7 +295,7 @@ } else version (X86_64) { - ulong rax,rbx,rcx,rdx,rbp,rsi,rdi,rsp,r10,r11,r12,r13,r14,r15; + ulong rax,rbx,rcx,rdx,rbp,rsi,rdi,rsp,r8,r9,r10,r11,r12,r13,r14,r15; asm { movq rax[RBP], RAX ; @@ -306,6 +306,8 @@ movq rsi[RBP], RSI ; movq rdi[RBP], RDI ; movq rsp[RBP], RSP ; + movq r8[RBP], R8 ; + movq r9[RBP], R9 ; movq r10[RBP], R10 ; movq r11[RBP], R11 ; movq r12[RBP], R12 ; Index: lib/gc/basic/gcx.d =================================================================== --- lib/gc/basic/gcx.d (revision 4578) +++ lib/gc/basic/gcx.d (working copy) @@ -2198,7 +2198,7 @@ } else version (X86_64) { - ulong rax,rbx,rcx,rdx,rbp,rsi,rdi,rsp,r10,r11,r12,r13,r14,r15; + ulong rax,rbx,rcx,rdx,rbp,rsi,rdi,rsp,r8,r9,r10,r11,r12,r13,r14,r15; asm { movq rax[RBP], RAX ; @@ -2209,6 +2209,8 @@ movq rsi[RBP], RSI ; movq rdi[RBP], RDI ; movq rsp[RBP], RSP ; + movq r8[RBP], R8 ; + movq r9[RBP], R9 ; movq r10[RBP], R10 ; movq r11[RBP], R11 ; movq r12[RBP], R12 ; Index: tango/text/convert/Layout.d =================================================================== --- tango/text/convert/Layout.d (revision 4578) +++ tango/text/convert/Layout.d (working copy) @@ -660,8 +660,12 @@ case TypeCode.STRUCT: auto s = cast(TypeInfo_Struct) type; - if (s.xtoString) - return Utf.fromString8 (s.xtoString(p), result); + if (s.xtoString) { + char[] delegate() toString; + toString.ptr = p; + toString.funcptr = cast(char[] function()) s.xtoString; + return Utf.fromString8 (toString(), result); + } goto default; case TypeCode.INTERFACE: Index: tango/net/Socket.d =================================================================== --- tango/net/Socket.d (revision 4578) +++ tango/net/Socket.d (working copy) @@ -1545,10 +1545,10 @@ abstract class Address { - protected sockaddr* name(); - protected int nameLen(); - AddressFamily addressFamily(); - char[] toString(); + abstract protected sockaddr* name(); + abstract protected int nameLen(); + abstract AddressFamily addressFamily(); + abstract char[] toString(); /***********************************************************************