* don't recalculate the regable info when dereferencing a symbol's vardef:

o avoid having to save and restore the original info
   o avoids problems in case determining the regable state depends on variables
     that may not have been initialised yet at that point (such as
     voidpointertype/voidcodepointertype in case the size of procvardefs needs
     to be calculated by the regable-determining code)

git-svn-id: trunk@33179 -
This commit is contained in:
Jonas Maebe 2016-03-06 13:20:22 +00:00
parent 2483ad5939
commit 7a966345e5

View File

@ -192,9 +192,10 @@ interface
vardefderef : tderef;
procedure setregable;
procedure setvardef(def:tdef);
procedure setvardef(const def: tdef);
procedure setvardef_and_regable(def:tdef);
public
property vardef: tdef read _vardef write setvardef;
property vardef: tdef read _vardef write setvardef_and_regable;
end;
tfieldvarsym = class(tabstractvarsym)
@ -1616,16 +1617,12 @@ implementation
procedure tabstractvarsym.deref;
var
oldvarregable: tvarregable;
begin
{ setting the vardef also updates varregable. We just loaded this }
{ assigning vardef also updates varregable. We just loaded this }
{ value from a ppu, so it must not be changed (e.g. tw7817a.pp/ }
{ tw7817b.pp: the address is taken of a local variable in an }
{ inlined procedure -> must remain non-regable when inlining) }
oldvarregable:=varregable;
vardef:=tdef(vardefderef.resolve);
varregable:=oldvarregable;
setvardef(tdef(vardefderef.resolve));
end;
@ -1691,9 +1688,9 @@ implementation
end;
procedure tabstractvarsym.setvardef(def:tdef);
procedure tabstractvarsym.setvardef_and_regable(def:tdef);
begin
_vardef := def;
setvardef(def);
setregable;
end;
@ -1736,6 +1733,12 @@ implementation
end;
procedure tabstractvarsym.setvardef(const def: tdef);
begin
_vardef := def;
end;
{****************************************************************************
TFIELDVARSYM
****************************************************************************}