mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-02 01:42:52 +02:00
* factored out handling of static field accesses
git-svn-id: trunk@16770 -
This commit is contained in:
parent
1d8fcadefb
commit
e85df4028c
@ -1016,6 +1016,36 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{ checks whether sym is a static field and if so, translates the access
|
||||||
|
to the appropriate node tree }
|
||||||
|
function handle_staticfield_access(sym: tsym; nested: boolean; var p1: tnode): boolean;
|
||||||
|
var
|
||||||
|
static_name: shortstring;
|
||||||
|
srsymtable: tsymtable;
|
||||||
|
begin
|
||||||
|
result:=false;
|
||||||
|
{ generate access code }
|
||||||
|
if (sp_static in sym.symoptions) then
|
||||||
|
begin
|
||||||
|
result:=true;
|
||||||
|
if not nested then
|
||||||
|
static_name:=lower(sym.owner.name^)+'_'+sym.name
|
||||||
|
else
|
||||||
|
static_name:=lower(generate_nested_name(sym.owner,'_'))+'_'+sym.name;
|
||||||
|
if sym.owner.defowner.typ=objectdef then
|
||||||
|
searchsym_in_class(tobjectdef(sym.owner.defowner),tobjectdef(sym.owner.defowner),static_name,sym,srsymtable)
|
||||||
|
else
|
||||||
|
searchsym_in_record(trecorddef(sym.owner.defowner),static_name,sym,srsymtable);
|
||||||
|
if assigned(sym) then
|
||||||
|
check_hints(sym,sym.symoptions,sym.deprecatedmsg);
|
||||||
|
p1.free;
|
||||||
|
p1:=nil;
|
||||||
|
{ static syms are always stored as absolutevarsym to handle scope and storage properly }
|
||||||
|
propaccesslist_to_node(p1,nil,tabsolutevarsym(sym).ref);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
{ the following procedure handles the access to a property symbol }
|
{ the following procedure handles the access to a property symbol }
|
||||||
procedure handle_propertysym(propsym : tpropertysym;st : TSymtable;var p1 : tnode);
|
procedure handle_propertysym(propsym : tpropertysym;st : TSymtable;var p1 : tnode);
|
||||||
var
|
var
|
||||||
@ -1024,9 +1054,7 @@ implementation
|
|||||||
membercall : boolean;
|
membercall : boolean;
|
||||||
callflags : tcallnodeflags;
|
callflags : tcallnodeflags;
|
||||||
propaccesslist : tpropaccesslist;
|
propaccesslist : tpropaccesslist;
|
||||||
static_name : shortstring;
|
|
||||||
sym: tsym;
|
sym: tsym;
|
||||||
srsymtable : tsymtable;
|
|
||||||
statements : tstatementnode;
|
statements : tstatementnode;
|
||||||
converted_result_data : ttempcreatenode;
|
converted_result_data : ttempcreatenode;
|
||||||
begin
|
begin
|
||||||
@ -1080,21 +1108,7 @@ implementation
|
|||||||
fieldvarsym :
|
fieldvarsym :
|
||||||
begin
|
begin
|
||||||
{ generate access code }
|
{ generate access code }
|
||||||
if (sp_static in sym.symoptions) then
|
if not handle_staticfield_access(sym,false,p1) then
|
||||||
begin
|
|
||||||
static_name:=lower(sym.owner.name^)+'_'+sym.name;
|
|
||||||
if sym.owner.defowner.typ=objectdef then
|
|
||||||
searchsym_in_class(tobjectdef(sym.owner.defowner),tobjectdef(sym.owner.defowner),static_name,sym,srsymtable)
|
|
||||||
else
|
|
||||||
searchsym_in_record(trecorddef(sym.owner.defowner),static_name,sym,srsymtable);
|
|
||||||
if assigned(sym) then
|
|
||||||
check_hints(sym,sym.symoptions,sym.deprecatedmsg);
|
|
||||||
p1.free;
|
|
||||||
p1:=nil;
|
|
||||||
{ static syms are always stored as absolutevarsym to handle scope and storage properly }
|
|
||||||
propaccesslist_to_node(p1,nil,tabsolutevarsym(sym).ref);
|
|
||||||
end
|
|
||||||
else
|
|
||||||
propaccesslist_to_node(p1,st,propaccesslist);
|
propaccesslist_to_node(p1,st,propaccesslist);
|
||||||
include(p1.flags,nf_isproperty);
|
include(p1.flags,nf_isproperty);
|
||||||
consume(_ASSIGNMENT);
|
consume(_ASSIGNMENT);
|
||||||
@ -1134,21 +1148,7 @@ implementation
|
|||||||
fieldvarsym :
|
fieldvarsym :
|
||||||
begin
|
begin
|
||||||
{ generate access code }
|
{ generate access code }
|
||||||
if (sp_static in sym.symoptions) then
|
if not handle_staticfield_access(sym,false,p1) then
|
||||||
begin
|
|
||||||
static_name:=lower(sym.owner.name^)+'_'+sym.name;
|
|
||||||
if sym.owner.defowner.typ=objectdef then
|
|
||||||
searchsym_in_class(tobjectdef(sym.owner.defowner),tobjectdef(sym.owner.defowner),static_name,sym,srsymtable)
|
|
||||||
else
|
|
||||||
searchsym_in_record(trecorddef(sym.owner.defowner),static_name,sym,srsymtable);
|
|
||||||
if assigned(sym) then
|
|
||||||
check_hints(sym,sym.symoptions,sym.deprecatedmsg);
|
|
||||||
p1.free;
|
|
||||||
p1:=nil;
|
|
||||||
{ static syms are always stored as absolutevarsym to handle scope and storage properly }
|
|
||||||
propaccesslist_to_node(p1,nil,tabsolutevarsym(sym).ref);
|
|
||||||
end
|
|
||||||
else
|
|
||||||
propaccesslist_to_node(p1,st,propaccesslist);
|
propaccesslist_to_node(p1,st,propaccesslist);
|
||||||
include(p1.flags,nf_isproperty);
|
include(p1.flags,nf_isproperty);
|
||||||
end;
|
end;
|
||||||
@ -1200,9 +1200,7 @@ implementation
|
|||||||
{ the ID token has to be consumed before calling this function }
|
{ the ID token has to be consumed before calling this function }
|
||||||
procedure do_member_read(structh:tabstractrecorddef;getaddr:boolean;sym:tsym;var p1:tnode;var again:boolean;callflags:tcallnodeflags);
|
procedure do_member_read(structh:tabstractrecorddef;getaddr:boolean;sym:tsym;var p1:tnode;var again:boolean;callflags:tcallnodeflags);
|
||||||
var
|
var
|
||||||
static_name : string;
|
|
||||||
isclassref : boolean;
|
isclassref : boolean;
|
||||||
srsymtable : TSymtable;
|
|
||||||
begin
|
begin
|
||||||
if sym=nil then
|
if sym=nil then
|
||||||
begin
|
begin
|
||||||
@ -1245,21 +1243,7 @@ implementation
|
|||||||
end;
|
end;
|
||||||
fieldvarsym:
|
fieldvarsym:
|
||||||
begin
|
begin
|
||||||
if (sp_static in sym.symoptions) then
|
if not handle_staticfield_access(sym,true,p1) then
|
||||||
begin
|
|
||||||
static_name:=lower(generate_nested_name(sym.owner,'_'))+'_'+sym.name;
|
|
||||||
if sym.Owner.defowner.typ=objectdef then
|
|
||||||
searchsym_in_class(tobjectdef(sym.owner.defowner),tobjectdef(sym.owner.defowner),static_name,sym,srsymtable)
|
|
||||||
else
|
|
||||||
searchsym_in_record(trecorddef(sym.owner.defowner),static_name,sym,srsymtable);
|
|
||||||
if assigned(sym) then
|
|
||||||
check_hints(sym,sym.symoptions,sym.deprecatedmsg);
|
|
||||||
p1.free;
|
|
||||||
p1:=nil;
|
|
||||||
{ static syms are always stored as absolutevarsym to handle scope and storage properly }
|
|
||||||
propaccesslist_to_node(p1,nil,tabsolutevarsym(sym).ref);
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
begin
|
||||||
if isclassref then
|
if isclassref then
|
||||||
if assigned(p1) and
|
if assigned(p1) and
|
||||||
|
Loading…
Reference in New Issue
Block a user