mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 21:09:24 +02:00
+ 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:
parent
4b1e5f1c9a
commit
36d63b953e
@ -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
|
||||
****************************************************************************}
|
||||
|
@ -43,7 +43,7 @@ type
|
||||
{$endif Test_Double_checksum}
|
||||
|
||||
const
|
||||
CurrentPPUVersion = 170;
|
||||
CurrentPPUVersion = 171;
|
||||
|
||||
{ buffer sizes }
|
||||
maxentrysize = 1024;
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user