|
@@ -179,13 +179,9 @@ interface
|
|
varspez : tvarspez; { sets the type of access }
|
|
varspez : tvarspez; { sets the type of access }
|
|
varregable : tvarregable;
|
|
varregable : tvarregable;
|
|
varstate : tvarstate;
|
|
varstate : tvarstate;
|
|
- { Has the address of this variable potentially escaped the
|
|
|
|
- block in which is was declared?
|
|
|
|
- could also be part of tabstractnormalvarsym, but there's
|
|
|
|
- one byte left here till the next 4 byte alignment }
|
|
|
|
- addr_taken : boolean;
|
|
|
|
- { true if the variable is accessed in a different scope }
|
|
|
|
- different_scope : boolean;
|
|
|
|
|
|
+ {could also be part of tabstractnormalvarsym, but there's
|
|
|
|
+ one byte left here till the next 4 byte alignment }
|
|
|
|
+ varsymaccess : tvarsymaccessflags;
|
|
constructor create(st:tsymtyp;const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions);
|
|
constructor create(st:tsymtyp;const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions);
|
|
constructor ppuload(st:tsymtyp;ppufile:tcompilerppufile);
|
|
constructor ppuload(st:tsymtyp;ppufile:tcompilerppufile);
|
|
procedure ppuwrite(ppufile:tcompilerppufile);override;
|
|
procedure ppuwrite(ppufile:tcompilerppufile);override;
|
|
@@ -198,11 +194,17 @@ interface
|
|
_vardef : tdef;
|
|
_vardef : tdef;
|
|
vardefderef : tderef;
|
|
vardefderef : tderef;
|
|
|
|
|
|
|
|
+ function get_addr_taken: boolean;
|
|
|
|
+ function get_different_scope: boolean;
|
|
procedure setregable;
|
|
procedure setregable;
|
|
procedure setvardef(const def: tdef);
|
|
procedure setvardef(const def: tdef);
|
|
procedure setvardef_and_regable(def:tdef);
|
|
procedure setvardef_and_regable(def:tdef);
|
|
|
|
+ procedure set_addr_taken(AValue: boolean);
|
|
|
|
+ procedure set_different_scope(AValue: boolean);
|
|
public
|
|
public
|
|
property vardef: tdef read _vardef write setvardef_and_regable;
|
|
property vardef: tdef read _vardef write setvardef_and_regable;
|
|
|
|
+ property addr_taken: boolean read get_addr_taken write set_addr_taken;
|
|
|
|
+ property different_scope: boolean read get_different_scope write set_different_scope;
|
|
end;
|
|
end;
|
|
|
|
|
|
tfieldvarsym = class(tabstractvarsym)
|
|
tfieldvarsym = class(tabstractvarsym)
|
|
@@ -1638,8 +1640,7 @@ implementation
|
|
varstate:=vs_readwritten;
|
|
varstate:=vs_readwritten;
|
|
varspez:=tvarspez(ppufile.getbyte);
|
|
varspez:=tvarspez(ppufile.getbyte);
|
|
varregable:=tvarregable(ppufile.getbyte);
|
|
varregable:=tvarregable(ppufile.getbyte);
|
|
- addr_taken:=ppufile.getboolean;
|
|
|
|
- different_scope:=ppufile.getboolean;
|
|
|
|
|
|
+ ppufile.getset(tppuset1(varsymaccess));
|
|
ppufile.getderef(vardefderef);
|
|
ppufile.getderef(vardefderef);
|
|
ppufile.getset(tppuset4(varoptions));
|
|
ppufile.getset(tppuset4(varoptions));
|
|
end;
|
|
end;
|
|
@@ -1671,8 +1672,7 @@ implementation
|
|
oldintfcrc:=ppufile.do_crc;
|
|
oldintfcrc:=ppufile.do_crc;
|
|
ppufile.do_crc:=false;
|
|
ppufile.do_crc:=false;
|
|
ppufile.putbyte(byte(varregable));
|
|
ppufile.putbyte(byte(varregable));
|
|
- ppufile.putboolean(addr_taken);
|
|
|
|
- ppufile.putboolean(different_scope);
|
|
|
|
|
|
+ ppufile.putset(tppuset1(varsymaccess));
|
|
ppufile.do_crc:=oldintfcrc;
|
|
ppufile.do_crc:=oldintfcrc;
|
|
ppufile.putderef(vardefderef);
|
|
ppufile.putderef(vardefderef);
|
|
ppufile.putset(tppuset4(varoptions));
|
|
ppufile.putset(tppuset4(varoptions));
|
|
@@ -1731,6 +1731,24 @@ implementation
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+ procedure tabstractvarsym.set_addr_taken(AValue: boolean);
|
|
|
|
+ begin
|
|
|
|
+ if AValue then
|
|
|
|
+ include(varsymaccess, vsa_addr_taken)
|
|
|
|
+ else
|
|
|
|
+ exclude(varsymaccess, vsa_addr_taken);
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ procedure tabstractvarsym.set_different_scope(AValue: boolean);
|
|
|
|
+ begin
|
|
|
|
+ if AValue then
|
|
|
|
+ include(varsymaccess, vsa_different_scope)
|
|
|
|
+ else
|
|
|
|
+ exclude(varsymaccess, vsa_different_scope);
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+
|
|
procedure tabstractvarsym.setregable;
|
|
procedure tabstractvarsym.setregable;
|
|
begin
|
|
begin
|
|
if vo_volatile in varoptions then
|
|
if vo_volatile in varoptions then
|
|
@@ -1771,6 +1789,18 @@ implementation
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+ function tabstractvarsym.get_addr_taken: boolean;
|
|
|
|
+ begin
|
|
|
|
+ result:=vsa_addr_taken in varsymaccess;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ function tabstractvarsym.get_different_scope: boolean;
|
|
|
|
+ begin
|
|
|
|
+ result:=vsa_different_scope in varsymaccess;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+
|
|
procedure tabstractvarsym.setvardef(const def: tdef);
|
|
procedure tabstractvarsym.setvardef(const def: tdef);
|
|
begin
|
|
begin
|
|
_vardef := def;
|
|
_vardef := def;
|