|
@@ -558,19 +558,23 @@ interface
|
|
_elementdef : tdef;
|
|
_elementdef : tdef;
|
|
_elementdefderef : tderef;
|
|
_elementdefderef : tderef;
|
|
procedure setelementdef(def:tdef);
|
|
procedure setelementdef(def:tdef);
|
|
|
|
+ class function getreusable_intern(def: tdef; elems: asizeint; const options: tarraydefoptions): tarraydef;
|
|
public
|
|
public
|
|
function elesize : asizeint;
|
|
function elesize : asizeint;
|
|
function elepackedbitsize : asizeint;
|
|
function elepackedbitsize : asizeint;
|
|
function elecount : asizeuint;
|
|
function elecount : asizeuint;
|
|
- constructor create_from_pointer(def:tpointerdef);virtual;
|
|
|
|
- constructor create(l,h:asizeint;def:tdef);virtual;
|
|
|
|
|
|
+ constructor create_from_pointer(def: tpointerdef);virtual;
|
|
|
|
+ constructor create(l, h: asizeint; def: tdef);virtual;
|
|
|
|
+ constructor create_vector(l,h:asizeint; def:tdef);
|
|
constructor create_openarray;virtual;
|
|
constructor create_openarray;virtual;
|
|
- class function getreusable(def: tdef; elems: asizeint): tarraydef; virtual;
|
|
|
|
|
|
+ class function getreusable(def: tdef; elems: asizeint): tarraydef;
|
|
|
|
+ class function getreusable_vector(def: tdef; elems: asizeint): tarraydef;
|
|
{ same as above, but in case the def must never be freed after the
|
|
{ same as above, but in case the def must never be freed after the
|
|
current module has been compiled -- even if the def was not written
|
|
current module has been compiled -- even if the def was not written
|
|
to the ppu file (for defs in para locations, as we don't reset them
|
|
to the ppu file (for defs in para locations, as we don't reset them
|
|
so we don't have to recalculate them all the time) }
|
|
so we don't have to recalculate them all the time) }
|
|
class function getreusable_no_free(def: tdef; elems: asizeint): tarraydef;
|
|
class function getreusable_no_free(def: tdef; elems: asizeint): tarraydef;
|
|
|
|
+ class function getreusable_no_free_vector(def: tdef; elems: asizeint): tarraydef;
|
|
constructor ppuload(ppufile:tcompilerppufile);
|
|
constructor ppuload(ppufile:tcompilerppufile);
|
|
destructor destroy; override;
|
|
destructor destroy; override;
|
|
function getcopy : tstoreddef;override;
|
|
function getcopy : tstoreddef;override;
|
|
@@ -588,6 +592,7 @@ interface
|
|
function needs_separate_initrtti : boolean;override;
|
|
function needs_separate_initrtti : boolean;override;
|
|
property elementdef : tdef read _elementdef write setelementdef;
|
|
property elementdef : tdef read _elementdef write setelementdef;
|
|
function is_publishable : boolean;override;
|
|
function is_publishable : boolean;override;
|
|
|
|
+ function is_hwvector: boolean;
|
|
end;
|
|
end;
|
|
tarraydefclass = class of tarraydef;
|
|
tarraydefclass = class of tarraydef;
|
|
|
|
|
|
@@ -4035,7 +4040,7 @@ implementation
|
|
TARRAYDEF
|
|
TARRAYDEF
|
|
***************************************************************************}
|
|
***************************************************************************}
|
|
|
|
|
|
- constructor tarraydef.create(l,h:asizeint;def:tdef);
|
|
|
|
|
|
+ constructor tarraydef.create(l, h: asizeint; def: tdef);
|
|
begin
|
|
begin
|
|
inherited create(arraydef,true);
|
|
inherited create(arraydef,true);
|
|
lowrange:=l;
|
|
lowrange:=l;
|
|
@@ -4048,6 +4053,12 @@ implementation
|
|
symtable:=tarraysymtable.create(self);
|
|
symtable:=tarraysymtable.create(self);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+ constructor tarraydef.create_vector(l ,h: asizeint; def: tdef);
|
|
|
|
+ begin
|
|
|
|
+ self.create(l,h,def);
|
|
|
|
+ include(arrayoptions,ado_IsVector);
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
|
|
constructor tarraydef.create_openarray;
|
|
constructor tarraydef.create_openarray;
|
|
begin
|
|
begin
|
|
@@ -4055,19 +4066,21 @@ implementation
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
- class function tarraydef.getreusable(def: tdef; elems: asizeint): tarraydef;
|
|
|
|
|
|
+ class function tarraydef.getreusable_intern(def: tdef; elems: asizeint; const options: tarraydefoptions): tarraydef;
|
|
var
|
|
var
|
|
res: PHashSetItem;
|
|
res: PHashSetItem;
|
|
oldsymtablestack: tsymtablestack;
|
|
oldsymtablestack: tsymtablestack;
|
|
arrdesc: packed record
|
|
arrdesc: packed record
|
|
def: tdef;
|
|
def: tdef;
|
|
elecount: asizeint;
|
|
elecount: asizeint;
|
|
|
|
+ options: tarraydefoptions
|
|
end;
|
|
end;
|
|
begin
|
|
begin
|
|
if not assigned(current_module) then
|
|
if not assigned(current_module) then
|
|
internalerror(2011081301);
|
|
internalerror(2011081301);
|
|
arrdesc.def:=def;
|
|
arrdesc.def:=def;
|
|
arrdesc.elecount:=elems;
|
|
arrdesc.elecount:=elems;
|
|
|
|
+ arrdesc.options:=options;
|
|
res:=current_module.arraydefs.FindOrAdd(@arrdesc,sizeof(arrdesc));
|
|
res:=current_module.arraydefs.FindOrAdd(@arrdesc,sizeof(arrdesc));
|
|
if not assigned(res^.Data) then
|
|
if not assigned(res^.Data) then
|
|
begin
|
|
begin
|
|
@@ -4082,6 +4095,7 @@ implementation
|
|
symtablestack:=nil;
|
|
symtablestack:=nil;
|
|
result:=carraydef.create(0,elems-1,sizesinttype);
|
|
result:=carraydef.create(0,elems-1,sizesinttype);
|
|
result.elementdef:=def;
|
|
result.elementdef:=def;
|
|
|
|
+ result.arrayoptions:=options;
|
|
setup_reusable_def(def,result,res,oldsymtablestack);
|
|
setup_reusable_def(def,result,res,oldsymtablestack);
|
|
{ res^.Data may still be nil -> don't overwrite result }
|
|
{ res^.Data may still be nil -> don't overwrite result }
|
|
exit;
|
|
exit;
|
|
@@ -4090,6 +4104,18 @@ implementation
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+ class function tarraydef.getreusable(def: tdef; elems: asizeint): tarraydef;
|
|
|
|
+ begin
|
|
|
|
+ result:=getreusable_intern(def,elems,[]);
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ class function tarraydef.getreusable_vector(def: tdef; elems: asizeint): tarraydef;
|
|
|
|
+ begin
|
|
|
|
+ result:=getreusable_intern(def,elems,[ado_IsVector]);
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+
|
|
class function tarraydef.getreusable_no_free(def: tdef; elems: asizeint): tarraydef;
|
|
class function tarraydef.getreusable_no_free(def: tdef; elems: asizeint): tarraydef;
|
|
begin
|
|
begin
|
|
result:=getreusable(def,elems);
|
|
result:=getreusable(def,elems);
|
|
@@ -4097,6 +4123,13 @@ implementation
|
|
include(result.defoptions,df_not_registered_no_free);
|
|
include(result.defoptions,df_not_registered_no_free);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+ class function tarraydef.getreusable_no_free_vector(def: tdef; elems: asizeint): tarraydef;
|
|
|
|
+ begin
|
|
|
|
+ result:=getreusable_vector(def,elems);
|
|
|
|
+ if not result.is_registered then
|
|
|
|
+ include(result.defoptions,df_not_registered_no_free);
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
|
|
destructor tarraydef.destroy;
|
|
destructor tarraydef.destroy;
|
|
begin
|
|
begin
|
|
@@ -4295,8 +4328,10 @@ implementation
|
|
|
|
|
|
function tarraydef.alignment : shortint;
|
|
function tarraydef.alignment : shortint;
|
|
begin
|
|
begin
|
|
|
|
+ if ado_IsVector in arrayoptions then
|
|
|
|
+ alignment:=size
|
|
{ alignment of dyn. arrays doesn't depend on the element size }
|
|
{ alignment of dyn. arrays doesn't depend on the element size }
|
|
- if (ado_IsDynamicArray in arrayoptions) then
|
|
|
|
|
|
+ else if ado_IsDynamicArray in arrayoptions then
|
|
alignment:=voidpointertype.alignment
|
|
alignment:=voidpointertype.alignment
|
|
{ alignment is the target alignment for the used load size }
|
|
{ alignment is the target alignment for the used load size }
|
|
else if (ado_IsBitPacked in arrayoptions) and
|
|
else if (ado_IsBitPacked in arrayoptions) and
|
|
@@ -4368,6 +4403,12 @@ implementation
|
|
Result:=ado_IsDynamicArray in arrayoptions;
|
|
Result:=ado_IsDynamicArray in arrayoptions;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+
|
|
|
|
+ function tarraydef.is_hwvector: boolean;
|
|
|
|
+ begin
|
|
|
|
+ result:=ado_IsVector in arrayoptions;
|
|
|
|
+ end;
|
|
|
|
+
|
|
{***************************************************************************
|
|
{***************************************************************************
|
|
tabstractrecorddef
|
|
tabstractrecorddef
|
|
***************************************************************************}
|
|
***************************************************************************}
|