system.pp 15 KB

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