system.pp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  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. {$ifndef nounsupported}
  214. {$i astrings.inc}
  215. {$endif}
  216. {$i ustrings.inc}
  217. {$i rtti.inc}
  218. {$i jrec.inc}
  219. function min(a,b : longint) : longint;
  220. begin
  221. if a<=b then
  222. min:=a
  223. else
  224. min:=b;
  225. end;
  226. { copying helpers }
  227. procedure fpc_copy_shallow_array(src, dst: JLObject; srcstart: jint = -1; srccopylen: jint = -1);
  228. var
  229. srclen, dstlen: jint;
  230. begin
  231. if assigned(src) then
  232. srclen:=JLRArray.getLength(src)
  233. else
  234. srclen:=0;
  235. if assigned(dst) then
  236. dstlen:=JLRArray.getLength(dst)
  237. else
  238. dstlen:=0;
  239. if srcstart=-1 then
  240. srcstart:=0
  241. else if srcstart>=srclen then
  242. exit;
  243. if srccopylen=-1 then
  244. srccopylen:=srclen
  245. else if srcstart+srccopylen>srclen then
  246. srccopylen:=srclen-srcstart;
  247. { causes exception in JLSystem.arraycopy }
  248. if (srccopylen=0) or
  249. (dstlen=0) then
  250. exit;
  251. JLSystem.arraycopy(src,srcstart,dst,0,min(srccopylen,dstlen));
  252. end;
  253. procedure fpc_copy_jrecord_array(src, dst: TJRecordArray; srcstart: jint = -1; srccopylen: jint = -1);
  254. var
  255. i: longint;
  256. srclen, dstlen: jint;
  257. begin
  258. srclen:=length(src);
  259. dstlen:=length(dst);
  260. if srcstart=-1 then
  261. srcstart:=0
  262. else if srcstart>=srclen then
  263. exit;
  264. if srccopylen=-1 then
  265. srccopylen:=srclen
  266. else if srcstart+srccopylen>srclen then
  267. srccopylen:=srclen-srcstart;
  268. { no arraycopy, have to clone each element }
  269. for i:=0 to min(srccopylen,dstlen)-1 do
  270. dst[i]:=FpcBaseRecordType(src[srcstart+i].clone);
  271. end;
  272. { 1-dimensional setlength routines }
  273. function fpc_setlength_dynarr_generic(aorg, anew: JLObject; deepcopy: boolean; docopy: boolean = true): JLObject;
  274. var
  275. orglen, newlen: jint;
  276. begin
  277. orglen:=0;
  278. newlen:=0;
  279. if not deepcopy then
  280. begin
  281. if assigned(aorg) then
  282. orglen:=JLRArray.getLength(aorg)
  283. else
  284. orglen:=0;
  285. if assigned(anew) then
  286. newlen:=JLRArray.getLength(anew)
  287. else
  288. newlen:=0;
  289. end;
  290. if deepcopy or
  291. (orglen<>newlen) then
  292. begin
  293. if docopy then
  294. fpc_copy_shallow_array(aorg,anew);
  295. result:=anew
  296. end
  297. else
  298. result:=aorg;
  299. end;
  300. function fpc_setlength_dynarr_jrecord(aorg, anew: TJRecordArray; deepcopy: boolean): TJRecordArray;
  301. begin
  302. if deepcopy or
  303. (length(aorg)<>length(anew)) then
  304. begin
  305. fpc_copy_jrecord_array(aorg,anew);
  306. result:=anew
  307. end
  308. else
  309. result:=aorg;
  310. end;
  311. { multi-dimensional setlength routine }
  312. function fpc_setlength_dynarr_multidim(aorg, anew: TJObjectArray; deepcopy: boolean; ndim: longint; eletype: jchar): TJObjectArray;
  313. var
  314. partdone,
  315. i: longint;
  316. begin
  317. { resize the current dimension; no need to copy the subarrays of the old
  318. array, as the subarrays will be (re-)initialised immediately below }
  319. { the srcstart/srccopylen always refers to the first dimension (since copy()
  320. performs a shallow copy of a dynamic array }
  321. result:=TJObjectArray(fpc_setlength_dynarr_generic(JLObject(aorg),JLObject(anew),deepcopy,false));
  322. { if aorg was empty, there's nothing else to do since result will now
  323. contain anew, of which all other dimensions are already initialised
  324. correctly since there are no aorg elements to copy }
  325. if not assigned(aorg) and
  326. not deepcopy then
  327. exit;
  328. partdone:=min(high(result),high(aorg));
  329. { ndim must be >=2 when this routine is called, since it has to return
  330. an array of java.lang.Object! (arrays are also objects, but primitive
  331. types are not) }
  332. if ndim=2 then
  333. begin
  334. { final dimension -> copy the primitive arrays }
  335. case eletype of
  336. FPCJDynArrTypeRecord:
  337. begin
  338. for i:=low(result) to partdone do
  339. result[i]:=JLObject(fpc_setlength_dynarr_jrecord(TJRecordArray(aorg[i]),TJRecordArray(anew[i]),deepcopy));
  340. for i:=succ(partdone) to high(result) do
  341. result[i]:=JLObject(fpc_setlength_dynarr_jrecord(nil,TJRecordArray(anew[i]),deepcopy));
  342. end;
  343. else
  344. begin
  345. for i:=low(result) to partdone do
  346. result[i]:=fpc_setlength_dynarr_generic(aorg[i],anew[i],deepcopy);
  347. for i:=succ(partdone) to high(result) do
  348. result[i]:=fpc_setlength_dynarr_generic(nil,anew[i],deepcopy);
  349. end;
  350. end;
  351. end
  352. else
  353. begin
  354. { recursively handle the next dimension }
  355. for i:=low(result) to partdone do
  356. result[i]:=JLObject(fpc_setlength_dynarr_multidim(TJObjectArray(aorg[i]),TJObjectArray(anew[i]),deepcopy,pred(ndim),eletype));
  357. for i:=succ(partdone) to high(result) do
  358. result[i]:=JLObject(fpc_setlength_dynarr_multidim(nil,TJObjectArray(anew[i]),deepcopy,pred(ndim),eletype));
  359. end;
  360. end;
  361. {i jdynarr.inc end}
  362. {*****************************************************************************
  363. Misc. System Dependent Functions
  364. *****************************************************************************}
  365. procedure TObject.Free;
  366. begin
  367. if not DestructorCalled then
  368. begin
  369. DestructorCalled:=true;
  370. Destroy;
  371. end;
  372. end;
  373. destructor TObject.Destroy;
  374. begin
  375. end;
  376. procedure TObject.Finalize;
  377. begin
  378. Free;
  379. end;
  380. {*****************************************************************************
  381. SystemUnit Initialization
  382. *****************************************************************************}
  383. end.