ptype.pas 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206
  1. {
  2. Copyright (c) 1998-2002 by Florian Klaempfl
  3. Does parsing types for Free Pascal
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2 of the License, or
  7. (at your option) any later version.
  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. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. ****************************************************************************
  16. }
  17. unit ptype;
  18. {$i fpcdefs.inc}
  19. interface
  20. uses
  21. globtype,cclasses,
  22. symtype,symdef,symbase;
  23. var
  24. { hack, which allows to use the current parsed }
  25. { object type as function argument type }
  26. testcurobject : byte;
  27. procedure resolve_forward_types;
  28. { reads a type identifier }
  29. procedure id_type(var def : tdef;isforwarddef:boolean);
  30. { reads a string, file type or a type identifier }
  31. procedure single_type(var def:tdef;isforwarddef,allowtypedef:boolean);
  32. { reads any type declaration, where the resulting type will get name as type identifier }
  33. procedure read_named_type(var def:tdef;const name : TIDString;genericdef:tstoreddef;genericlist:TFPObjectList;parseprocvardir:boolean);
  34. { reads any type declaration }
  35. procedure read_anon_type(var def : tdef;parseprocvardir:boolean);
  36. { generate persistent type information like VMT, RTTI and inittables }
  37. procedure write_persistent_type_info(st:tsymtable);
  38. implementation
  39. uses
  40. { common }
  41. cutils,
  42. { global }
  43. globals,tokens,verbose,constexp,
  44. systems,
  45. { target }
  46. paramgr,procinfo,
  47. { symtable }
  48. symconst,symsym,symtable,
  49. defutil,defcmp,
  50. { modules }
  51. fmodule,
  52. { pass 1 }
  53. node,ncgrtti,nobj,
  54. nmat,nadd,ncal,nset,ncnv,ninl,ncon,nld,nflw,
  55. { parser }
  56. scanner,
  57. pbase,pexpr,pdecsub,pdecvar,pdecobj;
  58. procedure resolve_forward_types;
  59. var
  60. i: longint;
  61. hpd,
  62. def : tdef;
  63. srsym : tsym;
  64. srsymtable : TSymtable;
  65. hs : string;
  66. begin
  67. for i:=0 to current_module.checkforwarddefs.Count-1 do
  68. begin
  69. def:=tdef(current_module.checkforwarddefs[i]);
  70. case def.typ of
  71. pointerdef,
  72. classrefdef :
  73. begin
  74. { classrefdef inherits from pointerdef }
  75. hpd:=tabstractpointerdef(def).pointeddef;
  76. { still a forward def ? }
  77. if hpd.typ=forwarddef then
  78. begin
  79. { try to resolve the forward }
  80. if not assigned(tforwarddef(hpd).tosymname) then
  81. internalerror(200211201);
  82. hs:=tforwarddef(hpd).tosymname^;
  83. searchsym(upper(hs),srsym,srsymtable);
  84. { we don't need the forwarddef anymore, dispose it }
  85. hpd.free;
  86. tabstractpointerdef(def).pointeddef:=nil; { if error occurs }
  87. { was a type sym found ? }
  88. if assigned(srsym) and
  89. (srsym.typ=typesym) then
  90. begin
  91. tabstractpointerdef(def).pointeddef:=ttypesym(srsym).typedef;
  92. { avoid wrong unused warnings web bug 801 PM }
  93. inc(ttypesym(srsym).refs);
  94. { we need a class type for classrefdef }
  95. if (def.typ=classrefdef) and
  96. not(is_class(ttypesym(srsym).typedef)) and
  97. not(is_objcclass(ttypesym(srsym).typedef)) then
  98. MessagePos1(def.typesym.fileinfo,type_e_class_type_expected,ttypesym(srsym).typedef.typename);
  99. end
  100. else
  101. begin
  102. Message1(sym_e_forward_type_not_resolved,hs);
  103. { try to recover }
  104. tabstractpointerdef(def).pointeddef:=generrordef;
  105. end;
  106. end;
  107. end;
  108. objectdef :
  109. begin
  110. { give an error as the implementation may follow in an
  111. other type block which is allowed by FPC modes }
  112. if not(m_fpc in current_settings.modeswitches) and
  113. (oo_is_forward in tobjectdef(def).objectoptions) then
  114. MessagePos1(def.typesym.fileinfo,type_e_type_is_not_completly_defined,def.typename);
  115. end;
  116. else
  117. internalerror(200811071);
  118. end;
  119. end;
  120. current_module.checkforwarddefs.clear;
  121. end;
  122. procedure generate_specialization(var tt:tdef);
  123. var
  124. st : TSymtable;
  125. srsym : tsym;
  126. pt2 : tnode;
  127. first,
  128. err : boolean;
  129. i : longint;
  130. sym : tsym;
  131. genericdef : tstoreddef;
  132. generictype : ttypesym;
  133. generictypelist : TFPObjectList;
  134. oldsymtablestack : tsymtablestack;
  135. hmodule : tmodule;
  136. pu : tused_unit;
  137. uspecializename,
  138. specializename : string;
  139. vmtbuilder : TVMTBuilder;
  140. onlyparsepara : boolean;
  141. specializest : tsymtable;
  142. begin
  143. { retrieve generic def that we are going to replace }
  144. genericdef:=tstoreddef(tt);
  145. tt:=nil;
  146. onlyparsepara:=false;
  147. if not(df_generic in genericdef.defoptions) then
  148. begin
  149. Message(parser_e_special_onlygenerics);
  150. tt:=generrordef;
  151. onlyparsepara:=true;
  152. end;
  153. { only need to record the tokens, then we don't know the type yet ... }
  154. if parse_generic then
  155. begin
  156. { ... but we have to insert a def into the symtable else the deflist
  157. of generic and specialization might not be equally sized which
  158. is later assumed }
  159. tt:=tundefineddef.create;
  160. onlyparsepara:=true;
  161. end;
  162. { Only parse the parameters for recovery or
  163. for recording in genericbuf }
  164. if onlyparsepara then
  165. begin
  166. consume(_LSHARPBRACKET);
  167. repeat
  168. pt2:=factor(false);
  169. pt2.free;
  170. until not try_to_consume(_COMMA);
  171. consume(_RSHARPBRACKET);
  172. exit;
  173. end;
  174. consume(_LSHARPBRACKET);
  175. { Parse generic parameters, for each undefineddef in the symtable of
  176. the genericdef we need to have a new def }
  177. err:=false;
  178. first:=true;
  179. generictypelist:=TFPObjectList.create(false);
  180. case genericdef.typ of
  181. procdef :
  182. st:=genericdef.GetSymtable(gs_para);
  183. objectdef,
  184. recorddef :
  185. st:=genericdef.GetSymtable(gs_record);
  186. end;
  187. if not assigned(st) then
  188. internalerror(200511182);
  189. { Parse type parameters }
  190. if not assigned(genericdef.typesym) then
  191. internalerror(200710173);
  192. specializename:=genericdef.typesym.realname;
  193. for i:=0 to st.SymList.Count-1 do
  194. begin
  195. sym:=tsym(st.SymList[i]);
  196. if (sp_generic_para in sym.symoptions) then
  197. begin
  198. if not first then
  199. consume(_COMMA)
  200. else
  201. first:=false;
  202. pt2:=factor(false);
  203. if pt2.nodetype=typen then
  204. begin
  205. if df_generic in pt2.resultdef.defoptions then
  206. Message(parser_e_no_generics_as_params);
  207. generictype:=ttypesym.create(sym.realname,pt2.resultdef);
  208. generictypelist.add(generictype);
  209. if not assigned(pt2.resultdef.typesym) then
  210. message(type_e_generics_cannot_reference_itself)
  211. else
  212. specializename:=specializename+'$'+pt2.resultdef.typesym.realname;
  213. end
  214. else
  215. begin
  216. Message(type_e_type_id_expected);
  217. err:=true;
  218. end;
  219. pt2.free;
  220. end;
  221. end;
  222. uspecializename:=upper(specializename);
  223. { force correct error location if too much type parameters are passed }
  224. if token<>_RSHARPBRACKET then
  225. consume(_RSHARPBRACKET);
  226. { Special case if we are referencing the current defined object }
  227. if assigned(current_objectdef) and
  228. (current_objectdef.objname^=uspecializename) then
  229. tt:=current_objectdef;
  230. { for units specializations can already be needed in the interface, therefor we
  231. will use the global symtable. Programs don't have a globalsymtable and there we
  232. use the localsymtable }
  233. if current_module.is_unit then
  234. specializest:=current_module.globalsymtable
  235. else
  236. specializest:=current_module.localsymtable;
  237. { Can we reuse an already specialized type? }
  238. if not assigned(tt) then
  239. begin
  240. srsym:=tsym(specializest.find(uspecializename));
  241. if assigned(srsym) then
  242. begin
  243. if srsym.typ<>typesym then
  244. internalerror(200710171);
  245. tt:=ttypesym(srsym).typedef;
  246. end;
  247. end;
  248. if not assigned(tt) then
  249. begin
  250. { Setup symtablestack at definition time
  251. to get types right, however this is not perfect, we should probably record
  252. the resolved symbols }
  253. oldsymtablestack:=symtablestack;
  254. symtablestack:=tsymtablestack.create;
  255. if not assigned(genericdef) then
  256. internalerror(200705151);
  257. hmodule:=find_module_from_symtable(genericdef.owner);
  258. if hmodule=nil then
  259. internalerror(200705152);
  260. pu:=tused_unit(hmodule.used_units.first);
  261. while assigned(pu) do
  262. begin
  263. if not assigned(pu.u.globalsymtable) then
  264. internalerror(200705153);
  265. symtablestack.push(pu.u.globalsymtable);
  266. pu:=tused_unit(pu.next);
  267. end;
  268. if assigned(hmodule.globalsymtable) then
  269. symtablestack.push(hmodule.globalsymtable);
  270. { hacky, but necessary to insert the newly generated class properly }
  271. symtablestack.push(oldsymtablestack.top);
  272. { Reparse the original type definition }
  273. if not err then
  274. begin
  275. { First a new typesym so we can reuse this specialization and
  276. references to this specialization can be handled }
  277. srsym:=ttypesym.create(specializename,generrordef);
  278. specializest.insert(srsym);
  279. if not assigned(genericdef.generictokenbuf) then
  280. internalerror(200511171);
  281. current_scanner.startreplaytokens(genericdef.generictokenbuf);
  282. read_named_type(tt,specializename,genericdef,generictypelist,false);
  283. ttypesym(srsym).typedef:=tt;
  284. tt.typesym:=srsym;
  285. { Consume the semicolon if it is also recorded }
  286. try_to_consume(_SEMICOLON);
  287. { Build VMT indexes for classes }
  288. if (tt.typ=objectdef) then
  289. begin
  290. vmtbuilder:=TVMTBuilder.Create(tobjectdef(tt));
  291. vmtbuilder.generate_vmt;
  292. vmtbuilder.free;
  293. end;
  294. end;
  295. { Restore symtablestack }
  296. symtablestack.free;
  297. symtablestack:=oldsymtablestack;
  298. end;
  299. generictypelist.free;
  300. consume(_RSHARPBRACKET);
  301. end;
  302. procedure id_type(var def : tdef;isforwarddef:boolean);
  303. { reads a type definition }
  304. { to a appropriating tdef, s gets the name of }
  305. { the type to allow name mangling }
  306. var
  307. is_unit_specific : boolean;
  308. pos : tfileposinfo;
  309. srsym : tsym;
  310. srsymtable : TSymtable;
  311. s,sorg : TIDString;
  312. t : ttoken;
  313. begin
  314. s:=pattern;
  315. sorg:=orgpattern;
  316. pos:=current_tokenpos;
  317. { use of current parsed object:
  318. - classes can be used also in classes
  319. - objects can be parameters }
  320. if assigned(current_objectdef) and
  321. (current_objectdef.objname^=pattern) and
  322. (
  323. (testcurobject=2) or
  324. is_class_or_interface_or_objc(current_objectdef)
  325. )then
  326. begin
  327. consume(_ID);
  328. def:=current_objectdef;
  329. exit;
  330. end;
  331. { Use the special searchsym_type that ignores records,objects and
  332. parameters }
  333. searchsym_type(s,srsym,srsymtable);
  334. { handle unit specification like System.Writeln }
  335. is_unit_specific:=try_consume_unitsym(srsym,srsymtable,t);
  336. consume(t);
  337. { Types are first defined with an error def before assigning
  338. the real type so check if it's an errordef. if so then
  339. give an error. Only check for typesyms in the current symbol
  340. table as forwarddef are not resolved directly }
  341. if assigned(srsym) and
  342. (srsym.typ=typesym) and
  343. (ttypesym(srsym).typedef.typ=errordef) then
  344. begin
  345. Message1(type_e_type_is_not_completly_defined,ttypesym(srsym).realname);
  346. def:=generrordef;
  347. exit;
  348. end;
  349. { are we parsing a possible forward def ? }
  350. if isforwarddef and
  351. not(is_unit_specific) then
  352. begin
  353. def:=tforwarddef.create(sorg,pos);
  354. exit;
  355. end;
  356. { unknown sym ? }
  357. if not assigned(srsym) then
  358. begin
  359. Message1(sym_e_id_not_found,sorg);
  360. def:=generrordef;
  361. exit;
  362. end;
  363. { type sym ? }
  364. if (srsym.typ<>typesym) then
  365. begin
  366. Message(type_e_type_id_expected);
  367. def:=generrordef;
  368. exit;
  369. end;
  370. { Give an error when referring to an errordef }
  371. if (ttypesym(srsym).typedef.typ=errordef) then
  372. begin
  373. Message(sym_e_error_in_type_def);
  374. def:=generrordef;
  375. exit;
  376. end;
  377. def:=ttypesym(srsym).typedef;
  378. end;
  379. procedure single_type(var def:tdef;isforwarddef,allowtypedef:boolean);
  380. var
  381. t2 : tdef;
  382. dospecialize,
  383. again : boolean;
  384. begin
  385. dospecialize:=false;
  386. repeat
  387. again:=false;
  388. case token of
  389. _STRING:
  390. string_dec(def,allowtypedef);
  391. _FILE:
  392. begin
  393. consume(_FILE);
  394. if (token=_OF) then
  395. begin
  396. if not(allowtypedef) then
  397. Message(parser_e_no_local_para_def);
  398. consume(_OF);
  399. single_type(t2,false,false);
  400. if is_managed_type(t2) then
  401. Message(parser_e_no_refcounted_typed_file);
  402. def:=tfiledef.createtyped(t2);
  403. end
  404. else
  405. def:=cfiletype;
  406. end;
  407. _ID:
  408. begin
  409. if try_to_consume(_SPECIALIZE) then
  410. begin
  411. dospecialize:=true;
  412. again:=true;
  413. end
  414. else
  415. begin
  416. id_type(def,isforwarddef);
  417. { handle types inside classes, e.g. TNode.TLongint }
  418. while (token=_POINT) do
  419. begin
  420. if parse_generic then
  421. begin
  422. consume(_POINT);
  423. consume(_ID);
  424. end
  425. else if is_class(def) then
  426. begin
  427. symtablestack.push(tobjectdef(def).symtable);
  428. consume(_POINT);
  429. id_type(t2,isforwarddef);
  430. symtablestack.pop(tobjectdef(def).symtable);
  431. def:=t2;
  432. end
  433. else
  434. break;
  435. end;
  436. end;
  437. end;
  438. else
  439. begin
  440. message(type_e_type_id_expected);
  441. def:=generrordef;
  442. end;
  443. end;
  444. until not again;
  445. if dospecialize then
  446. generate_specialization(def)
  447. else
  448. begin
  449. if assigned(current_specializedef) and (def=current_specializedef.genericdef) then
  450. begin
  451. def:=current_specializedef
  452. end
  453. else if (def=current_genericdef) then
  454. begin
  455. def:=current_genericdef
  456. end
  457. else if (df_generic in def.defoptions) then
  458. begin
  459. Message(parser_e_no_generics_as_types);
  460. def:=generrordef;
  461. end
  462. else if is_objccategory(def) then
  463. begin
  464. Message(parser_e_no_category_as_types);
  465. def:=generrordef
  466. end
  467. end;
  468. end;
  469. { reads a record declaration }
  470. function record_dec : tdef;
  471. var
  472. recst : trecordsymtable;
  473. begin
  474. { create recdef }
  475. recst:=trecordsymtable.create(current_settings.packrecords);
  476. record_dec:=trecorddef.create(recst);
  477. { insert in symtablestack }
  478. symtablestack.push(recst);
  479. { parse record }
  480. consume(_RECORD);
  481. read_record_fields([vd_record]);
  482. consume(_END);
  483. { make the record size aligned }
  484. recst.addalignmentpadding;
  485. { restore symtable stack }
  486. symtablestack.pop(recst);
  487. if trecorddef(record_dec).is_packed and
  488. is_managed_type(record_dec) then
  489. Message(type_e_no_packed_inittable);
  490. end;
  491. { reads a type definition and returns a pointer to it }
  492. procedure read_named_type(var def : tdef;const name : TIDString;genericdef:tstoreddef;genericlist:TFPObjectList;parseprocvardir:boolean);
  493. var
  494. pt : tnode;
  495. tt2 : tdef;
  496. aktenumdef : tenumdef;
  497. s : TIDString;
  498. l,v : TConstExprInt;
  499. oldpackrecords : longint;
  500. defpos,storepos : tfileposinfo;
  501. procedure expr_type;
  502. var
  503. pt1,pt2 : tnode;
  504. lv,hv : TConstExprInt;
  505. old_block_type : tblock_type;
  506. dospecialize : boolean;
  507. objdef: TDef;
  508. begin
  509. old_block_type:=block_type;
  510. dospecialize:=false;
  511. { use of current parsed object:
  512. - classes can be used also in classes
  513. - objects can be parameters }
  514. if (token=_ID) then
  515. begin
  516. objdef:=current_objectdef;
  517. while Assigned(objdef) and (objdef.typ=objectdef) do
  518. begin
  519. if (tobjectdef(objdef).objname^=pattern) and
  520. (
  521. (testcurobject=2) or
  522. is_class_or_interface_or_objc(objdef)
  523. ) then
  524. begin
  525. consume(_ID);
  526. def:=objdef;
  527. exit;
  528. end;
  529. objdef:=tobjectdef(tobjectdef(objdef).owner.defowner);
  530. end;
  531. end;
  532. { Generate a specialization? }
  533. if try_to_consume(_SPECIALIZE) then
  534. dospecialize:=true;
  535. { we can't accept a equal in type }
  536. pt1:=comp_expr(false);
  537. if not dospecialize and
  538. try_to_consume(_POINTPOINT) then
  539. begin
  540. { get high value of range }
  541. pt2:=comp_expr(false);
  542. { make both the same type or give an error. This is not
  543. done when both are integer values, because typecasting
  544. between -3200..3200 will result in a signed-unsigned
  545. conflict and give a range check error (PFV) }
  546. if not(is_integer(pt1.resultdef) and is_integer(pt2.resultdef)) then
  547. inserttypeconv(pt1,pt2.resultdef);
  548. { both must be evaluated to constants now }
  549. if (pt1.nodetype=ordconstn) and
  550. (pt2.nodetype=ordconstn) then
  551. begin
  552. lv:=tordconstnode(pt1).value;
  553. hv:=tordconstnode(pt2).value;
  554. { Check bounds }
  555. if hv<lv then
  556. message(parser_e_upper_lower_than_lower)
  557. else if (lv.signed and (lv.svalue<0)) and (not hv.signed and (hv.uvalue>qword(high(int64)))) then
  558. message(type_e_cant_eval_constant_expr)
  559. else
  560. begin
  561. { All checks passed, create the new def }
  562. case pt1.resultdef.typ of
  563. enumdef :
  564. def:=tenumdef.create_subrange(tenumdef(pt1.resultdef),lv.svalue,hv.svalue);
  565. orddef :
  566. begin
  567. if is_char(pt1.resultdef) then
  568. def:=torddef.create(uchar,lv,hv)
  569. else
  570. if is_boolean(pt1.resultdef) then
  571. def:=torddef.create(pasbool,lv,hv)
  572. else if is_signed(pt1.resultdef) then
  573. def:=torddef.create(range_to_basetype(lv,hv),lv,hv)
  574. else
  575. def:=torddef.create(range_to_basetype(lv,hv),lv,hv);
  576. end;
  577. end;
  578. end;
  579. end
  580. else
  581. Message(sym_e_error_in_type_def);
  582. pt2.free;
  583. end
  584. else
  585. begin
  586. { a simple type renaming or generic specialization }
  587. if (pt1.nodetype=typen) then
  588. begin
  589. def:=ttypenode(pt1).resultdef;
  590. if dospecialize then
  591. generate_specialization(def)
  592. else
  593. begin
  594. if assigned(current_specializedef) and (def=current_specializedef.genericdef) then
  595. begin
  596. def:=current_specializedef
  597. end
  598. else if (def=current_genericdef) then
  599. begin
  600. def:=current_genericdef
  601. end
  602. else if (df_generic in def.defoptions) then
  603. begin
  604. Message(parser_e_no_generics_as_types);
  605. def:=generrordef;
  606. end
  607. else if is_objccategory(def) then
  608. begin
  609. Message(parser_e_no_category_as_types);
  610. def:=generrordef
  611. end
  612. end;
  613. end
  614. else
  615. Message(sym_e_error_in_type_def);
  616. end;
  617. pt1.free;
  618. block_type:=old_block_type;
  619. end;
  620. procedure set_dec;
  621. begin
  622. consume(_SET);
  623. consume(_OF);
  624. read_anon_type(tt2,true);
  625. if assigned(tt2) then
  626. begin
  627. case tt2.typ of
  628. { don't forget that min can be negativ PM }
  629. enumdef :
  630. if (tenumdef(tt2).min>=0) and
  631. (tenumdef(tt2).max<=255) then
  632. // !! def:=tsetdef.create(tt2,tenumdef(tt2.def).min,tenumdef(tt2.def).max))
  633. def:=tsetdef.create(tt2,tenumdef(tt2).min,tenumdef(tt2).max)
  634. else
  635. Message(sym_e_ill_type_decl_set);
  636. orddef :
  637. begin
  638. if (torddef(tt2).ordtype<>uvoid) and
  639. (torddef(tt2).ordtype<>uwidechar) and
  640. (torddef(tt2).low>=0) then
  641. // !! def:=tsetdef.create(tt2,torddef(tt2.def).low,torddef(tt2.def).high))
  642. if Torddef(tt2).high>int64(high(byte)) then
  643. message(sym_e_ill_type_decl_set)
  644. else
  645. def:=tsetdef.create(tt2,torddef(tt2).low.svalue,torddef(tt2).high.svalue)
  646. else
  647. Message(sym_e_ill_type_decl_set);
  648. end;
  649. else
  650. Message(sym_e_ill_type_decl_set);
  651. end;
  652. end
  653. else
  654. def:=generrordef;
  655. end;
  656. procedure array_dec(is_packed: boolean);
  657. var
  658. lowval,
  659. highval : TConstExprInt;
  660. indexdef : tdef;
  661. hdef : tdef;
  662. arrdef : tarraydef;
  663. procedure setdefdecl(def:tdef);
  664. begin
  665. case def.typ of
  666. enumdef :
  667. begin
  668. lowval:=tenumdef(def).min;
  669. highval:=tenumdef(def).max;
  670. if (m_fpc in current_settings.modeswitches) and
  671. (tenumdef(def).has_jumps) then
  672. Message(type_e_array_index_enums_with_assign_not_possible);
  673. indexdef:=def;
  674. end;
  675. orddef :
  676. begin
  677. if torddef(def).ordtype in [uchar,
  678. u8bit,u16bit,
  679. s8bit,s16bit,s32bit,
  680. {$ifdef cpu64bitaddr}
  681. u32bit,s64bit,
  682. {$endif cpu64bitaddr}
  683. pasbool,bool8bit,bool16bit,bool32bit,bool64bit,
  684. uwidechar] then
  685. begin
  686. lowval:=torddef(def).low;
  687. highval:=torddef(def).high;
  688. indexdef:=def;
  689. end
  690. else
  691. Message1(parser_e_type_cant_be_used_in_array_index,def.typename);
  692. end;
  693. else
  694. Message(sym_e_error_in_type_def);
  695. end;
  696. end;
  697. begin
  698. arrdef:=nil;
  699. consume(_ARRAY);
  700. { open array? }
  701. if try_to_consume(_LECKKLAMMER) then
  702. begin
  703. { defaults }
  704. indexdef:=generrordef;
  705. { use defaults which don't overflow the compiler }
  706. lowval:=0;
  707. highval:=0;
  708. repeat
  709. { read the expression and check it, check apart if the
  710. declaration is an enum declaration because that needs to
  711. be parsed by readtype (PFV) }
  712. if token=_LKLAMMER then
  713. begin
  714. read_anon_type(hdef,true);
  715. setdefdecl(hdef);
  716. end
  717. else
  718. begin
  719. pt:=expr(true);
  720. if pt.nodetype=typen then
  721. setdefdecl(pt.resultdef)
  722. else
  723. begin
  724. if (pt.nodetype=rangen) then
  725. begin
  726. if (trangenode(pt).left.nodetype=ordconstn) and
  727. (trangenode(pt).right.nodetype=ordconstn) then
  728. begin
  729. { make both the same type or give an error. This is not
  730. done when both are integer values, because typecasting
  731. between -3200..3200 will result in a signed-unsigned
  732. conflict and give a range check error (PFV) }
  733. if not(is_integer(trangenode(pt).left.resultdef) and is_integer(trangenode(pt).left.resultdef)) then
  734. inserttypeconv(trangenode(pt).left,trangenode(pt).right.resultdef);
  735. lowval:=tordconstnode(trangenode(pt).left).value;
  736. highval:=tordconstnode(trangenode(pt).right).value;
  737. if highval<lowval then
  738. begin
  739. Message(parser_e_array_lower_less_than_upper_bound);
  740. highval:=lowval;
  741. end
  742. else if (lowval<int64(low(aint))) or
  743. (highval > high(aint)) then
  744. begin
  745. Message(parser_e_array_range_out_of_bounds);
  746. lowval :=0;
  747. highval:=0;
  748. end;
  749. if is_integer(trangenode(pt).left.resultdef) then
  750. range_to_type(lowval,highval,indexdef)
  751. else
  752. indexdef:=trangenode(pt).left.resultdef;
  753. end
  754. else
  755. Message(type_e_cant_eval_constant_expr);
  756. end
  757. else
  758. Message(sym_e_error_in_type_def)
  759. end;
  760. pt.free;
  761. end;
  762. { if the array is already created add the new arrray
  763. as element of the existing array, otherwise create a new array }
  764. if assigned(arrdef) then
  765. begin
  766. arrdef.elementdef:=tarraydef.create(lowval.svalue,highval.svalue,indexdef);
  767. arrdef:=tarraydef(arrdef.elementdef);
  768. end
  769. else
  770. begin
  771. arrdef:=tarraydef.create(lowval.svalue,highval.svalue,indexdef);
  772. def:=arrdef;
  773. end;
  774. if is_packed then
  775. include(arrdef.arrayoptions,ado_IsBitPacked);
  776. if token=_COMMA then
  777. consume(_COMMA)
  778. else
  779. break;
  780. until false;
  781. consume(_RECKKLAMMER);
  782. end
  783. else
  784. begin
  785. if is_packed then
  786. Message(parser_e_packed_dynamic_open_array);
  787. arrdef:=tarraydef.create(0,-1,s32inttype);
  788. include(arrdef.arrayoptions,ado_IsDynamicArray);
  789. def:=arrdef;
  790. end;
  791. consume(_OF);
  792. read_anon_type(tt2,true);
  793. { set element type of the last array definition }
  794. if assigned(arrdef) then
  795. begin
  796. arrdef.elementdef:=tt2;
  797. if is_packed and
  798. is_managed_type(tt2) then
  799. Message(type_e_no_packed_inittable);
  800. end;
  801. end;
  802. var
  803. p : tnode;
  804. hdef : tdef;
  805. pd : tabstractprocdef;
  806. is_func,
  807. enumdupmsg, first : boolean;
  808. newtype : ttypesym;
  809. oldlocalswitches : tlocalswitches;
  810. bitpacking: boolean;
  811. begin
  812. def:=nil;
  813. case token of
  814. _STRING,_FILE:
  815. begin
  816. single_type(def,false,true);
  817. end;
  818. _LKLAMMER:
  819. begin
  820. consume(_LKLAMMER);
  821. first := true;
  822. { allow negativ value_str }
  823. l:=int64(-1);
  824. enumdupmsg:=false;
  825. aktenumdef:=tenumdef.create;
  826. repeat
  827. s:=orgpattern;
  828. defpos:=current_tokenpos;
  829. consume(_ID);
  830. { only allow assigning of specific numbers under fpc mode }
  831. if not(m_tp7 in current_settings.modeswitches) and
  832. (
  833. { in fpc mode also allow := to be compatible
  834. with previous 1.0.x versions }
  835. ((m_fpc in current_settings.modeswitches) and
  836. try_to_consume(_ASSIGNMENT)) or
  837. try_to_consume(_EQUAL)
  838. ) then
  839. begin
  840. oldlocalswitches:=current_settings.localswitches;
  841. include(current_settings.localswitches,cs_allow_enum_calc);
  842. p:=comp_expr(true);
  843. current_settings.localswitches:=oldlocalswitches;
  844. if (p.nodetype=ordconstn) then
  845. begin
  846. { we expect an integer or an enum of the
  847. same type }
  848. if is_integer(p.resultdef) or
  849. is_char(p.resultdef) or
  850. equal_defs(p.resultdef,aktenumdef) then
  851. v:=tordconstnode(p).value
  852. else
  853. IncompatibleTypes(p.resultdef,s32inttype);
  854. end
  855. else
  856. Message(parser_e_illegal_expression);
  857. p.free;
  858. { please leave that a note, allows type save }
  859. { declarations in the win32 units ! }
  860. if (not first) and (v<=l) and (not enumdupmsg) then
  861. begin
  862. Message(parser_n_duplicate_enum);
  863. enumdupmsg:=true;
  864. end;
  865. l:=v;
  866. end
  867. else
  868. inc(l.svalue);
  869. first := false;
  870. storepos:=current_tokenpos;
  871. current_tokenpos:=defpos;
  872. tenumsymtable(aktenumdef.symtable).insert(tenumsym.create(s,aktenumdef,longint(l.svalue)));
  873. if not (cs_scopedenums in current_settings.localswitches) then
  874. tstoredsymtable(aktenumdef.owner).insert(tenumsym.create(s,aktenumdef,longint(l.svalue)));
  875. current_tokenpos:=storepos;
  876. until not try_to_consume(_COMMA);
  877. def:=aktenumdef;
  878. consume(_RKLAMMER);
  879. end;
  880. _ARRAY:
  881. begin
  882. array_dec(false);
  883. end;
  884. _SET:
  885. begin
  886. set_dec;
  887. end;
  888. _CARET:
  889. begin
  890. consume(_CARET);
  891. single_type(tt2,(block_type=bt_type),false);
  892. def:=tpointerdef.create(tt2);
  893. if tt2.typ=forwarddef then
  894. current_module.checkforwarddefs.add(def);
  895. end;
  896. _RECORD:
  897. begin
  898. def:=record_dec;
  899. end;
  900. _PACKED,
  901. _BITPACKED:
  902. begin
  903. bitpacking :=
  904. (cs_bitpacking in current_settings.localswitches) or
  905. (token = _BITPACKED);
  906. consume(token);
  907. if token=_ARRAY then
  908. array_dec(bitpacking)
  909. else if token=_SET then
  910. set_dec
  911. else if token=_FILE then
  912. single_type(def,false,true)
  913. else
  914. begin
  915. oldpackrecords:=current_settings.packrecords;
  916. if (not bitpacking) or
  917. (token in [_CLASS,_OBJECT]) then
  918. current_settings.packrecords:=1
  919. else
  920. current_settings.packrecords:=bit_alignment;
  921. case token of
  922. _CLASS :
  923. begin
  924. consume(_CLASS);
  925. def:=object_dec(odt_class,name,genericdef,genericlist,nil);
  926. end;
  927. _OBJECT :
  928. begin
  929. consume(_OBJECT);
  930. def:=object_dec(odt_object,name,genericdef,genericlist,nil);
  931. end;
  932. else
  933. def:=record_dec;
  934. end;
  935. current_settings.packrecords:=oldpackrecords;
  936. end;
  937. end;
  938. _DISPINTERFACE :
  939. begin
  940. { need extra check here since interface is a keyword
  941. in all pascal modes }
  942. if not(m_class in current_settings.modeswitches) then
  943. Message(parser_f_need_objfpc_or_delphi_mode);
  944. consume(token);
  945. def:=object_dec(odt_dispinterface,name,genericdef,genericlist,nil);
  946. end;
  947. _CLASS :
  948. begin
  949. consume(token);
  950. { Delphi only allows class of in type blocks }
  951. if (token=_OF) and
  952. (
  953. not(m_delphi in current_settings.modeswitches) or
  954. (block_type=bt_type)
  955. ) then
  956. begin
  957. consume(_OF);
  958. single_type(hdef,(block_type=bt_type),false);
  959. if is_class(hdef) or
  960. is_objcclass(hdef) then
  961. def:=tclassrefdef.create(hdef)
  962. else
  963. if hdef.typ=forwarddef then
  964. begin
  965. def:=tclassrefdef.create(hdef);
  966. current_module.checkforwarddefs.add(def);
  967. end
  968. else
  969. Message1(type_e_class_or_objcclass_type_expected,hdef.typename);
  970. end
  971. else
  972. def:=object_dec(odt_class,name,genericdef,genericlist,nil);
  973. end;
  974. _CPPCLASS :
  975. begin
  976. consume(token);
  977. def:=object_dec(odt_cppclass,name,genericdef,genericlist,nil);
  978. end;
  979. _OBJCCLASS :
  980. begin
  981. if not(m_objectivec1 in current_settings.modeswitches) then
  982. Message(parser_f_need_objc);
  983. consume(token);
  984. def:=object_dec(odt_objcclass,name,genericdef,genericlist,nil);
  985. end;
  986. _INTERFACE :
  987. begin
  988. { need extra check here since interface is a keyword
  989. in all pascal modes }
  990. if not(m_class in current_settings.modeswitches) then
  991. Message(parser_f_need_objfpc_or_delphi_mode);
  992. consume(token);
  993. if current_settings.interfacetype=it_interfacecom then
  994. def:=object_dec(odt_interfacecom,name,genericdef,genericlist,nil)
  995. else {it_interfacecorba}
  996. def:=object_dec(odt_interfacecorba,name,genericdef,genericlist,nil);
  997. end;
  998. _OBJCPROTOCOL :
  999. begin
  1000. if not(m_objectivec1 in current_settings.modeswitches) then
  1001. Message(parser_f_need_objc);
  1002. consume(token);
  1003. def:=object_dec(odt_objcprotocol,name,genericdef,genericlist,nil);
  1004. end;
  1005. _OBJCCATEGORY :
  1006. begin
  1007. if not(m_objectivec1 in current_settings.modeswitches) then
  1008. Message(parser_f_need_objc);
  1009. consume(token);
  1010. def:=object_dec(odt_objccategory,name,genericdef,genericlist,nil);
  1011. end;
  1012. _OBJECT :
  1013. begin
  1014. consume(token);
  1015. def:=object_dec(odt_object,name,genericdef,genericlist,nil);
  1016. end;
  1017. _PROCEDURE,
  1018. _FUNCTION:
  1019. begin
  1020. is_func:=(token=_FUNCTION);
  1021. consume(token);
  1022. pd:=tprocvardef.create(normal_function_level);
  1023. if token=_LKLAMMER then
  1024. parse_parameter_dec(pd);
  1025. if is_func then
  1026. begin
  1027. consume(_COLON);
  1028. single_type(pd.returndef,false,false);
  1029. end;
  1030. if try_to_consume(_OF) then
  1031. begin
  1032. consume(_OBJECT);
  1033. include(pd.procoptions,po_methodpointer);
  1034. end
  1035. else if (m_nested_procvars in current_settings.modeswitches) and
  1036. try_to_consume(_IS) then
  1037. begin
  1038. consume(_NESTED);
  1039. pd.parast.symtablelevel:=normal_function_level+1;
  1040. pd.check_mark_as_nested;
  1041. end;
  1042. def:=pd;
  1043. { possible proc directives }
  1044. if parseprocvardir then
  1045. begin
  1046. if check_proc_directive(true) then
  1047. begin
  1048. newtype:=ttypesym.create('unnamed',def);
  1049. parse_var_proc_directives(tsym(newtype));
  1050. newtype.typedef:=nil;
  1051. def.typesym:=nil;
  1052. newtype.free;
  1053. end;
  1054. { Add implicit hidden parameters and function result }
  1055. handle_calling_convention(pd);
  1056. end;
  1057. end;
  1058. else
  1059. if (token=_KLAMMERAFFE) and (m_iso in current_settings.modeswitches) then
  1060. begin
  1061. consume(_KLAMMERAFFE);
  1062. single_type(tt2,(block_type=bt_type),false);
  1063. def:=tpointerdef.create(tt2);
  1064. if tt2.typ=forwarddef then
  1065. current_module.checkforwarddefs.add(def);
  1066. end
  1067. else
  1068. expr_type;
  1069. end;
  1070. if def=nil then
  1071. def:=generrordef;
  1072. end;
  1073. procedure read_anon_type(var def : tdef;parseprocvardir:boolean);
  1074. begin
  1075. read_named_type(def,'',nil,nil,parseprocvardir);
  1076. end;
  1077. procedure write_persistent_type_info(st:tsymtable);
  1078. var
  1079. i : longint;
  1080. def : tdef;
  1081. vmtwriter : TVMTWriter;
  1082. begin
  1083. for i:=0 to st.DefList.Count-1 do
  1084. begin
  1085. def:=tdef(st.DefList[i]);
  1086. case def.typ of
  1087. recorddef :
  1088. write_persistent_type_info(trecorddef(def).symtable);
  1089. objectdef :
  1090. begin
  1091. { Skip generics and forward defs }
  1092. if (df_generic in def.defoptions) or
  1093. (oo_is_forward in tobjectdef(def).objectoptions) then
  1094. continue;
  1095. write_persistent_type_info(tobjectdef(def).symtable);
  1096. { Write also VMT if not done yet }
  1097. if not(ds_vmt_written in def.defstates) then
  1098. begin
  1099. vmtwriter:=TVMTWriter.create(tobjectdef(def));
  1100. if is_interface(tobjectdef(def)) then
  1101. vmtwriter.writeinterfaceids;
  1102. if (oo_has_vmt in tobjectdef(def).objectoptions) then
  1103. vmtwriter.writevmt;
  1104. vmtwriter.free;
  1105. include(def.defstates,ds_vmt_written);
  1106. end;
  1107. end;
  1108. procdef :
  1109. begin
  1110. if assigned(tprocdef(def).localst) and
  1111. (tprocdef(def).localst.symtabletype=localsymtable) then
  1112. write_persistent_type_info(tprocdef(def).localst);
  1113. if assigned(tprocdef(def).parast) then
  1114. write_persistent_type_info(tprocdef(def).parast);
  1115. end;
  1116. end;
  1117. { generate always persistent tables for types in the interface so it can
  1118. be reused in other units and give always the same pointer location. }
  1119. { Init }
  1120. if (
  1121. assigned(def.typesym) and
  1122. (st.symtabletype=globalsymtable) and
  1123. not is_objc_class_or_protocol(def)
  1124. ) or
  1125. is_managed_type(def) or
  1126. (ds_init_table_used in def.defstates) then
  1127. RTTIWriter.write_rtti(def,initrtti);
  1128. { RTTI }
  1129. if (
  1130. assigned(def.typesym) and
  1131. (st.symtabletype=globalsymtable) and
  1132. not is_objc_class_or_protocol(def)
  1133. ) or
  1134. (ds_rtti_table_used in def.defstates) then
  1135. RTTIWriter.write_rtti(def,fullrtti);
  1136. end;
  1137. end;
  1138. end.