+ Implemented DecRef

This commit is contained in:
michael 1998-06-08 19:26:53 +00:00
parent cabd568a3d
commit b36e918420
3 changed files with 175 additions and 8 deletions

View File

@ -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.
}

View File

@ -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.
}

View File

@ -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.
}