ptype.pas 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727
  1. {
  2. $Id$
  3. Copyright (c) 1998-2000 by Florian Klaempfl
  4. Does parsing types for Free Pascal
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. ****************************************************************************
  17. }
  18. unit ptype;
  19. {$i defines.inc}
  20. interface
  21. uses
  22. globtype,symtype;
  23. const
  24. { forward types should only be possible inside a TYPE statement }
  25. typecanbeforward : boolean = false;
  26. var
  27. { hack, which allows to use the current parsed }
  28. { object type as function argument type }
  29. testcurobject : byte;
  30. curobjectname : stringid;
  31. { reads a string, file type or a type id and returns a name and }
  32. { tdef }
  33. procedure single_type(var tt:ttype;var s : string;isforwarddef:boolean);
  34. procedure read_type(var tt:ttype;const name : stringid);
  35. { reads a type definition }
  36. { to a appropriating tdef, s gets the name of }
  37. { the type to allow name mangling }
  38. procedure id_type(var tt : ttype;var s : string;isforwarddef:boolean);
  39. implementation
  40. uses
  41. { common }
  42. cutils,cpuinfo,
  43. { global }
  44. globals,tokens,verbose,
  45. systems,
  46. { aasm }
  47. aasm,
  48. { symtable }
  49. symconst,symbase,symdef,symsym,symtable,types,
  50. { pass 1 }
  51. node,pass_1,
  52. nmat,nadd,ncal,nset,ncnv,ninl,ncon,nld,nflw,
  53. { parser }
  54. scanner,
  55. pbase,pexpr,pdecsub,pdecvar,pdecobj;
  56. procedure id_type(var tt : ttype;var s : string;isforwarddef:boolean);
  57. { reads a type definition }
  58. { to a appropriating tdef, s gets the name of }
  59. { the type to allow name mangling }
  60. var
  61. is_unit_specific : boolean;
  62. pos : tfileposinfo;
  63. srsym : tsym;
  64. srsymtable : tsymtable;
  65. sorg : stringid;
  66. begin
  67. s:=pattern;
  68. sorg:=orgpattern;
  69. pos:=akttokenpos;
  70. { classes can be used also in classes }
  71. if (curobjectname=pattern) and is_class_or_interface(aktobjectdef) then
  72. begin
  73. tt.setdef(aktobjectdef);
  74. consume(_ID);
  75. exit;
  76. end;
  77. { objects can be parameters }
  78. if (testcurobject=2) and (curobjectname=pattern) then
  79. begin
  80. tt.setdef(aktobjectdef);
  81. consume(_ID);
  82. exit;
  83. end;
  84. { try to load the symbol to see if it's a unitsym }
  85. is_unit_specific:=false;
  86. searchsym(s,srsym,srsymtable);
  87. consume(_ID);
  88. if assigned(srsym) and
  89. (srsym.typ=unitsym) then
  90. begin
  91. is_unit_specific:=true;
  92. consume(_POINT);
  93. if srsym.owner.unitid=0 then
  94. begin
  95. srsym:=searchsymonlyin(tunitsym(srsym).unitsymtable,pattern);
  96. pos:=akttokenpos;
  97. s:=pattern;
  98. end
  99. else
  100. srsym:=nil;
  101. consume(_ID);
  102. end;
  103. { are we parsing a possible forward def ? }
  104. if isforwarddef and
  105. not(is_unit_specific) then
  106. begin
  107. tt.setdef(tforwarddef.create(s,pos));
  108. exit;
  109. end;
  110. { unknown sym ? }
  111. if not assigned(srsym) then
  112. begin
  113. Message1(sym_e_id_not_found,sorg);
  114. tt:=generrortype;
  115. exit;
  116. end;
  117. { type sym ? }
  118. if (srsym.typ<>typesym) then
  119. begin
  120. Message(type_e_type_id_expected);
  121. tt:=generrortype;
  122. exit;
  123. end;
  124. { Types are first defined with an error def before assigning
  125. the real type so check if it's an errordef. if so then
  126. give an error }
  127. if (ttypesym(srsym).restype.def.deftype=errordef) then
  128. begin
  129. Message(sym_e_error_in_type_def);
  130. tt:=generrortype;
  131. exit;
  132. end;
  133. { Only use the definitions for system/current unit, becuase
  134. they can be refered from the parameters and symbols are not
  135. loaded at that time. A symbol reference to an other unit
  136. is still possible, because it's already loaded (PFV)
  137. can't use in [] here, becuase unitid can be > 255 }
  138. if (ttypesym(srsym).owner.unitid=0) or
  139. (ttypesym(srsym).owner.unitid=1) then
  140. tt.setdef(ttypesym(srsym).restype.def)
  141. else
  142. tt.setsym(srsym);
  143. end;
  144. procedure single_type(var tt:ttype;var s : string;isforwarddef:boolean);
  145. { reads a string, file type or a type id and returns a name and }
  146. { tdef }
  147. var
  148. hs : string;
  149. t2 : ttype;
  150. begin
  151. case token of
  152. _STRING:
  153. begin
  154. string_dec(tt);
  155. s:='STRING';
  156. end;
  157. _FILE:
  158. begin
  159. consume(_FILE);
  160. if token=_OF then
  161. begin
  162. consume(_OF);
  163. single_type(t2,hs,false);
  164. tt.setdef(tfiledef.createtyped(t2));
  165. s:='FILE$OF$'+hs;
  166. end
  167. else
  168. begin
  169. tt:=cfiletype;
  170. s:='FILE';
  171. end;
  172. end;
  173. else
  174. begin
  175. id_type(tt,s,isforwarddef);
  176. end;
  177. end;
  178. end;
  179. { reads a record declaration }
  180. function record_dec : tdef;
  181. var
  182. symtable : tsymtable;
  183. storetypecanbeforward : boolean;
  184. begin
  185. { create recdef }
  186. symtable:=trecordsymtable.create;
  187. record_dec:=trecorddef.create(symtable);
  188. { update symtable stack }
  189. symtable.next:=symtablestack;
  190. symtablestack:=symtable;
  191. { parse record }
  192. consume(_RECORD);
  193. storetypecanbeforward:=typecanbeforward;
  194. { for tp mode don't allow forward types }
  195. if m_tp in aktmodeswitches then
  196. typecanbeforward:=false;
  197. read_var_decs(true,false,false);
  198. consume(_END);
  199. typecanbeforward:=storetypecanbeforward;
  200. { may be scale record size to a size of n*4 ? }
  201. symtablestack.datasize:=align(symtablestack.datasize,symtablestack.dataalignment);
  202. { restore symtable stack }
  203. symtablestack:=symtable.next;
  204. end;
  205. { reads a type definition and returns a pointer to it }
  206. procedure read_type(var tt : ttype;const name : stringid);
  207. var
  208. pt : tnode;
  209. tt2 : ttype;
  210. aktenumdef : tenumdef;
  211. ap : tarraydef;
  212. s : stringid;
  213. l,v : TConstExprInt;
  214. oldaktpackrecords : longint;
  215. hs : string;
  216. defpos,storepos : tfileposinfo;
  217. procedure expr_type;
  218. var
  219. pt1,pt2 : tnode;
  220. begin
  221. { use of current parsed object ? }
  222. if (token=_ID) and (testcurobject=2) and (curobjectname=pattern) then
  223. begin
  224. consume(_ID);
  225. tt.setdef(aktobjectdef);
  226. exit;
  227. end;
  228. { classes can be used also in classes }
  229. if (curobjectname=pattern) and is_class_or_interface(aktobjectdef) then
  230. begin
  231. tt.setdef(aktobjectdef);
  232. consume(_ID);
  233. exit;
  234. end;
  235. { we can't accept a equal in type }
  236. pt1:=comp_expr(not(ignore_equal));
  237. if (token=_POINTPOINT) then
  238. begin
  239. consume(_POINTPOINT);
  240. { get high value of range }
  241. pt2:=comp_expr(not(ignore_equal));
  242. { make both the same type }
  243. inserttypeconv(pt1,pt2.resulttype);
  244. { both must be evaluated to constants now }
  245. if (pt1.nodetype=ordconstn) and
  246. (pt2.nodetype=ordconstn) then
  247. begin
  248. { Check bounds }
  249. if tordconstnode(pt2).value<tordconstnode(pt1).value then
  250. Message(cg_e_upper_lower_than_lower)
  251. else
  252. begin
  253. { All checks passed, create the new def }
  254. case pt1.resulttype.def.deftype of
  255. enumdef :
  256. tt.setdef(tenumdef.create_subrange(tenumdef(pt1.resulttype.def),tordconstnode(pt1).value,tordconstnode(pt2).value));
  257. orddef :
  258. begin
  259. if is_char(pt1.resulttype.def) then
  260. tt.setdef(torddef.create(uchar,tordconstnode(pt1).value,tordconstnode(pt2).value))
  261. else
  262. if is_boolean(pt1.resulttype.def) then
  263. tt.setdef(torddef.create(bool8bit,tordconstnode(pt1).value,tordconstnode(pt2).value))
  264. else
  265. tt.setdef(torddef.create(uauto,tordconstnode(pt1).value,tordconstnode(pt2).value));
  266. end;
  267. end;
  268. end;
  269. end
  270. else
  271. Message(sym_e_error_in_type_def);
  272. pt2.free;
  273. end
  274. else
  275. begin
  276. { a simple type renaming }
  277. if (pt1.nodetype=typen) then
  278. tt:=ttypenode(pt1).resulttype
  279. else
  280. Message(sym_e_error_in_type_def);
  281. end;
  282. pt1.free;
  283. end;
  284. procedure array_dec;
  285. var
  286. lowval,
  287. highval : longint;
  288. arraytype : ttype;
  289. ht : ttype;
  290. procedure setdefdecl(const t:ttype);
  291. begin
  292. case t.def.deftype of
  293. enumdef :
  294. begin
  295. lowval:=tenumdef(t.def).min;
  296. highval:=tenumdef(t.def).max;
  297. arraytype:=t;
  298. end;
  299. orddef :
  300. begin
  301. if torddef(t.def).typ in [uchar,
  302. u8bit,u16bit,
  303. s8bit,s16bit,s32bit,
  304. bool8bit,bool16bit,bool32bit,
  305. uwidechar] then
  306. begin
  307. lowval:=torddef(t.def).low;
  308. highval:=torddef(t.def).high;
  309. arraytype:=t;
  310. end
  311. else
  312. Message1(parser_e_type_cant_be_used_in_array_index,t.def.gettypename);
  313. end;
  314. else
  315. Message(sym_e_error_in_type_def);
  316. end;
  317. end;
  318. begin
  319. consume(_ARRAY);
  320. { open array? }
  321. if token=_LECKKLAMMER then
  322. begin
  323. consume(_LECKKLAMMER);
  324. { defaults }
  325. arraytype:=generrortype;
  326. lowval:=longint($80000000);
  327. highval:=$7fffffff;
  328. tt.reset;
  329. repeat
  330. { read the expression and check it, check apart if the
  331. declaration is an enum declaration because that needs to
  332. be parsed by readtype (PFV) }
  333. if token=_LKLAMMER then
  334. begin
  335. read_type(ht,'');
  336. setdefdecl(ht);
  337. end
  338. else
  339. begin
  340. pt:=expr;
  341. if pt.nodetype=typen then
  342. setdefdecl(pt.resulttype)
  343. else
  344. begin
  345. if (pt.nodetype=rangen) then
  346. begin
  347. if (trangenode(pt).left.nodetype=ordconstn) and
  348. (trangenode(pt).right.nodetype=ordconstn) then
  349. begin
  350. lowval:=tordconstnode(trangenode(pt).left).value;
  351. highval:=tordconstnode(trangenode(pt).right).value;
  352. if highval<lowval then
  353. begin
  354. Message(parser_e_array_lower_less_than_upper_bound);
  355. highval:=lowval;
  356. end;
  357. arraytype:=trangenode(pt).right.resulttype;
  358. end
  359. else
  360. Message(type_e_cant_eval_constant_expr);
  361. end
  362. else
  363. Message(sym_e_error_in_type_def)
  364. end;
  365. pt.free;
  366. end;
  367. { create arraydef }
  368. if not assigned(tt.def) then
  369. begin
  370. ap:=tarraydef.create(lowval,highval,arraytype);
  371. tt.setdef(ap);
  372. end
  373. else
  374. begin
  375. ap.elementtype.setdef(tarraydef.create(lowval,highval,arraytype));
  376. ap:=tarraydef(ap.elementtype.def);
  377. end;
  378. if token=_COMMA then
  379. consume(_COMMA)
  380. else
  381. break;
  382. until false;
  383. consume(_RECKKLAMMER);
  384. end
  385. else
  386. begin
  387. ap:=tarraydef.create(0,-1,s32bittype);
  388. ap.IsDynamicArray:=true;
  389. tt.setdef(ap);
  390. end;
  391. consume(_OF);
  392. read_type(tt2,'');
  393. { if no error, set element type }
  394. if assigned(ap) then
  395. ap.elementtype:=tt2;
  396. end;
  397. var
  398. p : tnode;
  399. enumdupmsg : boolean;
  400. begin
  401. tt.reset;
  402. case token of
  403. _STRING,_FILE:
  404. begin
  405. single_type(tt,hs,false);
  406. end;
  407. _LKLAMMER:
  408. begin
  409. consume(_LKLAMMER);
  410. { allow negativ value_str }
  411. l:=-1;
  412. enumdupmsg:=false;
  413. aktenumdef:=tenumdef.create;
  414. repeat
  415. s:=orgpattern;
  416. defpos:=akttokenpos;
  417. consume(_ID);
  418. { only allow assigning of specific numbers under fpc mode }
  419. if (m_fpc in aktmodeswitches) and
  420. (token=_ASSIGNMENT) then
  421. begin
  422. consume(_ASSIGNMENT);
  423. v:=get_intconst;
  424. { please leave that a note, allows type save }
  425. { declarations in the win32 units ! }
  426. if (v<=l) and (not enumdupmsg) then
  427. begin
  428. Message(parser_n_duplicate_enum);
  429. enumdupmsg:=true;
  430. end;
  431. l:=v;
  432. end
  433. else if (m_delphi in aktmodeswitches) and
  434. (token=_EQUAL) then
  435. begin
  436. consume(_EQUAL);
  437. p:=comp_expr(true);
  438. if (p.nodetype=ordconstn) then
  439. begin
  440. { we expect an integer or an enum of the
  441. same type }
  442. if is_integer(p.resulttype.def) or
  443. is_equal(p.resulttype.def,aktenumdef) then
  444. l:=tordconstnode(p).value
  445. else
  446. Message2(type_e_incompatible_types,p.resulttype.def.typename,s32bittype.def.typename);
  447. end
  448. else
  449. Message(cg_e_illegal_expression);
  450. p.free;
  451. end
  452. else
  453. inc(l);
  454. storepos:=akttokenpos;
  455. akttokenpos:=defpos;
  456. constsymtable.insert(tenumsym.create(s,aktenumdef,l));
  457. akttokenpos:=storepos;
  458. until not try_to_consume(_COMMA);
  459. tt.setdef(aktenumdef);
  460. consume(_RKLAMMER);
  461. end;
  462. _ARRAY:
  463. begin
  464. array_dec;
  465. end;
  466. _SET:
  467. begin
  468. consume(_SET);
  469. consume(_OF);
  470. read_type(tt2,'');
  471. if assigned(tt2.def) then
  472. begin
  473. case tt2.def.deftype of
  474. { don't forget that min can be negativ PM }
  475. enumdef :
  476. if tenumdef(tt2.def).min>=0 then
  477. tt.setdef(tsetdef.create(tt2,tenumdef(tt2.def).max))
  478. else
  479. Message(sym_e_ill_type_decl_set);
  480. orddef :
  481. begin
  482. case torddef(tt2.def).typ of
  483. uchar :
  484. tt.setdef(tsetdef.create(tt2,255));
  485. u8bit,u16bit,u32bit,
  486. s8bit,s16bit,s32bit :
  487. begin
  488. if (torddef(tt2.def).low>=0) then
  489. tt.setdef(tsetdef.create(tt2,torddef(tt2.def).high))
  490. else
  491. Message(sym_e_ill_type_decl_set);
  492. end;
  493. else
  494. Message(sym_e_ill_type_decl_set);
  495. end;
  496. end;
  497. else
  498. Message(sym_e_ill_type_decl_set);
  499. end;
  500. end
  501. else
  502. tt:=generrortype;
  503. end;
  504. _CARET:
  505. begin
  506. consume(_CARET);
  507. single_type(tt2,hs,typecanbeforward);
  508. tt.setdef(tpointerdef.create(tt2));
  509. end;
  510. _RECORD:
  511. begin
  512. tt.setdef(record_dec);
  513. end;
  514. _PACKED:
  515. begin
  516. consume(_PACKED);
  517. if token=_ARRAY then
  518. array_dec
  519. else
  520. begin
  521. oldaktpackrecords:=aktalignment.recordalignmax;
  522. aktalignment.recordalignmax:=1;
  523. if token in [_CLASS,_OBJECT] then
  524. tt.setdef(object_dec(name,nil))
  525. else
  526. tt.setdef(record_dec);
  527. aktalignment.recordalignmax:=oldaktpackrecords;
  528. end;
  529. end;
  530. _CLASS,
  531. _CPPCLASS,
  532. _INTERFACE,
  533. _OBJECT:
  534. begin
  535. tt.setdef(object_dec(name,nil));
  536. end;
  537. _PROCEDURE:
  538. begin
  539. consume(_PROCEDURE);
  540. tt.setdef(tprocvardef.create);
  541. if token=_LKLAMMER then
  542. parameter_dec(tprocvardef(tt.def));
  543. if token=_OF then
  544. begin
  545. consume(_OF);
  546. consume(_OBJECT);
  547. include(tprocvardef(tt.def).procoptions,po_methodpointer);
  548. end;
  549. end;
  550. _FUNCTION:
  551. begin
  552. consume(_FUNCTION);
  553. tt.def:=tprocvardef.create;
  554. if token=_LKLAMMER then
  555. parameter_dec(tprocvardef(tt.def));
  556. consume(_COLON);
  557. single_type(tprocvardef(tt.def).rettype,hs,false);
  558. if token=_OF then
  559. begin
  560. consume(_OF);
  561. consume(_OBJECT);
  562. include(tprocvardef(tt.def).procoptions,po_methodpointer);
  563. end;
  564. end;
  565. else
  566. expr_type;
  567. end;
  568. if tt.def=nil then
  569. tt:=generrortype;
  570. end;
  571. end.
  572. {
  573. $Log$
  574. Revision 1.30 2001-08-30 20:13:53 peter
  575. * rtti/init table updates
  576. * rttisym for reusable global rtti/init info
  577. * support published for interfaces
  578. Revision 1.29 2001/08/12 22:10:16 peter
  579. * write name in original case when type not found
  580. Revision 1.28 2001/07/09 21:15:41 peter
  581. * Length made internal
  582. * Add array support for Length
  583. Revision 1.27 2001/07/01 20:16:16 peter
  584. * alignmentinfo record added
  585. * -Oa argument supports more alignment settings that can be specified
  586. per type: PROC,LOOP,VARMIN,VARMAX,CONSTMIN,CONSTMAX,RECORDMIN
  587. RECORDMAX,LOCALMIN,LOCALMAX. It is possible to set the mimimum
  588. required alignment and the maximum usefull alignment. The final
  589. alignment will be choosen per variable size dependent on these
  590. settings
  591. Revision 1.26 2001/06/04 18:06:38 peter
  592. * fix for enum with assignment
  593. Revision 1.25 2001/06/04 11:51:59 peter
  594. * enum type declarations assignments can also be of the same enum
  595. type
  596. Revision 1.24 2001/06/03 20:16:19 peter
  597. * allow int64 in range declaration for new types
  598. Revision 1.23 2001/04/13 01:22:13 peter
  599. * symtable change to classes
  600. * range check generation and errors fixed, make cycle DEBUG=1 works
  601. * memory leaks fixed
  602. Revision 1.22 2001/04/04 22:43:53 peter
  603. * remove unnecessary calls to firstpass
  604. Revision 1.21 2001/04/02 21:20:34 peter
  605. * resulttype rewrite
  606. Revision 1.20 2001/03/22 22:35:42 florian
  607. + support for type a = (a=1); in Delphi mode added
  608. + procedure p(); in Delphi mode supported
  609. + on isn't keyword anymore, it can be used as
  610. id etc. now
  611. Revision 1.19 2001/03/12 12:49:01 michael
  612. + Patches from peter
  613. Revision 1.18 2001/03/11 22:58:50 peter
  614. * getsym redesign, removed the globals srsym,srsymtable
  615. Revision 1.17 2000/12/07 17:19:43 jonas
  616. * new constant handling: from now on, hex constants >$7fffffff are
  617. parsed as unsigned constants (otherwise, $80000000 got sign extended
  618. and became $ffffffff80000000), all constants in the longint range
  619. become longints, all constants >$7fffffff and <=cardinal($ffffffff)
  620. are cardinals and the rest are int64's.
  621. * added lots of longint typecast to prevent range check errors in the
  622. compiler and rtl
  623. * type casts of symbolic ordinal constants are now preserved
  624. * fixed bug where the original resulttype.def wasn't restored correctly
  625. after doing a 64bit rangecheck
  626. Revision 1.16 2000/11/29 00:30:38 florian
  627. * unused units removed from uses clause
  628. * some changes for widestrings
  629. Revision 1.15 2000/11/14 23:43:38 florian
  630. * fixed 1238
  631. Revision 1.14 2000/11/04 14:25:21 florian
  632. + merged Attila's changes for interfaces, not tested yet
  633. Revision 1.13 2000/10/31 22:02:51 peter
  634. * symtable splitted, no real code changes
  635. Revision 1.12 2000/10/26 21:54:03 peter
  636. * fixed crash with error in child definition (merged)
  637. Revision 1.11 2000/10/21 18:16:12 florian
  638. * a lot of changes:
  639. - basic dyn. array support
  640. - basic C++ support
  641. - some work for interfaces done
  642. ....
  643. Revision 1.10 2000/10/14 10:14:52 peter
  644. * moehrendorf oct 2000 rewrite
  645. Revision 1.9 2000/09/24 15:06:25 peter
  646. * use defines.inc
  647. Revision 1.8 2000/08/27 20:19:39 peter
  648. * store strings with case in ppu, when an internal symbol is created
  649. a '$' is prefixed so it's not automatic uppercased
  650. Revision 1.7 2000/08/27 16:11:52 peter
  651. * moved some util functions from globals,cobjects to cutils
  652. * splitted files into finput,fmodule
  653. Revision 1.6 2000/08/16 18:33:54 peter
  654. * splitted namedobjectitem.next into indexnext and listnext so it
  655. can be used in both lists
  656. * don't allow "word = word" type definitions (merged)
  657. Revision 1.5 2000/08/06 14:17:15 peter
  658. * overload fixes (merged)
  659. Revision 1.4 2000/07/30 17:04:43 peter
  660. * merged fixes
  661. Revision 1.3 2000/07/13 12:08:27 michael
  662. + patched to 1.1.0 with former 1.09patch from peter
  663. Revision 1.2 2000/07/13 11:32:47 michael
  664. + removed logs
  665. }