mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 19:09:16 +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;
|
restype: byte;
|
||||||
selftemp: ttempcreatenode;
|
selftemp: ttempcreatenode;
|
||||||
selfpara: tnode;
|
selfpara: tnode;
|
||||||
|
vardispatchparadef: trecorddef;
|
||||||
|
vardispatchfield: tsym;
|
||||||
|
|
||||||
names : ansistring;
|
names : ansistring;
|
||||||
variantdispatch : boolean;
|
variantdispatch : boolean;
|
||||||
@ -465,7 +467,9 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
{ create a temp to store parameter values }
|
{ 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);
|
addstatement(statements,params);
|
||||||
|
|
||||||
calldescnode:=cdataconstnode.create;
|
calldescnode:=cdataconstnode.create;
|
||||||
@ -518,15 +522,14 @@ implementation
|
|||||||
{ for Variants, we always pass a pointer, RTL helpers must handle it
|
{ for Variants, we always pass a pointer, RTL helpers must handle it
|
||||||
depending on byref bit }
|
depending on byref bit }
|
||||||
|
|
||||||
|
vardispatchfield:=vardispatchparadef.add_field_by_def('',assignmenttype);
|
||||||
if assignmenttype=voidpointertype then
|
if assignmenttype=voidpointertype then
|
||||||
addstatement(statements,cassignmentnode.create(
|
addstatement(statements,cassignmentnode.create(
|
||||||
ctypeconvnode.create_internal(ctemprefnode.create_offset(params,paramssize),
|
csubscriptnode.create(vardispatchfield,ctemprefnode.create(params)),
|
||||||
voidpointertype),
|
|
||||||
ctypeconvnode.create_internal(caddrnode.create_internal(para.left),voidpointertype)))
|
ctypeconvnode.create_internal(caddrnode.create_internal(para.left),voidpointertype)))
|
||||||
else
|
else
|
||||||
addstatement(statements,cassignmentnode.create(
|
addstatement(statements,cassignmentnode.create(
|
||||||
ctypeconvnode.create_internal(ctemprefnode.create_offset(params,paramssize),
|
csubscriptnode.create(vardispatchfield,ctemprefnode.create(params)),
|
||||||
assignmenttype),
|
|
||||||
ctypeconvnode.create_internal(para.left,assignmenttype)));
|
ctypeconvnode.create_internal(para.left,assignmenttype)));
|
||||||
|
|
||||||
inc(paramssize,max(voidpointertype.size,assignmenttype.size));
|
inc(paramssize,max(voidpointertype.size,assignmenttype.size));
|
||||||
@ -536,6 +539,9 @@ implementation
|
|||||||
para:=tcallparanode(para.nextpara);
|
para:=tcallparanode(para.nextpara);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ finalize the parameter record }
|
||||||
|
trecordsymtable(vardispatchparadef.symtable).addalignmentpadding;
|
||||||
|
|
||||||
{ Set final size for parameter block }
|
{ Set final size for parameter block }
|
||||||
params.size:=paramssize;
|
params.size:=paramssize;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user