ptype.pas 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190
  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 (df_generic in def.defoptions) then
  450. begin
  451. Message(parser_e_no_generics_as_types);
  452. def:=generrordef;
  453. end
  454. else if is_objccategory(def) then
  455. begin
  456. Message(parser_e_no_category_as_types);
  457. def:=generrordef
  458. end
  459. end;
  460. end;
  461. { reads a record declaration }
  462. function record_dec : tdef;
  463. var
  464. recst : trecordsymtable;
  465. begin
  466. { create recdef }
  467. recst:=trecordsymtable.create(current_settings.packrecords);
  468. record_dec:=trecorddef.create(recst);
  469. { insert in symtablestack }
  470. symtablestack.push(recst);
  471. { parse record }
  472. consume(_RECORD);
  473. read_record_fields([vd_record]);
  474. consume(_END);
  475. { make the record size aligned }
  476. recst.addalignmentpadding;
  477. { restore symtable stack }
  478. symtablestack.pop(recst);
  479. if trecorddef(record_dec).is_packed and
  480. is_managed_type(record_dec) then
  481. Message(type_e_no_packed_inittable);
  482. end;
  483. { reads a type definition and returns a pointer to it }
  484. procedure read_named_type(var def : tdef;const name : TIDString;genericdef:tstoreddef;genericlist:TFPObjectList;parseprocvardir:boolean);
  485. var
  486. pt : tnode;
  487. tt2 : tdef;
  488. aktenumdef : tenumdef;
  489. s : TIDString;
  490. l,v : TConstExprInt;
  491. oldpackrecords : longint;
  492. defpos,storepos : tfileposinfo;
  493. procedure expr_type;
  494. var
  495. pt1,pt2 : tnode;
  496. lv,hv : TConstExprInt;
  497. old_block_type : tblock_type;
  498. dospecialize : boolean;
  499. objdef: TDef;
  500. begin
  501. old_block_type:=block_type;
  502. dospecialize:=false;
  503. { use of current parsed object:
  504. - classes can be used also in classes
  505. - objects can be parameters }
  506. if (token=_ID) then
  507. begin
  508. objdef:=current_objectdef;
  509. while Assigned(objdef) and (objdef.typ=objectdef) do
  510. begin
  511. if (tobjectdef(objdef).objname^=pattern) and
  512. (
  513. (testcurobject=2) or
  514. is_class_or_interface_or_objc(objdef)
  515. ) then
  516. begin
  517. consume(_ID);
  518. def:=objdef;
  519. exit;
  520. end;
  521. objdef:=tobjectdef(tobjectdef(objdef).owner.defowner);
  522. end;
  523. end;
  524. { Generate a specialization? }
  525. if try_to_consume(_SPECIALIZE) then
  526. dospecialize:=true;
  527. { we can't accept a equal in type }
  528. pt1:=comp_expr(false);
  529. if not dospecialize and
  530. try_to_consume(_POINTPOINT) then
  531. begin
  532. { get high value of range }
  533. pt2:=comp_expr(false);
  534. { make both the same type or give an error. This is not
  535. done when both are integer values, because typecasting
  536. between -3200..3200 will result in a signed-unsigned
  537. conflict and give a range check error (PFV) }
  538. if not(is_integer(pt1.resultdef) and is_integer(pt2.resultdef)) then
  539. inserttypeconv(pt1,pt2.resultdef);
  540. { both must be evaluated to constants now }
  541. if (pt1.nodetype=ordconstn) and
  542. (pt2.nodetype=ordconstn) then
  543. begin
  544. lv:=tordconstnode(pt1).value;
  545. hv:=tordconstnode(pt2).value;
  546. { Check bounds }
  547. if hv<lv then
  548. message(parser_e_upper_lower_than_lower)
  549. else if (lv.signed and (lv.svalue<0)) and (not hv.signed and (hv.uvalue>qword(high(int64)))) then
  550. message(type_e_cant_eval_constant_expr)
  551. else
  552. begin
  553. { All checks passed, create the new def }
  554. case pt1.resultdef.typ of
  555. enumdef :
  556. def:=tenumdef.create_subrange(tenumdef(pt1.resultdef),lv.svalue,hv.svalue);
  557. orddef :
  558. begin
  559. if is_char(pt1.resultdef) then
  560. def:=torddef.create(uchar,lv,hv)
  561. else
  562. if is_boolean(pt1.resultdef) then
  563. def:=torddef.create(pasbool,lv,hv)
  564. else if is_signed(pt1.resultdef) then
  565. def:=torddef.create(range_to_basetype(lv,hv),lv,hv)
  566. else
  567. def:=torddef.create(range_to_basetype(lv,hv),lv,hv);
  568. end;
  569. end;
  570. end;
  571. end
  572. else
  573. Message(sym_e_error_in_type_def);
  574. pt2.free;
  575. end
  576. else
  577. begin
  578. { a simple type renaming or generic specialization }
  579. if (pt1.nodetype=typen) then
  580. begin
  581. def:=ttypenode(pt1).resultdef;
  582. if dospecialize then
  583. generate_specialization(def)
  584. else
  585. begin
  586. if (df_generic in def.defoptions) then
  587. begin
  588. Message(parser_e_no_generics_as_types);
  589. def:=generrordef;
  590. end
  591. else if is_objccategory(def) then
  592. begin
  593. Message(parser_e_no_category_as_types);
  594. def:=generrordef
  595. end
  596. end;
  597. end
  598. else
  599. Message(sym_e_error_in_type_def);
  600. end;
  601. pt1.free;
  602. block_type:=old_block_type;
  603. end;
  604. procedure set_dec;
  605. begin
  606. consume(_SET);
  607. consume(_OF);
  608. read_anon_type(tt2,true);
  609. if assigned(tt2) then
  610. begin
  611. case tt2.typ of
  612. { don't forget that min can be negativ PM }
  613. enumdef :
  614. if (tenumdef(tt2).min>=0) and
  615. (tenumdef(tt2).max<=255) then
  616. // !! def:=tsetdef.create(tt2,tenumdef(tt2.def).min,tenumdef(tt2.def).max))
  617. def:=tsetdef.create(tt2,tenumdef(tt2).min,tenumdef(tt2).max)
  618. else
  619. Message(sym_e_ill_type_decl_set);
  620. orddef :
  621. begin
  622. if (torddef(tt2).ordtype<>uvoid) and
  623. (torddef(tt2).ordtype<>uwidechar) and
  624. (torddef(tt2).low>=0) then
  625. // !! def:=tsetdef.create(tt2,torddef(tt2.def).low,torddef(tt2.def).high))
  626. if Torddef(tt2).high>int64(high(byte)) then
  627. message(sym_e_ill_type_decl_set)
  628. else
  629. def:=tsetdef.create(tt2,torddef(tt2).low.svalue,torddef(tt2).high.svalue)
  630. else
  631. Message(sym_e_ill_type_decl_set);
  632. end;
  633. else
  634. Message(sym_e_ill_type_decl_set);
  635. end;
  636. end
  637. else
  638. def:=generrordef;
  639. end;
  640. procedure array_dec(is_packed: boolean);
  641. var
  642. lowval,
  643. highval : TConstExprInt;
  644. indexdef : tdef;
  645. hdef : tdef;
  646. arrdef : tarraydef;
  647. procedure setdefdecl(def:tdef);
  648. begin
  649. case def.typ of
  650. enumdef :
  651. begin
  652. lowval:=tenumdef(def).min;
  653. highval:=tenumdef(def).max;
  654. if (m_fpc in current_settings.modeswitches) and
  655. (tenumdef(def).has_jumps) then
  656. Message(type_e_array_index_enums_with_assign_not_possible);
  657. indexdef:=def;
  658. end;
  659. orddef :
  660. begin
  661. if torddef(def).ordtype in [uchar,
  662. u8bit,u16bit,
  663. s8bit,s16bit,s32bit,
  664. {$ifdef cpu64bitaddr}
  665. u32bit,s64bit,
  666. {$endif cpu64bitaddr}
  667. pasbool,bool8bit,bool16bit,bool32bit,bool64bit,
  668. uwidechar] then
  669. begin
  670. lowval:=torddef(def).low;
  671. highval:=torddef(def).high;
  672. indexdef:=def;
  673. end
  674. else
  675. Message1(parser_e_type_cant_be_used_in_array_index,def.typename);
  676. end;
  677. else
  678. Message(sym_e_error_in_type_def);
  679. end;
  680. end;
  681. begin
  682. arrdef:=nil;
  683. consume(_ARRAY);
  684. { open array? }
  685. if try_to_consume(_LECKKLAMMER) then
  686. begin
  687. { defaults }
  688. indexdef:=generrordef;
  689. { use defaults which don't overflow the compiler }
  690. lowval:=0;
  691. highval:=0;
  692. repeat
  693. { read the expression and check it, check apart if the
  694. declaration is an enum declaration because that needs to
  695. be parsed by readtype (PFV) }
  696. if token=_LKLAMMER then
  697. begin
  698. read_anon_type(hdef,true);
  699. setdefdecl(hdef);
  700. end
  701. else
  702. begin
  703. pt:=expr(true);
  704. if pt.nodetype=typen then
  705. setdefdecl(pt.resultdef)
  706. else
  707. begin
  708. if (pt.nodetype=rangen) then
  709. begin
  710. if (trangenode(pt).left.nodetype=ordconstn) and
  711. (trangenode(pt).right.nodetype=ordconstn) then
  712. begin
  713. { make both the same type or give an error. This is not
  714. done when both are integer values, because typecasting
  715. between -3200..3200 will result in a signed-unsigned
  716. conflict and give a range check error (PFV) }
  717. if not(is_integer(trangenode(pt).left.resultdef) and is_integer(trangenode(pt).left.resultdef)) then
  718. inserttypeconv(trangenode(pt).left,trangenode(pt).right.resultdef);
  719. lowval:=tordconstnode(trangenode(pt).left).value;
  720. highval:=tordconstnode(trangenode(pt).right).value;
  721. if highval<lowval then
  722. begin
  723. Message(parser_e_array_lower_less_than_upper_bound);
  724. highval:=lowval;
  725. end
  726. else if (lowval<int64(low(aint))) or
  727. (highval > high(aint)) then
  728. begin
  729. Message(parser_e_array_range_out_of_bounds);
  730. lowval :=0;
  731. highval:=0;
  732. end;
  733. if is_integer(trangenode(pt).left.resultdef) then
  734. range_to_type(lowval,highval,indexdef)
  735. else
  736. indexdef:=trangenode(pt).left.resultdef;
  737. end
  738. else
  739. Message(type_e_cant_eval_constant_expr);
  740. end
  741. else
  742. Message(sym_e_error_in_type_def)
  743. end;
  744. pt.free;
  745. end;
  746. { if the array is already created add the new arrray
  747. as element of the existing array, otherwise create a new array }
  748. if assigned(arrdef) then
  749. begin
  750. arrdef.elementdef:=tarraydef.create(lowval.svalue,highval.svalue,indexdef);
  751. arrdef:=tarraydef(arrdef.elementdef);
  752. end
  753. else
  754. begin
  755. arrdef:=tarraydef.create(lowval.svalue,highval.svalue,indexdef);
  756. def:=arrdef;
  757. end;
  758. if is_packed then
  759. include(arrdef.arrayoptions,ado_IsBitPacked);
  760. if token=_COMMA then
  761. consume(_COMMA)
  762. else
  763. break;
  764. until false;
  765. consume(_RECKKLAMMER);
  766. end
  767. else
  768. begin
  769. if is_packed then
  770. Message(parser_e_packed_dynamic_open_array);
  771. arrdef:=tarraydef.create(0,-1,s32inttype);
  772. include(arrdef.arrayoptions,ado_IsDynamicArray);
  773. def:=arrdef;
  774. end;
  775. consume(_OF);
  776. read_anon_type(tt2,true);
  777. { set element type of the last array definition }
  778. if assigned(arrdef) then
  779. begin
  780. arrdef.elementdef:=tt2;
  781. if is_packed and
  782. is_managed_type(tt2) then
  783. Message(type_e_no_packed_inittable);
  784. end;
  785. end;
  786. var
  787. p : tnode;
  788. hdef : tdef;
  789. pd : tabstractprocdef;
  790. is_func,
  791. enumdupmsg, first : boolean;
  792. newtype : ttypesym;
  793. oldlocalswitches : tlocalswitches;
  794. bitpacking: boolean;
  795. begin
  796. def:=nil;
  797. case token of
  798. _STRING,_FILE:
  799. begin
  800. single_type(def,false,true);
  801. end;
  802. _LKLAMMER:
  803. begin
  804. consume(_LKLAMMER);
  805. first := true;
  806. { allow negativ value_str }
  807. l:=int64(-1);
  808. enumdupmsg:=false;
  809. aktenumdef:=tenumdef.create;
  810. repeat
  811. s:=orgpattern;
  812. defpos:=current_tokenpos;
  813. consume(_ID);
  814. { only allow assigning of specific numbers under fpc mode }
  815. if not(m_tp7 in current_settings.modeswitches) and
  816. (
  817. { in fpc mode also allow := to be compatible
  818. with previous 1.0.x versions }
  819. ((m_fpc in current_settings.modeswitches) and
  820. try_to_consume(_ASSIGNMENT)) or
  821. try_to_consume(_EQUAL)
  822. ) then
  823. begin
  824. oldlocalswitches:=current_settings.localswitches;
  825. include(current_settings.localswitches,cs_allow_enum_calc);
  826. p:=comp_expr(true);
  827. current_settings.localswitches:=oldlocalswitches;
  828. if (p.nodetype=ordconstn) then
  829. begin
  830. { we expect an integer or an enum of the
  831. same type }
  832. if is_integer(p.resultdef) or
  833. is_char(p.resultdef) or
  834. equal_defs(p.resultdef,aktenumdef) then
  835. v:=tordconstnode(p).value
  836. else
  837. IncompatibleTypes(p.resultdef,s32inttype);
  838. end
  839. else
  840. Message(parser_e_illegal_expression);
  841. p.free;
  842. { please leave that a note, allows type save }
  843. { declarations in the win32 units ! }
  844. if (not first) and (v<=l) and (not enumdupmsg) then
  845. begin
  846. Message(parser_n_duplicate_enum);
  847. enumdupmsg:=true;
  848. end;
  849. l:=v;
  850. end
  851. else
  852. inc(l.svalue);
  853. first := false;
  854. storepos:=current_tokenpos;
  855. current_tokenpos:=defpos;
  856. tenumsymtable(aktenumdef.symtable).insert(tenumsym.create(s,aktenumdef,longint(l.svalue)));
  857. if not (cs_scopedenums in current_settings.localswitches) then
  858. tstoredsymtable(aktenumdef.owner).insert(tenumsym.create(s,aktenumdef,longint(l.svalue)));
  859. current_tokenpos:=storepos;
  860. until not try_to_consume(_COMMA);
  861. def:=aktenumdef;
  862. consume(_RKLAMMER);
  863. end;
  864. _ARRAY:
  865. begin
  866. array_dec(false);
  867. end;
  868. _SET:
  869. begin
  870. set_dec;
  871. end;
  872. _CARET:
  873. begin
  874. consume(_CARET);
  875. single_type(tt2,(block_type=bt_type),false);
  876. def:=tpointerdef.create(tt2);
  877. if tt2.typ=forwarddef then
  878. current_module.checkforwarddefs.add(def);
  879. end;
  880. _RECORD:
  881. begin
  882. def:=record_dec;
  883. end;
  884. _PACKED,
  885. _BITPACKED:
  886. begin
  887. bitpacking :=
  888. (cs_bitpacking in current_settings.localswitches) or
  889. (token = _BITPACKED);
  890. consume(token);
  891. if token=_ARRAY then
  892. array_dec(bitpacking)
  893. else if token=_SET then
  894. set_dec
  895. else if token=_FILE then
  896. single_type(def,false,true)
  897. else
  898. begin
  899. oldpackrecords:=current_settings.packrecords;
  900. if (not bitpacking) or
  901. (token in [_CLASS,_OBJECT]) then
  902. current_settings.packrecords:=1
  903. else
  904. current_settings.packrecords:=bit_alignment;
  905. case token of
  906. _CLASS :
  907. begin
  908. consume(_CLASS);
  909. def:=object_dec(odt_class,name,genericdef,genericlist,nil);
  910. end;
  911. _OBJECT :
  912. begin
  913. consume(_OBJECT);
  914. def:=object_dec(odt_object,name,genericdef,genericlist,nil);
  915. end;
  916. else
  917. def:=record_dec;
  918. end;
  919. current_settings.packrecords:=oldpackrecords;
  920. end;
  921. end;
  922. _DISPINTERFACE :
  923. begin
  924. { need extra check here since interface is a keyword
  925. in all pascal modes }
  926. if not(m_class in current_settings.modeswitches) then
  927. Message(parser_f_need_objfpc_or_delphi_mode);
  928. consume(token);
  929. def:=object_dec(odt_dispinterface,name,genericdef,genericlist,nil);
  930. end;
  931. _CLASS :
  932. begin
  933. consume(token);
  934. { Delphi only allows class of in type blocks }
  935. if (token=_OF) and
  936. (
  937. not(m_delphi in current_settings.modeswitches) or
  938. (block_type=bt_type)
  939. ) then
  940. begin
  941. consume(_OF);
  942. single_type(hdef,(block_type=bt_type),false);
  943. if is_class(hdef) or
  944. is_objcclass(hdef) then
  945. def:=tclassrefdef.create(hdef)
  946. else
  947. if hdef.typ=forwarddef then
  948. begin
  949. def:=tclassrefdef.create(hdef);
  950. current_module.checkforwarddefs.add(def);
  951. end
  952. else
  953. Message1(type_e_class_or_objcclass_type_expected,hdef.typename);
  954. end
  955. else
  956. def:=object_dec(odt_class,name,genericdef,genericlist,nil);
  957. end;
  958. _CPPCLASS :
  959. begin
  960. consume(token);
  961. def:=object_dec(odt_cppclass,name,genericdef,genericlist,nil);
  962. end;
  963. _OBJCCLASS :
  964. begin
  965. if not(m_objectivec1 in current_settings.modeswitches) then
  966. Message(parser_f_need_objc);
  967. consume(token);
  968. def:=object_dec(odt_objcclass,name,genericdef,genericlist,nil);
  969. end;
  970. _INTERFACE :
  971. begin
  972. { need extra check here since interface is a keyword
  973. in all pascal modes }
  974. if not(m_class in current_settings.modeswitches) then
  975. Message(parser_f_need_objfpc_or_delphi_mode);
  976. consume(token);
  977. if current_settings.interfacetype=it_interfacecom then
  978. def:=object_dec(odt_interfacecom,name,genericdef,genericlist,nil)
  979. else {it_interfacecorba}
  980. def:=object_dec(odt_interfacecorba,name,genericdef,genericlist,nil);
  981. end;
  982. _OBJCPROTOCOL :
  983. begin
  984. if not(m_objectivec1 in current_settings.modeswitches) then
  985. Message(parser_f_need_objc);
  986. consume(token);
  987. def:=object_dec(odt_objcprotocol,name,genericdef,genericlist,nil);
  988. end;
  989. _OBJCCATEGORY :
  990. begin
  991. if not(m_objectivec1 in current_settings.modeswitches) then
  992. Message(parser_f_need_objc);
  993. consume(token);
  994. def:=object_dec(odt_objccategory,name,genericdef,genericlist,nil);
  995. end;
  996. _OBJECT :
  997. begin
  998. consume(token);
  999. def:=object_dec(odt_object,name,genericdef,genericlist,nil);
  1000. end;
  1001. _PROCEDURE,
  1002. _FUNCTION:
  1003. begin
  1004. is_func:=(token=_FUNCTION);
  1005. consume(token);
  1006. pd:=tprocvardef.create(normal_function_level);
  1007. if token=_LKLAMMER then
  1008. parse_parameter_dec(pd);
  1009. if is_func then
  1010. begin
  1011. consume(_COLON);
  1012. single_type(pd.returndef,false,false);
  1013. end;
  1014. if try_to_consume(_OF) then
  1015. begin
  1016. consume(_OBJECT);
  1017. include(pd.procoptions,po_methodpointer);
  1018. end
  1019. else if (m_nested_procvars in current_settings.modeswitches) and
  1020. try_to_consume(_IS) then
  1021. begin
  1022. consume(_NESTED);
  1023. pd.parast.symtablelevel:=normal_function_level+1;
  1024. pd.check_mark_as_nested;
  1025. end;
  1026. def:=pd;
  1027. { possible proc directives }
  1028. if parseprocvardir then
  1029. begin
  1030. if check_proc_directive(true) then
  1031. begin
  1032. newtype:=ttypesym.create('unnamed',def);
  1033. parse_var_proc_directives(tsym(newtype));
  1034. newtype.typedef:=nil;
  1035. def.typesym:=nil;
  1036. newtype.free;
  1037. end;
  1038. { Add implicit hidden parameters and function result }
  1039. handle_calling_convention(pd);
  1040. end;
  1041. end;
  1042. else
  1043. if (token=_KLAMMERAFFE) and (m_iso in current_settings.modeswitches) then
  1044. begin
  1045. consume(_KLAMMERAFFE);
  1046. single_type(tt2,(block_type=bt_type),false);
  1047. def:=tpointerdef.create(tt2);
  1048. if tt2.typ=forwarddef then
  1049. current_module.checkforwarddefs.add(def);
  1050. end
  1051. else
  1052. expr_type;
  1053. end;
  1054. if def=nil then
  1055. def:=generrordef;
  1056. end;
  1057. procedure read_anon_type(var def : tdef;parseprocvardir:boolean);
  1058. begin
  1059. read_named_type(def,'',nil,nil,parseprocvardir);
  1060. end;
  1061. procedure write_persistent_type_info(st:tsymtable);
  1062. var
  1063. i : longint;
  1064. def : tdef;
  1065. vmtwriter : TVMTWriter;
  1066. begin
  1067. for i:=0 to st.DefList.Count-1 do
  1068. begin
  1069. def:=tdef(st.DefList[i]);
  1070. case def.typ of
  1071. recorddef :
  1072. write_persistent_type_info(trecorddef(def).symtable);
  1073. objectdef :
  1074. begin
  1075. { Skip generics and forward defs }
  1076. if (df_generic in def.defoptions) or
  1077. (oo_is_forward in tobjectdef(def).objectoptions) then
  1078. continue;
  1079. write_persistent_type_info(tobjectdef(def).symtable);
  1080. { Write also VMT if not done yet }
  1081. if not(ds_vmt_written in def.defstates) then
  1082. begin
  1083. vmtwriter:=TVMTWriter.create(tobjectdef(def));
  1084. if is_interface(tobjectdef(def)) then
  1085. vmtwriter.writeinterfaceids;
  1086. if (oo_has_vmt in tobjectdef(def).objectoptions) then
  1087. vmtwriter.writevmt;
  1088. vmtwriter.free;
  1089. include(def.defstates,ds_vmt_written);
  1090. end;
  1091. end;
  1092. procdef :
  1093. begin
  1094. if assigned(tprocdef(def).localst) and
  1095. (tprocdef(def).localst.symtabletype=localsymtable) then
  1096. write_persistent_type_info(tprocdef(def).localst);
  1097. if assigned(tprocdef(def).parast) then
  1098. write_persistent_type_info(tprocdef(def).parast);
  1099. end;
  1100. end;
  1101. { generate always persistent tables for types in the interface so it can
  1102. be reused in other units and give always the same pointer location. }
  1103. { Init }
  1104. if (
  1105. assigned(def.typesym) and
  1106. (st.symtabletype=globalsymtable) and
  1107. not is_objc_class_or_protocol(def)
  1108. ) or
  1109. is_managed_type(def) or
  1110. (ds_init_table_used in def.defstates) then
  1111. RTTIWriter.write_rtti(def,initrtti);
  1112. { RTTI }
  1113. if (
  1114. assigned(def.typesym) and
  1115. (st.symtabletype=globalsymtable) and
  1116. not is_objc_class_or_protocol(def)
  1117. ) or
  1118. (ds_rtti_table_used in def.defstates) then
  1119. RTTIWriter.write_rtti(def,fullrtti);
  1120. end;
  1121. end;
  1122. end.