system.pp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  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-,P+,T+}
  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. PShortString = ^ShortString;
  48. { Java primitive types }
  49. jboolean = boolean;
  50. jbyte = shortint;
  51. jshort = smallint;
  52. jint = longint;
  53. jlong = int64;
  54. jchar = widechar;
  55. jfloat = single;
  56. jdouble = double;
  57. Arr1jboolean = array of jboolean;
  58. Arr1jbyte = array of jbyte;
  59. Arr1jshort = array of jshort;
  60. Arr1jint = array of jint;
  61. Arr1jlong = array of jlong;
  62. Arr1jchar = array of jchar;
  63. Arr1jfloat = array of jfloat;
  64. Arr1jdouble = array of jdouble;
  65. Arr2jboolean = array of Arr1jboolean;
  66. Arr2jbyte = array of Arr1jbyte;
  67. Arr2jshort = array of Arr1jshort;
  68. Arr2jint = array of Arr1jint;
  69. Arr2jlong = array of Arr1jlong;
  70. Arr2jchar = array of Arr1jchar;
  71. Arr2jfloat = array of Arr1jfloat;
  72. Arr2jdouble = array of Arr1jdouble;
  73. Arr3jboolean = array of Arr2jboolean;
  74. Arr3jbyte = array of Arr2jbyte;
  75. Arr3jshort = array of Arr2jshort;
  76. Arr3jint = array of Arr2jint;
  77. Arr3jlong = array of Arr2jlong;
  78. Arr3jchar = array of Arr2jchar;
  79. Arr3jfloat = array of Arr2jfloat;
  80. Arr3jdouble = array of Arr2jdouble;
  81. const
  82. { max. values for longint and int}
  83. maxLongint = $7fffffff;
  84. maxSmallint = 32767;
  85. maxint = maxsmallint;
  86. { Java base class type }
  87. {$i java_sysh.inc}
  88. {$i java_sys.inc}
  89. type
  90. TObject = class(JLObject)
  91. strict private
  92. DestructorCalled: Boolean;
  93. public
  94. procedure Free;
  95. destructor Destroy; virtual;
  96. procedure finalize; override;
  97. end;
  98. {$i innr.inc}
  99. {$i jmathh.inc}
  100. {$i jrech.inc}
  101. {$i sstringh.inc}
  102. {$i jdynarrh.inc}
  103. {$i astringh.inc}
  104. {$ifndef nounsupported}
  105. type
  106. tmethod = record
  107. code: jlobject;
  108. end;
  109. const
  110. vtInteger = 0;
  111. vtBoolean = 1;
  112. vtChar = 2;
  113. {$ifndef FPUNONE}
  114. vtExtended = 3;
  115. {$endif}
  116. vtString = 4;
  117. vtPointer = 5;
  118. vtPChar = 6;
  119. vtObject = 7;
  120. vtClass = 8;
  121. vtWideChar = 9;
  122. vtPWideChar = 10;
  123. vtAnsiString = 11;
  124. vtCurrency = 12;
  125. vtVariant = 13;
  126. vtInterface = 14;
  127. vtWideString = 15;
  128. vtInt64 = 16;
  129. vtQWord = 17;
  130. vtUnicodeString = 18;
  131. type
  132. TVarRec = record
  133. case VType : sizeint of
  134. {$ifdef ENDIAN_BIG}
  135. vtInteger : ({$IFDEF CPU64}integerdummy1 : Longint;{$ENDIF CPU64}VInteger: Longint);
  136. vtBoolean : ({$IFDEF CPU64}booldummy : Longint;{$ENDIF CPU64}booldummy1,booldummy2,booldummy3: byte; VBoolean: Boolean);
  137. vtChar : ({$IFDEF CPU64}chardummy : Longint;{$ENDIF CPU64}chardummy1,chardummy2,chardummy3: byte; VChar: Char);
  138. vtWideChar : ({$IFDEF CPU64}widechardummy : Longint;{$ENDIF CPU64}wchardummy1,VWideChar: WideChar);
  139. {$else ENDIAN_BIG}
  140. vtInteger : (VInteger: Longint);
  141. vtBoolean : (VBoolean: Boolean);
  142. vtChar : (VChar: Char);
  143. vtWideChar : (VWideChar: WideChar);
  144. {$endif ENDIAN_BIG}
  145. // vtString : (VString: PShortString);
  146. // vtPointer : (VPointer: Pointer);
  147. /// vtPChar : (VPChar: PChar);
  148. vtObject : (VObject: TObject);
  149. // vtClass : (VClass: TClass);
  150. // vtPWideChar : (VPWideChar: PWideChar);
  151. vtAnsiString : (VAnsiString: JLObject);
  152. vtCurrency : (VCurrency: Currency);
  153. // vtVariant : (VVariant: PVariant);
  154. vtInterface : (VInterface: JLObject);
  155. vtWideString : (VWideString: JLString);
  156. vtInt64 : (VInt64: Int64);
  157. vtUnicodeString : (VUnicodeString: JLString);
  158. vtQWord : (VQWord: QWord);
  159. end;
  160. {$endif}
  161. Function lo(i : Integer) : byte; [INTERNPROC: fpc_in_lo_Word];
  162. Function lo(w : Word) : byte; [INTERNPROC: fpc_in_lo_Word];
  163. Function lo(l : Longint) : Word; [INTERNPROC: fpc_in_lo_long];
  164. Function lo(l : DWord) : Word; [INTERNPROC: fpc_in_lo_long];
  165. Function lo(i : Int64) : DWord; [INTERNPROC: fpc_in_lo_qword];
  166. Function lo(q : QWord) : DWord; [INTERNPROC: fpc_in_lo_qword];
  167. Function hi(i : Integer) : byte; [INTERNPROC: fpc_in_hi_Word];
  168. Function hi(w : Word) : byte; [INTERNPROC: fpc_in_hi_Word];
  169. Function hi(l : Longint) : Word; [INTERNPROC: fpc_in_hi_long];
  170. Function hi(l : DWord) : Word; [INTERNPROC: fpc_in_hi_long];
  171. Function hi(i : Int64) : DWord; [INTERNPROC: fpc_in_hi_qword];
  172. Function hi(q : QWord) : DWord; [INTERNPROC: fpc_in_hi_qword];
  173. Function chr(b : byte) : AnsiChar; [INTERNPROC: fpc_in_chr_byte];
  174. function RorByte(Const AValue : Byte): Byte;[internproc:fpc_in_ror_x];
  175. function RorByte(Const AValue : Byte;Dist : Byte): Byte;[internproc:fpc_in_ror_x_x];
  176. function RolByte(Const AValue : Byte): Byte;[internproc:fpc_in_rol_x];
  177. function RolByte(Const AValue : Byte;Dist : Byte): Byte;[internproc:fpc_in_rol_x_x];
  178. function RorWord(Const AValue : Word): Word;[internproc:fpc_in_ror_x];
  179. function RorWord(Const AValue : Word;Dist : Byte): Word;[internproc:fpc_in_ror_x_x];
  180. function RolWord(Const AValue : Word): Word;[internproc:fpc_in_rol_x];
  181. function RolWord(Const AValue : Word;Dist : Byte): Word;[internproc:fpc_in_rol_x_x];
  182. function RorDWord(Const AValue : DWord): DWord;[internproc:fpc_in_ror_x];
  183. function RorDWord(Const AValue : DWord;Dist : Byte): DWord;[internproc:fpc_in_ror_x_x];
  184. function RolDWord(Const AValue : DWord): DWord;[internproc:fpc_in_rol_x];
  185. function RolDWord(Const AValue : DWord;Dist : Byte): DWord;[internproc:fpc_in_rol_x_x];
  186. function RorQWord(Const AValue : QWord): QWord;[internproc:fpc_in_ror_x];
  187. function RorQWord(Const AValue : QWord;Dist : Byte): QWord;[internproc:fpc_in_ror_x_x];
  188. function RolQWord(Const AValue : QWord): QWord;[internproc:fpc_in_rol_x];
  189. function RolQWord(Const AValue : QWord;Dist : Byte): QWord;[internproc:fpc_in_rol_x_x];
  190. function SarShortint(Const AValue : Shortint): Shortint;[internproc:fpc_in_sar_x];
  191. function SarShortint(Const AValue : Shortint;Shift : Byte): Shortint;[internproc:fpc_in_sar_x_y];
  192. function SarSmallint(Const AValue : Smallint): Smallint;[internproc:fpc_in_sar_x];
  193. function SarSmallint(Const AValue : Smallint;Shift : Byte): Smallint;[internproc:fpc_in_sar_x_y];
  194. function SarLongint(Const AValue : Longint): Longint;[internproc:fpc_in_sar_x];
  195. function SarLongint(Const AValue : Longint;Shift : Byte): Longint;[internproc:fpc_in_sar_x_y];
  196. function SarInt64(Const AValue : Int64): Int64;[internproc:fpc_in_sar_x];
  197. function SarInt64(Const AValue : Int64;Shift : Byte): Int64;[internproc:fpc_in_sar_x_y];
  198. {$i compproc.inc}
  199. {$i ustringh.inc}
  200. {*****************************************************************************}
  201. implementation
  202. {*****************************************************************************}
  203. {i jdynarr.inc}
  204. {
  205. This file is part of the Free Pascal run time library.
  206. Copyright (c) 2011 by Jonas Maebe
  207. member of the Free Pascal development team.
  208. This file implements the helper routines for dyn. Arrays in FPC
  209. See the file COPYING.FPC, included in this distribution,
  210. for details about the copyright.
  211. This program is distributed in the hope that it will be useful,
  212. but WITHOUT ANY WARRANTY; without even the implied warranty of
  213. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  214. **********************************************************************
  215. }
  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. {$i sstrings.inc}
  224. {$i astrings.inc}
  225. {$i ustrings.inc}
  226. {$i rtti.inc}
  227. {$i jrec.inc}
  228. {$i jint64.inc}
  229. { copying helpers }
  230. procedure fpc_copy_shallow_array(src, dst: JLObject; srcstart: jint = -1; srccopylen: jint = -1);
  231. var
  232. srclen, dstlen: jint;
  233. begin
  234. if assigned(src) then
  235. srclen:=JLRArray.getLength(src)
  236. else
  237. srclen:=0;
  238. if assigned(dst) then
  239. dstlen:=JLRArray.getLength(dst)
  240. else
  241. dstlen:=0;
  242. if srcstart=-1 then
  243. srcstart:=0
  244. else if srcstart>=srclen then
  245. exit;
  246. if srccopylen=-1 then
  247. srccopylen:=srclen
  248. else if srcstart+srccopylen>srclen then
  249. srccopylen:=srclen-srcstart;
  250. { causes exception in JLSystem.arraycopy }
  251. if (srccopylen=0) or
  252. (dstlen=0) then
  253. exit;
  254. JLSystem.arraycopy(src,srcstart,dst,0,min(srccopylen,dstlen));
  255. end;
  256. procedure fpc_copy_jrecord_array(src, dst: TJRecordArray; srcstart: jint = -1; srccopylen: jint = -1);
  257. var
  258. i: longint;
  259. srclen, dstlen: jint;
  260. begin
  261. srclen:=length(src);
  262. dstlen:=length(dst);
  263. if srcstart=-1 then
  264. srcstart:=0
  265. else if srcstart>=srclen then
  266. exit;
  267. if srccopylen=-1 then
  268. srccopylen:=srclen
  269. else if srcstart+srccopylen>srclen then
  270. srccopylen:=srclen-srcstart;
  271. { no arraycopy, have to clone each element }
  272. for i:=0 to min(srccopylen,dstlen)-1 do
  273. dst[i]:=FpcBaseRecordType(src[srcstart+i].clone);
  274. end;
  275. procedure fpc_copy_jshortstring_array(src, dst: TShortstringArray; srcstart: jint = -1; srccopylen: jint = -1);
  276. var
  277. i: longint;
  278. srclen, dstlen: jint;
  279. begin
  280. srclen:=length(src);
  281. dstlen:=length(dst);
  282. if srcstart=-1 then
  283. srcstart:=0
  284. else if srcstart>=srclen then
  285. exit;
  286. if srccopylen=-1 then
  287. srccopylen:=srclen
  288. else if srcstart+srccopylen>srclen then
  289. srccopylen:=srclen-srcstart;
  290. { no arraycopy, have to clone each element }
  291. for i:=0 to min(srccopylen,dstlen)-1 do
  292. dst[i]:=ShortstringClass(src[srcstart+i].clone);
  293. end;
  294. { 1-dimensional setlength routines }
  295. function fpc_setlength_dynarr_generic(aorg, anew: JLObject; deepcopy: boolean; docopy: boolean = true): JLObject;
  296. var
  297. orglen, newlen: jint;
  298. begin
  299. orglen:=0;
  300. newlen:=0;
  301. if not deepcopy then
  302. begin
  303. if assigned(aorg) then
  304. orglen:=JLRArray.getLength(aorg)
  305. else
  306. orglen:=0;
  307. if assigned(anew) then
  308. newlen:=JLRArray.getLength(anew)
  309. else
  310. newlen:=0;
  311. end;
  312. if deepcopy or
  313. (orglen<>newlen) then
  314. begin
  315. if docopy then
  316. fpc_copy_shallow_array(aorg,anew);
  317. result:=anew
  318. end
  319. else
  320. result:=aorg;
  321. end;
  322. function fpc_setlength_dynarr_jrecord(aorg, anew: TJRecordArray; deepcopy: boolean): TJRecordArray;
  323. begin
  324. if deepcopy or
  325. (length(aorg)<>length(anew)) then
  326. begin
  327. fpc_copy_jrecord_array(aorg,anew);
  328. result:=anew
  329. end
  330. else
  331. result:=aorg;
  332. end;
  333. function fpc_setlength_dynarr_jshortstring(aorg, anew: TShortstringArray; deepcopy: boolean): TShortstringArray;
  334. begin
  335. if deepcopy or
  336. (length(aorg)<>length(anew)) then
  337. begin
  338. fpc_copy_jshortstring_array(aorg,anew);
  339. result:=anew
  340. end
  341. else
  342. result:=aorg;
  343. end;
  344. { multi-dimensional setlength routine }
  345. function fpc_setlength_dynarr_multidim(aorg, anew: TJObjectArray; deepcopy: boolean; ndim: longint; eletype: jchar): TJObjectArray;
  346. var
  347. partdone,
  348. i: longint;
  349. begin
  350. { resize the current dimension; no need to copy the subarrays of the old
  351. array, as the subarrays will be (re-)initialised immediately below }
  352. { the srcstart/srccopylen always refers to the first dimension (since copy()
  353. performs a shallow copy of a dynamic array }
  354. result:=TJObjectArray(fpc_setlength_dynarr_generic(JLObject(aorg),JLObject(anew),deepcopy,false));
  355. { if aorg was empty, there's nothing else to do since result will now
  356. contain anew, of which all other dimensions are already initialised
  357. correctly since there are no aorg elements to copy }
  358. if not assigned(aorg) and
  359. not deepcopy then
  360. exit;
  361. partdone:=min(high(result),high(aorg));
  362. { ndim must be >=2 when this routine is called, since it has to return
  363. an array of java.lang.Object! (arrays are also objects, but primitive
  364. types are not) }
  365. if ndim=2 then
  366. begin
  367. { final dimension -> copy the primitive arrays }
  368. case eletype of
  369. FPCJDynArrTypeRecord:
  370. begin
  371. for i:=low(result) to partdone do
  372. result[i]:=JLObject(fpc_setlength_dynarr_jrecord(TJRecordArray(aorg[i]),TJRecordArray(anew[i]),deepcopy));
  373. for i:=succ(partdone) to high(result) do
  374. result[i]:=JLObject(fpc_setlength_dynarr_jrecord(nil,TJRecordArray(anew[i]),deepcopy));
  375. end;
  376. FPCJDynArrTypeShortstring:
  377. begin
  378. for i:=low(result) to partdone do
  379. result[i]:=JLObject(fpc_setlength_dynarr_jshortstring(TShortstringArray(aorg[i]),TShortstringArray(anew[i]),deepcopy));
  380. for i:=succ(partdone) to high(result) do
  381. result[i]:=JLObject(fpc_setlength_dynarr_jshortstring(nil,TShortstringArray(anew[i]),deepcopy));
  382. end;
  383. else
  384. begin
  385. for i:=low(result) to partdone do
  386. result[i]:=fpc_setlength_dynarr_generic(aorg[i],anew[i],deepcopy);
  387. for i:=succ(partdone) to high(result) do
  388. result[i]:=fpc_setlength_dynarr_generic(nil,anew[i],deepcopy);
  389. end;
  390. end;
  391. end
  392. else
  393. begin
  394. { recursively handle the next dimension }
  395. for i:=low(result) to partdone do
  396. result[i]:=JLObject(fpc_setlength_dynarr_multidim(TJObjectArray(aorg[i]),TJObjectArray(anew[i]),deepcopy,pred(ndim),eletype));
  397. for i:=succ(partdone) to high(result) do
  398. result[i]:=JLObject(fpc_setlength_dynarr_multidim(nil,TJObjectArray(anew[i]),deepcopy,pred(ndim),eletype));
  399. end;
  400. end;
  401. function fpc_dynarray_copy(src: JLObject; start, len: longint; ndim: longint; eletype: jchar): JLObject;
  402. var
  403. i: longint;
  404. srclen: longint;
  405. begin
  406. if not assigned(src) then
  407. begin
  408. result:=nil;
  409. exit;
  410. end;
  411. srclen:=JLRArray.getLength(src);
  412. if (start=-1) and
  413. (len=-1) then
  414. begin
  415. len:=srclen;
  416. start:=0;
  417. end
  418. else if (start+len>srclen) then
  419. len:=srclen-start+1;
  420. result:=JLRArray.newInstance(src.getClass.getComponentType,len);
  421. if ndim=1 then
  422. begin
  423. case eletype of
  424. FPCJDynArrTypeRecord:
  425. fpc_copy_jrecord_array(TJRecordArray(src),TJRecordArray(result),start,len);
  426. FPCJDynArrTypeShortstring:
  427. fpc_copy_jshortstring_array(TShortstringArray(src),TShortstringArray(result),start,len);
  428. else
  429. fpc_copy_shallow_array(src,result,start,len);
  430. end
  431. end
  432. else
  433. begin
  434. for i:=0 to len-1 do
  435. TJObjectArray(result)[i]:=fpc_dynarray_copy(TJObjectArray(src)[start+i],-1,-1,ndim-1,eletype);
  436. end;
  437. end;
  438. {i jdynarr.inc end}
  439. {*****************************************************************************
  440. Misc. System Dependent Functions
  441. *****************************************************************************}
  442. procedure TObject.Free;
  443. begin
  444. if not DestructorCalled then
  445. begin
  446. DestructorCalled:=true;
  447. Destroy;
  448. end;
  449. end;
  450. destructor TObject.Destroy;
  451. begin
  452. end;
  453. procedure TObject.Finalize;
  454. begin
  455. Free;
  456. end;
  457. {*****************************************************************************
  458. SystemUnit Initialization
  459. *****************************************************************************}
  460. end.