2
0

Symbols.cp 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612
  1. (* ==================================================================== *)
  2. (* *)
  3. (* Symbol Module for the Gardens Point Component Pascal Compiler. *)
  4. (* Implements the abstract base classes for all descriptor types. *)
  5. (* Copyright (c) John Gough 1999, 2000. *)
  6. (* *)
  7. (* ==================================================================== *)
  8. MODULE Symbols;
  9. IMPORT
  10. RTS,
  11. GPCPcopyright,
  12. GPText,
  13. Console,
  14. FileNames,
  15. NameHash,
  16. L := LitValue,
  17. V := VarSets,
  18. S := CPascalS,
  19. H := DiagHelper;
  20. (* ============================================================ *)
  21. CONST (* mode-kinds *)
  22. prvMode* = 0; pubMode* = 1; rdoMode* = 2; protect* = 3;
  23. CONST (* param-modes *)
  24. val* = 0; in* = 1; out* = 2; var* = 3; notPar* = 4;
  25. CONST (* force-kinds *)
  26. noEmit* = 0; partEmit* = 1; forced* = 2;
  27. CONST
  28. standard* = 0;
  29. CONST
  30. tOffset* = 16; (* backward compatibility with JavaVersion *)
  31. (* ============================================================ *)
  32. (* Foreign attributes for modules, procedures and classes *)
  33. (* ============================================================ *)
  34. CONST (* module and type attributes for xAttr *)
  35. mMsk* = { 0 .. 7}; main* = 0; weak* = 1; need* = 2;
  36. fixd* = 3; rtsMd* = 4; anon* = 5;
  37. clsTp* = 6; frnMd* = 7;
  38. rMsk* = { 8 .. 15}; noNew* = 8; valTp* = 9; noCpy* = 10;
  39. spshl* = 11; xCtor* = 12;
  40. fMsk* = {16 .. 23}; isFn* = 16; extFn* = 17; fnInf* = 18;
  41. dMsk* = {24 .. 31}; cMain* = 24; wMain* = 25; sta* = 26;
  42. (* ============================================================ *)
  43. TYPE NameStr* = ARRAY 64 OF CHAR;
  44. (* ============================================================ *)
  45. TYPE
  46. Idnt* = POINTER TO ABSTRACT RECORD (RTS.NativeObject)
  47. kind- : INTEGER; (* tag for unions *)
  48. token* : S.Token; (* scanner token *)
  49. type* : Type; (* typ-desc | NIL *)
  50. hash* : INTEGER; (* hash bucket no *)
  51. vMod- : INTEGER; (* visibility tag *)
  52. dfScp* : Scope; (* defining scope *)
  53. tgXtn* : ANYPTR; (* target stuff *)
  54. namStr- : RTS.NativeString;
  55. END; (* For fields: record-decl scope *)
  56. IdSeq* = RECORD
  57. tide-, high : INTEGER;
  58. a- : POINTER TO ARRAY OF Idnt;
  59. END;
  60. Scope* = POINTER TO ABSTRACT RECORD (Idnt)
  61. symTb* : SymbolTable; (* symbol scope *)
  62. endDecl* : BOOLEAN;
  63. ovfChk* : BOOLEAN;
  64. locals* : IdSeq;
  65. scopeNm* : L.CharOpen (* external name *)
  66. END;
  67. ScpSeq* = RECORD
  68. tide-, high : INTEGER;
  69. a- : POINTER TO ARRAY OF Scope;
  70. END;
  71. (* ============================================================ *)
  72. TYPE
  73. Type* = POINTER TO ABSTRACT RECORD
  74. idnt* : Idnt; (* Id of typename *)
  75. kind- : INTEGER; (* tag for unions *)
  76. serial- : INTEGER; (* type serial-nm *)
  77. force* : INTEGER; (* force sym-emit *)
  78. xName* : L.CharOpen; (* full ext name *)
  79. dump*,depth* : INTEGER; (* scratch loc'ns *)
  80. tgXtn* : ANYPTR; (* target stuff *)
  81. END;
  82. TypeSeq* = RECORD
  83. tide-, high : INTEGER;
  84. a- : POINTER TO ARRAY OF Type;
  85. END;
  86. (* ============================================================ *)
  87. TYPE
  88. Stmt* = POINTER TO ABSTRACT RECORD
  89. kind- : INTEGER; (* tag for unions *)
  90. token* : S.Token; (* stmt first tok *)
  91. END;
  92. StmtSeq* = RECORD
  93. tide-, high : INTEGER;
  94. a- : POINTER TO ARRAY OF Stmt;
  95. END;
  96. (* ============================================================ *)
  97. TYPE
  98. Expr* = POINTER TO ABSTRACT RECORD
  99. kind- : INTEGER; (* tag for unions *)
  100. token* : S.Token; (* exp marker tok *)
  101. tSpan* : S.Span; (* start expr tok *)
  102. type* : Type;
  103. END;
  104. ExprSeq* = RECORD
  105. tide-, high : INTEGER;
  106. a- : POINTER TO ARRAY OF Expr;
  107. END;
  108. (* ============================================================ *)
  109. TYPE (* Symbol tables are implemented by a binary tree *)
  110. SymInfo = POINTER TO RECORD (* private stuff *)
  111. key : INTEGER; (* hash key value *)
  112. val : Idnt; (* id-desc. value *)
  113. lOp : SymInfo; (* left child *)
  114. rOp : SymInfo; (* right child *)
  115. END;
  116. SymbolTable* = RECORD
  117. root : SymInfo;
  118. END;
  119. (* ============================================================ *)
  120. (* SymForAll is the base type of a visitor type. *)
  121. (* Instances of extensions of SymForAll type are passed to *)
  122. (* SymbolTables using *)
  123. (* symTab.Apply(sfa : SymForAll); *)
  124. (* This recurses over the table, applying sfa.Op(id) to each *)
  125. (* Idnt descriptor in the scope. *)
  126. (* ============================================================ *)
  127. TYPE
  128. SymForAll* = POINTER TO ABSTRACT RECORD END;
  129. SymTabDump* = POINTER TO RECORD (SymForAll)
  130. indent : INTEGER;
  131. END;
  132. NameDump* = POINTER TO RECORD (SymForAll)
  133. tide, high : INTEGER;
  134. a : L.CharOpen;
  135. END;
  136. (* ============================================================ *)
  137. TYPE
  138. SccTable* = POINTER TO RECORD
  139. symTab* : SymbolTable;
  140. target* : Type;
  141. reached* : BOOLEAN;
  142. END;
  143. (* ============================================================ *)
  144. TYPE
  145. NameFetch* = POINTER TO RECORD END;
  146. (** This type exports two methods only: *)
  147. (* (g : NameFetch)Of*(i : Idnt; OUT s : ARRAY OF CHAR); *)
  148. (* (g : NameFetch)ChPtr*(id : Idnt) : L.CharOpen; *)
  149. (* ============================================================ *)
  150. VAR modStr- : ARRAY 4 OF ARRAY 5 OF CHAR;
  151. modMrk- : ARRAY 5 OF CHAR;
  152. anonMrk- : ARRAY 3 OF CHAR;
  153. trgtNET- : BOOLEAN;
  154. getName* : NameFetch;
  155. next : INTEGER; (* private: next serial number. *)
  156. (* ============================================================ *)
  157. PROCEDURE SetTargetIsNET*(p : BOOLEAN);
  158. BEGIN
  159. trgtNET := p;
  160. IF p THEN anonMrk := "@T" ELSE anonMrk := "$T" END;
  161. END SetTargetIsNET;
  162. (* ============================================================ *)
  163. (* Abstract attribution methods *)
  164. (* ============================================================ *)
  165. PROCEDURE (i : Expr)exprAttr*() : Expr,NEW,ABSTRACT;
  166. PROCEDURE (s : Stmt)StmtAttr*(t : Scope),NEW,ABSTRACT;
  167. PROCEDURE (s : Stmt)flowAttr*(t : Scope; i : V.VarSet):V.VarSet,NEW,ABSTRACT;
  168. (* ============================================================ *)
  169. (* Abstract type erase methods *)
  170. (* ============================================================ *)
  171. PROCEDURE (s : Stmt)TypeErase*(t : Scope), NEW, ABSTRACT;
  172. PROCEDURE (s : Expr)TypeErase*() : Expr, NEW, ABSTRACT;
  173. PROCEDURE (i : Type)TypeErase*() : Type, NEW, ABSTRACT;
  174. (* ============================================================ *)
  175. (* Abstract diagnostic methods *)
  176. (* ============================================================ *)
  177. PROCEDURE (t : Idnt)Diagnose*(i : INTEGER),NEW,ABSTRACT;
  178. PROCEDURE (t : Type)Diagnose*(i : INTEGER),NEW,ABSTRACT;
  179. PROCEDURE (t : Expr)Diagnose*(i : INTEGER),NEW,ABSTRACT;
  180. PROCEDURE (t : Stmt)Diagnose*(i : INTEGER),NEW,ABSTRACT;
  181. PROCEDURE (t : Type)name*() : L.CharOpen,NEW,ABSTRACT;
  182. PROCEDURE (t : Idnt)SetNameFromString*(nam : L.CharOpen),NEW;
  183. BEGIN
  184. t.namStr := MKSTR(nam^);
  185. END SetNameFromString;
  186. PROCEDURE (t : Idnt)SetNameFromHash*(hash : INTEGER),NEW;
  187. BEGIN
  188. t.namStr := MKSTR(NameHash.charOpenOfHash(hash)^);
  189. END SetNameFromHash;
  190. PROCEDURE (t : Idnt)ClearName*(),NEW;
  191. BEGIN
  192. t.namStr := NIL;
  193. END ClearName;
  194. (* ============================================================ *)
  195. (* This diagnostic method is placed here to use when GPCP-CLR *)
  196. (* itself is being debugged. If ToString is present then *)
  197. (* > gpcp /target=jvm Symbol.cp fails with error 105 :- *)
  198. (* "This method is not a redefinition, you must use NEW" *)
  199. (* ============================================================ *
  200. PROCEDURE (t : Idnt)ToString*() : RTS.NativeString;
  201. BEGIN
  202. IF t.namStr # NIL THEN RETURN t.namStr;
  203. ELSE RETURN MKSTR(NameHash.charOpenOfHash(t.hash)^);
  204. END;
  205. END ToString;
  206. * ============================================================ *)
  207. (* ============================================================ *)
  208. (* This diagnostic method is placed here to use when GPCP-JVM *)
  209. (* itself is being debugged. If toString is present then *)
  210. (* > gpcp /target=net Symbol.cp fails with error 105 :- *)
  211. (* "This method is not a redefinition, you must use NEW" *)
  212. (* ============================================================ *
  213. PROCEDURE (t : Idnt)toString*() : RTS.NativeString;
  214. BEGIN
  215. IF t.namStr # NIL THEN RETURN t.namStr;
  216. ELSE RETURN MKSTR(NameHash.charOpenOfHash(t.hash)^);
  217. END;
  218. END toString;
  219. * ============================================================ *)
  220. (* ============================================================ *)
  221. (* ============================================================ *)
  222. (* Base Class text-span method *)
  223. (* ============================================================ *)
  224. PROCEDURE (s : Stmt)Span*() : S.Span,NEW,EXTENSIBLE;
  225. BEGIN
  226. RETURN S.mkSpanT(s.token);
  227. END Span;
  228. (* ============================================================ *)
  229. (* Base predicates on Idnt extensions *)
  230. (* If the predicate needs a different implementation for each *)
  231. (* of the direct subclasses, then it is ABSTRACT, otherwise it *)
  232. (* should be implemented here with a default return value. *)
  233. (* ============================================================ *)
  234. PROCEDURE (s : Idnt)isImport*() : BOOLEAN,NEW,EXTENSIBLE;
  235. BEGIN RETURN FALSE END isImport;
  236. (* -------------------------------------------- *)
  237. PROCEDURE (s : Idnt)isImported*() : BOOLEAN,NEW,EXTENSIBLE;
  238. BEGIN
  239. RETURN (s.dfScp # NIL) & s.dfScp.isImport();
  240. END isImported;
  241. (* -------------------------------------------- *)
  242. PROCEDURE (s : Type)isImportedType*() : BOOLEAN,NEW,EXTENSIBLE;
  243. BEGIN
  244. RETURN (s.idnt # NIL) &
  245. (s.idnt.dfScp # NIL) &
  246. s.idnt.dfScp.isImport();
  247. END isImportedType;
  248. (* -------------------------------------------- *)
  249. PROCEDURE^ (xp : Expr)ExprError*(n : INTEGER),NEW;
  250. PROCEDURE (s : Idnt)mutable*() : BOOLEAN,NEW,EXTENSIBLE;
  251. BEGIN RETURN FALSE END mutable;
  252. PROCEDURE (s : Idnt)CheckMutable*(x : Expr),NEW,EXTENSIBLE;
  253. BEGIN x.ExprError(181) END CheckMutable;
  254. (* -------------------------------------------- *)
  255. PROCEDURE (s : Idnt)isStatic*() : BOOLEAN,NEW,EXTENSIBLE;
  256. BEGIN RETURN FALSE END isStatic;
  257. (* -------------------------------------------- *)
  258. PROCEDURE (s : Idnt)isLocalVar*() : BOOLEAN,NEW,EXTENSIBLE;
  259. BEGIN RETURN FALSE END isLocalVar;
  260. (* -------------------------------------------- *)
  261. PROCEDURE (s : Idnt)isNeeded*() : BOOLEAN,NEW,EXTENSIBLE;
  262. BEGIN RETURN FALSE END isNeeded;
  263. (* -------------------------------------------- *)
  264. PROCEDURE (s : Idnt)isWeak*() : BOOLEAN,NEW,EXTENSIBLE;
  265. BEGIN RETURN FALSE END isWeak;
  266. (* -------------------------------------------- *)
  267. PROCEDURE (s : Idnt)isDynamic*() : BOOLEAN,NEW,EXTENSIBLE;
  268. BEGIN RETURN FALSE END isDynamic;
  269. (* -------------------------------------------- *)
  270. PROCEDURE (s : Idnt)isAbstract*() : BOOLEAN,NEW,EXTENSIBLE;
  271. BEGIN RETURN FALSE END isAbstract;
  272. (* -------------------------------------------- *)
  273. PROCEDURE (s : Idnt)isEmpty*() : BOOLEAN,NEW,EXTENSIBLE;
  274. BEGIN RETURN FALSE END isEmpty;
  275. (* -------------------------------------------- *)
  276. PROCEDURE (i : Idnt)parMode*() : INTEGER,NEW,EXTENSIBLE;
  277. BEGIN RETURN notPar END parMode;
  278. (* -------------------------------------------- *)
  279. (* ????
  280. PROCEDURE (s : Idnt)isRcv*() : BOOLEAN,NEW,EXTENSIBLE;
  281. BEGIN RETURN FALSE END isRcv;
  282. *)
  283. (* -------------------------------------------- *)
  284. (* ????
  285. PROCEDURE (s : Idnt)isAssignProc*() : BOOLEAN,NEW,EXTENSIBLE;
  286. BEGIN RETURN FALSE END isAssignProc;
  287. *)
  288. (* ============================================================ *)
  289. (* Base predicates on Type extensions *)
  290. (* ============================================================ *)
  291. PROCEDURE (l : Type)equalOpenOrVector*(r : Type) : BOOLEAN,NEW,EXTENSIBLE;
  292. BEGIN RETURN FALSE END equalOpenOrVector;
  293. (* -------------------------------------------- *)
  294. PROCEDURE (l : Type)procMatch*(r : Type) : BOOLEAN,NEW,EXTENSIBLE;
  295. BEGIN RETURN FALSE END procMatch;
  296. (* -------------------------------------------- *)
  297. PROCEDURE (l : Type)namesMatch*(r : Type) : BOOLEAN,NEW,EXTENSIBLE;
  298. BEGIN RETURN FALSE END namesMatch;
  299. (* -------------------------------------------- *)
  300. PROCEDURE (l : Type)sigsMatch*(r : Type) : BOOLEAN,NEW,EXTENSIBLE;
  301. BEGIN RETURN FALSE END sigsMatch;
  302. (* -------------------------------------------- *)
  303. PROCEDURE (l : Type)equalPointers*(r : Type) : BOOLEAN,NEW,EXTENSIBLE;
  304. BEGIN RETURN FALSE END equalPointers;
  305. (* -------------------------------------------- *)
  306. PROCEDURE (i : Type)isAnonType*() : BOOLEAN,NEW;
  307. BEGIN RETURN (i.idnt = NIL) OR (i.idnt.dfScp = NIL) END isAnonType;
  308. (* -------------------------------------------- *)
  309. PROCEDURE (i : Type)isBaseType*() : BOOLEAN,NEW,EXTENSIBLE;
  310. BEGIN RETURN FALSE END isBaseType;
  311. (* -------------------------------------------- *)
  312. PROCEDURE (i : Type)isIntType*() : BOOLEAN,NEW,EXTENSIBLE;
  313. BEGIN RETURN FALSE END isIntType;
  314. (* -------------------------------------------- *)
  315. PROCEDURE (s : Idnt)isIn*(set : V.VarSet) : BOOLEAN,NEW,EXTENSIBLE;
  316. BEGIN RETURN TRUE END isIn;
  317. (* -------------------------------------------- *)
  318. PROCEDURE (i : Type)isNumType*() : BOOLEAN,NEW,EXTENSIBLE;
  319. BEGIN RETURN FALSE END isNumType;
  320. (* -------------------------------------------- *)
  321. PROCEDURE (i : Type)isScalarType*() : BOOLEAN,NEW,EXTENSIBLE;
  322. BEGIN RETURN TRUE END isScalarType; (* all except arrays, records *)
  323. (* -------------------------------------------- *)
  324. PROCEDURE (i : Type)isSetType*() : BOOLEAN,NEW,EXTENSIBLE;
  325. BEGIN RETURN FALSE END isSetType;
  326. (* -------------------------------------------- *)
  327. PROCEDURE (i : Type)isRealType*() : BOOLEAN,NEW,EXTENSIBLE;
  328. BEGIN RETURN FALSE END isRealType;
  329. (* -------------------------------------------- *)
  330. PROCEDURE (i : Type)isCharType*() : BOOLEAN,NEW,EXTENSIBLE;
  331. BEGIN RETURN FALSE END isCharType;
  332. (* -------------------------------------------- *)
  333. PROCEDURE (i : Type)isBooleanType*() : BOOLEAN,NEW,EXTENSIBLE;
  334. BEGIN RETURN FALSE END isBooleanType;
  335. (* -------------------------------------------- *)
  336. PROCEDURE (i : Type)isStringType*() : BOOLEAN,NEW,EXTENSIBLE;
  337. BEGIN RETURN FALSE END isStringType;
  338. (* -------------------------------------------- *)
  339. PROCEDURE (i : Type)nativeCompat*() : BOOLEAN,NEW,EXTENSIBLE;
  340. BEGIN RETURN FALSE END nativeCompat;
  341. (* -------------------------------------------- *)
  342. PROCEDURE (i : Type)isCharArrayType*() : BOOLEAN,NEW,EXTENSIBLE;
  343. BEGIN RETURN FALSE END isCharArrayType;
  344. (* -------------------------------------------- *)
  345. PROCEDURE (s : Type)isRefSurrogate*() : BOOLEAN,NEW,EXTENSIBLE;
  346. BEGIN RETURN FALSE END isRefSurrogate;
  347. (* -------------------------------------------- *)
  348. PROCEDURE (i : Type)isPointerType*() : BOOLEAN,NEW,EXTENSIBLE;
  349. BEGIN RETURN FALSE END isPointerType;
  350. (* -------------------------------------------- *)
  351. PROCEDURE (i : Type)isRecordType*() : BOOLEAN,NEW,EXTENSIBLE;
  352. BEGIN RETURN FALSE END isRecordType;
  353. (* -------------------------------------------- *)
  354. PROCEDURE (i : Type)isProcType*() : BOOLEAN,NEW,EXTENSIBLE;
  355. BEGIN RETURN FALSE END isProcType;
  356. (* -------------------------------------------- *)
  357. PROCEDURE (i : Type)isProperProcType*() : BOOLEAN,NEW,EXTENSIBLE;
  358. BEGIN RETURN FALSE END isProperProcType;
  359. (* -------------------------------------------- *)
  360. PROCEDURE (i : Type)isDynamicType*() : BOOLEAN,NEW,EXTENSIBLE;
  361. BEGIN RETURN FALSE END isDynamicType;
  362. (* -------------------------------------------- *)
  363. PROCEDURE (i : Type)isAbsRecType*() : BOOLEAN,NEW,EXTENSIBLE;
  364. BEGIN RETURN FALSE END isAbsRecType;
  365. (* -------------------------------------------- *)
  366. PROCEDURE (i : Type)isLimRecType*() : BOOLEAN,NEW,EXTENSIBLE;
  367. BEGIN RETURN FALSE END isLimRecType;
  368. (* -------------------------------------------- *)
  369. PROCEDURE (i : Type)isExtnRecType*() : BOOLEAN,NEW,EXTENSIBLE;
  370. BEGIN RETURN FALSE END isExtnRecType;
  371. (* -------------------------------------------- *)
  372. PROCEDURE (i : Type)isOpenArrType*() : BOOLEAN,NEW,EXTENSIBLE;
  373. BEGIN RETURN FALSE END isOpenArrType;
  374. PROCEDURE (i : Type)isVectorType*() : BOOLEAN,NEW,EXTENSIBLE;
  375. BEGIN RETURN FALSE END isVectorType;
  376. (* -------------------------------------------- *)
  377. PROCEDURE (i : Type)needsInit*() : BOOLEAN,NEW,EXTENSIBLE;
  378. BEGIN RETURN TRUE END needsInit;
  379. (* -------------------------------------------- *)
  380. PROCEDURE (i : Type)isForeign*() : BOOLEAN,NEW,EXTENSIBLE;
  381. BEGIN RETURN FALSE END isForeign;
  382. (* -------------------------------------------- *)
  383. PROCEDURE (i : Type)valCopyOK*() : BOOLEAN,NEW,EXTENSIBLE;
  384. BEGIN RETURN TRUE END valCopyOK;
  385. (* -------------------------------------------- *)
  386. PROCEDURE (i : Type)isInterfaceType*() : BOOLEAN,NEW,EXTENSIBLE;
  387. BEGIN RETURN FALSE END isInterfaceType;
  388. (* -------------------------------------------- *)
  389. PROCEDURE (i : Type)isEventType*() : BOOLEAN,NEW,EXTENSIBLE;
  390. BEGIN RETURN FALSE END isEventType;
  391. (* -------------------------------------------- *)
  392. PROCEDURE (i : Type)isCompoundType*() : BOOLEAN,NEW,EXTENSIBLE;
  393. (* Returns TRUE if the type is a compound type *)
  394. BEGIN RETURN FALSE END isCompoundType;
  395. (* -------------------------------------------- *)
  396. PROCEDURE (i : Type)ImplementationType*() : Type,NEW,EXTENSIBLE;
  397. (* Returns the type that this type will be implemented
  398. * as. Usually this is just an identity function, but
  399. * for types that can be erased, it may be a different
  400. * type. *)
  401. BEGIN RETURN i END ImplementationType;
  402. (* -------------------------------------------- *)
  403. PROCEDURE (i : Type)implements*(x : Type) : BOOLEAN,NEW,EXTENSIBLE;
  404. BEGIN RETURN FALSE END implements;
  405. (* -------------------------------------------- *)
  406. PROCEDURE (i : Type)implementsAll*(x : Type) : BOOLEAN,NEW,EXTENSIBLE;
  407. (* Returns true iff i is a type that implements all of the
  408. * interfaces of x. x and i must be types that are capable of
  409. * implementing interfaces (a record or pointer) *)
  410. BEGIN RETURN FALSE END implementsAll;
  411. (* -------------------------------------------- *)
  412. PROCEDURE (b : Type)isBaseOf*(x : Type) : BOOLEAN,NEW,EXTENSIBLE;
  413. BEGIN RETURN FALSE END isBaseOf;
  414. (* -------------------------------------------- *)
  415. PROCEDURE (i : Type)isLongType*() : BOOLEAN,NEW,EXTENSIBLE;
  416. BEGIN RETURN FALSE END isLongType;
  417. (* -------------------------------------------- *)
  418. PROCEDURE (i : Type)isNativeObj*() : BOOLEAN,NEW,EXTENSIBLE;
  419. BEGIN RETURN FALSE END isNativeObj;
  420. (* -------------------------------------------- *)
  421. PROCEDURE (i : Type)isNativeStr*() : BOOLEAN,NEW,EXTENSIBLE;
  422. BEGIN RETURN FALSE END isNativeStr;
  423. (* -------------------------------------------- *)
  424. PROCEDURE (i : Type)isNativeExc*() : BOOLEAN,NEW,EXTENSIBLE;
  425. BEGIN RETURN FALSE END isNativeExc;
  426. (* -------------------------------------------- *)
  427. PROCEDURE (b : Type)includes*(x : Type) : BOOLEAN,NEW,EXTENSIBLE;
  428. BEGIN RETURN FALSE END includes;
  429. (* -------------------------------------------- *)
  430. PROCEDURE (i : Type)boundRecTp*() : Type,NEW,EXTENSIBLE;
  431. BEGIN RETURN NIL END boundRecTp;
  432. (* -------------------------------------------- *)
  433. PROCEDURE (i : Type)superType*() : Type,NEW,EXTENSIBLE;
  434. BEGIN RETURN NIL END superType;
  435. (* -------------------------------------------- *)
  436. PROCEDURE (i : Type)elaboration*() : Type,NEW,EXTENSIBLE;
  437. BEGIN RETURN i END elaboration;
  438. (* -------------------------------------------- *)
  439. PROCEDURE (i : Type)inheritedFeature*(m : Idnt) : Idnt,NEW,EXTENSIBLE;
  440. BEGIN
  441. RETURN NIL;
  442. END inheritedFeature;
  443. (* -------------------------------------------- *)
  444. PROCEDURE (i : Type)returnType*() : Type,NEW,EXTENSIBLE;
  445. BEGIN RETURN NIL END returnType;
  446. (* -------------------------------------------- *)
  447. PROCEDURE (recT : Type)AppendCtor*(prcI : Idnt),NEW,EMPTY;
  448. PROCEDURE (oldT : Type)CheckCovariance*(newI : Idnt),NEW,EMPTY;
  449. PROCEDURE (mthT : Type)CheckEmptyOK*(),NEW,EMPTY;
  450. PROCEDURE (theT : Type)ConditionalMark*(),NEW,ABSTRACT;
  451. PROCEDURE (theT : Type)UnconditionalMark*(),NEW,ABSTRACT;
  452. PROCEDURE (prcT : Type)OutCheck*(s : V.VarSet),NEW,EMPTY;
  453. PROCEDURE (s : Scope)LiveInitialize*(i : V.VarSet),NEW,EMPTY;
  454. PROCEDURE (s : Scope)UplevelInitialize*(i : V.VarSet),NEW,EMPTY;
  455. PROCEDURE (o : Idnt)OverloadFix*(),NEW,EMPTY;
  456. (* -------------------------------------------- *)
  457. PROCEDURE (i : Type)resolve*(d : INTEGER) : Type,NEW,ABSTRACT;
  458. PROCEDURE (i : Type)TypeFix*(IN a : TypeSeq),NEW,ABSTRACT;
  459. PROCEDURE (i : Type)InsertMethod*(m : Idnt),NEW,EMPTY;
  460. PROCEDURE (i : Type)SccTab*(t : SccTable),NEW,ABSTRACT;
  461. (* ============================================================ *)
  462. (* Base predicates on Expr extensions *)
  463. (* ============================================================ *)
  464. PROCEDURE (i : Expr)isNil*() : BOOLEAN,NEW,EXTENSIBLE;
  465. BEGIN RETURN FALSE END isNil;
  466. (* -------------------------------------------- *)
  467. PROCEDURE (i : Expr)isInf*() : BOOLEAN,NEW,EXTENSIBLE;
  468. BEGIN RETURN FALSE END isInf;
  469. (* -------------------------------------------- *)
  470. PROCEDURE (x : Expr)isWriteable*() : BOOLEAN,NEW,EXTENSIBLE;
  471. BEGIN RETURN FALSE END isWriteable;
  472. PROCEDURE (x : Expr)CheckWriteable*(),NEW,EXTENSIBLE;
  473. BEGIN x.ExprError(103) END CheckWriteable;
  474. (* -------------------------------------------- *)
  475. PROCEDURE (x : Expr)isVarDesig*() : BOOLEAN,NEW,EXTENSIBLE;
  476. BEGIN RETURN FALSE END isVarDesig;
  477. (* -------------------------------------------- *)
  478. PROCEDURE (x : Expr)isProcVar*() : BOOLEAN,NEW,EXTENSIBLE;
  479. BEGIN RETURN FALSE END isProcVar;
  480. (* -------------------------------------------- *)
  481. PROCEDURE (x : Expr)isJavaInit*() : BOOLEAN,NEW,EXTENSIBLE;
  482. BEGIN RETURN FALSE END isJavaInit;
  483. (* -------------------------------------------- *)
  484. PROCEDURE (x : Expr)isSetExpr*() : BOOLEAN,NEW;
  485. BEGIN RETURN (x.type # NIL) & (x.type.isSetType()) END isSetExpr;
  486. (* -------------------------------------------- *)
  487. PROCEDURE (x : Expr)isBooleanExpr*() : BOOLEAN,NEW;
  488. BEGIN RETURN (x.type # NIL) & (x.type.isBooleanType()) END isBooleanExpr;
  489. (* -------------------------------------------- *)
  490. PROCEDURE (x : Expr)isCharArray*() : BOOLEAN,NEW;
  491. BEGIN RETURN (x.type # NIL) & (x.type.isCharArrayType()) END isCharArray;
  492. (* -------------------------------------------- *)
  493. PROCEDURE (x : Expr)isCharLit*() : BOOLEAN,NEW,EXTENSIBLE;
  494. (** A literal character, or a literal string of length = 1. *)
  495. BEGIN RETURN FALSE END isCharLit;
  496. (* -------------------------------------------- *)
  497. PROCEDURE (x : Expr)isCharExpr*() : BOOLEAN,NEW;
  498. BEGIN
  499. RETURN x.isCharLit() OR
  500. (x.type # NIL) & (x.type.isCharType());
  501. END isCharExpr;
  502. (* -------------------------------------------- *)
  503. PROCEDURE (x : Expr)isString*() : BOOLEAN,NEW;
  504. (** A literal string or the result of a string concatenation. *)
  505. BEGIN RETURN (x.type # NIL) & (x.type.isStringType()) END isString;
  506. (* -------------------------------------------- *)
  507. PROCEDURE (x : Expr)isNumLit*() : BOOLEAN,NEW,EXTENSIBLE;
  508. (** Any literal integer. *)
  509. BEGIN RETURN FALSE END isNumLit;
  510. (* -------------------------------------------- *)
  511. PROCEDURE (x : Expr)isStrLit*() : BOOLEAN,NEW,EXTENSIBLE;
  512. (** Any literal string. *)
  513. BEGIN RETURN FALSE END isStrLit;
  514. (* -------------------------------------------- *)
  515. PROCEDURE (x : Expr)isProcLit*() : BOOLEAN,NEW,EXTENSIBLE;
  516. (** Any literal procedure. *)
  517. BEGIN RETURN FALSE END isProcLit;
  518. (* -------------------------------------------- *)
  519. PROCEDURE (x : Expr)isPointerExpr*() : BOOLEAN,NEW;
  520. BEGIN RETURN (x.type # NIL) & x.type.isPointerType() END isPointerExpr;
  521. PROCEDURE (x : Expr)isVectorExpr*() : BOOLEAN,NEW;
  522. BEGIN RETURN (x.type # NIL) & x.type.isVectorType() END isVectorExpr;
  523. (* -------------------------------------------- *)
  524. PROCEDURE (x : Expr)isProcExpr*() : BOOLEAN,NEW;
  525. BEGIN RETURN (x.type # NIL) & x.type.isProcType() END isProcExpr;
  526. (* -------------------------------------------- *)
  527. PROCEDURE (x : Expr)isIntExpr*() : BOOLEAN,NEW;
  528. BEGIN RETURN (x.type # NIL) & x.type.isIntType() END isIntExpr;
  529. (* -------------------------------------------- *)
  530. PROCEDURE (x : Expr)isRealExpr*() : BOOLEAN,NEW;
  531. BEGIN RETURN (x.type # NIL) & x.type.isRealType() END isRealExpr;
  532. (* -------------------------------------------- *)
  533. PROCEDURE (x : Expr)isNumericExpr*() : BOOLEAN,NEW;
  534. BEGIN RETURN (x.type # NIL) & x.type.isNumType() END isNumericExpr;
  535. (* -------------------------------------------- *)
  536. PROCEDURE (x : Expr)isStdFunc*() : BOOLEAN,NEW,EXTENSIBLE;
  537. BEGIN RETURN FALSE END isStdFunc;
  538. (* -------------------------------------------- *)
  539. PROCEDURE (x : Expr)hasDynamicType*() : BOOLEAN,NEW,EXTENSIBLE;
  540. (* overridden for IdLeaf extension of LeafX expression type *)
  541. BEGIN
  542. RETURN (x.type # NIL) & x.type.isDynamicType();
  543. END hasDynamicType;
  544. (* -------------------------------------------- *)
  545. PROCEDURE (x : Expr)isStdProc*() : BOOLEAN,NEW,EXTENSIBLE;
  546. BEGIN RETURN FALSE END isStdProc;
  547. (* -------------------------------------------- *)
  548. PROCEDURE (x : Expr)inRangeOf*(t : Type) : BOOLEAN,NEW,EXTENSIBLE;
  549. (* If t is an ordinal type, return x in range, or for array *
  550. * type t return x is within the index range. *)
  551. BEGIN RETURN FALSE END inRangeOf;
  552. (* ============================================================ *)
  553. PROCEDURE RepTypesError*(n : INTEGER; lT,rT : Type; ln,cl : INTEGER);
  554. BEGIN
  555. S.SemError.RepSt2(n, lT.name(), rT.name(), ln, cl);
  556. END RepTypesError;
  557. PROCEDURE RepTypesErrTok*(n : INTEGER; lT,rT : Type; tk : S.Token);
  558. BEGIN
  559. S.SemError.RepSt2(n, lT.name(), rT.name(), tk.lin, tk.col);
  560. END RepTypesErrTok;
  561. (* ============================================================ *)
  562. (* Various Type Compatability tests. *)
  563. (* ============================================================ *)
  564. PROCEDURE (lhT : Type)equalType*(rhT : Type) : BOOLEAN,NEW,EXTENSIBLE;
  565. BEGIN
  566. RETURN (lhT = rhT)
  567. OR lhT.equalPointers(rhT)
  568. OR lhT.equalOpenOrVector(rhT)
  569. OR lhT.procMatch(rhT);
  570. END equalType;
  571. (* -------------------------------------------- *)
  572. PROCEDURE (lhT : Type)assignCompat*(x : Expr) : BOOLEAN,NEW;
  573. VAR rhT : Type;
  574. BEGIN
  575. IF (x = NIL) OR (x.type = NIL) THEN RETURN TRUE; END;
  576. rhT := x.type;
  577. (* Compound type compatibility. *)
  578. IF lhT.isCompoundType() THEN
  579. IF ~lhT.isBaseOf(rhT) THEN RETURN FALSE END;
  580. IF (rhT.isExtnRecType()) THEN RETURN TRUE END;
  581. (* rhT is not extensible. It must support all of lhT's interfaces
  582. * statically *)
  583. RETURN rhT.implementsAll(lhT);
  584. END;
  585. IF lhT.equalType(rhT) & ~lhT.isExtnRecType() & ~lhT.isOpenArrType() THEN
  586. RETURN TRUE END;
  587. IF lhT.includes(rhT) THEN
  588. RETURN TRUE END;
  589. IF lhT.isPointerType() & lhT.isBaseOf(rhT) THEN
  590. RETURN TRUE END;
  591. IF x.isNil() THEN
  592. RETURN lhT.isPointerType() OR lhT.isProcType() END;
  593. IF x.isNumLit() & lhT.isIntType() OR
  594. x.isCharLit() & lhT.isCharType() OR
  595. x.isStrLit() & lhT.isCharArrayType() THEN
  596. RETURN x.inRangeOf(lhT) END;
  597. IF x.isString() THEN
  598. RETURN lhT.nativeCompat() OR lhT.isCharArrayType() END;
  599. IF lhT.isInterfaceType() THEN
  600. RETURN rhT.implements(lhT) END;
  601. RETURN FALSE;
  602. END assignCompat;
  603. (* -------------------------------------------- *)
  604. PROCEDURE (formal : Idnt)paramCompat*(actual : Expr) : BOOLEAN,NEW;
  605. VAR acType : Type;
  606. fmType : Type;
  607. BEGIN
  608. IF (actual = NIL) OR (actual.type = NIL) OR (formal.type = NIL) THEN
  609. RETURN TRUE;
  610. ELSE
  611. acType := actual.type;
  612. fmType := formal.type;
  613. END;
  614. IF fmType.equalType(acType) THEN RETURN TRUE;
  615. ELSE
  616. CASE formal.parMode() OF
  617. | val : RETURN fmType.assignCompat(actual);
  618. | out : RETURN fmType.isPointerType() & acType.isBaseOf(fmType);
  619. | var : RETURN fmType.isExtnRecType() & fmType.isBaseOf(acType);
  620. | in : RETURN fmType.isExtnRecType() & fmType.isBaseOf(acType) OR
  621. fmType.isPointerType() & fmType.assignCompat(actual);
  622. (* Special case: CP-strings ok with IN-mode NativeString/Object *)
  623. ELSE RETURN FALSE;
  624. END;
  625. END;
  626. END paramCompat;
  627. (* -------------------------------------------- *)
  628. PROCEDURE (lhT : Type)arrayCompat*(rhT : Type) : BOOLEAN,NEW,EXTENSIBLE;
  629. BEGIN
  630. RETURN lhT.equalType(rhT); (* unless it is an array *)
  631. END arrayCompat;
  632. (* ============================================================ *)
  633. (* Various Appends, for the abstract types. *)
  634. (* ============================================================ *)
  635. PROCEDURE InitIdSeq*(VAR seq : IdSeq; capacity : INTEGER);
  636. BEGIN
  637. NEW(seq.a, capacity); seq.tide := 0; seq.high := capacity-1;
  638. END InitIdSeq;
  639. (* ---------------------------------- *)
  640. PROCEDURE ResetIdSeq*(VAR seq : IdSeq);
  641. BEGIN
  642. seq.tide := 0;
  643. IF seq.a = NIL THEN InitIdSeq(seq, 2) END;
  644. END ResetIdSeq;
  645. (* ---------------------------------- *)
  646. PROCEDURE (VAR seq : IdSeq)ResetTo*(newTide : INTEGER),NEW;
  647. BEGIN
  648. ASSERT(newTide <= seq.tide);
  649. seq.tide := newTide;
  650. END ResetTo;
  651. (* ---------------------------------- *)
  652. PROCEDURE AppendIdnt*(VAR seq : IdSeq; elem : Idnt);
  653. VAR temp : POINTER TO ARRAY OF Idnt;
  654. i : INTEGER;
  655. BEGIN
  656. IF seq.a = NIL THEN
  657. InitIdSeq(seq, 2);
  658. ELSIF seq.tide > seq.high THEN (* must expand *)
  659. temp := seq.a;
  660. seq.high := seq.high * 2 + 1;
  661. NEW(seq.a, seq.high+1);
  662. FOR i := 0 TO seq.tide-1 DO seq.a[i] := temp[i] END;
  663. END;
  664. seq.a[seq.tide] := elem; INC(seq.tide);
  665. END AppendIdnt;
  666. (* -------------------------------------------- *)
  667. PROCEDURE InitTypeSeq*(VAR seq : TypeSeq; capacity : INTEGER);
  668. BEGIN
  669. NEW(seq.a, capacity); seq.tide := 0; seq.high := capacity-1;
  670. END InitTypeSeq;
  671. PROCEDURE ResetTypeSeq*(VAR seq : TypeSeq);
  672. BEGIN
  673. seq.tide := 0;
  674. IF seq.a = NIL THEN InitTypeSeq(seq, 2) END;
  675. END ResetTypeSeq;
  676. PROCEDURE AppendType*(VAR seq : TypeSeq; elem : Type);
  677. VAR temp : POINTER TO ARRAY OF Type;
  678. i : INTEGER;
  679. BEGIN
  680. IF seq.a = NIL THEN
  681. InitTypeSeq(seq, 2);
  682. ELSIF seq.tide > seq.high THEN (* must expand *)
  683. temp := seq.a;
  684. seq.high := seq.high * 2 + 1;
  685. NEW(seq.a, (seq.high+1));
  686. FOR i := 0 TO seq.tide-1 DO seq.a[i] := temp[i] END;
  687. END;
  688. seq.a[seq.tide] := elem; INC(seq.tide);
  689. END AppendType;
  690. (* -------------------------------------------- *)
  691. PROCEDURE InitScpSeq*(VAR seq : ScpSeq; capacity : INTEGER);
  692. BEGIN
  693. NEW(seq.a, capacity); seq.tide := 0; seq.high := capacity-1;
  694. END InitScpSeq;
  695. PROCEDURE ResetScpSeq*(VAR seq : ScpSeq);
  696. BEGIN
  697. seq.tide := 0;
  698. IF seq.a = NIL THEN InitScpSeq(seq, 2) END;
  699. END ResetScpSeq;
  700. PROCEDURE AppendScope*(VAR seq : ScpSeq; elem : Scope);
  701. VAR temp : POINTER TO ARRAY OF Scope;
  702. i : INTEGER;
  703. BEGIN
  704. IF seq.a = NIL THEN
  705. InitScpSeq(seq, 2);
  706. ELSIF seq.tide > seq.high THEN (* must expand *)
  707. temp := seq.a;
  708. seq.high := seq.high * 2 + 1;
  709. NEW(seq.a, (seq.high+1));
  710. FOR i := 0 TO seq.tide-1 DO seq.a[i] := temp[i] END;
  711. END;
  712. seq.a[seq.tide] := elem; INC(seq.tide);
  713. END AppendScope;
  714. (* ============================================================ *)
  715. PROCEDURE InitExprSeq*(VAR seq : ExprSeq; capacity : INTEGER);
  716. BEGIN
  717. NEW(seq.a, capacity); seq.tide := 0; seq.high := capacity-1;
  718. END InitExprSeq;
  719. (* ---------------------------------- *)
  720. PROCEDURE ResetExprSeq*(VAR seq : ExprSeq);
  721. BEGIN
  722. seq.tide := 0;
  723. IF seq.a = NIL THEN InitExprSeq(seq, 2) END;
  724. END ResetExprSeq;
  725. (* ---------------------------------- *)
  726. PROCEDURE (VAR seq : ExprSeq)ResetTo*(newTide : INTEGER),NEW;
  727. BEGIN
  728. ASSERT(newTide <= seq.tide);
  729. seq.tide := newTide;
  730. END ResetTo;
  731. (* ---------------------------------- *)
  732. PROCEDURE AppendExpr*(VAR seq : ExprSeq; elem : Expr);
  733. VAR temp : POINTER TO ARRAY OF Expr;
  734. i : INTEGER;
  735. BEGIN
  736. IF seq.a = NIL THEN
  737. InitExprSeq(seq, 2);
  738. ELSIF seq.tide > seq.high THEN (* must expand *)
  739. temp := seq.a;
  740. seq.high := seq.high * 2 + 1;
  741. NEW(seq.a, (seq.high+1));
  742. FOR i := 0 TO seq.tide-1 DO seq.a[i] := temp[i] END;
  743. END;
  744. seq.a[seq.tide] := elem; INC(seq.tide);
  745. END AppendExpr;
  746. (* -------------------------------------------- *)
  747. PROCEDURE InitStmtSeq*(VAR seq : StmtSeq; capacity : INTEGER);
  748. BEGIN
  749. NEW(seq.a, capacity); seq.tide := 0; seq.high := capacity-1;
  750. END InitStmtSeq;
  751. PROCEDURE AppendStmt*(VAR seq : StmtSeq; elem : Stmt);
  752. VAR temp : POINTER TO ARRAY OF Stmt;
  753. i : INTEGER;
  754. BEGIN
  755. IF seq.a = NIL THEN
  756. InitStmtSeq(seq, 2);
  757. ELSIF seq.tide > seq.high THEN (* must expand *)
  758. temp := seq.a;
  759. seq.high := seq.high * 2 + 1;
  760. NEW(seq.a, (seq.high+1));
  761. FOR i := 0 TO seq.tide-1 DO seq.a[i] := temp[i] END;
  762. END;
  763. seq.a[seq.tide] := elem; INC(seq.tide);
  764. END AppendStmt;
  765. (* ============================================================ *)
  766. PROCEDURE (p : Expr)NoteCall*(s : Scope),NEW,EMPTY;
  767. (* ============================================================ *)
  768. PROCEDURE (p : Expr)enterGuard*(tmp : Idnt) : Idnt,NEW,EXTENSIBLE;
  769. BEGIN RETURN NIL END enterGuard;
  770. (* -------------------------------------------- *)
  771. PROCEDURE (p : Expr)ExitGuard*(sav : Idnt; tmp : Idnt),NEW,EXTENSIBLE;
  772. BEGIN END ExitGuard;
  773. (* -------------------------------------------- *)
  774. PROCEDURE (p : Expr)checkLive*(s : Scope;
  775. l : V.VarSet) : V.VarSet,NEW,EXTENSIBLE;
  776. BEGIN RETURN l END checkLive;
  777. (* -------------------------------------------- *)
  778. PROCEDURE (p : Expr)assignLive*(s : Scope;
  779. l : V.VarSet) : V.VarSet,NEW,EXTENSIBLE;
  780. BEGIN RETURN p.checkLive(s,l) END assignLive;
  781. (* -------------------------------------------- *)
  782. PROCEDURE (p : Expr)BoolLive*(scpe : Scope;
  783. lvIn : V.VarSet;
  784. OUT tSet : V.VarSet;
  785. OUT fSet : V.VarSet),NEW,EXTENSIBLE;
  786. BEGIN
  787. tSet := p.checkLive(scpe, lvIn);
  788. fSet := tSet;
  789. END BoolLive;
  790. (* ============================================================ *)
  791. (* Set methods for the read-only fields *)
  792. (* ============================================================ *)
  793. PROCEDURE (s : Idnt)SetMode*(m : INTEGER),NEW;
  794. BEGIN s.vMod := m END SetMode;
  795. (* -------------------------------------------- *)
  796. PROCEDURE (s : Idnt)SetKind*(m : INTEGER),NEW;
  797. BEGIN s.kind := m END SetKind;
  798. (* -------------------------------------------- *)
  799. PROCEDURE (s : Type)SetKind*(m : INTEGER),NEW;
  800. (** set the "kind" field AND allocate a serial#. *)
  801. BEGIN
  802. s.kind := m;
  803. IF m # standard THEN s.serial := next; INC(next) END;
  804. END SetKind;
  805. (* -------------------------------------------- *)
  806. PROCEDURE (s : Expr)SetKind*(m : INTEGER),NEW;
  807. BEGIN s.kind := m END SetKind;
  808. (* -------------------------------------------- *)
  809. PROCEDURE (s : Stmt)SetKind*(m : INTEGER),NEW;
  810. BEGIN s.kind := m END SetKind;
  811. (* ============================================================ *)
  812. (* Abstract method of the SymForAll visitor base type *)
  813. (* ============================================================ *)
  814. PROCEDURE (s : SymForAll)Op*(id : Idnt),NEW,ABSTRACT;
  815. (* ============================================================ *)
  816. (* Name-fetch methods for type-name diagnostic strings *)
  817. (* ============================================================ *)
  818. PROCEDURE (g : NameFetch)Of*(id : Idnt; OUT s : ARRAY OF CHAR),NEW;
  819. VAR chO : L.CharOpen;
  820. BEGIN
  821. chO := NameHash.charOpenOfHash(id.hash);
  822. IF chO = NIL THEN s := "<NIL>" ELSE GPText.Assign(chO^,s) END;
  823. END Of;
  824. (* -------------------------------------------- *)
  825. PROCEDURE (g : NameFetch)ChPtr*(id : Idnt) : L.CharOpen,NEW;
  826. BEGIN
  827. RETURN NameHash.charOpenOfHash(id.hash);
  828. END ChPtr;
  829. PROCEDURE (g : NameFetch)NtStr*(id : Idnt) : RTS.NativeString,NEW;
  830. BEGIN
  831. IF g.ChPtr(id) = NIL THEN RETURN NIL;
  832. ELSE RETURN MKSTR(g.ChPtr(id)^);
  833. END;
  834. END NtStr;
  835. (* ============================================================ *)
  836. (* Private methods of the symbol-table info-blocks *)
  837. (* ============================================================ *)
  838. PROCEDURE mkSymInfo(h : INTEGER; d : Idnt) : SymInfo;
  839. VAR rtrn : SymInfo;
  840. BEGIN
  841. NEW(rtrn); rtrn.key := h; rtrn.val := d; RETURN rtrn;
  842. END mkSymInfo;
  843. (* -------------------------------------------- *)
  844. PROCEDURE (i : SymInfo)enter(h : INTEGER; d : Idnt) : BOOLEAN,NEW;
  845. BEGIN
  846. IF h < i.key THEN
  847. IF i.lOp = NIL THEN i.lOp := mkSymInfo(h,d); RETURN TRUE;
  848. ELSE RETURN i.lOp.enter(h,d);
  849. END;
  850. ELSIF h > i.key THEN
  851. IF i.rOp = NIL THEN i.rOp := mkSymInfo(h,d); RETURN TRUE;
  852. ELSE RETURN i.rOp.enter(h,d);
  853. END;
  854. ELSE (* h must equal i.key *) RETURN FALSE;
  855. END;
  856. END enter;
  857. (* -------------------------------------------- *)
  858. PROCEDURE (i : SymInfo)rmLeaf(h : INTEGER) : SymInfo,NEW;
  859. BEGIN
  860. IF h < i.key THEN i.lOp := i.lOp.rmLeaf(h);
  861. ELSIF h > i.key THEN i.rOp := i.rOp.rmLeaf(h);
  862. ELSE (* h must equal i.key *) RETURN NIL;
  863. END;
  864. RETURN i;
  865. END rmLeaf;
  866. (* -------------------------------------------- *)
  867. PROCEDURE (i : SymInfo)write(h : INTEGER; d : Idnt) : SymInfo,NEW;
  868. VAR rtrn : SymInfo;
  869. BEGIN
  870. rtrn := i; (* default: return self *)
  871. IF h < i.key THEN i.lOp := i.lOp.write(h,d);
  872. ELSIF h > i.key THEN i.rOp := i.rOp.write(h,d);
  873. ELSE rtrn.val := d;
  874. END;
  875. RETURN rtrn;
  876. END write;
  877. (* -------------------------------------------- *)
  878. PROCEDURE (i : SymInfo)lookup(h : INTEGER) : Idnt,NEW;
  879. BEGIN
  880. IF h < i.key THEN
  881. IF i.lOp = NIL THEN RETURN NIL ELSE RETURN i.lOp.lookup(h) END;
  882. ELSIF h > i.key THEN
  883. IF i.rOp = NIL THEN RETURN NIL ELSE RETURN i.rOp.lookup(h) END;
  884. ELSE (* h must equal i.key *)
  885. RETURN i.val;
  886. END;
  887. END lookup;
  888. (* -------------------------------------------- *)
  889. PROCEDURE (i : SymInfo)Apply(s : SymForAll),NEW;
  890. BEGIN
  891. s.Op(i.val); (* Apply Op() to this node *)
  892. IF i.lOp # NIL THEN i.lOp.Apply(s) END; (* Recurse to left subtree *)
  893. IF i.rOp # NIL THEN i.rOp.Apply(s) END; (* Recurse to right subtree *)
  894. END Apply;
  895. (* ============================================================ *)
  896. (* Public methods of the symbol-table type *)
  897. (* ============================================================ *)
  898. PROCEDURE (IN s : SymbolTable)isEmpty*() : BOOLEAN,NEW;
  899. BEGIN RETURN s.root = NIL END isEmpty;
  900. (* -------------------------------------------- *)
  901. PROCEDURE (VAR s : SymbolTable)enter*(hsh : INTEGER; id : Idnt) : BOOLEAN,NEW;
  902. (* Enter value in SymbolTable; Return value signals successful insertion. *)
  903. BEGIN
  904. IF s.root = NIL THEN
  905. s.root := mkSymInfo(hsh,id); RETURN TRUE;
  906. ELSE
  907. RETURN s.root.enter(hsh,id);
  908. END;
  909. END enter;
  910. (* -------------------------------------------- *)
  911. PROCEDURE (VAR s : SymbolTable)Overwrite*(hsh : INTEGER; id : Idnt),NEW;
  912. (* Overwrite value in SymbolTable; value must be present. *)
  913. BEGIN
  914. s.root := s.root.write(hsh,id);
  915. END Overwrite;
  916. (* -------------------------------------------- *)
  917. PROCEDURE (VAR s : SymbolTable)RemoveLeaf*(hsh : INTEGER),NEW;
  918. (* Remove value in SymbolTable; value must be a leaf. *)
  919. BEGIN
  920. s.root := s.root.rmLeaf(hsh);
  921. END RemoveLeaf;
  922. (* -------------------------------------------- *)
  923. PROCEDURE (IN s : SymbolTable)lookup*(h : INTEGER) : Idnt,NEW;
  924. (* Find value in symbol table, else return NIL. *)
  925. BEGIN
  926. IF s.root = NIL THEN RETURN NIL ELSE RETURN s.root.lookup(h) END;
  927. END lookup;
  928. (* -------------------------------------------- *)
  929. PROCEDURE (IN tab : SymbolTable)Apply*(sfa : SymForAll),NEW;
  930. (* Apply sfa.Op() to each entry in the symbol table. *)
  931. BEGIN
  932. IF tab.root # NIL THEN tab.root.Apply(sfa) END;
  933. END Apply;
  934. (* ============================================================ *)
  935. (* Public static methods on symbol-tables *)
  936. (* ============================================================ *)
  937. PROCEDURE trackedRefused*(id : Idnt; scp : Scope) : BOOLEAN;
  938. VAR fail : BOOLEAN;
  939. clash : Idnt;
  940. BEGIN
  941. fail := ~scp.symTb.enter(id.hash, id);
  942. IF fail THEN
  943. Console.WriteString("Trial insert of ");
  944. Console.WriteString(NameHash.charOpenOfHash(id.hash));
  945. Console.Write('{');
  946. IF id.isWeak() THEN Console.WriteString("weak,") END;
  947. IF id.isNeeded() THEN Console.WriteString("need,") END;
  948. Console.Write('}');
  949. Console.WriteString(" clashes in scope ");
  950. Console.WriteString(NameHash.charOpenOfHash(scp.hash));
  951. Console.WriteLn;
  952. clash := scp.symTb.lookup(id.hash);
  953. IF clash.isImport() & clash.isWeak() THEN
  954. Console.WriteString("Existing symTab entry is ");
  955. Console.WriteString(NameHash.charOpenOfHash(clash.hash));
  956. Console.Write('{');
  957. IF clash.isWeak() THEN Console.WriteString("weak,") END;
  958. IF clash.isNeeded() THEN Console.WriteString("need,") END;
  959. Console.Write('}');
  960. Console.WriteLn;
  961. scp.symTb.Overwrite(id.hash, id); fail := FALSE;
  962. END;
  963. END;
  964. RETURN fail;
  965. END trackedRefused;
  966. PROCEDURE refused*(id : Idnt; scp : Scope) : BOOLEAN;
  967. VAR fail : BOOLEAN;
  968. clash : Idnt;
  969. BEGIN
  970. fail := ~scp.symTb.enter(id.hash, id);
  971. IF fail THEN
  972. clash := scp.symTb.lookup(id.hash);
  973. IF clash.isImport() & clash.isWeak() THEN
  974. scp.symTb.Overwrite(id.hash, id); fail := FALSE;
  975. END;
  976. END;
  977. RETURN fail;
  978. END refused;
  979. (* -------------------------------------------- *)
  980. PROCEDURE bindLocal*(hash : INTEGER; scp : Scope) : Idnt;
  981. BEGIN
  982. RETURN scp.symTb.lookup(hash);
  983. END bindLocal;
  984. (* -------------------------------------------- *)
  985. PROCEDURE bind*(hash : INTEGER; scp : Scope) : Idnt;
  986. VAR resId : Idnt;
  987. BEGIN
  988. resId := scp.symTb.lookup(hash);
  989. IF resId = NIL THEN
  990. scp := scp.dfScp;
  991. WHILE (resId = NIL) & (scp # NIL) DO
  992. resId := scp.symTb.lookup(hash);
  993. scp := scp.dfScp;
  994. END;
  995. END;
  996. RETURN resId;
  997. END bind;
  998. (* -------------------------------------------- *)
  999. PROCEDURE maxMode*(i,j : INTEGER) : INTEGER;
  1000. BEGIN
  1001. IF (i = pubMode) OR (j = pubMode) THEN RETURN pubMode;
  1002. ELSIF (i = rdoMode) OR (j = rdoMode) THEN RETURN rdoMode;
  1003. ELSE RETURN prvMode;
  1004. END;
  1005. END maxMode;
  1006. (* ============================================================ *)
  1007. (* Various diagnostic methods *)
  1008. (* ============================================================ *)
  1009. PROCEDURE (IN tab : SymbolTable)Dump*(i : INTEGER),NEW;
  1010. VAR sfa : SymTabDump;
  1011. BEGIN
  1012. H.Indent(i);
  1013. Console.WriteString("+-------- Symtab dump ---------"); Console.WriteLn;
  1014. NEW(sfa);
  1015. sfa.indent := i;
  1016. tab.Apply(sfa);
  1017. H.Indent(i);
  1018. Console.WriteString("+-------- dump ended ----------"); Console.WriteLn;
  1019. END Dump;
  1020. (* -------------------------------------------- *)
  1021. PROCEDURE (id : Idnt)IdError*(n : INTEGER),NEW;
  1022. VAR l,c : INTEGER;
  1023. BEGIN
  1024. IF id.token # NIL THEN l := id.token.lin; c := id.token.col;
  1025. ELSE l := S.line; c := S.col;
  1026. END;
  1027. S.SemError.Report(n, l, c);
  1028. END IdError;
  1029. (* -------------------------------------------- *)
  1030. PROCEDURE (id : Idnt)IdErrorStr*(n : INTEGER;
  1031. IN s : ARRAY OF CHAR),NEW;
  1032. VAR l,c : INTEGER;
  1033. BEGIN
  1034. IF id.token # NIL THEN l := id.token.lin; c := id.token.col;
  1035. ELSE l := S.line; c := S.col;
  1036. END;
  1037. S.SemError.RepSt1(n,s,l,c);
  1038. END IdErrorStr;
  1039. (* -------------------------------------------- *)
  1040. PROCEDURE (ty : Type)TypeError*(n : INTEGER),NEW,EXTENSIBLE;
  1041. VAR l,c : INTEGER;
  1042. BEGIN
  1043. IF (ty.idnt # NIL) & (ty.idnt.token # NIL) THEN
  1044. l := ty.idnt.token.lin; c := ty.idnt.token.col;
  1045. ELSE l := S.line; c := S.col;
  1046. END;
  1047. S.SemError.Report(n,l,c);
  1048. END TypeError;
  1049. (* -------------------------------------------- *)
  1050. PROCEDURE (ty : Type)TypeErrStr*(n : INTEGER;
  1051. IN s : ARRAY OF CHAR),NEW,EXTENSIBLE;
  1052. VAR l,c : INTEGER;
  1053. BEGIN
  1054. IF (ty.idnt # NIL) & (ty.idnt.token # NIL) THEN
  1055. l := ty.idnt.token.lin; c := ty.idnt.token.col;
  1056. ELSE l := S.line; c := S.col;
  1057. END;
  1058. S.SemError.RepSt1(n,s,l,c);
  1059. END TypeErrStr;
  1060. (* -------------------------------------------- *)
  1061. PROCEDURE (xp : Expr)ExprError*(n : INTEGER),NEW;
  1062. VAR l,c : INTEGER;
  1063. BEGIN
  1064. IF xp.token # NIL THEN l := xp.token.lin; c := xp.token.col;
  1065. ELSE l := S.line; c := S.col;
  1066. END;
  1067. S.SemError.Report(n,l,c);
  1068. END ExprError;
  1069. (* -------------------------------------------- *)
  1070. PROCEDURE (st : Stmt)StmtError*(n : INTEGER),NEW;
  1071. VAR l,c : INTEGER;
  1072. BEGIN
  1073. IF st.token # NIL THEN l := st.token.lin; c := st.token.col;
  1074. ELSE l := S.line; c := S.col;
  1075. END;
  1076. S.SemError.Report(n,l,c);
  1077. END StmtError;
  1078. (* -------------------------------------------- *)
  1079. PROCEDURE (id : Idnt)name*() : L.CharOpen, NEW;
  1080. BEGIN
  1081. RETURN NameHash.charOpenOfHash(id.hash);
  1082. END name;
  1083. PROCEDURE (t : Idnt)WriteName*(),NEW;
  1084. VAR name : FileNames.NameString;
  1085. BEGIN
  1086. getName.Of(t, name);
  1087. Console.WriteString(name$);
  1088. END WriteName;
  1089. (* -------------------------------------------- *)
  1090. PROCEDURE DoXName*(i : INTEGER; s : L.CharOpen);
  1091. BEGIN
  1092. H.Indent(i);
  1093. Console.WriteString("name = ");
  1094. IF s # NIL THEN Console.WriteString(s) ELSE
  1095. Console.WriteString("<nil>") END;
  1096. Console.WriteLn;
  1097. END DoXName;
  1098. (* -------------------------------------------- *)
  1099. PROCEDURE (t : Idnt)SuperDiag*(i : INTEGER),NEW;
  1100. VAR dump : INTEGER;
  1101. BEGIN
  1102. dump := 0;
  1103. (* H.Class("Idnt",t,i); *)
  1104. H.Indent(i); Console.WriteString("Idnt: name = ");
  1105. Console.WriteString(getName.ChPtr(t));
  1106. Console.Write(modMrk[t.vMod]);
  1107. Console.WriteString(" (");
  1108. IF t.type = NIL THEN
  1109. Console.WriteString("no type");
  1110. ELSE
  1111. dump := t.type.dump;
  1112. Console.WriteString(t.type.name());
  1113. END;
  1114. IF dump # 0 THEN
  1115. Console.WriteString(") t$");
  1116. Console.WriteInt(dump, 1);
  1117. ELSE
  1118. Console.Write(")");
  1119. END;
  1120. Console.Write("#"); Console.WriteInt(t.hash,1);
  1121. Console.WriteLn;
  1122. END SuperDiag;
  1123. (* -------------------------------------------- *)
  1124. PROCEDURE (t : Type)SuperDiag*(i : INTEGER),NEW;
  1125. BEGIN
  1126. (* H.Class("Type",t,i); *)
  1127. H.Indent(i); Console.WriteString("Type: ");
  1128. Console.WriteString(t.name());
  1129. IF t.dump # 0 THEN
  1130. Console.WriteString(" t$");
  1131. Console.WriteInt(t.dump, 1);
  1132. Console.Write(",");
  1133. END;
  1134. Console.WriteString(" s#");
  1135. Console.WriteInt(t.serial, 1);
  1136. Console.WriteLn;
  1137. END SuperDiag;
  1138. (* -------------------------------------------- *)
  1139. PROCEDURE (t : Expr)SuperDiag*(i : INTEGER),NEW;
  1140. BEGIN
  1141. H.Class("Expr",t,i);
  1142. END SuperDiag;
  1143. (* -------------------------------------------- *)
  1144. PROCEDURE (t : Stmt)SuperDiag*(i : INTEGER),NEW;
  1145. BEGIN
  1146. H.Class("Stmt",t,i);
  1147. IF t.token # NIL THEN
  1148. H.Indent(i);
  1149. Console.WriteString("(lin:col ");
  1150. Console.WriteInt(t.token.lin, 1); Console.Write(":");
  1151. Console.WriteInt(t.token.col, 1); Console.Write(")");
  1152. Console.WriteLn;
  1153. END;
  1154. END SuperDiag;
  1155. (* -------------------------------------------- *)
  1156. PROCEDURE (s : SymTabDump)Op*(id : Idnt);
  1157. BEGIN
  1158. id.Diagnose(s.indent);
  1159. END Op;
  1160. (* -------------------------------------------- *)
  1161. PROCEDURE (s : Type)DiagFormalType*(i : INTEGER),NEW,EMPTY;
  1162. (* -------------------------------------------- *)
  1163. PROCEDURE (x : Expr)DiagSrcLoc*(),NEW;
  1164. BEGIN
  1165. IF x.token # NIL THEN
  1166. Console.WriteString("Expr at ");
  1167. Console.WriteInt(x.token.lin,1);
  1168. Console.Write(":");
  1169. Console.WriteInt(x.token.col,1);
  1170. ELSE
  1171. Console.WriteString("no src token");
  1172. END;
  1173. Console.WriteLn;
  1174. END DiagSrcLoc;
  1175. (* -------------------------------------------- *)
  1176. PROCEDURE newNameDump() : NameDump;
  1177. VAR dump : NameDump;
  1178. BEGIN
  1179. NEW(dump);
  1180. NEW(dump.a, 32);
  1181. dump.high := 31;
  1182. dump.tide := 0;
  1183. RETURN dump;
  1184. END newNameDump;
  1185. (* --------------------------- *)
  1186. PROCEDURE (sfa : NameDump)Op*(id : Idnt);
  1187. VAR name : L.CharOpen;
  1188. temp : L.CharOpen;
  1189. indx : INTEGER;
  1190. newH : INTEGER;
  1191. char : CHAR;
  1192. BEGIN
  1193. name := NameHash.charOpenOfHash(id.hash);
  1194. (*
  1195. * IF sfa.tide + LEN(name) >= sfa.tide THEN OOPS!
  1196. *)
  1197. IF sfa.tide + LEN(name) >= sfa.high THEN
  1198. temp := sfa.a;
  1199. newH := sfa.high + 3 * LEN(name);
  1200. NEW(sfa.a, newH+1);
  1201. FOR indx := 0 TO sfa.tide - 1 DO
  1202. sfa.a[indx] := temp[indx];
  1203. END;
  1204. sfa.high := newH;
  1205. END;
  1206. IF sfa.tide > 0 THEN
  1207. sfa.a[sfa.tide-1] := ",";
  1208. sfa.a[sfa.tide ] := " ";
  1209. INC(sfa.tide);
  1210. END;
  1211. indx := 0;
  1212. REPEAT
  1213. char := name[indx];
  1214. sfa.a[sfa.tide] := char;
  1215. INC(sfa.tide);
  1216. INC(indx);
  1217. UNTIL char = 0X;
  1218. END Op;
  1219. (* --------------------------- *)
  1220. PROCEDURE dumpList*(s : SymbolTable) : L.CharOpen;
  1221. VAR sfa : NameDump;
  1222. BEGIN
  1223. sfa := newNameDump();
  1224. s.Apply(sfa);
  1225. RETURN sfa.a;
  1226. END dumpList;
  1227. (* ============================================================ *)
  1228. BEGIN (* ====================================================== *)
  1229. NEW(getName);
  1230. modMrk := " *-!";
  1231. modStr[val] := "";
  1232. modStr[in ] := "IN ";
  1233. modStr[out] := "OUT ";
  1234. modStr[var] := "VAR ";
  1235. END Symbols. (* ============================================== *)
  1236. (* ============================================================ *)