mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-06 22:50:14 +02:00
* pdecvar.pas, refactoring: don't create storedprocdef unless it is actually required.
+ Added statement to dispose storedprocdef after use, it was missing. git-svn-id: trunk@16809 -
This commit is contained in:
parent
ae7bfbb578
commit
ba74d47081
@ -282,7 +282,7 @@ implementation
|
||||
p.dispid:=tobjectdef(astruct).get_next_dispid;
|
||||
end;
|
||||
|
||||
procedure add_index_parameter(var paranr: word; p: tpropertysym; readprocdef, writeprocdef, storedprocdef: tprocvardef);
|
||||
procedure add_index_parameter(var paranr: word; p: tpropertysym; readprocdef, writeprocdef: tprocvardef);
|
||||
var
|
||||
hparavs: tparavarsym;
|
||||
begin
|
||||
@ -291,8 +291,6 @@ implementation
|
||||
readprocdef.parast.insert(hparavs);
|
||||
hparavs:=tparavarsym.create('$index',10*paranr,vs_value,p.indexdef,[]);
|
||||
writeprocdef.parast.insert(hparavs);
|
||||
hparavs:=tparavarsym.create('$index',10*paranr,vs_value,p.indexdef,[]);
|
||||
storedprocdef.parast.insert(hparavs);
|
||||
end;
|
||||
|
||||
var
|
||||
@ -321,19 +319,14 @@ implementation
|
||||
paranr:=0;
|
||||
readprocdef:=tprocvardef.create(normal_function_level);
|
||||
writeprocdef:=tprocvardef.create(normal_function_level);
|
||||
storedprocdef:=tprocvardef.create(normal_function_level);
|
||||
|
||||
{ make them method pointers }
|
||||
if assigned(astruct) and not is_classproperty then
|
||||
begin
|
||||
include(readprocdef.procoptions,po_methodpointer);
|
||||
include(writeprocdef.procoptions,po_methodpointer);
|
||||
include(storedprocdef.procoptions,po_methodpointer);
|
||||
end;
|
||||
|
||||
{ method for stored must return boolean }
|
||||
storedprocdef.returndef:=booltype;
|
||||
|
||||
if token<>_ID then
|
||||
begin
|
||||
consume(_ID);
|
||||
@ -448,7 +441,7 @@ implementation
|
||||
p.indexdef:=pt.resultdef;
|
||||
include(p.propoptions,ppo_indexed);
|
||||
{ concat a longint to the para templates }
|
||||
add_index_parameter(paranr,p,readprocdef,writeprocdef,storedprocdef);
|
||||
add_index_parameter(paranr,p,readprocdef,writeprocdef);
|
||||
pt.free;
|
||||
end;
|
||||
end
|
||||
@ -471,7 +464,7 @@ implementation
|
||||
p.default:=tpropertysym(overridden).default;
|
||||
p.propoptions:=tpropertysym(overridden).propoptions;
|
||||
if ppo_indexed in p.propoptions then
|
||||
add_index_parameter(paranr,p,readprocdef,writeprocdef,storedprocdef);
|
||||
add_index_parameter(paranr,p,readprocdef,writeprocdef);
|
||||
end
|
||||
else
|
||||
begin
|
||||
@ -641,11 +634,25 @@ implementation
|
||||
case sym.typ of
|
||||
procsym :
|
||||
begin
|
||||
{ Create a temporary procvardef to handle parameters }
|
||||
storedprocdef:=tprocvardef.create(normal_function_level);
|
||||
include(storedprocdef.procoptions,po_methodpointer);
|
||||
{ Return type must be boolean }
|
||||
storedprocdef.returndef:=booltype;
|
||||
{ Add index parameter if needed }
|
||||
if ppo_indexed in p.propoptions then
|
||||
begin
|
||||
hparavs:=tparavarsym.create('$index',10,vs_value,p.indexdef,[]);
|
||||
storedprocdef.parast.insert(hparavs);
|
||||
end;
|
||||
|
||||
{ Insert hidden parameters }
|
||||
handle_calling_convention(storedprocdef);
|
||||
p.propaccesslist[palt_stored].procdef:=Tprocsym(sym).Find_procdef_bypara(storedprocdef.paras,storedprocdef.returndef,[cpo_allowdefaults,cpo_ignorehidden]);
|
||||
if not assigned(p.propaccesslist[palt_stored].procdef) then
|
||||
message(parser_e_ill_property_storage_sym);
|
||||
{ Not needed anymore }
|
||||
storedprocdef.owner.deletedef(storedprocdef);
|
||||
end;
|
||||
fieldvarsym :
|
||||
begin
|
||||
|
Loading…
Reference in New Issue
Block a user