genrtti.inc 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1999-2000 by xxxx
  5. member of the Free Pascal development team
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. { Run-Time type information routines - processor dependent part }
  13. {$ifndef FPC_SYSTEM_HAS_FPC_INITIALIZE}
  14. Procedure Initialize (Data,TypeInfo : pointer);[Public,Alias : 'FPC_INITIALIZE'];
  15. { this definition is sometimes (depending on switches)
  16. already defined or not so define it locally to avoid problems PM }
  17. Type
  18. Pbyte = ^Byte;
  19. Var Temp : PByte;
  20. I : longint;
  21. Size,Count : longint;
  22. TInfo : Pointer;
  23. begin
  24. Temp:=PByte(TypeInfo);
  25. case temp^ of
  26. tkAstring,tkWstring : PPchar(Data)^:=Nil;
  27. tkArray :
  28. begin
  29. temp:=Temp+1;
  30. I:=temp^;
  31. temp:=temp+(I+1); // skip name string;
  32. Size:=PArrayRec(Temp)^.Size; // get element size
  33. Count:=PArrayRec(Temp)^.Count; // get element Count
  34. TInfo:=PArrayRec(Temp)^.Info; // Get element info
  35. For I:=0 to Count-1 do
  36. Initialize (Data+(I*size),TInfo);
  37. end;
  38. tkrecord :
  39. begin
  40. Temp:=Temp+1;
  41. I:=Temp^;
  42. temp:=temp+(I+1); // skip name string;
  43. Size:=PRecRec(Temp)^.Size; // get record size; not needed.
  44. Count:=PRecRec(Temp)^.Count; // get element Count
  45. For I:=1 to count Do
  46. With PRecRec(Temp)^.elements[I] do
  47. Initialize (Data+Offset,Info);
  48. end;
  49. end;
  50. end;
  51. {$endif}
  52. {$ifndef FPC_SYSTEM_HAS_FPC_FINALIZE}
  53. Procedure Finalize (Data,TypeInfo: Pointer);[Public,Alias : 'FPC_FINALIZE'];
  54. { this definition is sometimes (depending on switches)
  55. already defined or not so define it locally to avoid problems PM }
  56. Type
  57. Pbyte = ^Byte;
  58. Var Temp : PByte;
  59. I : longint;
  60. Size,Count : longint;
  61. TInfo : Pointer;
  62. begin
  63. Temp:=PByte(TypeInfo);
  64. case temp^ of
  65. tkAstring,tkWstring : AnsiStr_Decr_Ref(Data);
  66. tkArray :
  67. begin
  68. Temp:=Temp+1;
  69. I:=temp^;
  70. temp:=temp+(I+1); // skip name string;
  71. Size:=PArrayRec(Temp)^.Size; // get element size
  72. Count:=PArrayRec(Temp)^.Count; // get element Count
  73. TInfo:=PArrayRec(Temp)^.Info; // Get element info
  74. For I:=0 to Count-1 do
  75. Finalize (Data+(I*size),TInfo);
  76. end;
  77. tkrecord :
  78. begin
  79. Temp:=Temp+1;
  80. I:=Temp^;
  81. temp:=temp+(I+1); // skip name string;
  82. Size:=PRecRec(Temp)^.Size; // get record size; not needed.
  83. Count:=PRecRec(Temp)^.Count; // get element Count
  84. For I:=1 to count do
  85. With PRecRec(Temp)^.elements[I] do
  86. Finalize (Data+Offset,Info);
  87. end;
  88. end;
  89. end;
  90. {$endif}
  91. {$ifndef FPC_SYSTEM_HAS_FPC_ADDREF}
  92. Procedure Addref (Data,TypeInfo : Pointer); [Public,alias : 'FPC_ADDREF'];
  93. { this definition is sometimes (depending on switches)
  94. already defined or not so define it locally to avoid problems PM }
  95. Type
  96. Pbyte = ^Byte;
  97. Var Temp : PByte;
  98. I : longint;
  99. Size,Count : longint;
  100. TInfo : Pointer;
  101. begin
  102. Temp:=PByte(TypeInfo);
  103. case temp^ of
  104. tkAstring,tkWstring : AnsiStr_Incr_Ref(Data);
  105. tkArray :
  106. begin
  107. Temp:=Temp+1;
  108. I:=temp^;
  109. temp:=temp+(I+1); // skip name string;
  110. Size:=PArrayRec(Temp)^.Size; // get element size
  111. Count:=PArrayRec(Temp)^.Count; // get element Count
  112. TInfo:=PArrayRec(Temp)^.Info; // Get element info
  113. For I:=0 to Count-1 do
  114. AddRef (Data+(I*size),TInfo);
  115. end;
  116. tkrecord :
  117. begin
  118. Temp:=Temp+1;
  119. I:=Temp^;
  120. temp:=temp+(I+1); // skip name string;
  121. Size:=PRecRec(Temp)^.Size; // get record size; not needed.
  122. Count:=PRecRec(Temp)^.Count; // get element Count
  123. For I:=1 to count do
  124. With PRecRec(Temp)^.elements[I] do
  125. AddRef (Data+Offset,Info);
  126. end;
  127. end;
  128. end;
  129. {$endif}
  130. {$ifndef FPC_SYSTEM_HAS_FPC_DECREF}
  131. Procedure DecRef (Data, TypeInfo : Pointer);[Public,alias : 'FPC_DECREF'];
  132. { this definition is sometimes (depending on switches)
  133. already defined or not so define it locally to avoid problems PM }
  134. Type
  135. Pbyte = ^Byte;
  136. Var Temp : PByte;
  137. I : longint;
  138. Size,Count : longint;
  139. TInfo : Pointer;
  140. begin
  141. Temp:=PByte(TypeInfo);
  142. case temp^ of
  143. tkAstring,tkWstring : AnsiStr_Decr_Ref(Data);
  144. tkArray :
  145. begin
  146. Temp:=Temp+1;
  147. I:=temp^;
  148. temp:=temp+(I+1); // skip name string;
  149. Size:=PArrayRec(Temp)^.Size; // get element size
  150. Count:=PArrayRec(Temp)^.Count; // get element Count
  151. TInfo:=PArrayRec(Temp)^.Info; // Get element info
  152. For I:=0 to Count-1 do
  153. DecRef (Data+(I*size),TInfo);
  154. end;
  155. tkrecord :
  156. begin
  157. Temp:=Temp+1;
  158. I:=Temp^;
  159. temp:=temp+(I+1); // skip name string;
  160. Size:=PRecRec(Temp)^.Size; // get record size; not needed.
  161. Count:=PRecRec(Temp)^.Count; // get element Count
  162. For I:=1 to count do
  163. With PRecRec(Temp)^.elements[I] do
  164. DecRef (Data+Offset,Info);
  165. end;
  166. end;
  167. end;
  168. {$endif}
  169. {$ifndef FPC_SYSTEM_HAS_FPC_FINALIZEARRAY}
  170. procedure FinalizeArray(data,typeinfo : pointer;count,size : longint); [Public,Alias:'FPC_FINALIZEARRAY'];
  171. var
  172. i : longint;
  173. begin
  174. for i:=0 to count-1 do
  175. int_finalize(data+size*i,typeinfo);
  176. end;
  177. {$endif}
  178. {
  179. $Log$
  180. Revision 1.2 2001-04-23 18:25:44 peter
  181. * m68k updates
  182. }