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();
 
         /***********************************************************************