ptype.pas 61 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583
  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. procedure resolve_forward_types;
  24. { reads a type identifier }
  25. procedure id_type(var def : tdef;isforwarddef:boolean);
  26. { reads a string, file type or a type identifier }
  27. procedure single_type(var def:tdef;isforwarddef,allowtypedef:boolean);
  28. { reads any type declaration, where the resulting type will get name as type identifier }
  29. procedure read_named_type(var def:tdef;const name : TIDString;genericdef:tstoreddef;genericlist:TFPObjectList;parseprocvardir:boolean);
  30. { reads any type declaration }
  31. procedure read_anon_type(var def : tdef;parseprocvardir:boolean);
  32. { generate persistent type information like VMT, RTTI and inittables }
  33. procedure write_persistent_type_info(st:tsymtable);
  34. implementation
  35. uses
  36. { common }
  37. cutils,
  38. { global }
  39. globals,tokens,verbose,constexp,
  40. systems,
  41. { target }
  42. paramgr,procinfo,
  43. { symtable }
  44. symconst,symsym,symtable,
  45. defutil,defcmp,
  46. { modules }
  47. fmodule,
  48. { pass 1 }
  49. node,ncgrtti,nobj,
  50. nmat,nadd,ncal,nset,ncnv,ninl,ncon,nld,nflw,
  51. { parser }
  52. scanner,
  53. pbase,pexpr,pdecsub,pdecvar,pdecobj,pdecl;
  54. procedure resolve_forward_types;
  55. var
  56. i: longint;
  57. hpd,
  58. def : tdef;
  59. srsym : tsym;
  60. srsymtable : TSymtable;
  61. hs : string;
  62. begin
  63. for i:=0 to current_module.checkforwarddefs.Count-1 do
  64. begin
  65. def:=tdef(current_module.checkforwarddefs[i]);
  66. case def.typ of
  67. pointerdef,
  68. classrefdef :
  69. begin
  70. { classrefdef inherits from pointerdef }
  71. hpd:=tabstractpointerdef(def).pointeddef;
  72. { still a forward def ? }
  73. if hpd.typ=forwarddef then
  74. begin
  75. { try to resolve the forward }
  76. if not assigned(tforwarddef(hpd).tosymname) then
  77. internalerror(200211201);
  78. hs:=tforwarddef(hpd).tosymname^;
  79. searchsym(upper(hs),srsym,srsymtable);
  80. { we don't need the forwarddef anymore, dispose it }
  81. hpd.free;
  82. tabstractpointerdef(def).pointeddef:=nil; { if error occurs }
  83. { was a type sym found ? }
  84. if assigned(srsym) and
  85. (srsym.typ=typesym) then
  86. begin
  87. tabstractpointerdef(def).pointeddef:=ttypesym(srsym).typedef;
  88. { avoid wrong unused warnings web bug 801 PM }
  89. inc(ttypesym(srsym).refs);
  90. { we need a class type for classrefdef }
  91. if (def.typ=classrefdef) and
  92. not(is_class(ttypesym(srsym).typedef)) and
  93. not(is_objcclass(ttypesym(srsym).typedef)) then
  94. MessagePos1(def.typesym.fileinfo,type_e_class_type_expected,ttypesym(srsym).typedef.typename);
  95. end
  96. else
  97. begin
  98. Message1(sym_e_forward_type_not_resolved,hs);
  99. { try to recover }
  100. tabstractpointerdef(def).pointeddef:=generrordef;
  101. end;
  102. end;
  103. end;
  104. objectdef :
  105. begin
  106. { give an error as the implementation may follow in an
  107. other type block which is allowed by FPC modes }
  108. if not(m_fpc in current_settings.modeswitches) and
  109. (oo_is_forward in tobjectdef(def).objectoptions) then
  110. MessagePos1(def.typesym.fileinfo,type_e_type_is_not_completly_defined,def.typename);
  111. end;
  112. else
  113. internalerror(200811071);
  114. end;
  115. end;
  116. current_module.checkforwarddefs.clear;
  117. end;
  118. procedure generate_specialization(var tt:tdef);
  119. var
  120. st : TSymtable;
  121. srsym : tsym;
  122. pt2 : tnode;
  123. first,
  124. err : boolean;
  125. i : longint;
  126. sym : tsym;
  127. genericdef : tstoreddef;
  128. generictype : ttypesym;
  129. generictypelist : TFPObjectList;
  130. oldsymtablestack : tsymtablestack;
  131. hmodule : tmodule;
  132. pu : tused_unit;
  133. uspecializename,
  134. specializename : string;
  135. vmtbuilder : TVMTBuilder;
  136. onlyparsepara : boolean;
  137. specializest : tsymtable;
  138. item: psymtablestackitem;
  139. begin
  140. { retrieve generic def that we are going to replace }
  141. genericdef:=tstoreddef(tt);
  142. tt:=nil;
  143. onlyparsepara:=false;
  144. if not(df_generic in genericdef.defoptions) then
  145. begin
  146. Message(parser_e_special_onlygenerics);
  147. tt:=generrordef;
  148. onlyparsepara:=true;
  149. end;
  150. { only need to record the tokens, then we don't know the type yet ... }
  151. if parse_generic then
  152. begin
  153. { ... but we have to insert a def into the symtable else the deflist
  154. of generic and specialization might not be equally sized which
  155. is later assumed }
  156. tt:=tundefineddef.create;
  157. onlyparsepara:=true;
  158. end;
  159. { Only parse the parameters for recovery or
  160. for recording in genericbuf }
  161. if onlyparsepara then
  162. begin
  163. consume(_LSHARPBRACKET);
  164. repeat
  165. pt2:=factor(false,true);
  166. pt2.free;
  167. until not try_to_consume(_COMMA);
  168. consume(_RSHARPBRACKET);
  169. exit;
  170. end;
  171. consume(_LSHARPBRACKET);
  172. { Parse generic parameters, for each undefineddef in the symtable of
  173. the genericdef we need to have a new def }
  174. err:=false;
  175. first:=true;
  176. generictypelist:=TFPObjectList.create(false);
  177. case genericdef.typ of
  178. procdef:
  179. st:=genericdef.GetSymtable(gs_para);
  180. objectdef,
  181. recorddef:
  182. st:=genericdef.GetSymtable(gs_record);
  183. arraydef:
  184. st:=tarraydef(genericdef).symtable;
  185. else
  186. internalerror(200511182);
  187. end;
  188. { Parse type parameters }
  189. if not assigned(genericdef.typesym) then
  190. internalerror(200710173);
  191. specializename:=genericdef.typesym.realname;
  192. for i:=0 to st.SymList.Count-1 do
  193. begin
  194. sym:=tsym(st.SymList[i]);
  195. if (sp_generic_para in sym.symoptions) then
  196. begin
  197. if not first then
  198. consume(_COMMA)
  199. else
  200. first:=false;
  201. pt2:=factor(false,true);
  202. if pt2.nodetype=typen then
  203. begin
  204. if df_generic in pt2.resultdef.defoptions then
  205. Message(parser_e_no_generics_as_params);
  206. generictype:=ttypesym.create(sym.realname,pt2.resultdef);
  207. generictypelist.add(generictype);
  208. if not assigned(pt2.resultdef.typesym) then
  209. message(type_e_generics_cannot_reference_itself)
  210. else
  211. specializename:=specializename+'$'+pt2.resultdef.typesym.realname;
  212. end
  213. else
  214. begin
  215. Message(type_e_type_id_expected);
  216. err:=true;
  217. end;
  218. pt2.free;
  219. end;
  220. end;
  221. uspecializename:=upper(specializename);
  222. { force correct error location if too much type parameters are passed }
  223. if token<>_RSHARPBRACKET then
  224. consume(_RSHARPBRACKET);
  225. { Special case if we are referencing the current defined object }
  226. if assigned(current_structdef) and
  227. (current_structdef.objname^=uspecializename) then
  228. tt:=current_structdef;
  229. { for units specializations can already be needed in the interface, therefor we
  230. will use the global symtable. Programs don't have a globalsymtable and there we
  231. use the localsymtable }
  232. if current_module.is_unit then
  233. specializest:=current_module.globalsymtable
  234. else
  235. specializest:=current_module.localsymtable;
  236. { Can we reuse an already specialized type? }
  237. if not assigned(tt) then
  238. begin
  239. srsym:=tsym(specializest.find(uspecializename));
  240. if assigned(srsym) then
  241. begin
  242. if srsym.typ<>typesym then
  243. internalerror(200710171);
  244. tt:=ttypesym(srsym).typedef;
  245. end;
  246. end;
  247. if not assigned(tt) then
  248. begin
  249. { Setup symtablestack at definition time
  250. to get types right, however this is not perfect, we should probably record
  251. the resolved symbols }
  252. oldsymtablestack:=symtablestack;
  253. symtablestack:=tsymtablestack.create;
  254. if not assigned(genericdef) then
  255. internalerror(200705151);
  256. hmodule:=find_module_from_symtable(genericdef.owner);
  257. if hmodule=nil then
  258. internalerror(200705152);
  259. pu:=tused_unit(hmodule.used_units.first);
  260. while assigned(pu) do
  261. begin
  262. if not assigned(pu.u.globalsymtable) then
  263. internalerror(200705153);
  264. symtablestack.push(pu.u.globalsymtable);
  265. pu:=tused_unit(pu.next);
  266. end;
  267. if assigned(hmodule.globalsymtable) then
  268. symtablestack.push(hmodule.globalsymtable);
  269. { hacky, but necessary to insert the newly generated class properly }
  270. item:=oldsymtablestack.stack;
  271. while assigned(item) and (item^.symtable.symtablelevel>main_program_level) do
  272. item:=item^.next;
  273. if assigned(item) and (item^.symtable<>symtablestack.top) then
  274. symtablestack.push(item^.symtable);
  275. { Reparse the original type definition }
  276. if not err then
  277. begin
  278. { First a new typesym so we can reuse this specialization and
  279. references to this specialization can be handled }
  280. srsym:=ttypesym.create(specializename,generrordef);
  281. specializest.insert(srsym);
  282. if not assigned(genericdef.generictokenbuf) then
  283. internalerror(200511171);
  284. current_scanner.startreplaytokens(genericdef.generictokenbuf);
  285. read_named_type(tt,specializename,genericdef,generictypelist,false);
  286. ttypesym(srsym).typedef:=tt;
  287. tt.typesym:=srsym;
  288. { Consume the semicolon if it is also recorded }
  289. try_to_consume(_SEMICOLON);
  290. { Build VMT indexes for classes }
  291. if (tt.typ=objectdef) then
  292. begin
  293. vmtbuilder:=TVMTBuilder.Create(tobjectdef(tt));
  294. vmtbuilder.generate_vmt;
  295. vmtbuilder.free;
  296. end;
  297. end;
  298. { Restore symtablestack }
  299. symtablestack.free;
  300. symtablestack:=oldsymtablestack;
  301. end
  302. else
  303. begin
  304. { There is comment few lines before ie 200512115
  305. saying "We are parsing the same objectdef, the def index numbers
  306. are the same". This is wrong (index numbers are not same)
  307. in case there is specialization (S2 in this case) inside
  308. specialized generic (G2 in this case) which is equal to
  309. some previous specialization (S1 in this case). In that case,
  310. new symbol is not added to currently specialized type
  311. (S in this case) for that specializations (S2 in this case),
  312. and this results in that specialization and generic definition
  313. don't have same number of elements in their object symbol tables.
  314. This patch adds undefined def to ensure that those
  315. two symbol tables will have same number of elements.
  316. }
  317. tundefineddef.create;
  318. end;
  319. generictypelist.free;
  320. consume(_RSHARPBRACKET);
  321. end;
  322. procedure id_type(var def : tdef;isforwarddef:boolean);
  323. { reads a type definition }
  324. { to a appropriating tdef, s gets the name of }
  325. { the type to allow name mangling }
  326. var
  327. is_unit_specific : boolean;
  328. pos : tfileposinfo;
  329. srsym : tsym;
  330. srsymtable : TSymtable;
  331. s,sorg : TIDString;
  332. t : ttoken;
  333. structdef : tabstractrecorddef;
  334. begin
  335. s:=pattern;
  336. sorg:=orgpattern;
  337. pos:=current_tokenpos;
  338. { use of current parsed object:
  339. - classes can be used also in classes
  340. - objects can be parameters }
  341. structdef:=current_structdef;
  342. while assigned(structdef) and (structdef.typ in [objectdef,recorddef]) do
  343. begin
  344. if (structdef.objname^=pattern) then
  345. begin
  346. consume(_ID);
  347. def:=structdef;
  348. exit;
  349. end;
  350. structdef:=tabstractrecorddef(structdef.owner.defowner);
  351. end;
  352. { Use the special searchsym_type that ignores records and parameters }
  353. searchsym_type(s,srsym,srsymtable);
  354. { handle unit specification like System.Writeln }
  355. is_unit_specific:=try_consume_unitsym(srsym,srsymtable,t);
  356. consume(t);
  357. { Types are first defined with an error def before assigning
  358. the real type so check if it's an errordef. if so then
  359. give an error. Only check for typesyms in the current symbol
  360. table as forwarddef are not resolved directly }
  361. if assigned(srsym) and
  362. (srsym.typ=typesym) and
  363. (ttypesym(srsym).typedef.typ=errordef) then
  364. begin
  365. Message1(type_e_type_is_not_completly_defined,ttypesym(srsym).realname);
  366. def:=generrordef;
  367. exit;
  368. end;
  369. { are we parsing a possible forward def ? }
  370. if isforwarddef and
  371. not(is_unit_specific) then
  372. begin
  373. def:=tforwarddef.create(sorg,pos);
  374. exit;
  375. end;
  376. { unknown sym ? }
  377. if not assigned(srsym) then
  378. begin
  379. Message1(sym_e_id_not_found,sorg);
  380. def:=generrordef;
  381. exit;
  382. end;
  383. { type sym ? }
  384. if (srsym.typ<>typesym) then
  385. begin
  386. Message(type_e_type_id_expected);
  387. def:=generrordef;
  388. exit;
  389. end;
  390. { Give an error when referring to an errordef }
  391. if (ttypesym(srsym).typedef.typ=errordef) then
  392. begin
  393. Message(sym_e_error_in_type_def);
  394. def:=generrordef;
  395. exit;
  396. end;
  397. def:=ttypesym(srsym).typedef;
  398. end;
  399. procedure single_type(var def:tdef;isforwarddef,allowtypedef:boolean);
  400. var
  401. t2 : tdef;
  402. dospecialize,
  403. again : boolean;
  404. begin
  405. dospecialize:=false;
  406. repeat
  407. again:=false;
  408. case token of
  409. _STRING:
  410. string_dec(def,allowtypedef);
  411. _FILE:
  412. begin
  413. consume(_FILE);
  414. if (token=_OF) then
  415. begin
  416. if not(allowtypedef) then
  417. Message(parser_e_no_local_para_def);
  418. consume(_OF);
  419. single_type(t2,false,false);
  420. if is_managed_type(t2) then
  421. Message(parser_e_no_refcounted_typed_file);
  422. def:=tfiledef.createtyped(t2);
  423. end
  424. else
  425. def:=cfiletype;
  426. end;
  427. _ID:
  428. begin
  429. if try_to_consume(_SPECIALIZE) then
  430. begin
  431. if not(allowtypedef) then
  432. begin
  433. Message(parser_e_no_local_para_def);
  434. { try to recover }
  435. while token<>_SEMICOLON do
  436. consume(token);
  437. def:=generrordef;
  438. end
  439. else
  440. begin
  441. dospecialize:=true;
  442. again:=true;
  443. end;
  444. end
  445. else
  446. begin
  447. id_type(def,isforwarddef);
  448. { handle types inside classes, e.g. TNode.TLongint }
  449. while (token=_POINT) do
  450. begin
  451. if parse_generic then
  452. begin
  453. consume(_POINT);
  454. consume(_ID);
  455. end
  456. else if is_class_or_object(def) or is_record(def) then
  457. begin
  458. symtablestack.push(tabstractrecorddef(def).symtable);
  459. consume(_POINT);
  460. id_type(t2,isforwarddef);
  461. symtablestack.pop(tabstractrecorddef(def).symtable);
  462. def:=t2;
  463. end
  464. else
  465. break;
  466. end;
  467. end;
  468. end;
  469. else
  470. begin
  471. message(type_e_type_id_expected);
  472. def:=generrordef;
  473. end;
  474. end;
  475. until not again;
  476. if dospecialize then
  477. generate_specialization(def)
  478. else
  479. begin
  480. if assigned(current_specializedef) and (def=current_specializedef.genericdef) then
  481. begin
  482. def:=current_specializedef
  483. end
  484. else if (def=current_genericdef) then
  485. begin
  486. def:=current_genericdef
  487. end
  488. else if (df_generic in def.defoptions) then
  489. begin
  490. Message(parser_e_no_generics_as_types);
  491. def:=generrordef;
  492. end
  493. else if is_objccategory(def) then
  494. begin
  495. Message(parser_e_no_category_as_types);
  496. def:=generrordef
  497. end
  498. end;
  499. end;
  500. procedure parse_record_members;
  501. procedure maybe_parse_hint_directives(pd:tprocdef);
  502. var
  503. dummysymoptions : tsymoptions;
  504. deprecatedmsg : pshortstring;
  505. begin
  506. dummysymoptions:=[];
  507. deprecatedmsg:=nil;
  508. while try_consume_hintdirective(dummysymoptions,deprecatedmsg) do
  509. Consume(_SEMICOLON);
  510. if assigned(pd) then
  511. begin
  512. pd.symoptions:=pd.symoptions+dummysymoptions;
  513. pd.deprecatedmsg:=deprecatedmsg;
  514. end
  515. else
  516. stringdispose(deprecatedmsg);
  517. end;
  518. var
  519. pd : tprocdef;
  520. oldparse_only: boolean;
  521. member_blocktype : tblock_type;
  522. fields_allowed, is_classdef, classfields: boolean;
  523. vdoptions: tvar_dec_options;
  524. begin
  525. { empty record declaration ? }
  526. if (token=_SEMICOLON) then
  527. Exit;
  528. current_structdef.symtable.currentvisibility:=vis_public;
  529. fields_allowed:=true;
  530. is_classdef:=false;
  531. classfields:=false;
  532. member_blocktype:=bt_general;
  533. repeat
  534. case token of
  535. _TYPE :
  536. begin
  537. consume(_TYPE);
  538. member_blocktype:=bt_type;
  539. end;
  540. _VAR :
  541. begin
  542. consume(_VAR);
  543. fields_allowed:=true;
  544. member_blocktype:=bt_general;
  545. classfields:=is_classdef;
  546. is_classdef:=false;
  547. end;
  548. _CONST:
  549. begin
  550. consume(_CONST);
  551. member_blocktype:=bt_const;
  552. end;
  553. _ID, _CASE, _OPERATOR :
  554. begin
  555. case idtoken of
  556. _PRIVATE :
  557. begin
  558. consume(_PRIVATE);
  559. current_structdef.symtable.currentvisibility:=vis_private;
  560. include(current_structdef.objectoptions,oo_has_private);
  561. fields_allowed:=true;
  562. is_classdef:=false;
  563. classfields:=false;
  564. member_blocktype:=bt_general;
  565. end;
  566. _PROTECTED :
  567. begin
  568. consume(_PROTECTED);
  569. current_structdef.symtable.currentvisibility:=vis_protected;
  570. include(current_structdef.objectoptions,oo_has_protected);
  571. fields_allowed:=true;
  572. is_classdef:=false;
  573. classfields:=false;
  574. member_blocktype:=bt_general;
  575. end;
  576. _PUBLIC :
  577. begin
  578. consume(_PUBLIC);
  579. current_structdef.symtable.currentvisibility:=vis_public;
  580. fields_allowed:=true;
  581. is_classdef:=false;
  582. classfields:=false;
  583. member_blocktype:=bt_general;
  584. end;
  585. _PUBLISHED :
  586. begin
  587. Message(parser_e_no_record_published);
  588. consume(_PUBLISHED);
  589. current_structdef.symtable.currentvisibility:=vis_published;
  590. fields_allowed:=true;
  591. is_classdef:=false;
  592. classfields:=false;
  593. member_blocktype:=bt_general;
  594. end;
  595. _STRICT :
  596. begin
  597. consume(_STRICT);
  598. if token=_ID then
  599. begin
  600. case idtoken of
  601. _PRIVATE:
  602. begin
  603. consume(_PRIVATE);
  604. current_structdef.symtable.currentvisibility:=vis_strictprivate;
  605. include(current_structdef.objectoptions,oo_has_strictprivate);
  606. end;
  607. _PROTECTED:
  608. begin
  609. consume(_PROTECTED);
  610. current_structdef.symtable.currentvisibility:=vis_strictprotected;
  611. include(current_structdef.objectoptions,oo_has_strictprotected);
  612. end;
  613. else
  614. message(parser_e_protected_or_private_expected);
  615. end;
  616. end
  617. else
  618. message(parser_e_protected_or_private_expected);
  619. fields_allowed:=true;
  620. is_classdef:=false;
  621. classfields:=false;
  622. member_blocktype:=bt_general;
  623. end
  624. else
  625. if is_classdef and (idtoken=_OPERATOR) then
  626. begin
  627. oldparse_only:=parse_only;
  628. parse_only:=true;
  629. pd:=parse_proc_dec(is_classdef,current_structdef);
  630. { this is for error recovery as well as forward }
  631. { interface mappings, i.e. mapping to a method }
  632. { which isn't declared yet }
  633. if assigned(pd) then
  634. begin
  635. parse_record_proc_directives(pd);
  636. handle_calling_convention(pd);
  637. { add definition to procsym }
  638. proc_add_definition(pd);
  639. end;
  640. maybe_parse_hint_directives(pd);
  641. parse_only:=oldparse_only;
  642. fields_allowed:=false;
  643. is_classdef:=false;
  644. end
  645. else
  646. begin
  647. if member_blocktype=bt_general then
  648. begin
  649. if (not fields_allowed) then
  650. Message(parser_e_field_not_allowed_here);
  651. vdoptions:=[vd_record];
  652. if classfields then
  653. include(vdoptions,vd_class);
  654. read_record_fields(vdoptions);
  655. end
  656. else if member_blocktype=bt_type then
  657. types_dec(true)
  658. else if member_blocktype=bt_const then
  659. consts_dec(true)
  660. else
  661. internalerror(201001110);
  662. end;
  663. end;
  664. end;
  665. _PROPERTY :
  666. begin
  667. struct_property_dec(is_classdef);
  668. fields_allowed:=false;
  669. is_classdef:=false;
  670. end;
  671. _CLASS:
  672. begin
  673. is_classdef:=false;
  674. { read class method }
  675. if try_to_consume(_CLASS) then
  676. begin
  677. { class modifier is only allowed for procedures, functions, }
  678. { constructors, destructors, fields and properties }
  679. if not(token in [_FUNCTION,_PROCEDURE,_PROPERTY,_VAR,_CONSTRUCTOR,_DESTRUCTOR,_OPERATOR]) and
  680. not((token=_ID) and (idtoken=_OPERATOR)) then
  681. Message(parser_e_procedure_or_function_expected);
  682. is_classdef:=true;
  683. end;
  684. end;
  685. _PROCEDURE,
  686. _FUNCTION:
  687. begin
  688. oldparse_only:=parse_only;
  689. parse_only:=true;
  690. pd:=parse_proc_dec(is_classdef,current_structdef);
  691. { this is for error recovery as well as forward }
  692. { interface mappings, i.e. mapping to a method }
  693. { which isn't declared yet }
  694. if assigned(pd) then
  695. begin
  696. parse_record_proc_directives(pd);
  697. { since records have no inheritance don't allow non static
  698. class methods. delphi do so. }
  699. if is_classdef and not (po_staticmethod in pd.procoptions) then
  700. MessagePos(pd.fileinfo, parser_e_class_methods_only_static_in_records);
  701. handle_calling_convention(pd);
  702. { add definition to procsym }
  703. proc_add_definition(pd);
  704. end;
  705. maybe_parse_hint_directives(pd);
  706. parse_only:=oldparse_only;
  707. fields_allowed:=false;
  708. is_classdef:=false;
  709. end;
  710. _CONSTRUCTOR :
  711. begin
  712. if not is_classdef then
  713. Message(parser_e_no_constructor_in_records);
  714. if not is_classdef and (current_structdef.symtable.currentvisibility <> vis_public) then
  715. Message(parser_w_constructor_should_be_public);
  716. { only 1 class constructor is allowed }
  717. if is_classdef and (oo_has_class_constructor in current_structdef.objectoptions) then
  718. Message1(parser_e_only_one_class_constructor_allowed, current_structdef.objrealname^);
  719. oldparse_only:=parse_only;
  720. parse_only:=true;
  721. if is_classdef then
  722. pd:=class_constructor_head
  723. else
  724. pd:=constructor_head;
  725. parse_record_proc_directives(pd);
  726. handle_calling_convention(pd);
  727. { add definition to procsym }
  728. proc_add_definition(pd);
  729. maybe_parse_hint_directives(pd);
  730. parse_only:=oldparse_only;
  731. fields_allowed:=false;
  732. is_classdef:=false;
  733. end;
  734. _DESTRUCTOR :
  735. begin
  736. if not is_classdef then
  737. Message(parser_e_no_destructor_in_records);
  738. { only 1 class destructor is allowed }
  739. if is_classdef and (oo_has_class_destructor in current_structdef.objectoptions) then
  740. Message1(parser_e_only_one_class_destructor_allowed, current_structdef.objrealname^);
  741. oldparse_only:=parse_only;
  742. parse_only:=true;
  743. if is_classdef then
  744. pd:=class_destructor_head
  745. else
  746. pd:=destructor_head;
  747. parse_record_proc_directives(pd);
  748. handle_calling_convention(pd);
  749. { add definition to procsym }
  750. proc_add_definition(pd);
  751. maybe_parse_hint_directives(pd);
  752. parse_only:=oldparse_only;
  753. fields_allowed:=false;
  754. is_classdef:=false;
  755. end;
  756. _END :
  757. begin
  758. consume(_END);
  759. break;
  760. end;
  761. else
  762. consume(_ID); { Give a ident expected message, like tp7 }
  763. end;
  764. until false;
  765. end;
  766. { reads a record declaration }
  767. function record_dec(const n:tidstring;genericdef:tstoreddef;genericlist:TFPObjectList):tdef;
  768. var
  769. old_current_structdef: tabstractrecorddef;
  770. old_current_genericdef,
  771. old_current_specializedef: tstoreddef;
  772. old_parse_generic: boolean;
  773. recst: trecordsymtable;
  774. begin
  775. old_current_structdef:=current_structdef;
  776. old_current_genericdef:=current_genericdef;
  777. old_current_specializedef:=current_specializedef;
  778. old_parse_generic:=parse_generic;
  779. current_genericdef:=nil;
  780. current_specializedef:=nil;
  781. { create recdef }
  782. recst:=trecordsymtable.create(n,current_settings.packrecords);
  783. current_structdef:=trecorddef.create(n,recst);
  784. result:=current_structdef;
  785. { insert in symtablestack }
  786. symtablestack.push(recst);
  787. { parse record }
  788. consume(_RECORD);
  789. { usage of specialized type inside its generic template }
  790. if assigned(genericdef) then
  791. current_specializedef:=current_structdef
  792. { reject declaration of generic class inside generic class }
  793. else if assigned(genericlist) then
  794. current_genericdef:=current_structdef;
  795. insert_generic_parameter_types(current_structdef,genericdef,genericlist);
  796. parse_generic:=(df_generic in current_structdef.defoptions);
  797. if m_advanced_records in current_settings.modeswitches then
  798. parse_record_members
  799. else
  800. begin
  801. read_record_fields([vd_record]);
  802. consume(_END);
  803. end;
  804. { make the record size aligned }
  805. recst.addalignmentpadding;
  806. { restore symtable stack }
  807. symtablestack.pop(recst);
  808. if trecorddef(current_structdef).is_packed and is_managed_type(current_structdef) then
  809. Message(type_e_no_packed_inittable);
  810. { restore old state }
  811. parse_generic:=old_parse_generic;
  812. current_structdef:=old_current_structdef;
  813. current_genericdef:=old_current_genericdef;
  814. current_specializedef:=old_current_specializedef;
  815. end;
  816. { reads a type definition and returns a pointer to it }
  817. procedure read_named_type(var def : tdef;const name : TIDString;genericdef:tstoreddef;genericlist:TFPObjectList;parseprocvardir:boolean);
  818. var
  819. pt : tnode;
  820. tt2 : tdef;
  821. aktenumdef : tenumdef;
  822. s : TIDString;
  823. l,v : TConstExprInt;
  824. oldpackrecords : longint;
  825. defpos,storepos : tfileposinfo;
  826. procedure expr_type;
  827. var
  828. pt1,pt2 : tnode;
  829. lv,hv : TConstExprInt;
  830. old_block_type : tblock_type;
  831. dospecialize : boolean;
  832. structdef: tabstractrecorddef;
  833. begin
  834. old_block_type:=block_type;
  835. dospecialize:=false;
  836. { use of current parsed object:
  837. - classes can be used also in classes
  838. - objects can be parameters }
  839. if (token=_ID) then
  840. begin
  841. structdef:=current_structdef;
  842. while assigned(structdef) and (structdef.typ in [objectdef,recorddef]) do
  843. begin
  844. if (structdef.objname^=pattern) then
  845. begin
  846. consume(_ID);
  847. def:=structdef;
  848. exit;
  849. end;
  850. structdef:=tabstractrecorddef(structdef.owner.defowner);
  851. end;
  852. end;
  853. { Generate a specialization? }
  854. if try_to_consume(_SPECIALIZE) then
  855. dospecialize:=true;
  856. { we can't accept a equal in type }
  857. pt1:=comp_expr(false,true);
  858. if not dospecialize and
  859. try_to_consume(_POINTPOINT) then
  860. begin
  861. { get high value of range }
  862. pt2:=comp_expr(false,false);
  863. { make both the same type or give an error. This is not
  864. done when both are integer values, because typecasting
  865. between -3200..3200 will result in a signed-unsigned
  866. conflict and give a range check error (PFV) }
  867. if not(is_integer(pt1.resultdef) and is_integer(pt2.resultdef)) then
  868. inserttypeconv(pt1,pt2.resultdef);
  869. { both must be evaluated to constants now }
  870. if (pt1.nodetype=ordconstn) and
  871. (pt2.nodetype=ordconstn) then
  872. begin
  873. lv:=tordconstnode(pt1).value;
  874. hv:=tordconstnode(pt2).value;
  875. { Check bounds }
  876. if hv<lv then
  877. message(parser_e_upper_lower_than_lower)
  878. else if (lv.signed and (lv.svalue<0)) and (not hv.signed and (hv.uvalue>qword(high(int64)))) then
  879. message(type_e_cant_eval_constant_expr)
  880. else
  881. begin
  882. { All checks passed, create the new def }
  883. case pt1.resultdef.typ of
  884. enumdef :
  885. def:=tenumdef.create_subrange(tenumdef(pt1.resultdef),lv.svalue,hv.svalue);
  886. orddef :
  887. begin
  888. if is_char(pt1.resultdef) then
  889. def:=torddef.create(uchar,lv,hv)
  890. else
  891. if is_boolean(pt1.resultdef) then
  892. def:=torddef.create(pasbool,lv,hv)
  893. else if is_signed(pt1.resultdef) then
  894. def:=torddef.create(range_to_basetype(lv,hv),lv,hv)
  895. else
  896. def:=torddef.create(range_to_basetype(lv,hv),lv,hv);
  897. end;
  898. end;
  899. end;
  900. end
  901. else
  902. Message(sym_e_error_in_type_def);
  903. pt2.free;
  904. end
  905. else
  906. begin
  907. { a simple type renaming or generic specialization }
  908. if (pt1.nodetype=typen) then
  909. begin
  910. def:=ttypenode(pt1).resultdef;
  911. if dospecialize then
  912. generate_specialization(def)
  913. else
  914. begin
  915. if assigned(current_specializedef) and (def=current_specializedef.genericdef) then
  916. begin
  917. def:=current_specializedef
  918. end
  919. else if (def=current_genericdef) then
  920. begin
  921. def:=current_genericdef
  922. end
  923. else if (df_generic in def.defoptions) then
  924. begin
  925. Message(parser_e_no_generics_as_types);
  926. def:=generrordef;
  927. end
  928. else if is_objccategory(def) then
  929. begin
  930. Message(parser_e_no_category_as_types);
  931. def:=generrordef
  932. end
  933. end;
  934. end
  935. else
  936. Message(sym_e_error_in_type_def);
  937. end;
  938. pt1.free;
  939. block_type:=old_block_type;
  940. end;
  941. procedure set_dec;
  942. begin
  943. consume(_SET);
  944. consume(_OF);
  945. read_anon_type(tt2,true);
  946. if assigned(tt2) then
  947. begin
  948. case tt2.typ of
  949. { don't forget that min can be negativ PM }
  950. enumdef :
  951. if (tenumdef(tt2).min>=0) and
  952. (tenumdef(tt2).max<=255) then
  953. // !! def:=tsetdef.create(tt2,tenumdef(tt2.def).min,tenumdef(tt2.def).max))
  954. def:=tsetdef.create(tt2,tenumdef(tt2).min,tenumdef(tt2).max)
  955. else
  956. Message(sym_e_ill_type_decl_set);
  957. orddef :
  958. begin
  959. if (torddef(tt2).ordtype<>uvoid) and
  960. (torddef(tt2).ordtype<>uwidechar) and
  961. (torddef(tt2).low>=0) then
  962. // !! def:=tsetdef.create(tt2,torddef(tt2.def).low,torddef(tt2.def).high))
  963. if Torddef(tt2).high>int64(high(byte)) then
  964. message(sym_e_ill_type_decl_set)
  965. else
  966. def:=tsetdef.create(tt2,torddef(tt2).low.svalue,torddef(tt2).high.svalue)
  967. else
  968. Message(sym_e_ill_type_decl_set);
  969. end;
  970. else
  971. Message(sym_e_ill_type_decl_set);
  972. end;
  973. end
  974. else
  975. def:=generrordef;
  976. end;
  977. procedure array_dec(is_packed:boolean;genericdef:tstoreddef;genericlist:TFPObjectList);
  978. var
  979. lowval,
  980. highval : TConstExprInt;
  981. indexdef : tdef;
  982. hdef : tdef;
  983. arrdef : tarraydef;
  984. procedure setdefdecl(def:tdef);
  985. begin
  986. case def.typ of
  987. enumdef :
  988. begin
  989. lowval:=tenumdef(def).min;
  990. highval:=tenumdef(def).max;
  991. if (m_fpc in current_settings.modeswitches) and
  992. (tenumdef(def).has_jumps) then
  993. Message(type_e_array_index_enums_with_assign_not_possible);
  994. indexdef:=def;
  995. end;
  996. orddef :
  997. begin
  998. if torddef(def).ordtype in [uchar,
  999. u8bit,u16bit,
  1000. s8bit,s16bit,s32bit,
  1001. {$ifdef cpu64bitaddr}
  1002. u32bit,s64bit,
  1003. {$endif cpu64bitaddr}
  1004. pasbool,bool8bit,bool16bit,bool32bit,bool64bit,
  1005. uwidechar] then
  1006. begin
  1007. lowval:=torddef(def).low;
  1008. highval:=torddef(def).high;
  1009. indexdef:=def;
  1010. end
  1011. else
  1012. Message1(parser_e_type_cant_be_used_in_array_index,def.typename);
  1013. end;
  1014. else
  1015. Message(sym_e_error_in_type_def);
  1016. end;
  1017. end;
  1018. var
  1019. old_current_genericdef,
  1020. old_current_specializedef: tstoreddef;
  1021. old_parse_generic: boolean;
  1022. begin
  1023. old_current_genericdef:=current_genericdef;
  1024. old_current_specializedef:=current_specializedef;
  1025. old_parse_generic:=parse_generic;
  1026. current_genericdef:=nil;
  1027. current_specializedef:=nil;
  1028. arrdef:=nil;
  1029. consume(_ARRAY);
  1030. { open array? }
  1031. if try_to_consume(_LECKKLAMMER) then
  1032. begin
  1033. { defaults }
  1034. indexdef:=generrordef;
  1035. { use defaults which don't overflow the compiler }
  1036. lowval:=0;
  1037. highval:=0;
  1038. repeat
  1039. { read the expression and check it, check apart if the
  1040. declaration is an enum declaration because that needs to
  1041. be parsed by readtype (PFV) }
  1042. if token=_LKLAMMER then
  1043. begin
  1044. read_anon_type(hdef,true);
  1045. setdefdecl(hdef);
  1046. end
  1047. else
  1048. begin
  1049. pt:=expr(true);
  1050. if pt.nodetype=typen then
  1051. setdefdecl(pt.resultdef)
  1052. else
  1053. begin
  1054. if (pt.nodetype=rangen) then
  1055. begin
  1056. if (trangenode(pt).left.nodetype=ordconstn) and
  1057. (trangenode(pt).right.nodetype=ordconstn) then
  1058. begin
  1059. { make both the same type or give an error. This is not
  1060. done when both are integer values, because typecasting
  1061. between -3200..3200 will result in a signed-unsigned
  1062. conflict and give a range check error (PFV) }
  1063. if not(is_integer(trangenode(pt).left.resultdef) and is_integer(trangenode(pt).left.resultdef)) then
  1064. inserttypeconv(trangenode(pt).left,trangenode(pt).right.resultdef);
  1065. lowval:=tordconstnode(trangenode(pt).left).value;
  1066. highval:=tordconstnode(trangenode(pt).right).value;
  1067. if highval<lowval then
  1068. begin
  1069. Message(parser_e_array_lower_less_than_upper_bound);
  1070. highval:=lowval;
  1071. end
  1072. else if (lowval<int64(low(aint))) or
  1073. (highval > high(aint)) then
  1074. begin
  1075. Message(parser_e_array_range_out_of_bounds);
  1076. lowval :=0;
  1077. highval:=0;
  1078. end;
  1079. if is_integer(trangenode(pt).left.resultdef) then
  1080. range_to_type(lowval,highval,indexdef)
  1081. else
  1082. indexdef:=trangenode(pt).left.resultdef;
  1083. end
  1084. else
  1085. Message(type_e_cant_eval_constant_expr);
  1086. end
  1087. else
  1088. Message(sym_e_error_in_type_def)
  1089. end;
  1090. pt.free;
  1091. end;
  1092. { if the array is already created add the new arrray
  1093. as element of the existing array, otherwise create a new array }
  1094. if assigned(arrdef) then
  1095. begin
  1096. arrdef.elementdef:=tarraydef.create(lowval.svalue,highval.svalue,indexdef);
  1097. arrdef:=tarraydef(arrdef.elementdef);
  1098. end
  1099. else
  1100. begin
  1101. arrdef:=tarraydef.create(lowval.svalue,highval.svalue,indexdef);
  1102. def:=arrdef;
  1103. end;
  1104. if is_packed then
  1105. include(arrdef.arrayoptions,ado_IsBitPacked);
  1106. if token=_COMMA then
  1107. consume(_COMMA)
  1108. else
  1109. break;
  1110. until false;
  1111. consume(_RECKKLAMMER);
  1112. end
  1113. else
  1114. begin
  1115. if is_packed then
  1116. Message(parser_e_packed_dynamic_open_array);
  1117. arrdef:=tarraydef.create(0,-1,s32inttype);
  1118. include(arrdef.arrayoptions,ado_IsDynamicArray);
  1119. def:=arrdef;
  1120. end;
  1121. if assigned(arrdef) then
  1122. begin
  1123. { usage of specialized type inside its generic template }
  1124. if assigned(genericdef) then
  1125. current_specializedef:=arrdef
  1126. { reject declaration of generic class inside generic class }
  1127. else if assigned(genericlist) then
  1128. current_genericdef:=arrdef;
  1129. symtablestack.push(arrdef.symtable);
  1130. insert_generic_parameter_types(arrdef,genericdef,genericlist);
  1131. parse_generic:=(df_generic in arrdef.defoptions);
  1132. end;
  1133. consume(_OF);
  1134. read_anon_type(tt2,true);
  1135. { set element type of the last array definition }
  1136. if assigned(arrdef) then
  1137. begin
  1138. symtablestack.pop(arrdef.symtable);
  1139. arrdef.elementdef:=tt2;
  1140. if is_packed and
  1141. is_managed_type(tt2) then
  1142. Message(type_e_no_packed_inittable);
  1143. end;
  1144. { restore old state }
  1145. parse_generic:=old_parse_generic;
  1146. current_genericdef:=old_current_genericdef;
  1147. current_specializedef:=old_current_specializedef;
  1148. end;
  1149. var
  1150. p : tnode;
  1151. hdef : tdef;
  1152. pd : tabstractprocdef;
  1153. is_func,
  1154. enumdupmsg, first : boolean;
  1155. newtype : ttypesym;
  1156. oldlocalswitches : tlocalswitches;
  1157. bitpacking: boolean;
  1158. begin
  1159. def:=nil;
  1160. case token of
  1161. _STRING,_FILE:
  1162. begin
  1163. single_type(def,false,true);
  1164. end;
  1165. _LKLAMMER:
  1166. begin
  1167. consume(_LKLAMMER);
  1168. first:=true;
  1169. { allow negativ value_str }
  1170. l:=int64(-1);
  1171. enumdupmsg:=false;
  1172. aktenumdef:=tenumdef.create;
  1173. repeat
  1174. s:=orgpattern;
  1175. defpos:=current_tokenpos;
  1176. consume(_ID);
  1177. { only allow assigning of specific numbers under fpc mode }
  1178. if not(m_tp7 in current_settings.modeswitches) and
  1179. (
  1180. { in fpc mode also allow := to be compatible
  1181. with previous 1.0.x versions }
  1182. ((m_fpc in current_settings.modeswitches) and
  1183. try_to_consume(_ASSIGNMENT)) or
  1184. try_to_consume(_EQ)
  1185. ) then
  1186. begin
  1187. oldlocalswitches:=current_settings.localswitches;
  1188. include(current_settings.localswitches,cs_allow_enum_calc);
  1189. p:=comp_expr(true,false);
  1190. current_settings.localswitches:=oldlocalswitches;
  1191. if (p.nodetype=ordconstn) then
  1192. begin
  1193. { we expect an integer or an enum of the
  1194. same type }
  1195. if is_integer(p.resultdef) or
  1196. is_char(p.resultdef) or
  1197. equal_defs(p.resultdef,aktenumdef) then
  1198. v:=tordconstnode(p).value
  1199. else
  1200. IncompatibleTypes(p.resultdef,s32inttype);
  1201. end
  1202. else
  1203. Message(parser_e_illegal_expression);
  1204. p.free;
  1205. { please leave that a note, allows type save }
  1206. { declarations in the win32 units ! }
  1207. if (not first) and (v<=l) and (not enumdupmsg) then
  1208. begin
  1209. Message(parser_n_duplicate_enum);
  1210. enumdupmsg:=true;
  1211. end;
  1212. l:=v;
  1213. end
  1214. else
  1215. inc(l.svalue);
  1216. first:=false;
  1217. storepos:=current_tokenpos;
  1218. current_tokenpos:=defpos;
  1219. tenumsymtable(aktenumdef.symtable).insert(tenumsym.create(s,aktenumdef,longint(l.svalue)));
  1220. if not (cs_scopedenums in current_settings.localswitches) then
  1221. tstoredsymtable(aktenumdef.owner).insert(tenumsym.create(s,aktenumdef,longint(l.svalue)));
  1222. current_tokenpos:=storepos;
  1223. until not try_to_consume(_COMMA);
  1224. def:=aktenumdef;
  1225. consume(_RKLAMMER);
  1226. end;
  1227. _ARRAY:
  1228. begin
  1229. array_dec(false,genericdef,genericlist);
  1230. end;
  1231. _SET:
  1232. begin
  1233. set_dec;
  1234. end;
  1235. _CARET:
  1236. begin
  1237. consume(_CARET);
  1238. single_type(tt2,(block_type=bt_type),false);
  1239. def:=tpointerdef.create(tt2);
  1240. if tt2.typ=forwarddef then
  1241. current_module.checkforwarddefs.add(def);
  1242. end;
  1243. _RECORD:
  1244. begin
  1245. def:=record_dec(name,genericdef,genericlist);
  1246. end;
  1247. _PACKED,
  1248. _BITPACKED:
  1249. begin
  1250. bitpacking :=
  1251. (cs_bitpacking in current_settings.localswitches) or
  1252. (token = _BITPACKED);
  1253. consume(token);
  1254. if token=_ARRAY then
  1255. array_dec(bitpacking,genericdef,genericlist)
  1256. else if token=_SET then
  1257. set_dec
  1258. else if token=_FILE then
  1259. single_type(def,false,true)
  1260. else
  1261. begin
  1262. oldpackrecords:=current_settings.packrecords;
  1263. if (not bitpacking) or
  1264. (token in [_CLASS,_OBJECT]) then
  1265. current_settings.packrecords:=1
  1266. else
  1267. current_settings.packrecords:=bit_alignment;
  1268. case token of
  1269. _CLASS :
  1270. begin
  1271. consume(_CLASS);
  1272. def:=object_dec(odt_class,name,genericdef,genericlist,nil);
  1273. end;
  1274. _OBJECT :
  1275. begin
  1276. consume(_OBJECT);
  1277. def:=object_dec(odt_object,name,genericdef,genericlist,nil);
  1278. end;
  1279. else
  1280. def:=record_dec(name,genericdef,genericlist);
  1281. end;
  1282. current_settings.packrecords:=oldpackrecords;
  1283. end;
  1284. end;
  1285. _DISPINTERFACE :
  1286. begin
  1287. { need extra check here since interface is a keyword
  1288. in all pascal modes }
  1289. if not(m_class in current_settings.modeswitches) then
  1290. Message(parser_f_need_objfpc_or_delphi_mode);
  1291. consume(token);
  1292. def:=object_dec(odt_dispinterface,name,genericdef,genericlist,nil);
  1293. end;
  1294. _CLASS :
  1295. begin
  1296. consume(token);
  1297. { Delphi only allows class of in type blocks }
  1298. if (token=_OF) and
  1299. (
  1300. not(m_delphi in current_settings.modeswitches) or
  1301. (block_type=bt_type)
  1302. ) then
  1303. begin
  1304. consume(_OF);
  1305. single_type(hdef,(block_type=bt_type),false);
  1306. if is_class(hdef) or
  1307. is_objcclass(hdef) then
  1308. def:=tclassrefdef.create(hdef)
  1309. else
  1310. if hdef.typ=forwarddef then
  1311. begin
  1312. def:=tclassrefdef.create(hdef);
  1313. current_module.checkforwarddefs.add(def);
  1314. end
  1315. else
  1316. Message1(type_e_class_or_objcclass_type_expected,hdef.typename);
  1317. end
  1318. else
  1319. def:=object_dec(odt_class,name,genericdef,genericlist,nil);
  1320. end;
  1321. _CPPCLASS :
  1322. begin
  1323. consume(token);
  1324. def:=object_dec(odt_cppclass,name,genericdef,genericlist,nil);
  1325. end;
  1326. _OBJCCLASS :
  1327. begin
  1328. if not(m_objectivec1 in current_settings.modeswitches) then
  1329. Message(parser_f_need_objc);
  1330. consume(token);
  1331. def:=object_dec(odt_objcclass,name,genericdef,genericlist,nil);
  1332. end;
  1333. _INTERFACE :
  1334. begin
  1335. { need extra check here since interface is a keyword
  1336. in all pascal modes }
  1337. if not(m_class in current_settings.modeswitches) then
  1338. Message(parser_f_need_objfpc_or_delphi_mode);
  1339. consume(token);
  1340. if current_settings.interfacetype=it_interfacecom then
  1341. def:=object_dec(odt_interfacecom,name,genericdef,genericlist,nil)
  1342. else {it_interfacecorba}
  1343. def:=object_dec(odt_interfacecorba,name,genericdef,genericlist,nil);
  1344. end;
  1345. _OBJCPROTOCOL :
  1346. begin
  1347. if not(m_objectivec1 in current_settings.modeswitches) then
  1348. Message(parser_f_need_objc);
  1349. consume(token);
  1350. def:=object_dec(odt_objcprotocol,name,genericdef,genericlist,nil);
  1351. end;
  1352. _OBJCCATEGORY :
  1353. begin
  1354. if not(m_objectivec1 in current_settings.modeswitches) then
  1355. Message(parser_f_need_objc);
  1356. consume(token);
  1357. def:=object_dec(odt_objccategory,name,genericdef,genericlist,nil);
  1358. end;
  1359. _OBJECT :
  1360. begin
  1361. consume(token);
  1362. def:=object_dec(odt_object,name,genericdef,genericlist,nil);
  1363. end;
  1364. _PROCEDURE,
  1365. _FUNCTION:
  1366. begin
  1367. is_func:=(token=_FUNCTION);
  1368. consume(token);
  1369. pd:=tprocvardef.create(normal_function_level);
  1370. if token=_LKLAMMER then
  1371. parse_parameter_dec(pd);
  1372. if is_func then
  1373. begin
  1374. consume(_COLON);
  1375. single_type(pd.returndef,false,false);
  1376. end;
  1377. if try_to_consume(_OF) then
  1378. begin
  1379. consume(_OBJECT);
  1380. include(pd.procoptions,po_methodpointer);
  1381. end
  1382. else if (m_nested_procvars in current_settings.modeswitches) and
  1383. try_to_consume(_IS) then
  1384. begin
  1385. consume(_NESTED);
  1386. pd.parast.symtablelevel:=normal_function_level+1;
  1387. pd.check_mark_as_nested;
  1388. end;
  1389. def:=pd;
  1390. { possible proc directives }
  1391. if parseprocvardir then
  1392. begin
  1393. if check_proc_directive(true) then
  1394. begin
  1395. newtype:=ttypesym.create('unnamed',def);
  1396. parse_var_proc_directives(tsym(newtype));
  1397. newtype.typedef:=nil;
  1398. def.typesym:=nil;
  1399. newtype.free;
  1400. end;
  1401. { Add implicit hidden parameters and function result }
  1402. handle_calling_convention(pd);
  1403. end;
  1404. end;
  1405. else
  1406. if (token=_KLAMMERAFFE) and (m_iso in current_settings.modeswitches) then
  1407. begin
  1408. consume(_KLAMMERAFFE);
  1409. single_type(tt2,(block_type=bt_type),false);
  1410. def:=tpointerdef.create(tt2);
  1411. if tt2.typ=forwarddef then
  1412. current_module.checkforwarddefs.add(def);
  1413. end
  1414. else
  1415. expr_type;
  1416. end;
  1417. if def=nil then
  1418. def:=generrordef;
  1419. end;
  1420. procedure read_anon_type(var def : tdef;parseprocvardir:boolean);
  1421. begin
  1422. read_named_type(def,'',nil,nil,parseprocvardir);
  1423. end;
  1424. procedure write_persistent_type_info(st:tsymtable);
  1425. var
  1426. i : longint;
  1427. def : tdef;
  1428. vmtwriter : TVMTWriter;
  1429. begin
  1430. for i:=0 to st.DefList.Count-1 do
  1431. begin
  1432. def:=tdef(st.DefList[i]);
  1433. case def.typ of
  1434. recorddef :
  1435. write_persistent_type_info(trecorddef(def).symtable);
  1436. objectdef :
  1437. begin
  1438. { Skip generics and forward defs }
  1439. if (df_generic in def.defoptions) or
  1440. (oo_is_forward in tobjectdef(def).objectoptions) then
  1441. continue;
  1442. write_persistent_type_info(tobjectdef(def).symtable);
  1443. { Write also VMT if not done yet }
  1444. if not(ds_vmt_written in def.defstates) then
  1445. begin
  1446. vmtwriter:=TVMTWriter.create(tobjectdef(def));
  1447. if is_interface(tobjectdef(def)) then
  1448. vmtwriter.writeinterfaceids;
  1449. if (oo_has_vmt in tobjectdef(def).objectoptions) then
  1450. vmtwriter.writevmt;
  1451. vmtwriter.free;
  1452. include(def.defstates,ds_vmt_written);
  1453. end;
  1454. end;
  1455. procdef :
  1456. begin
  1457. if assigned(tprocdef(def).localst) and
  1458. (tprocdef(def).localst.symtabletype=localsymtable) then
  1459. write_persistent_type_info(tprocdef(def).localst);
  1460. if assigned(tprocdef(def).parast) then
  1461. write_persistent_type_info(tprocdef(def).parast);
  1462. end;
  1463. end;
  1464. { generate always persistent tables for types in the interface so it can
  1465. be reused in other units and give always the same pointer location. }
  1466. { Init }
  1467. if (
  1468. assigned(def.typesym) and
  1469. (st.symtabletype=globalsymtable) and
  1470. not is_objc_class_or_protocol(def)
  1471. ) or
  1472. is_managed_type(def) or
  1473. (ds_init_table_used in def.defstates) then
  1474. RTTIWriter.write_rtti(def,initrtti);
  1475. { RTTI }
  1476. if (
  1477. assigned(def.typesym) and
  1478. (st.symtabletype=globalsymtable) and
  1479. not is_objc_class_or_protocol(def)
  1480. ) or
  1481. (ds_rtti_table_used in def.defstates) then
  1482. RTTIWriter.write_rtti(def,fullrtti);
  1483. end;
  1484. end;
  1485. end.