rttip.inc 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1999-2000 by Michael Van Canneyt
  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. Procedure Initialize (Data,TypeInfo : pointer);[Alias : 'INITIALIZE'];
  14. Var Temp : PByte;
  15. I : longint;
  16. Size,Count : longint;
  17. TInfo : Pointer;
  18. begin
  19. Temp:=PByte(TypeInfo);
  20. case temp^ of
  21. tkLstring,tkWstring : PPchar(Data)^:=Nil;
  22. tkArray :
  23. begin
  24. temp:=Temp+1;
  25. I:=temp^;
  26. temp:=temp+(I+1); // skip name string;
  27. Size:=PArrayRec(Temp)^.Size; // get element size
  28. Count:=PArrayRec(Temp)^.Count; // get element Count
  29. TInfo:=PArrayRec(Temp)^.Info; // Get element info
  30. For I:=0 to Count-1 do
  31. Initialize (Data+(I*size),TInfo);
  32. end;
  33. tkRecord,tkObject,tkClass:
  34. begin
  35. Temp:=Temp+1;
  36. I:=Temp^;
  37. temp:=temp+(I+1); // skip name string;
  38. Size:=PRecRec(Temp)^.Size; // get record size; not needed.
  39. Count:=PRecRec(Temp)^.Count; // get element Count
  40. For I:=1 to count Do
  41. With PRecRec(Temp)^.elements[I] do
  42. Initialize (Data+Offset,Info);
  43. end;
  44. end;
  45. end;
  46. Procedure Finalize (Data,TypeInfo: Pointer);[Alias : 'FINALIZE'];
  47. Var Temp : PByte;
  48. I : longint;
  49. Size,Count : longint;
  50. TInfo : Pointer;
  51. begin
  52. Temp:=PByte(TypeInfo);
  53. case temp^ of
  54. tkLstring,tkWstring : Decr_Ansi_ref(Data);
  55. tkArray :
  56. begin
  57. Temp:=Temp+1;
  58. I:=temp^;
  59. temp:=temp+(I+1); // skip name string;
  60. Size:=PArrayRec(Temp)^.Size; // get element size
  61. Count:=PArrayRec(Temp)^.Count; // get element Count
  62. TInfo:=PArrayRec(Temp)^.Info; // Get element info
  63. For I:=0 to Count-1 do
  64. Finalize (Data+(I*size),TInfo);
  65. end;
  66. tkRecord,tkObject,tkClass:
  67. begin
  68. Temp:=Temp+1;
  69. I:=Temp^;
  70. temp:=temp+(I+1); // skip name string;
  71. Size:=PRecRec(Temp)^.Size; // get record size; not needed.
  72. Count:=PRecRec(Temp)^.Count; // get element Count
  73. For I:=1 to count do
  74. With PRecRec(Temp)^.elements[I] do
  75. Finalize (Data+Offset,Info);
  76. end;
  77. end;
  78. end;
  79. Procedure Addref (Data,TypeInfo : Pointer); [alias : 'ADDREF'];
  80. Var Temp : PByte;
  81. I : longint;
  82. Size,Count : longint;
  83. TInfo : Pointer;
  84. begin
  85. Temp:=PByte(TypeInfo);
  86. case temp^ of
  87. tkLstring,tkWstring : Incr_Ansi_ref(Data);
  88. tkArray :
  89. begin
  90. Temp:=Temp+1;
  91. I:=temp^;
  92. temp:=temp+(I+1); // skip name string;
  93. Size:=PArrayRec(Temp)^.Size; // get element size
  94. Count:=PArrayRec(Temp)^.Count; // get element Count
  95. TInfo:=PArrayRec(Temp)^.Info; // Get element info
  96. For I:=0 to Count-1 do
  97. AddRef (Data+(I*size),TInfo);
  98. end;
  99. tkRecord,tkObject,tkClass:
  100. begin
  101. Temp:=Temp+1;
  102. I:=Temp^;
  103. temp:=temp+(I+1); // skip name string;
  104. Size:=PRecRec(Temp)^.Size; // get record size; not needed.
  105. Count:=PRecRec(Temp)^.Count; // get element Count
  106. For I:=1 to count do
  107. With PRecRec(Temp)^.elements[I] do
  108. Addref (Data+Offset,Info);
  109. end;
  110. end;
  111. end;
  112. Procedure DecRef (Data, TypeInfo : Pointer);
  113. Var Temp : PByte;
  114. I : longint;
  115. Size,Count : longint;
  116. TInfo : Pointer;
  117. begin
  118. Temp:=PByte(TypeInfo);
  119. case temp^ of
  120. tkLstring,tkWstring : Decr_Ansi_ref(Data);
  121. tkArray :
  122. begin
  123. Temp:=Temp+1;
  124. I:=temp^;
  125. temp:=temp+(I+1); // skip name string;
  126. Size:=PArrayRec(Temp)^.Size; // get element size
  127. Count:=PArrayRec(Temp)^.Count; // get element Count
  128. TInfo:=PArrayRec(Temp)^.Info; // Get element info
  129. For I:=0 to Count-1 do
  130. DecRef (Data+(I*size),TInfo);
  131. end;
  132. tkRecord,tkObject,tkClass:
  133. begin
  134. Temp:=Temp+1;
  135. I:=Temp^;
  136. temp:=temp+(I+1); // skip name string;
  137. Size:=PRecRec(Temp)^.Size; // get record size; not needed.
  138. Count:=PRecRec(Temp)^.Count; // get element Count
  139. For I:=1 to count do
  140. With PRecRec(Temp)^.elements[I] do
  141. DecRef (Data+Offset,Info);
  142. end;
  143. end;
  144. end;
  145. {
  146. $Log$
  147. Revision 1.3 2002-09-07 16:01:26 peter
  148. * old logs removed and tabs fixed
  149. }