mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-10 05:46:14 +02:00
+ Implemented DecRef
This commit is contained in:
parent
cabd568a3d
commit
b36e918420
@ -14,6 +14,7 @@
|
||||
**********************************************************************}
|
||||
|
||||
{ Run-Time type information routines - processor dependent part }
|
||||
{$ASMMODE DIRECT}
|
||||
|
||||
Procedure Initialize (Data,TypeInfo : pointer);[Alias : 'INITIALIZE'];assembler;
|
||||
|
||||
@ -251,7 +252,7 @@ asm
|
||||
.DoAnsiStringAddRef:
|
||||
movl 8(%ebp),%eax
|
||||
pushl %eax
|
||||
call DECR_ANSI_REF
|
||||
call INCR_ANSI_REF
|
||||
.ExitAddRef:
|
||||
pop %edx
|
||||
pop %ecx
|
||||
@ -261,9 +262,97 @@ asm
|
||||
ret $8
|
||||
end;
|
||||
|
||||
Procedure DecRef (Data,TypeInfo : Pointer); [alias : 'DECREF'];Assembler;
|
||||
|
||||
asm
|
||||
# Save registers
|
||||
push %esp
|
||||
movl %esp,%ebp
|
||||
push %eax
|
||||
push %ebx
|
||||
push %ecx
|
||||
push %edx
|
||||
# decide what type it is
|
||||
movl 12(%ebp),%ebx
|
||||
movb (%ebx),%al
|
||||
subb $10,%al
|
||||
jz .DoAnsiStringDecRef
|
||||
decb %al
|
||||
jz .DoAnsiStringDecRef
|
||||
subb $2,%al
|
||||
jz .DoArrayDecRef
|
||||
decb %al
|
||||
jz .DoRecordDecRef
|
||||
jmp .ExitDecRef
|
||||
.DoRecordDecRef:
|
||||
incl %ebx
|
||||
movzbl (%ebx),%eax
|
||||
# Skip also recordsize.
|
||||
addl $5,%eax
|
||||
addl %eax,%ebx
|
||||
# %ebx points to element count. Set in %edx
|
||||
movl (%ebx),%edx
|
||||
addl $4,%ebx
|
||||
# %ebx points to First element in record
|
||||
.MyRecordDecRefLoop:
|
||||
decl %edx
|
||||
jl .ExitDecRef
|
||||
# Calculate data
|
||||
movl 8(%ebp),%eax
|
||||
addl (%ebx),%eax
|
||||
addl $4,%ebx
|
||||
# Push type
|
||||
pushl (%ebx)
|
||||
addl $4,%ebx
|
||||
# push data
|
||||
pushl %eax
|
||||
call DecRef
|
||||
jmp .MyRecordDecRefLoop
|
||||
# Array handling
|
||||
.DoArrayDecRef:
|
||||
# %ebx points to size. Put size in ecx
|
||||
movl (%ebx),%ecx
|
||||
addl $4, %ebx
|
||||
# %ebx points to count. Put count in %edx
|
||||
movl (%ebx),%edx
|
||||
addl $4, %ebx
|
||||
# %ebx points to type. Put into ebx.
|
||||
# Start treating elements.
|
||||
.MyArrayDecRefLoop:
|
||||
decl %edx
|
||||
jl .ExitDecRef
|
||||
# push type
|
||||
pushl (%ebx)
|
||||
# calculate data
|
||||
movl %ecx,%eax
|
||||
imull %edx,%eax
|
||||
addl 8(%ebp),%eax
|
||||
# push data
|
||||
pushl %eax
|
||||
call DecRef
|
||||
jmp .MyArrayDecRefLoop
|
||||
# AnsiString handling :
|
||||
.DoAnsiStringDecRef:
|
||||
movl 8(%ebp),%eax
|
||||
pushl %eax
|
||||
call DECR_ANSI_REF
|
||||
.ExitDecRef:
|
||||
pop %edx
|
||||
pop %ecx
|
||||
pop %ebx
|
||||
pop %eax
|
||||
leave
|
||||
ret $8
|
||||
end;
|
||||
|
||||
{$ASMMODE DEFAULT}
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.1 1998-06-08 15:32:12 michael
|
||||
Revision 1.2 1998-06-08 19:31:03 michael
|
||||
+ Implemented DecRef
|
||||
|
||||
Revision 1.1 1998/06/08 15:32:12 michael
|
||||
+ Split rtti according to processor. Implemented optimized i386 code.
|
||||
|
||||
}
|
@ -108,7 +108,7 @@ begin
|
||||
Count:=PArrayRec(Temp)^.Count; // get element Count
|
||||
TInfo:=PArrayRec(Temp)^.Info; // Get element info
|
||||
For I:=0 to Count-1 do
|
||||
Finalize (Data+(I*size),TInfo);
|
||||
AddRef (Data+(I*size),TInfo);
|
||||
end;
|
||||
tkrecord :
|
||||
begin
|
||||
@ -119,14 +119,53 @@ begin
|
||||
Count:=PRecRec(Temp)^.Count; // get element Count
|
||||
For I:=1 to count do
|
||||
With PRecRec(Temp)^.elements[I] do
|
||||
Finalize (Data+Offset,Info);
|
||||
AddRef (Data+Offset,Info);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
Procedure DecRef (Data, TypeInfo : Pointer);
|
||||
|
||||
Var Temp : PByte;
|
||||
I : longint;
|
||||
Size,Count : longint;
|
||||
TInfo : Pointer;
|
||||
|
||||
begin
|
||||
Temp:=PByte(TypeInfo);
|
||||
case temp^ of
|
||||
tkLstring,tkWstring : Decr_Ansi_ref(Data);
|
||||
tkArray :
|
||||
begin
|
||||
Temp:=Temp+1;
|
||||
I:=temp^;
|
||||
temp:=temp+(I+1); // skip name string;
|
||||
Size:=PArrayRec(Temp)^.Size; // get element size
|
||||
Count:=PArrayRec(Temp)^.Count; // get element Count
|
||||
TInfo:=PArrayRec(Temp)^.Info; // Get element info
|
||||
For I:=0 to Count-1 do
|
||||
DecRef (Data+(I*size),TInfo);
|
||||
end;
|
||||
tkrecord :
|
||||
begin
|
||||
Temp:=Temp+1;
|
||||
I:=Temp^;
|
||||
temp:=temp+(I+1); // skip name string;
|
||||
Size:=PRecRec(Temp)^.Size; // get record size; not needed.
|
||||
Count:=PRecRec(Temp)^.Count; // get element Count
|
||||
For I:=1 to count do
|
||||
With PRecRec(Temp)^.elements[I] do
|
||||
DecRef (Data+Offset,Info);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.1 1998-06-08 15:32:08 michael
|
||||
Revision 1.2 1998-06-08 19:26:53 michael
|
||||
+ Implemented DecRef
|
||||
|
||||
Revision 1.1 1998/06/08 15:32:08 michael
|
||||
+ Split rtti according to processor. Implemented optimized i386 code.
|
||||
|
||||
}
|
@ -108,7 +108,7 @@ begin
|
||||
Count:=PArrayRec(Temp)^.Count; // get element Count
|
||||
TInfo:=PArrayRec(Temp)^.Info; // Get element info
|
||||
For I:=0 to Count-1 do
|
||||
Finalize (Data+(I*size),TInfo);
|
||||
AddRef (Data+(I*size),TInfo);
|
||||
end;
|
||||
tkrecord :
|
||||
begin
|
||||
@ -119,14 +119,53 @@ begin
|
||||
Count:=PRecRec(Temp)^.Count; // get element Count
|
||||
For I:=1 to count do
|
||||
With PRecRec(Temp)^.elements[I] do
|
||||
Finalize (Data+Offset,Info);
|
||||
Addref (Data+Offset,Info);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
Procedure DecRef (Data, TypeInfo : Pointer);
|
||||
|
||||
Var Temp : PByte;
|
||||
I : longint;
|
||||
Size,Count : longint;
|
||||
TInfo : Pointer;
|
||||
|
||||
begin
|
||||
Temp:=PByte(TypeInfo);
|
||||
case temp^ of
|
||||
tkLstring,tkWstring : Decr_Ansi_ref(Data);
|
||||
tkArray :
|
||||
begin
|
||||
Temp:=Temp+1;
|
||||
I:=temp^;
|
||||
temp:=temp+(I+1); // skip name string;
|
||||
Size:=PArrayRec(Temp)^.Size; // get element size
|
||||
Count:=PArrayRec(Temp)^.Count; // get element Count
|
||||
TInfo:=PArrayRec(Temp)^.Info; // Get element info
|
||||
For I:=0 to Count-1 do
|
||||
DecRef (Data+(I*size),TInfo);
|
||||
end;
|
||||
tkrecord :
|
||||
begin
|
||||
Temp:=Temp+1;
|
||||
I:=Temp^;
|
||||
temp:=temp+(I+1); // skip name string;
|
||||
Size:=PRecRec(Temp)^.Size; // get record size; not needed.
|
||||
Count:=PRecRec(Temp)^.Count; // get element Count
|
||||
For I:=1 to count do
|
||||
With PRecRec(Temp)^.elements[I] do
|
||||
DecRef (Data+Offset,Info);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.1 1998-06-08 15:32:14 michael
|
||||
Revision 1.2 1998-06-08 19:32:16 michael
|
||||
+ Implemented DecRef
|
||||
|
||||
Revision 1.1 1998/06/08 15:32:14 michael
|
||||
+ Split rtti according to processor. Implemented optimized i386 code.
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user