mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-16 23:21:57 +02:00
* 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:
parent
abe8d44f37
commit
a29524800f
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user