|
@@ -579,21 +579,23 @@ interface
|
|
function getvardef:longint;override;
|
|
function getvardef:longint;override;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+ { tenumdef }
|
|
|
|
+
|
|
tenumdef = class(tstoreddef)
|
|
tenumdef = class(tstoreddef)
|
|
minval,
|
|
minval,
|
|
maxval : aint;
|
|
maxval : aint;
|
|
has_jumps : boolean;
|
|
has_jumps : boolean;
|
|
- firstenum : tsym; {tenumsym}
|
|
|
|
basedef : tenumdef;
|
|
basedef : tenumdef;
|
|
basedefderef : tderef;
|
|
basedefderef : tderef;
|
|
|
|
+ symtable : TSymtable;
|
|
constructor create;
|
|
constructor create;
|
|
constructor create_subrange(_basedef:tenumdef;_min,_max:aint);
|
|
constructor create_subrange(_basedef:tenumdef;_min,_max:aint);
|
|
constructor ppuload(ppufile:tcompilerppufile);
|
|
constructor ppuload(ppufile:tcompilerppufile);
|
|
|
|
+ destructor destroy;override;
|
|
function getcopy : tstoreddef;override;
|
|
function getcopy : tstoreddef;override;
|
|
procedure ppuwrite(ppufile:tcompilerppufile);override;
|
|
procedure ppuwrite(ppufile:tcompilerppufile);override;
|
|
procedure buildderef;override;
|
|
procedure buildderef;override;
|
|
procedure deref;override;
|
|
procedure deref;override;
|
|
- procedure derefimpl;override;
|
|
|
|
function GetTypeName:string;override;
|
|
function GetTypeName:string;override;
|
|
function is_publishable : boolean;override;
|
|
function is_publishable : boolean;override;
|
|
procedure calcsavesize;
|
|
procedure calcsavesize;
|
|
@@ -602,6 +604,7 @@ interface
|
|
procedure setmin(_min:aint);
|
|
procedure setmin(_min:aint);
|
|
function min:aint;
|
|
function min:aint;
|
|
function max:aint;
|
|
function max:aint;
|
|
|
|
+ function getfirstsym:tsym;
|
|
end;
|
|
end;
|
|
|
|
|
|
tsetdef = class(tstoreddef)
|
|
tsetdef = class(tstoreddef)
|
|
@@ -1392,7 +1395,7 @@ implementation
|
|
calcsavesize;
|
|
calcsavesize;
|
|
has_jumps:=false;
|
|
has_jumps:=false;
|
|
basedef:=nil;
|
|
basedef:=nil;
|
|
- firstenum:=nil;
|
|
|
|
|
|
+ symtable:=tenumsymtable.create(self);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
@@ -1404,21 +1407,37 @@ implementation
|
|
basedef:=_basedef;
|
|
basedef:=_basedef;
|
|
calcsavesize;
|
|
calcsavesize;
|
|
has_jumps:=false;
|
|
has_jumps:=false;
|
|
- firstenum:=basedef.firstenum;
|
|
|
|
- while assigned(firstenum) and (tenumsym(firstenum).value<>minval) do
|
|
|
|
- firstenum:=tenumsym(firstenum).nextenum;
|
|
|
|
- end;
|
|
|
|
|
|
+ symtable:=basedef.symtable.getcopy;
|
|
|
|
+ include(defoptions, df_copied_def);
|
|
|
|
+ end;
|
|
|
|
|
|
|
|
|
|
constructor tenumdef.ppuload(ppufile:tcompilerppufile);
|
|
constructor tenumdef.ppuload(ppufile:tcompilerppufile);
|
|
begin
|
|
begin
|
|
inherited ppuload(enumdef,ppufile);
|
|
inherited ppuload(enumdef,ppufile);
|
|
- ppufile.getderef(basedefderef);
|
|
|
|
minval:=ppufile.getaint;
|
|
minval:=ppufile.getaint;
|
|
maxval:=ppufile.getaint;
|
|
maxval:=ppufile.getaint;
|
|
savesize:=ppufile.getaint;
|
|
savesize:=ppufile.getaint;
|
|
has_jumps:=false;
|
|
has_jumps:=false;
|
|
- firstenum:=Nil;
|
|
|
|
|
|
+ if df_copied_def in defoptions then
|
|
|
|
+ begin
|
|
|
|
+ symtable:=nil;
|
|
|
|
+ ppufile.getderef(basedefderef);
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ begin
|
|
|
|
+ // create with nil defowner first to prevent values changes on insert
|
|
|
|
+ symtable:=tenumsymtable.create(nil);
|
|
|
|
+ tenumsymtable(symtable).ppuload(ppufile);
|
|
|
|
+ symtable.defowner:=self;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ destructor tenumdef.destroy;
|
|
|
|
+ begin
|
|
|
|
+ symtable.free;
|
|
|
|
+ symtable:=nil;
|
|
|
|
+ inherited destroy;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
@@ -1431,10 +1450,13 @@ implementation
|
|
result:=tenumdef.create;
|
|
result:=tenumdef.create;
|
|
tenumdef(result).minval:=minval;
|
|
tenumdef(result).minval:=minval;
|
|
tenumdef(result).maxval:=maxval;
|
|
tenumdef(result).maxval:=maxval;
|
|
|
|
+ tenumdef(result).symtable.free;
|
|
|
|
+ tenumdef(result).symtable:=symtable.getcopy;
|
|
|
|
+ tenumdef(result).basedef:=self;
|
|
end;
|
|
end;
|
|
tenumdef(result).has_jumps:=has_jumps;
|
|
tenumdef(result).has_jumps:=has_jumps;
|
|
- tenumdef(result).firstenum:=firstenum;
|
|
|
|
tenumdef(result).basedefderef:=basedefderef;
|
|
tenumdef(result).basedefderef:=basedefderef;
|
|
|
|
+ include(tenumdef(result).defoptions,df_copied_def);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
@@ -1501,43 +1523,54 @@ implementation
|
|
max:=maxval;
|
|
max:=maxval;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+ function tenumdef.getfirstsym: tsym;
|
|
|
|
+ var
|
|
|
|
+ i:integer;
|
|
|
|
+ begin
|
|
|
|
+ for i := 0 to symtable.SymList.Count - 1 do
|
|
|
|
+ begin
|
|
|
|
+ result:=tsym(symtable.SymList[i]);
|
|
|
|
+ if tenumsym(result).value=minval then
|
|
|
|
+ exit;
|
|
|
|
+ end;
|
|
|
|
+ result:=nil;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
|
|
procedure tenumdef.buildderef;
|
|
procedure tenumdef.buildderef;
|
|
begin
|
|
begin
|
|
inherited buildderef;
|
|
inherited buildderef;
|
|
- basedefderef.build(basedef);
|
|
|
|
|
|
+ if df_copied_def in defoptions then
|
|
|
|
+ basedefderef.build(basedef)
|
|
|
|
+ else
|
|
|
|
+ tenumsymtable(symtable).buildderef;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure tenumdef.deref;
|
|
procedure tenumdef.deref;
|
|
begin
|
|
begin
|
|
inherited deref;
|
|
inherited deref;
|
|
- basedef:=tenumdef(basedefderef.resolve);
|
|
|
|
- { restart ordering }
|
|
|
|
- firstenum:=nil;
|
|
|
|
- end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- procedure tenumdef.derefimpl;
|
|
|
|
- begin
|
|
|
|
- if assigned(basedef) and
|
|
|
|
- (firstenum=nil) then
|
|
|
|
|
|
+ if df_copied_def in defoptions then
|
|
begin
|
|
begin
|
|
- firstenum:=basedef.firstenum;
|
|
|
|
- while assigned(firstenum) and (tenumsym(firstenum).value<>minval) do
|
|
|
|
- firstenum:=tenumsym(firstenum).nextenum;
|
|
|
|
- end;
|
|
|
|
|
|
+ basedef:=tenumdef(basedefderef.resolve);
|
|
|
|
+ symtable:=basedef.symtable.getcopy;
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ tenumsymtable(symtable).deref;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure tenumdef.ppuwrite(ppufile:tcompilerppufile);
|
|
procedure tenumdef.ppuwrite(ppufile:tcompilerppufile);
|
|
begin
|
|
begin
|
|
inherited ppuwrite(ppufile);
|
|
inherited ppuwrite(ppufile);
|
|
- ppufile.putderef(basedefderef);
|
|
|
|
ppufile.putaint(min);
|
|
ppufile.putaint(min);
|
|
ppufile.putaint(max);
|
|
ppufile.putaint(max);
|
|
ppufile.putaint(savesize);
|
|
ppufile.putaint(savesize);
|
|
|
|
+ if df_copied_def in defoptions then
|
|
|
|
+ ppufile.putderef(basedefderef);
|
|
ppufile.writeentry(ibenumdef);
|
|
ppufile.writeentry(ibenumdef);
|
|
|
|
+ if not (df_copied_def in defoptions) then
|
|
|
|
+ tenumsymtable(symtable).ppuwrite(ppufile);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|