Преглед изворни кода

* converted variant dispatch parameter construction from a hacked temp
to a plain record (gets rid of ttemprefnode.create_offset())

git-svn-id: trunk@33725 -

Jonas Maebe пре 9 година
родитељ
комит
a29524800f
1 измењених фајлова са 11 додато и 5 уклоњено
  1. 11 5
      compiler/ncal.pas

+ 11 - 5
compiler/ncal.pas

@@ -365,6 +365,8 @@ implementation
         restype: byte;
         selftemp: ttempcreatenode;
         selfpara: tnode;
+        vardispatchparadef: trecorddef;
+        vardispatchfield: tsym;
 
         names : ansistring;
         variantdispatch : boolean;
@@ -465,7 +467,9 @@ implementation
           end;
 
         { create a temp to store parameter values }
-        params:=ctempcreatenode.create(cformaltype,0,tt_persistent,false);
+        vardispatchparadef:=crecorddef.create_global_internal('',voidpointertype.size,voidpointertype.size,current_settings.alignment.maxCrecordalign);
+        { the size will be set once the vardistpatchparadef record has been completed }
+        params:=ctempcreatenode.create(vardispatchparadef,0,tt_persistent,false);
         addstatement(statements,params);
 
         calldescnode:=cdataconstnode.create;
@@ -518,15 +522,14 @@ implementation
             { for Variants, we always pass a pointer, RTL helpers must handle it
               depending on byref bit }
 
+            vardispatchfield:=vardispatchparadef.add_field_by_def('',assignmenttype);
             if assignmenttype=voidpointertype then
               addstatement(statements,cassignmentnode.create(
-                ctypeconvnode.create_internal(ctemprefnode.create_offset(params,paramssize),
-                  voidpointertype),
+                csubscriptnode.create(vardispatchfield,ctemprefnode.create(params)),
                 ctypeconvnode.create_internal(caddrnode.create_internal(para.left),voidpointertype)))
             else
               addstatement(statements,cassignmentnode.create(
-                ctypeconvnode.create_internal(ctemprefnode.create_offset(params,paramssize),
-                  assignmenttype),
+              csubscriptnode.create(vardispatchfield,ctemprefnode.create(params)),
                 ctypeconvnode.create_internal(para.left,assignmenttype)));
 
             inc(paramssize,max(voidpointertype.size,assignmenttype.size));
@@ -536,6 +539,9 @@ implementation
             para:=tcallparanode(para.nextpara);
           end;
 
+        { finalize the parameter record }
+        trecordsymtable(vardispatchparadef.symtable).addalignmentpadding;
+
         { Set final size for parameter block }
         params.size:=paramssize;