mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 09:09:09 +02:00
* 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:
parent
2483ad5939
commit
7a966345e5
@ -192,9 +192,10 @@ interface
|
|||||||
vardefderef : tderef;
|
vardefderef : tderef;
|
||||||
|
|
||||||
procedure setregable;
|
procedure setregable;
|
||||||
procedure setvardef(def:tdef);
|
procedure setvardef(const def: tdef);
|
||||||
|
procedure setvardef_and_regable(def:tdef);
|
||||||
public
|
public
|
||||||
property vardef: tdef read _vardef write setvardef;
|
property vardef: tdef read _vardef write setvardef_and_regable;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
tfieldvarsym = class(tabstractvarsym)
|
tfieldvarsym = class(tabstractvarsym)
|
||||||
@ -1616,16 +1617,12 @@ implementation
|
|||||||
|
|
||||||
|
|
||||||
procedure tabstractvarsym.deref;
|
procedure tabstractvarsym.deref;
|
||||||
var
|
|
||||||
oldvarregable: tvarregable;
|
|
||||||
begin
|
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/ }
|
{ 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 }
|
{ tw7817b.pp: the address is taken of a local variable in an }
|
||||||
{ inlined procedure -> must remain non-regable when inlining) }
|
{ inlined procedure -> must remain non-regable when inlining) }
|
||||||
oldvarregable:=varregable;
|
setvardef(tdef(vardefderef.resolve));
|
||||||
vardef:=tdef(vardefderef.resolve);
|
|
||||||
varregable:=oldvarregable;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -1691,9 +1688,9 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure tabstractvarsym.setvardef(def:tdef);
|
procedure tabstractvarsym.setvardef_and_regable(def:tdef);
|
||||||
begin
|
begin
|
||||||
_vardef := def;
|
setvardef(def);
|
||||||
setregable;
|
setregable;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -1736,6 +1733,12 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure tabstractvarsym.setvardef(const def: tdef);
|
||||||
|
begin
|
||||||
|
_vardef := def;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
{****************************************************************************
|
{****************************************************************************
|
||||||
TFIELDVARSYM
|
TFIELDVARSYM
|
||||||
****************************************************************************}
|
****************************************************************************}
|
||||||
|
Loading…
Reference in New Issue
Block a user