mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-13 12:39:09 +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 }
|
{ Run-Time type information routines - processor dependent part }
|
||||||
|
{$ASMMODE DIRECT}
|
||||||
|
|
||||||
Procedure Initialize (Data,TypeInfo : pointer);[Alias : 'INITIALIZE'];assembler;
|
Procedure Initialize (Data,TypeInfo : pointer);[Alias : 'INITIALIZE'];assembler;
|
||||||
|
|
||||||
@ -251,7 +252,7 @@ asm
|
|||||||
.DoAnsiStringAddRef:
|
.DoAnsiStringAddRef:
|
||||||
movl 8(%ebp),%eax
|
movl 8(%ebp),%eax
|
||||||
pushl %eax
|
pushl %eax
|
||||||
call DECR_ANSI_REF
|
call INCR_ANSI_REF
|
||||||
.ExitAddRef:
|
.ExitAddRef:
|
||||||
pop %edx
|
pop %edx
|
||||||
pop %ecx
|
pop %ecx
|
||||||
@ -261,9 +262,97 @@ asm
|
|||||||
ret $8
|
ret $8
|
||||||
end;
|
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$
|
$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.
|
+ Split rtti according to processor. Implemented optimized i386 code.
|
||||||
|
|
||||||
}
|
}
|
@ -108,7 +108,7 @@ begin
|
|||||||
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
|
||||||
Finalize (Data+(I*size),TInfo);
|
AddRef (Data+(I*size),TInfo);
|
||||||
end;
|
end;
|
||||||
tkrecord :
|
tkrecord :
|
||||||
begin
|
begin
|
||||||
@ -119,14 +119,53 @@ begin
|
|||||||
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
|
||||||
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;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$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.
|
+ Split rtti according to processor. Implemented optimized i386 code.
|
||||||
|
|
||||||
}
|
}
|
@ -108,7 +108,7 @@ begin
|
|||||||
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
|
||||||
Finalize (Data+(I*size),TInfo);
|
AddRef (Data+(I*size),TInfo);
|
||||||
end;
|
end;
|
||||||
tkrecord :
|
tkrecord :
|
||||||
begin
|
begin
|
||||||
@ -119,14 +119,53 @@ begin
|
|||||||
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
|
||||||
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;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$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.
|
+ Split rtti according to processor. Implemented optimized i386 code.
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user