* set vs_initialised for typed consts

* delete old symbol when absolute is used

git-svn-id: trunk@5351 -
This commit is contained in:
peter 2006-11-13 07:42:48 +00:00
parent d0b95a7841
commit 45621c892e
4 changed files with 62 additions and 31 deletions

View File

@ -518,10 +518,6 @@ implementation
TFPObjectList (Copied from rtl/objpas/classes/lists.inc)
*****************************************************************************}
Const
// Ratio of Pointer and Word Size.
WordRatio = SizeOf(Pointer) Div SizeOf(Word);
procedure TFPList.RaiseIndexError(Index : Integer);
begin
Error(SListIndexError, Index);
@ -574,7 +570,7 @@ begin
If NewCount > FCapacity then
SetCapacity(NewCount);
If FCount < NewCount then
FillWord(Flist^[FCount], (NewCount-FCount) * WordRatio, 0);
FillChar(Flist^[FCount], (NewCount-FCount) * sizeof(Pointer), 0);
end;
FCount := Newcount;
end;
@ -591,7 +587,7 @@ begin
Self.Expand;
FList^[FCount] := Item;
Result := FCount;
FCount := FCount + 1;
inc(FCount);
end;
procedure TFPList.Clear;
@ -608,9 +604,9 @@ procedure TFPList.Delete(Index: Integer);
begin
If (Index<0) or (Index>=FCount) then
Error (SListIndexError, Index);
FCount := FCount-1;
dec(FCount);
System.Move (FList^[Index+1], FList^[Index], (FCount - Index) * SizeOf(Pointer));
// Shrink the list if appropriate
{ Shrink the list if appropriate }
if (FCapacity > 256) and (FCount < FCapacity shr 2) then
begin
FCapacity := FCapacity shr 1;
@ -744,10 +740,8 @@ begin
FCount:=NewCount;
end;
// Needed by Sort method.
Procedure QuickSort(FList: PPointerList; L, R : Longint;
Compare: TListSortCompare);
Procedure QuickSort(FList: PPointerList; L, R : Longint;Compare: TListSortCompare);
var
I, J : Longint;
P, Q : Pointer;
@ -1236,14 +1230,42 @@ begin
end;
procedure TFPHashList.Delete(Index: Integer);
var
HashIndex,
PrevIndex : integer;
begin
If (Index<0) or (Index>=FCount) then
Error (SListIndexError, Index);
with FHashList^[Index] do
{ Remove from current Hash }
HashIndex:=FHashTable^[FHashList^[Index].HashValue mod LongWord(FHashCapacity)];
PrevIndex:=-1;
while Index<>-1 do
begin
Data:=nil;
StrIndex:=-1;
if HashIndex=Index then
break;
PrevIndex:=HashIndex;
HashIndex:=FHashList^[HashIndex].NextIndex;
end;
if PrevIndex<>-1 then
FHashList^[PrevIndex].NextIndex:=FHashList^[Index].NextIndex
else
FHashTable^[FHashList^[Index].HashValue mod LongWord(FHashCapacity)]:=FHashList^[Index].NextIndex;
{ Remove from HashList }
dec(FCount);
System.Move (FHashList^[Index+1], FHashList^[Index], (FCount - Index) * Sizeof(THashItem));
{ Shrink the list if appropriate }
if (FCapacity > 256) and (FCount < FCapacity shr 2) then
begin
FCapacity := FCapacity shr 1;
ReallocMem(FHashList, Sizeof(THashItem) * FCapacity);
end;
end;
function TFPHashList.Remove(Item: Pointer): Integer;
begin
Result := IndexOf(Item);
If Result <> -1 then
Self.Delete(Result);
end;
class procedure TFPHashList.Error(const Msg: string; Data: PtrInt);
@ -1301,13 +1323,6 @@ begin
end;
end;
function TFPHashList.Remove(Item: Pointer): Integer;
begin
Result := IndexOf(Item);
If Result <> -1 then
Self.Delete(Result);
end;
function TFPHashList.InternalFind(AHash:LongWord;const AName:string;out PrevIndex:Integer):Integer;
var
HashIndex : Integer;

View File

@ -690,8 +690,6 @@ implementation
vs.defaultconstsym:=tcsym;
symtablestack.top.insert(tcsym);
read_typed_const(current_asmdata.asmlists[al_typedconsts],tcsym);
{ The variable has a value assigned }
vs.varstate:=vs_initialised;
end;
staticvarsym :
begin
@ -714,7 +712,7 @@ implementation
Message(parser_e_absolute_only_one_var);
if vs.typ=staticvarsym then
begin
tstaticvarsym(vs).set_mangledname(target_info.Cprefix+vs.realname);
tstaticvarsym(vs).set_mangledname(C_Name);
include(vs.varoptions,vo_is_external);
end
else
@ -726,6 +724,7 @@ implementation
vs : tabstractvarsym;
abssym : tabsolutevarsym;
pt,hp : tnode;
st : tsymtable;
begin
abssym:=nil;
{ only allowed for one var }
@ -795,8 +794,9 @@ implementation
{ replace old varsym with the new absolutevarsym }
if assigned(abssym) then
begin
Hidesym(vs);
vs.owner.insert(abssym);
st:=vs.owner;
vs.owner.Delete(vs);
st.insert(abssym);
sc[0]:=abssym;
end;
end;
@ -804,7 +804,6 @@ implementation
procedure read_public_and_external(sc:TFPObjectList);
var
vs : tabstractvarsym;
semicolonatend,
is_dll,
is_cdecl,
is_external_var,
@ -822,13 +821,12 @@ implementation
Message(parser_e_no_local_var_external);
exit;
end;
{ defaults }
is_dll:=false;
is_cdecl:=false;
is_external_var:=false;
is_public_var:=false;
semicolonatend:= false;
C_name:=vs.realname;
{ macpas specific handling due to some switches}

View File

@ -1065,8 +1065,8 @@ implementation
begin
{ mark the staticvarsym as typedconst }
include(sym.varoptions,vo_is_typed_const);
{ the variable is declared }
sym.varstate:=vs_declared;
{ The variable has a value assigned }
sym.varstate:=vs_initialised;
{ the variable can't be placed in a register }
sym.varregable:=vr_none;

View File

@ -106,9 +106,11 @@ interface
procedure clear;virtual;
function checkduplicate(var s:THashedIDString;sym:TSymEntry):boolean;virtual;
procedure insert(sym:TSymEntry;checkdup:boolean=true);
procedure Delete(sym:TSymEntry);
function Find(const s:TIDString) : TSymEntry;
function FindWithHash(const s:THashedIDString) : TSymEntry;virtual;
procedure insertdef(def:TDefEntry);virtual;
procedure deletedef(def:TDefEntry);
function iscurrentunit:boolean;virtual;
end;
@ -297,6 +299,14 @@ implementation
end;
procedure TSymtable.Delete(sym:TSymEntry);
begin
if sym.Owner<>self then
internalerror(200611121);
SymList.Remove(sym);
end;
procedure TSymtable.insertdef(def:TDefEntry);
begin
DefList.Add(def);
@ -304,6 +314,14 @@ implementation
end;
procedure TSymtable.deletedef(def:TDefEntry);
begin
if def.Owner<>self then
internalerror(200611122);
DefList.Remove(def);
end;
function TSymtable.Find(const s : TIDString) : TSymEntry;
begin
result:=TSymEntry(SymList.Find(s));