diff --git a/rtl/i386/rttip.inc b/rtl/i386/rttip.inc index ad71a17c28..ddb7fefe3e 100644 --- a/rtl/i386/rttip.inc +++ b/rtl/i386/rttip.inc @@ -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. } \ No newline at end of file diff --git a/rtl/m68k/rttip.inc b/rtl/m68k/rttip.inc index 6f032bc66c..fa9af87191 100644 --- a/rtl/m68k/rttip.inc +++ b/rtl/m68k/rttip.inc @@ -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. } \ No newline at end of file diff --git a/rtl/template/rttip.inc b/rtl/template/rttip.inc index 05699021c0..41f936494a 100644 --- a/rtl/template/rttip.inc +++ b/rtl/template/rttip.inc @@ -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. } \ No newline at end of file