+ added an i8086 specific boolean property is_huge to the tarraydef. For now it

will only be used for indexing huge pointers (i.e. only huge arrays with the
  ado_IsConvertedPointer array option will be supported). In the distant future,
  regular huge arrays may be supported as well (but that would require
  substantially more work, including adding hugeness support to other structures
  such as records, objects and classes, so I'm not planning on doing it anytime
  soon).

git-svn-id: trunk@28270 -
This commit is contained in:
nickysn 2014-07-26 13:27:46 +00:00
parent 4b1e5f1c9a
commit 36d63b953e
3 changed files with 66 additions and 1 deletions

View File

@ -78,7 +78,19 @@ type
end;
tcpuclassrefdefclass = class of tcpuclassrefdef;
{ tcpuarraydef }
tcpuarraydef = class(tarraydef)
private
huge: Boolean;
protected
procedure ppuload_platform(ppufile: tcompilerppufile); override;
procedure ppuwrite_platform(ppufile: tcompilerppufile); override;
public
constructor create_from_pointer(def:tpointerdef);override;
function getcopy: tstoreddef; override;
function GetTypeName:string;override;
property is_huge: Boolean read huge write huge;
end;
tcpuarraydefclass = class of tcpuarraydef;
@ -216,6 +228,57 @@ implementation
end;
{****************************************************************************
tcpuarraydef
****************************************************************************}
constructor tcpuarraydef.create_from_pointer(def: tpointerdef);
begin
if tcpupointerdef(def).x86pointertyp=x86pt_huge then
begin
huge:=true;
{ use -1 so that the elecount will not overflow }
self.create(0,high(asizeint)-1,s32inttype);
arrayoptions:=[ado_IsConvertedPointer];
setelementdef(def.pointeddef);
end
else
begin
huge:=false;
inherited create_from_pointer(def);
end;
end;
function tcpuarraydef.getcopy: tstoreddef;
begin
result:=inherited;
tcpuarraydef(result).huge:=huge;
end;
function tcpuarraydef.GetTypeName: string;
begin
Result:=inherited;
if is_huge then
Result:='Huge '+Result;
end;
procedure tcpuarraydef.ppuload_platform(ppufile: tcompilerppufile);
begin
inherited;
huge:=(ppufile.getbyte<>0);
end;
procedure tcpuarraydef.ppuwrite_platform(ppufile: tcompilerppufile);
begin
inherited;
ppufile.putbyte(byte(huge));
end;
{****************************************************************************
tcpuprocdef
****************************************************************************}

View File

@ -43,7 +43,7 @@ type
{$endif Test_Double_checksum}
const
CurrentPPUVersion = 170;
CurrentPPUVersion = 171;
{ buffer sizes }
maxentrysize = 1024;

View File

@ -2865,6 +2865,8 @@ begin
writeln([space,' Range : ',arrdef.RangeLow,' to ',arrdef.RangeHigh]);
write ([space,' Options : ']);
readarraydefoptions(arrdef);
if tsystemcpu(ppufile.header.cpu)=cpu_i8086 then
writeln([space,' Huge : ',(getbyte<>0)]);
readsymtable('symbols', arrdef);
end;