ptype.pas 46 KB

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