mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-16 04:30:35 +01:00
* support for marking arraydefs as vectors
git-svn-id: trunk@43782 -
This commit is contained in:
parent
1e3f72403e
commit
f5833dc048
@ -555,7 +555,8 @@ type
|
||||
ado_IsConstructor, // array constructor (e.g. something = [1,2,3])
|
||||
ado_IsArrayOfConst, // array of const
|
||||
ado_IsConstString, // string constant
|
||||
ado_IsBitPacked // bitpacked array
|
||||
ado_IsBitPacked, // bitpacked array
|
||||
ado_IsVector // Vector
|
||||
);
|
||||
tarraydefoptions=set of tarraydefoption;
|
||||
|
||||
|
||||
@ -558,19 +558,23 @@ interface
|
||||
_elementdef : tdef;
|
||||
_elementdefderef : tderef;
|
||||
procedure setelementdef(def:tdef);
|
||||
class function getreusable_intern(def: tdef; elems: asizeint; const options: tarraydefoptions): tarraydef;
|
||||
public
|
||||
function elesize : asizeint;
|
||||
function elepackedbitsize : asizeint;
|
||||
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;
|
||||
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
|
||||
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
|
||||
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_vector(def: tdef; elems: asizeint): tarraydef;
|
||||
constructor ppuload(ppufile:tcompilerppufile);
|
||||
destructor destroy; override;
|
||||
function getcopy : tstoreddef;override;
|
||||
@ -588,6 +592,7 @@ interface
|
||||
function needs_separate_initrtti : boolean;override;
|
||||
property elementdef : tdef read _elementdef write setelementdef;
|
||||
function is_publishable : boolean;override;
|
||||
function is_hwvector: boolean;
|
||||
end;
|
||||
tarraydefclass = class of tarraydef;
|
||||
|
||||
@ -4035,7 +4040,7 @@ implementation
|
||||
TARRAYDEF
|
||||
***************************************************************************}
|
||||
|
||||
constructor tarraydef.create(l,h:asizeint;def:tdef);
|
||||
constructor tarraydef.create(l, h: asizeint; def: tdef);
|
||||
begin
|
||||
inherited create(arraydef,true);
|
||||
lowrange:=l;
|
||||
@ -4048,6 +4053,12 @@ implementation
|
||||
symtable:=tarraysymtable.create(self);
|
||||
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;
|
||||
begin
|
||||
@ -4055,19 +4066,21 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
class function tarraydef.getreusable(def: tdef; elems: asizeint): tarraydef;
|
||||
class function tarraydef.getreusable_intern(def: tdef; elems: asizeint; const options: tarraydefoptions): tarraydef;
|
||||
var
|
||||
res: PHashSetItem;
|
||||
oldsymtablestack: tsymtablestack;
|
||||
arrdesc: packed record
|
||||
def: tdef;
|
||||
elecount: asizeint;
|
||||
options: tarraydefoptions
|
||||
end;
|
||||
begin
|
||||
if not assigned(current_module) then
|
||||
internalerror(2011081301);
|
||||
arrdesc.def:=def;
|
||||
arrdesc.elecount:=elems;
|
||||
arrdesc.options:=options;
|
||||
res:=current_module.arraydefs.FindOrAdd(@arrdesc,sizeof(arrdesc));
|
||||
if not assigned(res^.Data) then
|
||||
begin
|
||||
@ -4082,6 +4095,7 @@ implementation
|
||||
symtablestack:=nil;
|
||||
result:=carraydef.create(0,elems-1,sizesinttype);
|
||||
result.elementdef:=def;
|
||||
result.arrayoptions:=options;
|
||||
setup_reusable_def(def,result,res,oldsymtablestack);
|
||||
{ res^.Data may still be nil -> don't overwrite result }
|
||||
exit;
|
||||
@ -4090,6 +4104,18 @@ implementation
|
||||
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;
|
||||
begin
|
||||
result:=getreusable(def,elems);
|
||||
@ -4097,6 +4123,13 @@ implementation
|
||||
include(result.defoptions,df_not_registered_no_free);
|
||||
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;
|
||||
begin
|
||||
@ -4295,8 +4328,10 @@ implementation
|
||||
|
||||
function tarraydef.alignment : shortint;
|
||||
begin
|
||||
if ado_IsVector in arrayoptions then
|
||||
alignment:=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 is the target alignment for the used load size }
|
||||
else if (ado_IsBitPacked in arrayoptions) and
|
||||
@ -4368,6 +4403,12 @@ implementation
|
||||
Result:=ado_IsDynamicArray in arrayoptions;
|
||||
end;
|
||||
|
||||
|
||||
function tarraydef.is_hwvector: boolean;
|
||||
begin
|
||||
result:=ado_IsVector in arrayoptions;
|
||||
end;
|
||||
|
||||
{***************************************************************************
|
||||
tabstractrecorddef
|
||||
***************************************************************************}
|
||||
|
||||
@ -3251,7 +3251,8 @@ const
|
||||
{ ado_IsConstructor } 'IsConstructor',
|
||||
{ ado_IsArrayOfConst } 'ArrayOfConst',
|
||||
{ ado_IsConstString } 'ConstString',
|
||||
{ ado_IsBitPacked } 'BitPacked'
|
||||
{ ado_IsBitPacked } 'BitPacked',
|
||||
{ ado_IsVector } 'Vector'
|
||||
);
|
||||
var
|
||||
symoptions: tarraydefoptions;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user