* fixed alignment issues

This commit is contained in:
florian 2004-03-27 23:22:38 +00:00
parent a7f1878fc9
commit 1d209e605e

View File

@ -91,6 +91,10 @@ Var Temp : PByte;
I : longint; I : longint;
Size,Count : longint; Size,Count : longint;
TInfo : Pointer; TInfo : Pointer;
{$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
ArrayRec : TArrayRec;
RecElem : TRecElem;
{$endif FPC_REQUIRES_PROPER_ALIGNMENT}
begin begin
Temp:=PByte(TypeInfo); Temp:=PByte(TypeInfo);
case temp^ of case temp^ of
@ -101,11 +105,17 @@ begin
inc(temp); inc(temp);
I:=temp^; I:=temp^;
inc(temp,(I+1)); // skip name string; inc(temp,(I+1)); // skip name string;
{$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
move(PArrayRec(Temp)^,ArrayRec,sizeof(ArrayRec));
for I:=0 to ArrayRec.Count-1 do
int_Initialize (Data+(I*ArrayRec.size),ArrayRec.Info);
{$else FPC_REQUIRES_PROPER_ALIGNMENT}
Size:=PArrayRec(Temp)^.Size; // get element size Size:=PArrayRec(Temp)^.Size; // get element size
Count:=PArrayRec(Temp)^.Count; // get element Count Count:=PArrayRec(Temp)^.Count; // get element Count
TInfo:=PArrayRec(Temp)^.Info; // Get element info TInfo:=PArrayRec(Temp)^.Info; // Get element info
For I:=0 to Count-1 do For I:=0 to Count-1 do
int_Initialize (Data+(I*size),TInfo); int_Initialize (Data+(I*size),TInfo);
{$endif FPC_REQUIRES_PROPER_ALIGNMENT}
end; end;
tkObject, tkObject,
tkRecord: tkRecord:
@ -113,10 +123,19 @@ begin
inc(Temp); inc(Temp);
I:=Temp^; I:=Temp^;
inc(temp,I+1); // skip name string; inc(temp,I+1); // skip name string;
{$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
move(PRecRec(Temp)^.Count,Count,sizeof(Count)); // get element Count
For I:=1 to count Do
begin
move(PRecRec(Temp)^.elements[I],RecElem,sizeof(TRecElem));
int_Initialize (Data+RecElem.Offset,RecElem.Info);
end;
{$else FPC_REQUIRES_PROPER_ALIGNMENT}
Count:=PRecRec(Temp)^.Count; // get element Count Count:=PRecRec(Temp)^.Count; // get element Count
For I:=1 to count Do For I:=1 to count Do
With PRecRec(Temp)^.elements[I] do With PRecRec(Temp)^.elements[I] do
int_Initialize (Data+Offset,Info); int_Initialize (Data+Offset,Info);
{$endif FPC_REQUIRES_PROPER_ALIGNMENT}
end; end;
{$ifdef HASVARIANT} {$ifdef HASVARIANT}
tkVariant: tkVariant:
@ -133,6 +152,10 @@ Var Temp : PByte;
I : longint; I : longint;
Size,Count : longint; Size,Count : longint;
TInfo : Pointer; TInfo : Pointer;
{$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
ArrayRec : TArrayRec;
RecElem : TRecElem;
{$endif FPC_REQUIRES_PROPER_ALIGNMENT}
begin begin
Temp:=PByte(TypeInfo); Temp:=PByte(TypeInfo);
case temp^ of case temp^ of
@ -147,11 +170,17 @@ begin
inc(Temp); inc(Temp);
I:=temp^; I:=temp^;
inc(temp,I+1); // skip name string; inc(temp,I+1); // skip name string;
{$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
move(PArrayRec(Temp)^,ArrayRec,sizeof(ArrayRec));
for I:=0 to ArrayRec.Count-1 do
int_Finalize (Data+(I*ArrayRec.size),ArrayRec.Info);
{$else FPC_REQUIRES_PROPER_ALIGNMENT}
Size:=PArrayRec(Temp)^.Size; // get element size Size:=PArrayRec(Temp)^.Size; // get element size
Count:=PArrayRec(Temp)^.Count; // get element Count Count:=PArrayRec(Temp)^.Count; // get element Count
TInfo:=PArrayRec(Temp)^.Info; // Get element info TInfo:=PArrayRec(Temp)^.Info; // Get element info
For I:=0 to Count-1 do For I:=0 to Count-1 do
int_Finalize (Data+(I*size),TInfo); int_Finalize (Data+(I*size),TInfo);
{$endif FPC_REQUIRES_PROPER_ALIGNMENT}
end; end;
tkObject, tkObject,
tkRecord: tkRecord:
@ -159,10 +188,19 @@ begin
inc(Temp); inc(Temp);
I:=Temp^; I:=Temp^;
inc(temp,I+1); // skip name string; inc(temp,I+1); // skip name string;
{$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
move(PRecRec(Temp)^.Count,Count,sizeof(Count)); // get element Count
For I:=1 to count Do
begin
move(PRecRec(Temp)^.elements[I],RecElem,sizeof(TRecElem));
int_Finalize (Data+RecElem.Offset,RecElem.Info);
end;
{$else FPC_REQUIRES_PROPER_ALIGNMENT}
Count:=PRecRec(Temp)^.Count; // get element Count Count:=PRecRec(Temp)^.Count; // get element Count
For I:=1 to count do For I:=1 to count do
With PRecRec(Temp)^.elements[I] do With PRecRec(Temp)^.elements[I] do
int_Finalize (Data+Offset,Info); int_Finalize (Data+Offset,Info);
{$endif FPC_REQUIRES_PROPER_ALIGNMENT}
end; end;
{$ifdef HASINTF} {$ifdef HASINTF}
tkInterface: tkInterface:
@ -186,6 +224,10 @@ Var Temp : PByte;
I : longint; I : longint;
Size,Count : longint; Size,Count : longint;
TInfo : Pointer; TInfo : Pointer;
{$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
ArrayRec : TArrayRec;
RecElem : TRecElem;
{$endif FPC_REQUIRES_PROPER_ALIGNMENT}
begin begin
Temp:=PByte(TypeInfo); Temp:=PByte(TypeInfo);
case temp^ of case temp^ of
@ -200,11 +242,17 @@ begin
Inc(Temp); Inc(Temp);
I:=temp^; I:=temp^;
inc(temp,I+1); // skip name string; inc(temp,I+1); // skip name string;
{$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
move(PArrayRec(Temp)^,ArrayRec,sizeof(ArrayRec));
for I:=0 to ArrayRec.Count-1 do
int_AddRef (Data+(I*ArrayRec.size),ArrayRec.Info);
{$else FPC_REQUIRES_PROPER_ALIGNMENT}
Size:=PArrayRec(Temp)^.Size; // get element size Size:=PArrayRec(Temp)^.Size; // get element size
Count:=PArrayRec(Temp)^.Count; // get element Count Count:=PArrayRec(Temp)^.Count; // get element Count
TInfo:=PArrayRec(Temp)^.Info; // Get element info TInfo:=PArrayRec(Temp)^.Info; // Get element info
For I:=0 to Count-1 do For I:=0 to Count-1 do
int_AddRef (Data+(I*size),TInfo); int_AddRef (Data+(I*size),TInfo);
{$endif FPC_REQUIRES_PROPER_ALIGNMENT}
end; end;
tkobject, tkobject,
tkrecord : tkrecord :
@ -212,10 +260,19 @@ begin
Inc(Temp); Inc(Temp);
I:=Temp^; I:=Temp^;
temp:=temp+(I+1); // skip name string; temp:=temp+(I+1); // skip name string;
{$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
move(PRecRec(Temp)^.Count,Count,sizeof(Count)); // get element Count
For I:=1 to count Do
begin
move(PRecRec(Temp)^.elements[I],RecElem,sizeof(TRecElem));
int_AddRef (Data+RecElem.Offset,RecElem.Info);
end;
{$else FPC_REQUIRES_PROPER_ALIGNMENT}
Count:=PRecRec(Temp)^.Count; // get element Count Count:=PRecRec(Temp)^.Count; // get element Count
For I:=1 to count do For I:=1 to count do
With PRecRec(Temp)^.elements[I] do With PRecRec(Temp)^.elements[I] do
int_AddRef (Data+Offset,Info); int_AddRef (Data+Offset,Info);
{$endif FPC_REQUIRES_PROPER_ALIGNMENT}
end; end;
tkDynArray: tkDynArray:
fpc_dynarray_incr_ref(PPointer(Data)^); fpc_dynarray_incr_ref(PPointer(Data)^);
@ -238,6 +295,10 @@ Var Temp : PByte;
I : longint; I : longint;
Size,Count : longint; Size,Count : longint;
TInfo : Pointer; TInfo : Pointer;
{$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
ArrayRec : TArrayRec;
RecElem : TRecElem;
{$endif FPC_REQUIRES_PROPER_ALIGNMENT}
begin begin
Temp:=PByte(TypeInfo); Temp:=PByte(TypeInfo);
case temp^ of case temp^ of
@ -253,11 +314,17 @@ begin
inc(Temp); inc(Temp);
I:=temp^; I:=temp^;
inc(temp,I+1); // skip name string; inc(temp,I+1); // skip name string;
{$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
move(PArrayRec(Temp)^,ArrayRec,sizeof(ArrayRec));
for I:=0 to ArrayRec.Count-1 do
fpc_systemDecRef (Data+(I*ArrayRec.size),ArrayRec.Info);
{$else FPC_REQUIRES_PROPER_ALIGNMENT}
Size:=PArrayRec(Temp)^.Size; // get element size Size:=PArrayRec(Temp)^.Size; // get element size
Count:=PArrayRec(Temp)^.Count; // get element Count Count:=PArrayRec(Temp)^.Count; // get element Count
TInfo:=PArrayRec(Temp)^.Info; // Get element info TInfo:=PArrayRec(Temp)^.Info; // Get element info
For I:=0 to Count-1 do For I:=0 to Count-1 do
fpc_systemDecRef (Data+(I*size),TInfo); fpc_systemDecRef (Data+(I*size),TInfo);
{$endif FPC_REQUIRES_PROPER_ALIGNMENT}
end; end;
tkobject, tkobject,
tkrecord: tkrecord:
@ -265,10 +332,19 @@ begin
inc(Temp); inc(Temp);
I:=temp^; I:=temp^;
inc(temp,I+1); // skip name string; inc(temp,I+1); // skip name string;
{$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
move(PRecRec(Temp)^.Count,Count,sizeof(Count)); // get element Count
For I:=1 to count Do
begin
move(PRecRec(Temp)^.elements[I],RecElem,sizeof(TRecElem));
fpc_systemDecRef (Data+RecElem.Offset,RecElem.Info);
end;
{$else FPC_REQUIRES_PROPER_ALIGNMENT}
Count:=PRecRec(Temp)^.Count; // get element Count Count:=PRecRec(Temp)^.Count; // get element Count
For I:=1 to count do For I:=1 to count do
With PRecRec(Temp)^.elements[I] do With PRecRec(Temp)^.elements[I] do
fpc_systemDecRef (Data+Offset,Info); fpc_systemDecRef (Data+Offset,Info);
{$endif FPC_REQUIRES_PROPER_ALIGNMENT}
end; end;
tkDynArray: tkDynArray:
fpc_dynarray_decr_ref(PPointer(Data)^,TypeInfo); fpc_dynarray_decr_ref(PPointer(Data)^,TypeInfo);
@ -292,7 +368,10 @@ procedure fpc_finalize_array(data,typeinfo : pointer;count,size : longint); [Pub
{ {
$Log$ $Log$
Revision 1.10 2004-02-26 16:19:01 peter Revision 1.11 2004-03-27 23:22:38 florian
* fixed alignment issues
Revision 1.10 2004/02/26 16:19:01 peter
* tkclass removed from finalize() * tkclass removed from finalize()
* cleanupinstance now parses the tkclass rtti entry itself and * cleanupinstance now parses the tkclass rtti entry itself and
calls finalize() for the rtti members calls finalize() for the rtti members