Browse Source

+ Implemented DecRef

michael 27 years ago
parent
commit
b36e918420
3 changed files with 175 additions and 8 deletions
  1. 91 2
      rtl/i386/rttip.inc
  2. 42 3
      rtl/m68k/rttip.inc
  3. 42 3
      rtl/template/rttip.inc

+ 91 - 2
rtl/i386/rttip.inc

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

+ 42 - 3
rtl/m68k/rttip.inc

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

+ 42 - 3
rtl/template/rttip.inc

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