* converted variant dispatch parameter construction from a hacked temp

to a plain record (gets rid of ttemprefnode.create_offset())

git-svn-id: trunk@33725 -
This commit is contained in:
Jonas Maebe 2016-05-20 20:51:41 +00:00
parent abe8d44f37
commit a29524800f

View File

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