* don't write rtti for static fields so we don't try to initialise/finalise

them (mantis #17546)
  * fixed the various field rtti methods so that they only operate on fields
    and skip the rest (at the end they always typecast the sym to a
    tfieldvarsym, so this could result in wrong memory accesses)

git-svn-id: trunk@16086 -
This commit is contained in:
Jonas Maebe 2010-10-05 14:56:48 +00:00
parent 747a5c804b
commit 13399280dc
3 changed files with 38 additions and 6 deletions

1
.gitattributes vendored
View File

@ -10689,6 +10689,7 @@ tests/webtbs/tw17402a.pp svneol=native#text/pascal
tests/webtbs/tw17413.pp svneol=native#text/plain
tests/webtbs/tw17430.pp svneol=native#text/plain
tests/webtbs/tw1744.pp svneol=native#text/plain
tests/webtbs/tw17546.pp svneol=native#text/plain
tests/webtbs/tw1754c.pp svneol=native#text/plain
tests/webtbs/tw1755.pp svneol=native#text/plain
tests/webtbs/tw1758.pp svneol=native#text/plain

View File

@ -121,9 +121,10 @@ implementation
for i:=0 to st.SymList.Count-1 do
begin
sym:=tsym(st.SymList[i]);
if (rt=fullrtti) or
if (tsym(sym).typ=fieldvarsym) and
not(sp_static in tsym(sym).symoptions) and
(
(tsym(sym).typ=fieldvarsym) and
(rt=fullrtti) or
tfieldvarsym(sym).vardef.needs_inittable
) then
inc(result);
@ -139,9 +140,10 @@ implementation
for i:=0 to st.SymList.Count-1 do
begin
sym:=tsym(st.SymList[i]);
if (rt=fullrtti) or
if (tsym(sym).typ=fieldvarsym) and
not(sp_static in tsym(sym).symoptions) and
(
(tsym(sym).typ=fieldvarsym) and
(rt=fullrtti) or
tfieldvarsym(sym).vardef.needs_inittable
) then
begin
@ -160,9 +162,10 @@ implementation
for i:=0 to st.SymList.Count-1 do
begin
sym:=tsym(st.SymList[i]);
if (rt=fullrtti) or
if (tsym(sym).typ=fieldvarsym) and
not(sp_static in tsym(sym).symoptions) and
(
(tsym(sym).typ=fieldvarsym) and
(rt=fullrtti) or
tfieldvarsym(sym).vardef.needs_inittable
) then
write_rtti(tfieldvarsym(sym).vardef,rt);

28
tests/webtbs/tw17546.pp Normal file
View File

@ -0,0 +1,28 @@
{ %opt=-gh }
{$MODE OBJFPC}
program test02;
{$STATIC ON}
type
TDummyClass = class
IdName: AnsiString; static;
end;
var
o: TDummyClass;
begin
HaltOnNotReleased := true;
TDummyClass.IdName := 'Test';
TDummyClass.IdName := TDummyClass.IdName + 'a';
o := TDummyClass.Create;
WriteLn('Here we go');
o.Free;
WriteLn('We did it!');
end.