|
@@ -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;
|
|
|
|