system.pp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2006 by Florian Klaempfl
  4. member of the Free Pascal development team.
  5. System unit for embedded systems
  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. Unit system;
  13. {$namespace org.freepascal.rtl}
  14. {*****************************************************************************}
  15. interface
  16. {*****************************************************************************}
  17. {$define FPC_IS_SYSTEM}
  18. {$I-,Q-,H-,R-,V-}
  19. {$implicitexceptions off}
  20. {$mode objfpc}
  21. {$undef FPC_HAS_FEATURE_ANSISTRINGS}
  22. {$undef FPC_HAS_FEATURE_TEXTIO}
  23. {$undef FPC_HAS_FEATURE_VARIANTS}
  24. {$undef FPC_HAS_FEATURE_CLASSES}
  25. {$undef FPC_HAS_FEATURE_EXCEPTIONS}
  26. {$undef FPC_HAS_FEATURE_OBJECTS}
  27. {$undef FPC_HAS_FEATURE_RTTI}
  28. {$undef FPC_HAS_FEATURE_FILEIO}
  29. {$undef FPC_INCLUDE_SOFTWARE_INT64_TO_DOUBLE}
  30. Type
  31. { The compiler has all integer types defined internally. Here
  32. we define only aliases }
  33. DWord = LongWord;
  34. Cardinal = LongWord;
  35. Integer = SmallInt;
  36. UInt64 = QWord;
  37. SizeInt = Longint;
  38. SizeUInt = Longint;
  39. PtrInt = Longint;
  40. PtrUInt = Longint;
  41. ValReal = Double;
  42. AnsiChar = Char;
  43. UnicodeChar = WideChar;
  44. { map comp to int64, }
  45. Comp = Int64;
  46. HResult = type longint;
  47. { Java primitive types }
  48. jboolean = boolean;
  49. jbyte = shortint;
  50. jshort = smallint;
  51. jint = longint;
  52. jlong = int64;
  53. jchar = widechar;
  54. jfloat = single;
  55. jdouble = double;
  56. Arr1jboolean = array of jboolean;
  57. Arr1jbyte = array of jbyte;
  58. Arr1jshort = array of jshort;
  59. Arr1jint = array of jint;
  60. Arr1jlong = array of jlong;
  61. Arr1jchar = array of jchar;
  62. Arr1jfloat = array of jfloat;
  63. Arr1jdouble = array of jdouble;
  64. Arr2jboolean = array of Arr1jboolean;
  65. Arr2jbyte = array of Arr1jbyte;
  66. Arr2jshort = array of Arr1jshort;
  67. Arr2jint = array of Arr1jint;
  68. Arr2jlong = array of Arr1jlong;
  69. Arr2jchar = array of Arr1jchar;
  70. Arr2jfloat = array of Arr1jfloat;
  71. Arr2jdouble = array of Arr1jdouble;
  72. Arr3jboolean = array of Arr2jboolean;
  73. Arr3jbyte = array of Arr2jbyte;
  74. Arr3jshort = array of Arr2jshort;
  75. Arr3jint = array of Arr2jint;
  76. Arr3jlong = array of Arr2jlong;
  77. Arr3jchar = array of Arr2jchar;
  78. Arr3jfloat = array of Arr2jfloat;
  79. Arr3jdouble = array of Arr2jdouble;
  80. const
  81. { max. values for longint and int}
  82. maxLongint = $7fffffff;
  83. maxSmallint = 32767;
  84. maxint = maxsmallint;
  85. { Java base class type }
  86. {$i java_sysh.inc}
  87. {$i java_sys.inc}
  88. type
  89. TObject = class(JLObject)
  90. strict private
  91. DestructorCalled: Boolean;
  92. public
  93. procedure Free;
  94. destructor Destroy; virtual;
  95. procedure finalize; override;
  96. end;
  97. {$i innr.inc}
  98. {$i jmathh.inc}
  99. {$i jrech.inc}
  100. {$i jdynarrh.inc}
  101. {$ifndef nounsupported}
  102. type
  103. tmethod = record
  104. code: jlobject;
  105. end;
  106. const
  107. vtInteger = 0;
  108. vtBoolean = 1;
  109. vtChar = 2;
  110. {$ifndef FPUNONE}
  111. vtExtended = 3;
  112. {$endif}
  113. vtString = 4;
  114. vtPointer = 5;
  115. vtPChar = 6;
  116. vtObject = 7;
  117. vtClass = 8;
  118. vtWideChar = 9;
  119. vtPWideChar = 10;
  120. vtAnsiString = 11;
  121. vtCurrency = 12;
  122. vtVariant = 13;
  123. vtInterface = 14;
  124. vtWideString = 15;
  125. vtInt64 = 16;
  126. vtQWord = 17;
  127. vtUnicodeString = 18;
  128. type
  129. TVarRec = record
  130. case VType : sizeint of
  131. {$ifdef ENDIAN_BIG}
  132. vtInteger : ({$IFDEF CPU64}integerdummy1 : Longint;{$ENDIF CPU64}VInteger: Longint);
  133. vtBoolean : ({$IFDEF CPU64}booldummy : Longint;{$ENDIF CPU64}booldummy1,booldummy2,booldummy3: byte; VBoolean: Boolean);
  134. vtChar : ({$IFDEF CPU64}chardummy : Longint;{$ENDIF CPU64}chardummy1,chardummy2,chardummy3: byte; VChar: Char);
  135. vtWideChar : ({$IFDEF CPU64}widechardummy : Longint;{$ENDIF CPU64}wchardummy1,VWideChar: WideChar);
  136. {$else ENDIAN_BIG}
  137. vtInteger : (VInteger: Longint);
  138. vtBoolean : (VBoolean: Boolean);
  139. vtChar : (VChar: Char);
  140. vtWideChar : (VWideChar: WideChar);
  141. {$endif ENDIAN_BIG}
  142. // vtString : (VString: PShortString);
  143. // vtPointer : (VPointer: Pointer);
  144. /// vtPChar : (VPChar: PChar);
  145. vtObject : (VObject: TObject);
  146. // vtClass : (VClass: TClass);
  147. // vtPWideChar : (VPWideChar: PWideChar);
  148. vtAnsiString : (VAnsiString: JLString);
  149. vtCurrency : (VCurrency: Currency);
  150. // vtVariant : (VVariant: PVariant);
  151. vtInterface : (VInterface: JLObject);
  152. vtWideString : (VWideString: JLString);
  153. vtInt64 : (VInt64: Int64);
  154. vtUnicodeString : (VUnicodeString: JLString);
  155. vtQWord : (VQWord: QWord);
  156. end;
  157. {$endif}
  158. Function lo(i : Integer) : byte; [INTERNPROC: fpc_in_lo_Word];
  159. Function lo(w : Word) : byte; [INTERNPROC: fpc_in_lo_Word];
  160. Function lo(l : Longint) : Word; [INTERNPROC: fpc_in_lo_long];
  161. Function lo(l : DWord) : Word; [INTERNPROC: fpc_in_lo_long];
  162. Function lo(i : Int64) : DWord; [INTERNPROC: fpc_in_lo_qword];
  163. Function lo(q : QWord) : DWord; [INTERNPROC: fpc_in_lo_qword];
  164. Function hi(i : Integer) : byte; [INTERNPROC: fpc_in_hi_Word];
  165. Function hi(w : Word) : byte; [INTERNPROC: fpc_in_hi_Word];
  166. Function hi(l : Longint) : Word; [INTERNPROC: fpc_in_hi_long];
  167. Function hi(l : DWord) : Word; [INTERNPROC: fpc_in_hi_long];
  168. Function hi(i : Int64) : DWord; [INTERNPROC: fpc_in_hi_qword];
  169. Function hi(q : QWord) : DWord; [INTERNPROC: fpc_in_hi_qword];
  170. Function chr(b : byte) : AnsiChar; [INTERNPROC: fpc_in_chr_byte];
  171. function RorByte(Const AValue : Byte): Byte;[internproc:fpc_in_ror_x];
  172. function RorByte(Const AValue : Byte;Dist : Byte): Byte;[internproc:fpc_in_ror_x_x];
  173. function RolByte(Const AValue : Byte): Byte;[internproc:fpc_in_rol_x];
  174. function RolByte(Const AValue : Byte;Dist : Byte): Byte;[internproc:fpc_in_rol_x_x];
  175. function RorWord(Const AValue : Word): Word;[internproc:fpc_in_ror_x];
  176. function RorWord(Const AValue : Word;Dist : Byte): Word;[internproc:fpc_in_ror_x_x];
  177. function RolWord(Const AValue : Word): Word;[internproc:fpc_in_rol_x];
  178. function RolWord(Const AValue : Word;Dist : Byte): Word;[internproc:fpc_in_rol_x_x];
  179. function RorDWord(Const AValue : DWord): DWord;[internproc:fpc_in_ror_x];
  180. function RorDWord(Const AValue : DWord;Dist : Byte): DWord;[internproc:fpc_in_ror_x_x];
  181. function RolDWord(Const AValue : DWord): DWord;[internproc:fpc_in_rol_x];
  182. function RolDWord(Const AValue : DWord;Dist : Byte): DWord;[internproc:fpc_in_rol_x_x];
  183. function RorQWord(Const AValue : QWord): QWord;[internproc:fpc_in_ror_x];
  184. function RorQWord(Const AValue : QWord;Dist : Byte): QWord;[internproc:fpc_in_ror_x_x];
  185. function RolQWord(Const AValue : QWord): QWord;[internproc:fpc_in_rol_x];
  186. function RolQWord(Const AValue : QWord;Dist : Byte): QWord;[internproc:fpc_in_rol_x_x];
  187. function SarShortint(Const AValue : Shortint): Shortint;[internproc:fpc_in_sar_x];
  188. function SarShortint(Const AValue : Shortint;Shift : Byte): Shortint;[internproc:fpc_in_sar_x_y];
  189. function SarSmallint(Const AValue : Smallint): Smallint;[internproc:fpc_in_sar_x];
  190. function SarSmallint(Const AValue : Smallint;Shift : Byte): Smallint;[internproc:fpc_in_sar_x_y];
  191. function SarLongint(Const AValue : Longint): Longint;[internproc:fpc_in_sar_x];
  192. function SarLongint(Const AValue : Longint;Shift : Byte): Longint;[internproc:fpc_in_sar_x_y];
  193. function SarInt64(Const AValue : Int64): Int64;[internproc:fpc_in_sar_x];
  194. function SarInt64(Const AValue : Int64;Shift : Byte): Int64;[internproc:fpc_in_sar_x_y];
  195. {$i compproc.inc}
  196. {$i ustringh.inc}
  197. {*****************************************************************************}
  198. implementation
  199. {*****************************************************************************}
  200. {i jdynarr.inc}
  201. {
  202. This file is part of the Free Pascal run time library.
  203. Copyright (c) 2011 by Jonas Maebe
  204. member of the Free Pascal development team.
  205. This file implements the helper routines for dyn. Arrays in FPC
  206. See the file COPYING.FPC, included in this distribution,
  207. for details about the copyright.
  208. This program is distributed in the hope that it will be useful,
  209. but WITHOUT ANY WARRANTY; without even the implied warranty of
  210. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  211. **********************************************************************
  212. }
  213. {$i ustrings.inc}
  214. {$i rtti.inc}
  215. {$i jrec.inc}
  216. function min(a,b : longint) : longint;
  217. begin
  218. if a<=b then
  219. min:=a
  220. else
  221. min:=b;
  222. end;
  223. { copying helpers }
  224. { also for booleans }
  225. procedure fpc_copy_jbyte_array(src, dst: TJByteArray);
  226. var
  227. i: longint;
  228. begin
  229. for i:=0 to min(high(src),high(dst)) do
  230. dst[i]:=src[i];
  231. end;
  232. procedure fpc_copy_jshort_array(src, dst: TJShortArray);
  233. var
  234. i: longint;
  235. begin
  236. for i:=0 to min(high(src),high(dst)) do
  237. dst[i]:=src[i];
  238. end;
  239. procedure fpc_copy_jint_array(src, dst: TJIntArray);
  240. var
  241. i: longint;
  242. begin
  243. for i:=0 to min(high(src),high(dst)) do
  244. dst[i]:=src[i];
  245. end;
  246. procedure fpc_copy_jlong_array(src, dst: TJLongArray);
  247. var
  248. i: longint;
  249. begin
  250. for i:=0 to min(high(src),high(dst)) do
  251. dst[i]:=src[i];
  252. end;
  253. procedure fpc_copy_jchar_array(src, dst: TJCharArray);
  254. var
  255. i: longint;
  256. begin
  257. for i:=0 to min(high(src),high(dst)) do
  258. dst[i]:=src[i];
  259. end;
  260. procedure fpc_copy_jfloat_array(src, dst: TJFloatArray);
  261. var
  262. i: longint;
  263. begin
  264. for i:=0 to min(high(src),high(dst)) do
  265. dst[i]:=src[i];
  266. end;
  267. procedure fpc_copy_jdouble_array(src, dst: TJDoubleArray);
  268. var
  269. i: longint;
  270. begin
  271. for i:=0 to min(high(src),high(dst)) do
  272. dst[i]:=src[i];
  273. end;
  274. procedure fpc_copy_jobject_array(src, dst: TJObjectArray);
  275. var
  276. i: longint;
  277. begin
  278. for i:=0 to min(high(src),high(dst)) do
  279. dst[i]:=src[i];
  280. end;
  281. procedure fpc_copy_jrecord_array(src, dst: TJRecordArray);
  282. var
  283. i: longint;
  284. begin
  285. for i:=0 to min(high(src),high(dst)) do
  286. dst[i]:=FpcBaseRecordType(src[i].clone);
  287. end;
  288. { 1-dimensional setlength routines }
  289. function fpc_setlength_dynarr_jbyte(aorg, anew: TJByteArray; deepcopy: boolean): TJByteArray;
  290. begin
  291. if deepcopy or
  292. (length(aorg)<>length(anew)) then
  293. begin
  294. fpc_copy_jbyte_array(aorg,anew);
  295. result:=anew
  296. end
  297. else
  298. result:=aorg;
  299. end;
  300. function fpc_setlength_dynarr_jshort(aorg, anew: TJShortArray; deepcopy: boolean): TJShortArray;
  301. begin
  302. if deepcopy or
  303. (length(aorg)<>length(anew)) then
  304. begin
  305. fpc_copy_jshort_array(aorg,anew);
  306. result:=anew
  307. end
  308. else
  309. result:=aorg;
  310. end;
  311. function fpc_setlength_dynarr_jint(aorg, anew: TJIntArray; deepcopy: boolean): TJIntArray;
  312. begin
  313. if deepcopy or
  314. (length(aorg)<>length(anew)) then
  315. begin
  316. fpc_copy_jint_array(aorg,anew);
  317. result:=anew
  318. end
  319. else
  320. result:=aorg;
  321. end;
  322. function fpc_setlength_dynarr_jlong(aorg, anew: TJLongArray; deepcopy: boolean): TJLongArray;
  323. begin
  324. if deepcopy or
  325. (length(aorg)<>length(anew)) then
  326. begin
  327. fpc_copy_jlong_array(aorg,anew);
  328. result:=anew
  329. end
  330. else
  331. result:=aorg;
  332. end;
  333. function fpc_setlength_dynarr_jchar(aorg, anew: TJCharArray; deepcopy: boolean): TJCharArray;
  334. begin
  335. if deepcopy or
  336. (length(aorg)<>length(anew)) then
  337. begin
  338. fpc_copy_jchar_array(aorg,anew);
  339. result:=anew
  340. end
  341. else
  342. result:=aorg;
  343. end;
  344. function fpc_setlength_dynarr_jfloat(aorg, anew: TJFloatArray; deepcopy: boolean): TJFloatArray;
  345. begin
  346. if deepcopy or
  347. (length(aorg)<>length(anew)) then
  348. begin
  349. fpc_copy_jfloat_array(aorg,anew);
  350. result:=anew
  351. end
  352. else
  353. result:=aorg;
  354. end;
  355. function fpc_setlength_dynarr_jdouble(aorg, anew: TJDoubleArray; deepcopy: boolean): TJDoubleArray;
  356. begin
  357. if deepcopy or
  358. (length(aorg)<>length(anew)) then
  359. begin
  360. fpc_copy_jdouble_array(aorg,anew);
  361. result:=anew
  362. end
  363. else
  364. result:=aorg;
  365. end;
  366. function fpc_setlength_dynarr_jobject(aorg, anew: TJObjectArray; deepcopy: boolean; docopy : boolean = true): TJObjectArray;
  367. begin
  368. if deepcopy or
  369. (length(aorg)<>length(anew)) then
  370. begin
  371. if docopy then
  372. fpc_copy_jobject_array(aorg,anew);
  373. result:=anew
  374. end
  375. else
  376. result:=aorg;
  377. end;
  378. function fpc_setlength_dynarr_jrecord(aorg, anew: TJRecordArray; deepcopy: boolean): TJRecordArray;
  379. begin
  380. if deepcopy or
  381. (length(aorg)<>length(anew)) then
  382. begin
  383. fpc_copy_jrecord_array(aorg,anew);
  384. result:=anew
  385. end
  386. else
  387. result:=aorg;
  388. end;
  389. { multi-dimensional setlength routine }
  390. function fpc_setlength_dynarr_multidim(aorg, anew: TJObjectArray; deepcopy: boolean; ndim: longint; eletype: jchar): TJObjectArray;
  391. var
  392. partdone,
  393. i: longint;
  394. begin
  395. { resize the current dimension; no need to copy the subarrays of the old
  396. array, as the subarrays will be (re-)initialised immediately below }
  397. result:=fpc_setlength_dynarr_jobject(aorg,anew,deepcopy,false);
  398. { if aorg was empty, there's nothing else to do since result will now
  399. contain anew, of which all other dimensions are already initialised
  400. correctly since there are no aorg elements to copy }
  401. if not assigned(aorg) and
  402. not deepcopy then
  403. exit;
  404. partdone:=min(high(result),high(aorg));
  405. { ndim must be >=2 when this routine is called, since it has to return
  406. an array of java.lang.Object! (arrays are also objects, but primitive
  407. types are not) }
  408. if ndim=2 then
  409. begin
  410. { final dimension -> copy the primitive arrays }
  411. case eletype of
  412. FPCJDynArrTypeJByte:
  413. begin
  414. for i:=low(result) to partdone do
  415. result[i]:=JLObject(fpc_setlength_dynarr_jbyte(TJByteArray(aorg[i]),TJByteArray(anew[i]),deepcopy));
  416. for i:=succ(partdone) to high(result) do
  417. result[i]:=JLObject(fpc_setlength_dynarr_jbyte(nil,TJByteArray(anew[i]),deepcopy));
  418. end;
  419. FPCJDynArrTypeJShort:
  420. begin
  421. for i:=low(result) to partdone do
  422. result[i]:=JLObject(fpc_setlength_dynarr_jshort(TJShortArray(aorg[i]),TJShortArray(anew[i]),deepcopy));
  423. for i:=succ(partdone) to high(result) do
  424. result[i]:=JLObject(fpc_setlength_dynarr_jshort(nil,TJShortArray(anew[i]),deepcopy));
  425. end;
  426. FPCJDynArrTypeJInt:
  427. begin
  428. for i:=low(result) to partdone do
  429. result[i]:=JLObject(fpc_setlength_dynarr_jint(TJIntArray(aorg[i]),TJIntArray(anew[i]),deepcopy));
  430. for i:=succ(partdone) to high(result) do
  431. result[i]:=JLObject(fpc_setlength_dynarr_jint(nil,TJIntArray(anew[i]),deepcopy));
  432. end;
  433. FPCJDynArrTypeJLong:
  434. begin
  435. for i:=low(result) to partdone do
  436. result[i]:=JLObject(fpc_setlength_dynarr_jlong(TJLongArray(aorg[i]),TJLongArray(anew[i]),deepcopy));
  437. for i:=succ(partdone) to high(result) do
  438. result[i]:=JLObject(fpc_setlength_dynarr_jlong(nil,TJLongArray(anew[i]),deepcopy));
  439. end;
  440. FPCJDynArrTypeJChar:
  441. begin
  442. for i:=low(result) to partdone do
  443. result[i]:=JLObject(fpc_setlength_dynarr_jchar(TJCharArray(aorg[i]),TJCharArray(anew[i]),deepcopy));
  444. for i:=succ(partdone) to high(result) do
  445. result[i]:=JLObject(fpc_setlength_dynarr_jchar(nil,TJCharArray(anew[i]),deepcopy));
  446. end;
  447. FPCJDynArrTypeJFloat:
  448. begin
  449. for i:=low(result) to partdone do
  450. result[i]:=JLObject(fpc_setlength_dynarr_jfloat(TJFloatArray(aorg[i]),TJFloatArray(anew[i]),deepcopy));
  451. for i:=succ(partdone) to high(result) do
  452. result[i]:=JLObject(fpc_setlength_dynarr_jfloat(nil,TJFloatArray(anew[i]),deepcopy));
  453. end;
  454. FPCJDynArrTypeJDouble:
  455. begin
  456. for i:=low(result) to partdone do
  457. result[i]:=JLObject(fpc_setlength_dynarr_jdouble(TJDoubleArray(aorg[i]),TJDoubleArray(anew[i]),deepcopy));
  458. for i:=succ(partdone) to high(result) do
  459. result[i]:=JLObject(fpc_setlength_dynarr_jdouble(nil,TJDoubleArray(anew[i]),deepcopy));
  460. end;
  461. FPCJDynArrTypeJObject:
  462. begin
  463. for i:=low(result) to partdone do
  464. result[i]:=JLObject(fpc_setlength_dynarr_jobject(TJObjectArray(aorg[i]),TJObjectArray(anew[i]),deepcopy,true));
  465. for i:=succ(partdone) to high(result) do
  466. result[i]:=JLObject(fpc_setlength_dynarr_jobject(nil,TJObjectArray(anew[i]),deepcopy,true));
  467. end;
  468. FPCJDynArrTypeRecord:
  469. begin
  470. for i:=low(result) to partdone do
  471. result[i]:=JLObject(fpc_setlength_dynarr_jrecord(TJRecordArray(aorg[i]),TJRecordArray(anew[i]),deepcopy));
  472. for i:=succ(partdone) to high(result) do
  473. result[i]:=JLObject(fpc_setlength_dynarr_jrecord(nil,TJRecordArray(anew[i]),deepcopy));
  474. end;
  475. end;
  476. end
  477. else
  478. begin
  479. { recursively handle the next dimension }
  480. for i:=low(result) to partdone do
  481. result[i]:=JLObject(fpc_setlength_dynarr_multidim(TJObjectArray(aorg[i]),TJObjectArray(anew[i]),deepcopy,pred(ndim),eletype));
  482. for i:=succ(partdone) to high(result) do
  483. result[i]:=JLObject(fpc_setlength_dynarr_multidim(nil,TJObjectArray(anew[i]),deepcopy,pred(ndim),eletype));
  484. end;
  485. end;
  486. {i jdynarr.inc end}
  487. {*****************************************************************************
  488. Misc. System Dependent Functions
  489. *****************************************************************************}
  490. procedure TObject.Free;
  491. begin
  492. if not DestructorCalled then
  493. begin
  494. DestructorCalled:=true;
  495. Destroy;
  496. end;
  497. end;
  498. destructor TObject.Destroy;
  499. begin
  500. end;
  501. procedure TObject.Finalize;
  502. begin
  503. Free;
  504. end;
  505. {*****************************************************************************
  506. SystemUnit Initialization
  507. *****************************************************************************}
  508. end.