CPT.txt 70 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890
  1. MODULE DevCPT;
  2. (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Dev/Mod/CPT.odc *)
  3. (* DO NOT EDIT *)
  4. IMPORT DevCPM;
  5. CONST
  6. MaxIdLen = 256;
  7. TYPE
  8. Name* = ARRAY MaxIdLen OF SHORTCHAR;
  9. String* = POINTER TO ARRAY OF SHORTCHAR;
  10. Const* = POINTER TO ConstDesc;
  11. Object* = POINTER TO ObjDesc;
  12. Struct* = POINTER TO StrDesc;
  13. Node* = POINTER TO NodeDesc;
  14. ConstExt* = String;
  15. LinkList* = POINTER TO LinkDesc;
  16. ConstDesc* = RECORD
  17. ext*: ConstExt; (* string or code for code proc (longstring in utf8) *)
  18. intval*: INTEGER; (* constant value or adr, proc par size, text position or least case label *)
  19. intval2*: INTEGER; (* string length (#char, incl 0X), proc var size or larger case label *)
  20. setval*: SET; (* constant value, procedure body present or "ELSE" present in case *)
  21. realval*: REAL; (* real or longreal constant value *)
  22. link*: Const (* chain of constants present in obj file *)
  23. END ;
  24. LinkDesc* = RECORD
  25. offset*, linkadr*: INTEGER;
  26. next*: LinkList;
  27. END;
  28. ObjDesc* = RECORD
  29. left*, right*, link*, scope*: Object;
  30. name*: String; (* name = null OR name^ # "" *)
  31. leaf*: BOOLEAN;
  32. sysflag*: BYTE;
  33. mode*, mnolev*: BYTE; (* mnolev < 0 -> mno = -mnolev *)
  34. vis*: BYTE; (* internal, external, externalR, inPar, outPar *)
  35. history*: BYTE; (* relevant if name # "" *)
  36. used*, fpdone*: BOOLEAN;
  37. fprint*: INTEGER;
  38. typ*: Struct; (* actual type, changed in with statements *)
  39. ptyp*: Struct; (* original type if typ is changed *)
  40. conval*: Const;
  41. adr*, num*: INTEGER; (* mthno *)
  42. links*: LinkList;
  43. nlink*: Object; (* link for name list, declaration order for methods, library link for imp obj *)
  44. library*, entry*: String; (* library name, entry name *)
  45. modifiers*: POINTER TO ARRAY OF String; (* additional interface strings *)
  46. linkadr*: INTEGER; (* used in ofront *)
  47. red: BOOLEAN;
  48. END ;
  49. StrDesc* = RECORD
  50. form*, comp*, mno*, extlev*: BYTE;
  51. ref*, sysflag*: SHORTINT;
  52. n*, size*, align*, txtpos*: INTEGER; (* align is alignment for records and len offset for dynarrs *)
  53. untagged*, allocated*, pbused*, pvused*, exp*, fpdone, idfpdone: BOOLEAN;
  54. attribute*: BYTE;
  55. idfp, pbfp*, pvfp*:INTEGER;
  56. BaseTyp*: Struct;
  57. link*, strobj*: Object;
  58. ext*: ConstExt (* id string for interface records *)
  59. END ;
  60. NodeDesc* = RECORD
  61. left*, right*, link*: Node;
  62. class*, subcl*, hint*: BYTE;
  63. readonly*: BOOLEAN;
  64. typ*: Struct;
  65. obj*: Object;
  66. conval*: Const
  67. END ;
  68. CONST
  69. maxImps = 127; (* must be <= MAX(SHORTINT) *)
  70. maxStruct = DevCPM.MaxStruct; (* must be < MAX(INTEGER) DIV 2 *)
  71. FirstRef = 32;
  72. FirstRef0 = 16; (* correction for version 0 *)
  73. actVersion = 1;
  74. VAR
  75. topScope*: Object;
  76. undftyp*, bytetyp*, booltyp*, char8typ*, int8typ*, int16typ*, int32typ*,
  77. real32typ*, real64typ*, settyp*, string8typ*, niltyp*, notyp*, sysptrtyp*,
  78. anytyp*, anyptrtyp*, char16typ*, string16typ*, int64typ*,
  79. restyp*, iunktyp*, punktyp*, guidtyp*,
  80. intrealtyp*, lreal64typ*, lint64typ*, lchar16typ*: Struct;
  81. nofGmod*: BYTE; (*nof imports*)
  82. GlbMod*: ARRAY maxImps OF Object; (* .right = first object, .name = module import name (not alias) *)
  83. SelfName*: Name; (* name of module being compiled *)
  84. SYSimported*: BOOLEAN;
  85. processor*, impProc*: SHORTINT;
  86. libName*: Name; (* library alias of module being compiled *)
  87. null*: String; (* "" *)
  88. CONST
  89. (* object modes *)
  90. Var = 1; VarPar = 2; Con = 3; Fld = 4; Typ = 5; LProc = 6; XProc = 7;
  91. SProc = 8; CProc = 9; IProc = 10; Mod = 11; Head = 12; TProc = 13; Attr = 20;
  92. (* structure forms *)
  93. Undef = 0; Byte = 1; Bool = 2; Char8 = 3; Int8 = 4; Int16 = 5; Int32 = 6;
  94. Real32 = 7; Real64 = 8; Set = 9; String8 = 10; NilTyp = 11; NoTyp = 12;
  95. Pointer = 13; ProcTyp = 14; Comp = 15;
  96. AnyPtr = 14; AnyRec = 15; (* sym file only *)
  97. Char16 = 16; String16 = 17; Int64 = 18;
  98. Res = 20; IUnk = 21; PUnk = 22; Guid = 23;
  99. (* composite structure forms *)
  100. Basic = 1; Array = 2; DynArr = 3; Record = 4;
  101. (*function number*)
  102. assign = 0;
  103. haltfn = 0; newfn = 1; absfn = 2; capfn = 3; ordfn = 4;
  104. entierfn = 5; oddfn = 6; minfn = 7; maxfn = 8; chrfn = 9;
  105. shortfn = 10; longfn = 11; sizefn = 12; incfn = 13; decfn = 14;
  106. inclfn = 15; exclfn = 16; lenfn = 17; copyfn = 18; ashfn = 19; assertfn = 32;
  107. lchrfn = 33; lentierfcn = 34; typfn = 36; bitsfn = 37; bytesfn = 38;
  108. (*SYSTEM function number*)
  109. adrfn = 20; ccfn = 21; lshfn = 22; rotfn = 23;
  110. getfn = 24; putfn = 25; getrfn = 26; putrfn = 27;
  111. bitfn = 28; valfn = 29; sysnewfn = 30; movefn = 31;
  112. thisrecfn = 45; thisarrfn = 46;
  113. (* COM function number *)
  114. validfn = 40; iidfn = 41; queryfn = 42;
  115. (* attribute flags (attr.adr, struct.attribute, proc.conval.setval) *)
  116. newAttr = 16; absAttr = 17; limAttr = 18; empAttr = 19; extAttr = 20;
  117. (* procedure flags (conval.setval) *)
  118. isHidden = 29;
  119. (* module visibility of objects *)
  120. internal = 0; external = 1; externalR = 2; inPar = 3; outPar = 4;
  121. (* history of imported objects *)
  122. inserted = 0; same = 1; pbmodified = 2; pvmodified = 3; removed = 4; inconsistent = 5;
  123. (* sysflags *)
  124. inBit = 2; outBit = 4; interface = 10;
  125. (* symbol file items *)
  126. Smname = 16; Send = 18; Stype = 19; Salias = 20; Svar = 21; Srvar = 22;
  127. Svalpar = 23; Svarpar = 24; Sfld = 25; Srfld = 26; Shdptr = 27; Shdpro = 28; Stpro = 29; Shdtpro = 30;
  128. Sxpro = 31; Sipro = 32; Scpro = 33; Sstruct = 34; Ssys = 35; Sptr = 36; Sarr = 37; Sdarr = 38; Srec = 39; Spro = 40;
  129. Shdutptr = 41; Slib = 42; Sentry = 43; Sinpar = 25; Soutpar = 26;
  130. Slimrec = 25; Sabsrec = 26; Sextrec = 27; Slimpro = 31; Sabspro = 32; Semppro = 33; Sextpro = 34; Simpo = 22;
  131. TYPE
  132. ImpCtxt = RECORD
  133. nextTag, reffp: INTEGER;
  134. nofr, minr, nofm: SHORTINT;
  135. self: BOOLEAN;
  136. ref: ARRAY maxStruct OF Struct;
  137. old: ARRAY maxStruct OF Object;
  138. pvfp: ARRAY maxStruct OF INTEGER; (* set only if old # NIL *)
  139. glbmno: ARRAY maxImps OF BYTE (* index is local mno *)
  140. END ;
  141. ExpCtxt = RECORD
  142. reffp: INTEGER;
  143. ref: SHORTINT;
  144. nofm: BYTE;
  145. locmno: ARRAY maxImps OF BYTE (* index is global mno *)
  146. END ;
  147. VAR
  148. universe, syslink, comlink, infinity: Object;
  149. impCtxt: ImpCtxt;
  150. expCtxt: ExpCtxt;
  151. nofhdfld: INTEGER;
  152. sfpresent, symExtended, symNew: BOOLEAN;
  153. version: INTEGER;
  154. symChanges: INTEGER;
  155. portable: BOOLEAN;
  156. depth: INTEGER;
  157. PROCEDURE err(n: SHORTINT);
  158. BEGIN DevCPM.err(n)
  159. END err;
  160. PROCEDURE NewConst*(): Const;
  161. VAR const: Const;
  162. BEGIN NEW(const); RETURN const
  163. END NewConst;
  164. PROCEDURE NewObj*(): Object;
  165. VAR obj: Object;
  166. BEGIN NEW(obj); obj.name := null; RETURN obj
  167. END NewObj;
  168. PROCEDURE NewStr*(form, comp: BYTE): Struct;
  169. VAR typ: Struct;
  170. BEGIN NEW(typ); typ.form := form; typ.comp := comp; typ.ref := maxStruct; (* ref >= maxStruct: not exported yet *)
  171. typ.txtpos := DevCPM.errpos; typ.size := -1; typ.BaseTyp := undftyp; RETURN typ
  172. END NewStr;
  173. PROCEDURE NewNode*(class: BYTE): Node;
  174. VAR node: Node;
  175. BEGIN
  176. NEW(node); node.class := class; RETURN node
  177. END NewNode;
  178. (*
  179. PROCEDURE NewExt*(): ConstExt;
  180. VAR ext: ConstExt;
  181. BEGIN NEW(ext); RETURN ext
  182. END NewExt;
  183. *)
  184. PROCEDURE NewName* ((*IN*) name: ARRAY OF SHORTCHAR): String;
  185. VAR i: INTEGER; p: String;
  186. BEGIN
  187. i := 0; WHILE name[i] # 0X DO INC(i) END;
  188. IF i > 0 THEN NEW(p, i + 1); p^ := name$; RETURN p
  189. ELSE RETURN null
  190. END
  191. END NewName;
  192. PROCEDURE OpenScope*(level: BYTE; owner: Object);
  193. VAR head: Object;
  194. BEGIN head := NewObj();
  195. head.mode := Head; head.mnolev := level; head.link := owner;
  196. IF owner # NIL THEN owner.scope := head END ;
  197. head.left := topScope; head.right := NIL; head.scope := NIL; topScope := head
  198. END OpenScope;
  199. PROCEDURE CloseScope*;
  200. BEGIN topScope := topScope.left
  201. END CloseScope;
  202. PROCEDURE Init*(opt: SET);
  203. BEGIN
  204. topScope := universe; OpenScope(0, NIL); SYSimported := FALSE;
  205. GlbMod[0] := topScope; nofGmod := 1;
  206. sfpresent := TRUE; (* !!! *)
  207. symChanges := 0;
  208. infinity.conval.intval := DevCPM.ConstNotAlloc;
  209. depth := 0
  210. END Init;
  211. PROCEDURE Open* (name: Name);
  212. BEGIN
  213. SelfName := name$; topScope.name := NewName(name);
  214. END Open;
  215. PROCEDURE Close*;
  216. VAR i: SHORTINT;
  217. BEGIN (* garbage collection *)
  218. CloseScope;
  219. i := 0; WHILE i < maxImps DO GlbMod[i] := NIL; INC(i) END ;
  220. i := FirstRef; WHILE i < maxStruct DO impCtxt.ref[i] := NIL; impCtxt.old[i] := NIL; INC(i) END
  221. END Close;
  222. PROCEDURE SameType* (x, y: Struct): BOOLEAN;
  223. BEGIN
  224. RETURN (x = y) OR (x.form = y.form) & ~(x.form IN {Pointer, ProcTyp, Comp}) OR (x = undftyp) OR (y = undftyp)
  225. END SameType;
  226. PROCEDURE EqualType* (x, y: Struct): BOOLEAN;
  227. VAR xp, yp: Object; n: INTEGER;
  228. BEGIN
  229. n := 0;
  230. WHILE (n < 100) & (x # y)
  231. & (((x.comp = DynArr) & (y.comp = DynArr) & (x.sysflag = y.sysflag))
  232. OR ((x.form = Pointer) & (y.form = Pointer))
  233. OR ((x.form = ProcTyp) & (y.form = ProcTyp))) DO
  234. IF x.form = ProcTyp THEN
  235. IF x.sysflag # y.sysflag THEN RETURN FALSE END;
  236. xp := x.link; yp := y.link;
  237. INC(depth);
  238. WHILE (xp # NIL) & (yp # NIL) & (xp.mode = yp.mode) & (xp.sysflag = yp.sysflag)
  239. & (xp.vis = yp.vis) & (depth < 100) & EqualType(xp.typ, yp.typ) DO
  240. xp := xp.link; yp := yp.link
  241. END;
  242. DEC(depth);
  243. IF (xp # NIL) OR (yp # NIL) THEN RETURN FALSE END
  244. END;
  245. x := x.BaseTyp; y := y.BaseTyp; INC(n)
  246. END;
  247. RETURN SameType(x, y)
  248. END EqualType;
  249. PROCEDURE Extends* (x, y: Struct): BOOLEAN;
  250. BEGIN
  251. IF (x.form = Pointer) & (y.form = Pointer) THEN x := x.BaseTyp; y := y.BaseTyp END;
  252. IF (x.comp = Record) & (y.comp = Record) THEN
  253. IF (y = anytyp) & ~x.untagged THEN RETURN TRUE END;
  254. WHILE (x # NIL) & (x # undftyp) & (x # y) DO x := x.BaseTyp END
  255. END;
  256. RETURN (x # NIL) & EqualType(x, y)
  257. END Extends;
  258. PROCEDURE Includes* (xform, yform: INTEGER): BOOLEAN;
  259. BEGIN
  260. CASE xform OF
  261. | Char16: RETURN yform IN {Char8, Char16, Int8}
  262. | Int16: RETURN yform IN {Char8, Int8, Int16}
  263. | Int32: RETURN yform IN {Char8, Char16, Int8, Int16, Int32}
  264. | Int64: RETURN yform IN {Char8, Char16, Int8, Int16, Int32, Int64}
  265. | Real32: RETURN yform IN {Char8, Char16, Int8, Int16, Int32, Int64, Real32}
  266. | Real64: RETURN yform IN {Char8, Char16, Int8, Int16, Int32, Int64, Real32, Real64}
  267. | String16: RETURN yform IN {String8, String16}
  268. ELSE RETURN xform = yform
  269. END
  270. END Includes;
  271. PROCEDURE FindImport*(VAR name: Name; mod: Object; VAR res: Object);
  272. VAR obj: Object; (* i: INTEGER; n: Name; *)
  273. BEGIN obj := mod.scope.right;
  274. LOOP
  275. IF obj = NIL THEN EXIT END ;
  276. IF name < obj.name^ THEN obj := obj.left
  277. ELSIF name > obj.name^ THEN obj := obj.right
  278. ELSE (*found*)
  279. IF (obj.mode = Typ) & (obj.vis = internal) THEN obj := NIL
  280. ELSE obj.used := TRUE
  281. END ;
  282. EXIT
  283. END
  284. END ;
  285. res := obj;
  286. (* bh: checks usage of non Unicode WinApi functions and types
  287. IF (res # NIL) & (mod.scope.library # NIL)
  288. & ~(DevCPM.interface IN DevCPM.options)
  289. & (SelfName # "Kernel") & (SelfName # "HostPorts") THEN
  290. n := name + "W";
  291. FindImport(n, mod, obj);
  292. IF obj # NIL THEN
  293. DevCPM.err(733)
  294. ELSE
  295. i := LEN(name$);
  296. IF name[i - 1] = "A" THEN
  297. n[i - 1] := "W"; n[i] := 0X;
  298. FindImport(n, mod, obj);
  299. IF obj # NIL THEN
  300. DevCPM.err(734)
  301. END
  302. END
  303. END
  304. END;
  305. *)
  306. END FindImport;
  307. PROCEDURE Find*(VAR name: Name; VAR res: Object);
  308. VAR obj, head: Object;
  309. BEGIN head := topScope;
  310. LOOP obj := head.right;
  311. LOOP
  312. IF obj = NIL THEN EXIT END ;
  313. IF name < obj.name^ THEN obj := obj.left
  314. ELSIF name > obj.name^ THEN obj := obj.right
  315. ELSE (* found, obj.used not set for local objects *) EXIT
  316. END
  317. END ;
  318. IF obj # NIL THEN EXIT END ;
  319. head := head.left;
  320. IF head = NIL THEN EXIT END
  321. END ;
  322. res := obj
  323. END Find;
  324. PROCEDURE FindFld (VAR name: ARRAY OF SHORTCHAR; typ: Struct; VAR res: Object);
  325. VAR obj: Object;
  326. BEGIN
  327. WHILE (typ # NIL) & (typ # undftyp) DO obj := typ.link;
  328. WHILE obj # NIL DO
  329. IF name < obj.name^ THEN obj := obj.left
  330. ELSIF name > obj.name^ THEN obj := obj.right
  331. ELSE (*found*) res := obj; RETURN
  332. END
  333. END ;
  334. typ := typ.BaseTyp
  335. END;
  336. res := NIL
  337. END FindFld;
  338. PROCEDURE FindField* (VAR name: ARRAY OF SHORTCHAR; typ: Struct; VAR res: Object);
  339. BEGIN
  340. FindFld(name, typ, res);
  341. IF (res = NIL) & ~typ.untagged THEN FindFld(name, anytyp, res) END
  342. END FindField;
  343. PROCEDURE FindBaseField* (VAR name: ARRAY OF SHORTCHAR; typ: Struct; VAR res: Object);
  344. BEGIN
  345. FindFld(name, typ.BaseTyp, res);
  346. IF (res = NIL) & ~typ.untagged THEN FindFld(name, anytyp, res) END
  347. END FindBaseField;
  348. (*
  349. PROCEDURE Rotated (y: Object; name: String): Object;
  350. VAR c, gc: Object;
  351. BEGIN
  352. IF name^ < y.name^ THEN
  353. c := y.left;
  354. IF name^ < c.name^ THEN gc := c.left; c.left := gc.right; gc.right := c
  355. ELSE gc := c.right; c.right := gc.left; gc.left := c
  356. END;
  357. y.left := gc
  358. ELSE
  359. c := y.right;
  360. IF name^ < c.name^ THEN gc := c.left; c.left := gc.right; gc.right := c
  361. ELSE gc := c.right; c.right := gc.left; gc.left := c
  362. END;
  363. y.right := gc
  364. END;
  365. RETURN gc
  366. END Rotated;
  367. PROCEDURE InsertIn (obj, scope: Object; VAR old: Object);
  368. VAR gg, g, p, x: Object; name, sname: String;
  369. BEGIN
  370. sname := scope.name; scope.name := null;
  371. gg := scope; g := gg; p := g; x := p.right; name := obj.name;
  372. WHILE x # NIL DO
  373. IF (x.left # NIL) & (x.right # NIL) & x.left.red & x.right.red THEN
  374. x.red := TRUE; x.left.red := FALSE; x.right.red := FALSE;
  375. IF p.red THEN
  376. g.red := TRUE;
  377. IF (name^ < g.name^) # (name^ < p.name^) THEN p := Rotated(g, name) END;
  378. x := Rotated(gg, name); x.red := FALSE
  379. END
  380. END;
  381. gg := g; g := p; p := x;
  382. IF name^ < x.name^ THEN x := x.left
  383. ELSIF name^ > x.name^ THEN x := x.right
  384. ELSE old := x; scope.right.red := FALSE; scope.name := sname; RETURN
  385. END
  386. END;
  387. x := obj; old := NIL;
  388. IF name^ < p.name^ THEN p.left := x ELSE p.right := x END;
  389. x.red := TRUE;
  390. IF p.red THEN
  391. g.red := TRUE;
  392. IF (name^ < g.name^) # (name^ < p.name^) THEN p := Rotated(g, name) END;
  393. x := Rotated(gg, name);
  394. x.red := FALSE
  395. END;
  396. scope.right.red := FALSE; scope.name := sname
  397. END InsertIn;
  398. *)
  399. PROCEDURE InsertIn (obj, scope: Object; VAR old: Object);
  400. VAR ob0, ob1: Object; left: BOOLEAN; name: String;
  401. BEGIN
  402. ASSERT((scope # NIL) & (scope.mode = Head), 100);
  403. ob0 := scope; ob1 := scope.right; left := FALSE; name := obj.name;
  404. WHILE ob1 # NIL DO
  405. IF name^ < ob1.name^ THEN ob0 := ob1; ob1 := ob1.left; left := TRUE
  406. ELSIF name^ > ob1.name^ THEN ob0 := ob1; ob1 := ob1.right; left := FALSE
  407. ELSE old := ob1; RETURN
  408. END
  409. END;
  410. IF left THEN ob0.left := obj ELSE ob0.right := obj END ;
  411. obj.left := NIL; obj.right := NIL; old := NIL
  412. END InsertIn;
  413. PROCEDURE Insert* (VAR name: Name; VAR obj: Object);
  414. VAR old: Object;
  415. BEGIN
  416. obj := NewObj(); obj.leaf := TRUE;
  417. obj.name := NewName(name);
  418. obj.mnolev := topScope.mnolev;
  419. InsertIn(obj, topScope, old);
  420. IF old # NIL THEN err(1) END (*double def*)
  421. END Insert;
  422. PROCEDURE InsertThisField (obj: Object; typ: Struct; VAR old: Object);
  423. VAR ob0, ob1: Object; left: BOOLEAN; name: String;
  424. BEGIN
  425. IF typ.link = NIL THEN typ.link := obj
  426. ELSE
  427. ob1 := typ.link; name := obj.name;
  428. REPEAT
  429. IF name^ < ob1.name^ THEN ob0 := ob1; ob1 := ob1.left; left := TRUE
  430. ELSIF name^ > ob1.name^ THEN ob0 := ob1; ob1 := ob1.right; left := FALSE
  431. ELSE old := ob1; RETURN
  432. END
  433. UNTIL ob1 = NIL;
  434. IF left THEN ob0.left := obj ELSE ob0.right := obj END
  435. END
  436. END InsertThisField;
  437. PROCEDURE InsertField* (VAR name: Name; typ: Struct; VAR obj: Object);
  438. VAR old: Object;
  439. BEGIN
  440. obj := NewObj(); obj.leaf := TRUE;
  441. obj.name := NewName(name);
  442. InsertThisField(obj, typ, old);
  443. IF old # NIL THEN err(1) END (*double def*)
  444. END InsertField;
  445. (*-------------------------- Fingerprinting --------------------------*)
  446. PROCEDURE FPrintName(VAR fp: INTEGER; VAR name: ARRAY OF SHORTCHAR);
  447. VAR i: SHORTINT; ch: SHORTCHAR;
  448. BEGIN i := 0;
  449. REPEAT ch := name[i]; DevCPM.FPrint(fp, ORD(ch)); INC(i) UNTIL ch = 0X
  450. END FPrintName;
  451. PROCEDURE ^IdFPrint*(typ: Struct);
  452. PROCEDURE FPrintSign*(VAR fp: INTEGER; result: Struct; par: Object);
  453. (* depends on assignment compatibility of params only *)
  454. BEGIN
  455. IdFPrint(result); DevCPM.FPrint(fp, result.idfp);
  456. WHILE par # NIL DO
  457. DevCPM.FPrint(fp, par.mode); IdFPrint(par.typ); DevCPM.FPrint(fp, par.typ.idfp);
  458. IF (par.mode = VarPar) & (par.vis # 0) THEN DevCPM.FPrint(fp, par.vis) END; (* IN / OUT *)
  459. IF par.sysflag # 0 THEN DevCPM.FPrint(fp, par.sysflag) END;
  460. (* par.name and par.adr not considered *)
  461. par := par.link
  462. END
  463. END FPrintSign;
  464. PROCEDURE IdFPrint*(typ: Struct); (* idfp codifies assignment compatibility *)
  465. VAR btyp: Struct; strobj: Object; idfp: INTEGER; f, c: SHORTINT;
  466. BEGIN
  467. IF ~typ.idfpdone THEN
  468. typ.idfpdone := TRUE; (* may be recursive, temporary idfp is 0 in that case *)
  469. idfp := 0; f := typ.form; c := typ.comp; DevCPM.FPrint(idfp, f); DevCPM.FPrint(idfp, c);
  470. btyp := typ.BaseTyp; strobj := typ.strobj;
  471. IF (strobj # NIL) & (strobj.name # null) THEN
  472. FPrintName(idfp, GlbMod[typ.mno].name^); FPrintName(idfp, strobj.name^)
  473. END ;
  474. IF (f = Pointer) OR (c = Record) & (btyp # NIL) OR (c = DynArr) THEN
  475. IdFPrint(btyp); DevCPM.FPrint(idfp, btyp.idfp)
  476. ELSIF c = Array THEN IdFPrint(btyp); DevCPM.FPrint(idfp, btyp.idfp); DevCPM.FPrint(idfp, typ.n)
  477. ELSIF f = ProcTyp THEN FPrintSign(idfp, btyp, typ.link)
  478. END ;
  479. typ.idfp := idfp
  480. END
  481. END IdFPrint;
  482. PROCEDURE FPrintStr*(typ: Struct);
  483. VAR f, c: SHORTINT; btyp: Struct; strobj, bstrobj: Object; pbfp, pvfp: INTEGER;
  484. PROCEDURE ^FPrintFlds(fld: Object; adr: INTEGER; visible: BOOLEAN);
  485. PROCEDURE FPrintHdFld(typ: Struct; fld: Object; adr: INTEGER); (* modifies pvfp only *)
  486. VAR i, j, n: INTEGER; btyp: Struct;
  487. BEGIN
  488. IF typ.comp = Record THEN FPrintFlds(typ.link, adr, FALSE)
  489. ELSIF typ.comp = Array THEN btyp := typ.BaseTyp; n := typ.n;
  490. WHILE btyp.comp = Array DO n := btyp.n * n; btyp := btyp.BaseTyp END ;
  491. IF (btyp.form = Pointer) OR (btyp.comp = Record) THEN
  492. j := nofhdfld; FPrintHdFld(btyp, fld, adr);
  493. IF j # nofhdfld THEN i := 1;
  494. WHILE (i < n) (* & (nofhdfld <= DevCPM.MaxHdFld) *) DO (* !!! *)
  495. INC(adr, btyp.size); FPrintHdFld(btyp, fld, adr); INC(i)
  496. END
  497. END
  498. END
  499. ELSIF DevCPM.ExpHdPtrFld &
  500. ((typ.form = Pointer) & ~typ.untagged OR (fld.name^ = DevCPM.HdPtrName)) THEN (* !!! *)
  501. DevCPM.FPrint(pvfp, Pointer); DevCPM.FPrint(pvfp, adr); INC(nofhdfld)
  502. ELSIF DevCPM.ExpHdUtPtrFld &
  503. ((typ.form = Pointer) & typ.untagged OR (fld.name^ = DevCPM.HdUtPtrName)) THEN (* !!! *)
  504. DevCPM.FPrint(pvfp, Pointer); DevCPM.FPrint(pvfp, adr); INC(nofhdfld);
  505. IF typ.form = Pointer THEN DevCPM.FPrint(pvfp, typ.sysflag) ELSE DevCPM.FPrint(pvfp, fld.sysflag) END
  506. ELSIF DevCPM.ExpHdProcFld & ((typ.form = ProcTyp) OR (fld.name^ = DevCPM.HdProcName)) THEN
  507. DevCPM.FPrint(pvfp, ProcTyp); DevCPM.FPrint(pvfp, adr); INC(nofhdfld)
  508. END
  509. END FPrintHdFld;
  510. PROCEDURE FPrintFlds(fld: Object; adr: INTEGER; visible: BOOLEAN); (* modifies pbfp and pvfp *)
  511. BEGIN
  512. WHILE (fld # NIL) & (fld.mode = Fld) DO
  513. IF (fld.vis # internal) & visible THEN
  514. DevCPM.FPrint(pvfp, fld.vis); FPrintName(pvfp, fld.name^); DevCPM.FPrint(pvfp, fld.adr);
  515. DevCPM.FPrint(pbfp, fld.vis); FPrintName(pbfp, fld.name^); DevCPM.FPrint(pbfp, fld.adr);
  516. FPrintStr(fld.typ); DevCPM.FPrint(pbfp, fld.typ.pbfp); DevCPM.FPrint(pvfp, fld.typ.pvfp)
  517. ELSE FPrintHdFld(fld.typ, fld, fld.adr + adr)
  518. END ;
  519. fld := fld.link
  520. END
  521. END FPrintFlds;
  522. PROCEDURE FPrintTProcs(obj: Object); (* modifies pbfp and pvfp *)
  523. VAR fp: INTEGER;
  524. BEGIN
  525. IF obj # NIL THEN
  526. FPrintTProcs(obj.left);
  527. IF obj.mode = TProc THEN
  528. IF obj.vis # internal THEN
  529. fp := 0;
  530. IF obj.vis = externalR THEN DevCPM.FPrint(fp, externalR) END;
  531. IF limAttr IN obj.conval.setval THEN DevCPM.FPrint(fp, limAttr)
  532. ELSIF absAttr IN obj.conval.setval THEN DevCPM.FPrint(fp, absAttr)
  533. ELSIF empAttr IN obj.conval.setval THEN DevCPM.FPrint(fp, empAttr)
  534. ELSIF extAttr IN obj.conval.setval THEN DevCPM.FPrint(fp, extAttr)
  535. END;
  536. DevCPM.FPrint(fp, TProc); DevCPM.FPrint(fp, obj.num);
  537. FPrintSign(fp, obj.typ, obj.link); FPrintName(fp, obj.name^);
  538. IF obj.entry # NIL THEN FPrintName(fp, obj.entry^) END;
  539. DevCPM.FPrint(pvfp, fp); DevCPM.FPrint(pbfp, fp)
  540. ELSIF DevCPM.ExpHdTProc THEN
  541. DevCPM.FPrint(pvfp, TProc); DevCPM.FPrint(pvfp, obj.num)
  542. END
  543. END;
  544. FPrintTProcs(obj.right)
  545. END
  546. END FPrintTProcs;
  547. BEGIN
  548. IF ~typ.fpdone THEN
  549. IdFPrint(typ); pbfp := typ.idfp;
  550. IF typ.sysflag # 0 THEN DevCPM.FPrint(pbfp, typ.sysflag) END;
  551. IF typ.ext # NIL THEN FPrintName(pbfp, typ.ext^) END;
  552. IF typ.attribute # 0 THEN DevCPM.FPrint(pbfp, typ.attribute) END;
  553. pvfp := pbfp; typ.pbfp := pbfp; typ.pvfp := pvfp; (* initial fprints may be used recursively *)
  554. typ.fpdone := TRUE;
  555. f := typ.form; c := typ.comp; btyp := typ.BaseTyp;
  556. IF f = Pointer THEN
  557. strobj := typ.strobj; bstrobj := btyp.strobj;
  558. IF (strobj = NIL) OR (strobj.name = null) OR (bstrobj = NIL) OR (bstrobj.name = null) THEN
  559. FPrintStr(btyp); DevCPM.FPrint(pbfp, btyp.pbfp); pvfp := pbfp
  560. (* else use idfp as pbfp and as pvfp, do not call FPrintStr(btyp) here, else cycle not broken *)
  561. END
  562. ELSIF f = ProcTyp THEN (* use idfp as pbfp and as pvfp *)
  563. ELSIF c IN {Array, DynArr} THEN FPrintStr(btyp); DevCPM.FPrint(pbfp, btyp.pvfp); pvfp := pbfp
  564. ELSE (* c = Record *)
  565. IF btyp # NIL THEN FPrintStr(btyp); DevCPM.FPrint(pbfp, btyp.pbfp); DevCPM.FPrint(pvfp, btyp.pvfp) END ;
  566. DevCPM.FPrint(pvfp, typ.size); DevCPM.FPrint(pvfp, typ.align); DevCPM.FPrint(pvfp, typ.n);
  567. nofhdfld := 0; FPrintFlds(typ.link, 0, TRUE);
  568. FPrintTProcs(typ.link); (* DevCPM.FPrint(pvfp, pbfp); *) strobj := typ.strobj;
  569. IF (strobj = NIL) OR (strobj.name = null) THEN pbfp := pvfp END
  570. END ;
  571. typ.pbfp := pbfp; typ.pvfp := pvfp
  572. END
  573. END FPrintStr;
  574. PROCEDURE FPrintObj*(obj: Object);
  575. VAR fprint: INTEGER; f, m: SHORTINT; rval: SHORTREAL; ext: ConstExt; mod: Object; r: REAL; x: INTEGER;
  576. BEGIN
  577. IF ~obj.fpdone THEN
  578. fprint := 0; obj.fpdone := TRUE;
  579. DevCPM.FPrint(fprint, obj.mode);
  580. IF obj.mode = Con THEN
  581. f := obj.typ.form; DevCPM.FPrint(fprint, f);
  582. CASE f OF
  583. | Bool, Char8, Char16, Int8, Int16, Int32:
  584. DevCPM.FPrint(fprint, obj.conval.intval)
  585. | Int64:
  586. x := SHORT(ENTIER((obj.conval.realval + obj.conval.intval) / 4294967296.0));
  587. r := obj.conval.realval + obj.conval.intval - x * 4294967296.0;
  588. IF r > MAX(INTEGER) THEN r := r - 4294967296.0 END;
  589. DevCPM.FPrint(fprint, SHORT(ENTIER(r)));
  590. DevCPM.FPrint(fprint, x)
  591. | Set:
  592. DevCPM.FPrintSet(fprint, obj.conval.setval)
  593. | Real32:
  594. rval := SHORT(obj.conval.realval); DevCPM.FPrintReal(fprint, rval)
  595. | Real64:
  596. DevCPM.FPrintLReal(fprint, obj.conval.realval)
  597. | String8, String16:
  598. FPrintName(fprint, obj.conval.ext^)
  599. | NilTyp:
  600. ELSE err(127)
  601. END
  602. ELSIF obj.mode = Var THEN
  603. DevCPM.FPrint(fprint, obj.vis); FPrintStr(obj.typ); DevCPM.FPrint(fprint, obj.typ.pbfp)
  604. ELSIF obj.mode IN {XProc, IProc} THEN
  605. FPrintSign(fprint, obj.typ, obj.link)
  606. ELSIF obj.mode = CProc THEN
  607. FPrintSign(fprint, obj.typ, obj.link); ext := obj.conval.ext;
  608. m := ORD(ext^[0]); f := 1; DevCPM.FPrint(fprint, m);
  609. WHILE f <= m DO DevCPM.FPrint(fprint, ORD(ext^[f])); INC(f) END
  610. ELSIF obj.mode = Typ THEN
  611. FPrintStr(obj.typ); DevCPM.FPrint(fprint, obj.typ.pbfp)
  612. END ;
  613. IF obj.sysflag < 0 THEN DevCPM.FPrint(fprint, obj.sysflag) END;
  614. IF obj.mode IN {LProc, XProc, CProc, Var, Typ, Con} THEN
  615. IF obj.library # NIL THEN
  616. FPrintName(fprint, obj.library^)
  617. ELSIF obj.mnolev < 0 THEN
  618. mod := GlbMod[-obj.mnolev];
  619. IF (mod.library # NIL) THEN
  620. FPrintName(fprint, mod.library^)
  621. END
  622. ELSIF obj.mnolev = 0 THEN
  623. IF libName # "" THEN FPrintName(fprint, libName) END
  624. END;
  625. IF obj.entry # NIL THEN FPrintName(fprint, obj.entry^) END
  626. END;
  627. obj.fprint := fprint
  628. END
  629. END FPrintObj;
  630. PROCEDURE FPrintErr* (obj: Object; errno: SHORTINT); (* !!! *)
  631. BEGIN
  632. IF errno = 249 THEN
  633. DevCPM.LogWLn; DevCPM.LogWStr(" ");
  634. DevCPM.LogWStr(GlbMod[-obj.mnolev].name^);
  635. DevCPM.LogW("."); DevCPM.LogWStr(obj.name^);
  636. DevCPM.LogWStr(" is not consistently imported");
  637. err(249)
  638. ELSIF obj = NIL THEN (* changed module sys flags *)
  639. IF ~symNew & sfpresent THEN
  640. DevCPM.LogWLn; DevCPM.LogWStr(" changed library flag")
  641. END
  642. ELSIF obj.mnolev = 0 THEN (* don't report changes in imported modules *)
  643. IF sfpresent THEN
  644. IF symChanges < 20 THEN
  645. DevCPM.LogWLn; DevCPM.LogWStr(" "); DevCPM.LogWStr(obj.name^);
  646. IF errno = 250 THEN DevCPM.LogWStr(" is no longer in symbol file")
  647. ELSIF errno = 251 THEN DevCPM.LogWStr(" is redefined internally ")
  648. ELSIF errno = 252 THEN DevCPM.LogWStr(" is redefined")
  649. ELSIF errno = 253 THEN DevCPM.LogWStr(" is new in symbol file")
  650. END
  651. ELSIF symChanges = 20 THEN
  652. DevCPM.LogWLn; DevCPM.LogWStr(" ...")
  653. END;
  654. INC(symChanges)
  655. ELSIF (errno = 253) & ~symExtended THEN
  656. DevCPM.LogWLn;
  657. DevCPM.LogWStr(" new symbol file")
  658. END
  659. END;
  660. IF errno = 253 THEN symExtended := TRUE ELSE symNew := TRUE END
  661. END FPrintErr;
  662. (*-------------------------- Import --------------------------*)
  663. PROCEDURE InName(VAR name: String);
  664. VAR i: SHORTINT; ch: SHORTCHAR; n: Name;
  665. BEGIN i := 0;
  666. REPEAT
  667. DevCPM.SymRCh(ch); n[i] := ch; INC(i)
  668. UNTIL ch = 0X;
  669. IF i > 1 THEN NEW(name, i); name^ := n$ ELSE name := null END
  670. END InName;
  671. PROCEDURE InMod(tag: INTEGER; VAR mno: BYTE); (* mno is global *)
  672. VAR head: Object; name: String; mn: INTEGER; i: BYTE; lib: String;
  673. BEGIN
  674. IF tag = 0 THEN mno := impCtxt.glbmno[0]
  675. ELSIF tag > 0 THEN
  676. lib := NIL;
  677. IF tag = Slib THEN InName(lib); tag := DevCPM.SymRInt() END;
  678. ASSERT(tag = Smname);
  679. InName(name);
  680. IF (name^ = SelfName) & ~impCtxt.self & ~(DevCPM.interface IN DevCPM.options) THEN err(154) END ;
  681. i := 0;
  682. WHILE (i < nofGmod) & (name^ # GlbMod[i].name^) DO INC(i) END ;
  683. IF i < nofGmod THEN mno := i (*module already present*)
  684. ELSE
  685. head := NewObj(); head.mode := Head; head.name := name;
  686. mno := nofGmod; head.mnolev := SHORT(SHORT(-mno));
  687. head.library := lib;
  688. IF nofGmod < maxImps THEN
  689. GlbMod[mno] := head; INC(nofGmod)
  690. ELSE err(227)
  691. END
  692. END ;
  693. impCtxt.glbmno[impCtxt.nofm] := mno; INC(impCtxt.nofm)
  694. ELSE
  695. mno := impCtxt.glbmno[-tag]
  696. END
  697. END InMod;
  698. PROCEDURE InConstant(f: INTEGER; conval: Const);
  699. VAR ch, ch1: SHORTCHAR; ext, t: ConstExt; rval: SHORTREAL; r, s: REAL; i, x, y: INTEGER; str: Name;
  700. BEGIN
  701. CASE f OF
  702. | Byte, Char8, Bool:
  703. DevCPM.SymRCh(ch); conval.intval := ORD(ch)
  704. | Char16:
  705. DevCPM.SymRCh(ch); conval.intval := ORD(ch);
  706. DevCPM.SymRCh(ch); conval.intval := conval.intval + ORD(ch) * 256
  707. | Int8, Int16, Int32:
  708. conval.intval := DevCPM.SymRInt()
  709. | Int64:
  710. DevCPM.SymRCh(ch); x := 0; y := 1; r := 0; s := 268435456 (*2^28*);
  711. WHILE (y < 268435456 (*2^28*)) & (ch >= 80X) DO
  712. x := x + (ORD(ch) - 128) * y; y := y * 128; DevCPM.SymRCh(ch)
  713. END;
  714. WHILE ch >= 80X DO r := r + (ORD(ch) - 128) * s; s := s * 128; DevCPM.SymRCh(ch) END;
  715. conval.realval := r + x + ((LONG(ORD(ch)) + 64) MOD 128 - 64) * s;
  716. conval.intval := SHORT(ENTIER(r + x + ((LONG(ORD(ch)) + 64) MOD 128 - 64) * s - conval.realval))
  717. | Set:
  718. DevCPM.SymRSet(conval.setval)
  719. | Real32:
  720. DevCPM.SymRReal(rval); conval.realval := rval;
  721. conval.intval := DevCPM.ConstNotAlloc
  722. | Real64:
  723. DevCPM.SymRLReal(conval.realval);
  724. conval.intval := DevCPM.ConstNotAlloc
  725. | String8, String16:
  726. i := 0;
  727. REPEAT
  728. DevCPM.SymRCh(ch);
  729. IF i < LEN(str) - 1 THEN str[i] := ch
  730. ELSIF i = LEN(str) - 1 THEN str[i] := 0X; NEW(ext, 2 * LEN(str)); ext^ := str$; ext[i] := ch
  731. ELSIF i < LEN(ext^) - 1 THEN ext[i] := ch
  732. ELSE t := ext; t[i] := 0X; NEW(ext, 2 * LEN(t^)); ext^ := t^$; ext[i] := ch
  733. END;
  734. INC(i)
  735. UNTIL ch = 0X;
  736. IF i < LEN(str) THEN NEW(ext, i); ext^ := str$ END;
  737. conval.ext := ext; conval.intval := DevCPM.ConstNotAlloc;
  738. IF f = String8 THEN conval.intval2 := i
  739. ELSE
  740. i := 0; y := 0;
  741. REPEAT DevCPM.GetUtf8(ext^, x, i); INC(y) UNTIL x = 0;
  742. conval.intval2 := y
  743. END
  744. (*
  745. ext := NewExt(); conval.ext := ext; i := 0;
  746. REPEAT
  747. DevCPM.SymRCh(ch); ext^[i] := ch; INC(i)
  748. UNTIL ch = 0X;
  749. conval.intval2 := i;
  750. conval.intval := DevCPM.ConstNotAlloc
  751. | String16:
  752. ext := NewExt(); conval.ext := ext; i := 0;
  753. REPEAT
  754. DevCPM.SymRCh(ch); ext^[i] := ch; INC(i);
  755. DevCPM.SymRCh(ch1); ext^[i] := ch1; INC(i)
  756. UNTIL (ch = 0X) & (ch1 = 0X);
  757. conval.intval2 := i;
  758. conval.intval := DevCPM.ConstNotAlloc
  759. *)
  760. | NilTyp:
  761. conval.intval := 0
  762. (*
  763. | Guid:
  764. ext := NewExt(); conval.ext := ext; i := 0;
  765. WHILE i < 16 DO
  766. DevCPM.SymRCh(ch); ext^[i] := ch; INC(i)
  767. END;
  768. ext[16] := 0X;
  769. conval.intval2 := 16;
  770. conval.intval := DevCPM.ConstNotAlloc;
  771. *)
  772. END
  773. END InConstant;
  774. PROCEDURE ^InStruct(VAR typ: Struct);
  775. PROCEDURE InSign(mno: BYTE; VAR res: Struct; VAR par: Object);
  776. VAR last, new: Object; tag: INTEGER;
  777. BEGIN
  778. InStruct(res);
  779. tag := DevCPM.SymRInt(); last := NIL;
  780. WHILE tag # Send DO
  781. new := NewObj(); new.mnolev := SHORT(SHORT(-mno));
  782. IF last = NIL THEN par := new ELSE last.link := new END ;
  783. IF tag = Ssys THEN
  784. new.sysflag := SHORT(SHORT(DevCPM.SymRInt())); tag := DevCPM.SymRInt();
  785. IF ODD(new.sysflag DIV inBit) THEN new.vis := inPar
  786. ELSIF ODD(new.sysflag DIV inBit) THEN new.vis := outPar
  787. END
  788. END;
  789. IF tag = Svalpar THEN new.mode := Var
  790. ELSE new.mode := VarPar;
  791. IF tag = Sinpar THEN new.vis := inPar
  792. ELSIF tag = Soutpar THEN new.vis := outPar
  793. END
  794. END ;
  795. InStruct(new.typ); new.adr := DevCPM.SymRInt(); InName(new.name);
  796. last := new; tag := DevCPM.SymRInt()
  797. END
  798. END InSign;
  799. PROCEDURE InFld(): Object; (* first number in impCtxt.nextTag, mno set outside *)
  800. VAR tag: INTEGER; obj: Object;
  801. BEGIN
  802. tag := impCtxt.nextTag; obj := NewObj();
  803. IF tag <= Srfld THEN
  804. obj.mode := Fld;
  805. IF tag = Srfld THEN obj.vis := externalR ELSE obj.vis := external END ;
  806. InStruct(obj.typ); InName(obj.name);
  807. obj.adr := DevCPM.SymRInt()
  808. ELSE
  809. obj.mode := Fld;
  810. IF tag = Shdptr THEN obj.name := NewName(DevCPM.HdPtrName)
  811. ELSIF tag = Shdutptr THEN obj.name := NewName(DevCPM.HdUtPtrName); (* !!! *)
  812. obj.sysflag := 1
  813. ELSIF tag = Ssys THEN
  814. obj.name := NewName(DevCPM.HdUtPtrName); obj.sysflag := SHORT(SHORT(DevCPM.SymRInt()))
  815. ELSE obj.name := NewName(DevCPM.HdProcName)
  816. END;
  817. obj.typ := undftyp; obj.vis := internal;
  818. obj.adr := DevCPM.SymRInt()
  819. END;
  820. RETURN obj
  821. END InFld;
  822. PROCEDURE InTProc(mno: BYTE): Object; (* first number in impCtxt.nextTag *)
  823. VAR tag: INTEGER; obj: Object;
  824. BEGIN
  825. tag := impCtxt.nextTag;
  826. obj := NewObj(); obj.mnolev := SHORT(SHORT(-mno));
  827. IF tag = Shdtpro THEN
  828. obj.mode := TProc; obj.name := NewName(DevCPM.HdTProcName);
  829. obj.link := NewObj(); (* dummy, easier in Browser *)
  830. obj.typ := undftyp; obj.vis := internal;
  831. obj.num := DevCPM.SymRInt()
  832. ELSE
  833. obj.vis := external;
  834. IF tag = Simpo THEN obj.vis := externalR; tag := DevCPM.SymRInt() END;
  835. obj.mode := TProc; obj.conval := NewConst(); obj.conval.intval := -1;
  836. IF tag = Sentry THEN InName(obj.entry); tag := DevCPM.SymRInt() END;
  837. InSign(mno, obj.typ, obj.link); InName(obj.name);
  838. obj.num := DevCPM.SymRInt();
  839. IF tag = Slimpro THEN INCL(obj.conval.setval, limAttr)
  840. ELSIF tag = Sabspro THEN INCL(obj.conval.setval, absAttr)
  841. ELSIF tag = Semppro THEN INCL(obj.conval.setval, empAttr)
  842. ELSIF tag = Sextpro THEN INCL(obj.conval.setval, extAttr)
  843. END
  844. END ;
  845. RETURN obj
  846. END InTProc;
  847. PROCEDURE InStruct(VAR typ: Struct);
  848. VAR mno: BYTE; ref: SHORTINT; tag: INTEGER; name: String;
  849. t: Struct; obj, last, fld, old, dummy: Object;
  850. BEGIN
  851. tag := DevCPM.SymRInt();
  852. IF tag # Sstruct THEN
  853. tag := -tag;
  854. IF (version = 0) & (tag >= FirstRef0) THEN tag := tag + FirstRef - FirstRef0 END; (* correction for new FirstRef *)
  855. typ := impCtxt.ref[tag]
  856. ELSE
  857. ref := impCtxt.nofr; INC(impCtxt.nofr);
  858. IF ref < impCtxt.minr THEN impCtxt.minr := ref END ;
  859. tag := DevCPM.SymRInt();
  860. InMod(tag, mno); InName(name); obj := NewObj();
  861. IF name = null THEN
  862. IF impCtxt.self THEN old := NIL (* do not insert type desc anchor here, but in OPL *)
  863. ELSE obj.name := NewName("@"); InsertIn(obj, GlbMod[mno], old(*=NIL*)); obj.name := null
  864. END ;
  865. typ := NewStr(Undef, Basic)
  866. ELSE obj.name := name; InsertIn(obj, GlbMod[mno], old);
  867. IF old # NIL THEN (* recalculate fprints to compare with old fprints *)
  868. FPrintObj(old); impCtxt.pvfp[ref] := old.typ.pvfp;
  869. IF impCtxt.self THEN (* do not overwrite old typ *)
  870. typ := NewStr(Undef, Basic)
  871. ELSE (* overwrite old typ for compatibility reason *)
  872. typ := old.typ; typ.link := NIL; typ.sysflag := 0; typ.ext := NIL;
  873. typ.fpdone := FALSE; typ.idfpdone := FALSE
  874. END
  875. ELSE typ := NewStr(Undef, Basic)
  876. END
  877. END ;
  878. impCtxt.ref[ref] := typ; impCtxt.old[ref] := old; typ.ref := SHORT(ref + maxStruct);
  879. (* ref >= maxStruct: not exported yet, ref used for err 155 *)
  880. typ.mno := mno; typ.allocated := TRUE;
  881. typ.strobj := obj; obj.mode := Typ; obj.typ := typ;
  882. obj.mnolev := SHORT(SHORT(-mno)); obj.vis := internal; (* name not visible here *)
  883. tag := DevCPM.SymRInt();
  884. IF tag = Ssys THEN
  885. typ.sysflag := SHORT(DevCPM.SymRInt()); tag := DevCPM.SymRInt()
  886. END;
  887. typ.untagged := typ.sysflag > 0;
  888. IF tag = Slib THEN
  889. InName(obj.library); tag := DevCPM.SymRInt()
  890. END;
  891. IF tag = Sentry THEN
  892. InName(obj.entry); tag := DevCPM.SymRInt()
  893. END;
  894. IF tag = String8 THEN
  895. InName(typ.ext); tag := DevCPM.SymRInt()
  896. END;
  897. CASE tag OF
  898. | Sptr:
  899. typ.form := Pointer; typ.size := DevCPM.PointerSize; typ.n := 0; InStruct(typ.BaseTyp)
  900. | Sarr:
  901. typ.form := Comp; typ.comp := Array; InStruct(typ.BaseTyp); typ.n := DevCPM.SymRInt();
  902. typ.size := typ.n * typ.BaseTyp.size (* !!! *)
  903. | Sdarr:
  904. typ.form := Comp; typ.comp := DynArr; InStruct(typ.BaseTyp);
  905. IF typ.BaseTyp.comp = DynArr THEN typ.n := typ.BaseTyp.n + 1
  906. ELSE typ.n := 0
  907. END ;
  908. typ.size := DevCPM.DArrSizeA + DevCPM.DArrSizeB * typ.n; (* !!! *)
  909. IF typ.untagged THEN typ.size := DevCPM.PointerSize END
  910. | Srec, Sabsrec, Slimrec, Sextrec:
  911. typ.form := Comp; typ.comp := Record; InStruct(typ.BaseTyp);
  912. (* correction by ETH 18.1.96 *)
  913. IF typ.BaseTyp = notyp THEN typ.BaseTyp := NIL END;
  914. typ.extlev := 0; t := typ.BaseTyp;
  915. WHILE (t # NIL) & (t.comp = Record) DO INC(typ.extlev); t := t.BaseTyp END;
  916. typ.size := DevCPM.SymRInt(); typ.align := DevCPM.SymRInt();
  917. typ.n := DevCPM.SymRInt();
  918. IF tag = Sabsrec THEN typ.attribute := absAttr
  919. ELSIF tag = Slimrec THEN typ.attribute := limAttr
  920. ELSIF tag = Sextrec THEN typ.attribute := extAttr
  921. END;
  922. impCtxt.nextTag := DevCPM.SymRInt(); last := NIL;
  923. WHILE (impCtxt.nextTag >= Sfld) & (impCtxt.nextTag <= Shdpro)
  924. OR (impCtxt.nextTag = Shdutptr) OR (impCtxt.nextTag = Ssys) DO
  925. fld := InFld(); fld.mnolev := SHORT(SHORT(-mno));
  926. IF last # NIL THEN last.link := fld END ;
  927. last := fld;
  928. InsertThisField(fld, typ, dummy);
  929. impCtxt.nextTag := DevCPM.SymRInt()
  930. END ;
  931. WHILE impCtxt.nextTag # Send DO fld := InTProc(mno);
  932. InsertThisField(fld, typ, dummy);
  933. impCtxt.nextTag := DevCPM.SymRInt()
  934. END
  935. | Spro:
  936. typ.form := ProcTyp; typ.size := DevCPM.ProcSize; InSign(mno, typ.BaseTyp, typ.link)
  937. | Salias:
  938. InStruct(t);
  939. typ.form := t.form; typ.comp := Basic; typ.size := t.size;
  940. typ.pbfp := t.pbfp; typ.pvfp := t.pvfp; typ.fpdone := TRUE;
  941. typ.idfp := t.idfp; typ.idfpdone := TRUE; typ.BaseTyp := t
  942. END ;
  943. IF ref = impCtxt.minr THEN
  944. WHILE ref < impCtxt.nofr DO
  945. t := impCtxt.ref[ref]; FPrintStr(t);
  946. obj := t.strobj; (* obj.typ.strobj = obj, else obj.fprint differs (alias) *)
  947. IF obj.name # null THEN FPrintObj(obj) END ;
  948. old := impCtxt.old[ref];
  949. IF old # NIL THEN t.strobj := old; (* restore strobj *)
  950. IF impCtxt.self THEN
  951. IF old.mnolev < 0 THEN
  952. IF old.history # inconsistent THEN
  953. IF old.fprint # obj.fprint THEN old.history := pbmodified
  954. ELSIF impCtxt.pvfp[ref] # t.pvfp THEN old.history := pvmodified
  955. END
  956. (* ELSE remain inconsistent *)
  957. END
  958. ELSIF old.fprint # obj.fprint THEN old.history := pbmodified
  959. ELSIF impCtxt.pvfp[ref] # t.pvfp THEN old.history := pvmodified
  960. ELSIF old.vis = internal THEN old.history := same (* may be changed to "removed" in InObj *)
  961. ELSE old.history := inserted (* may be changed to "same" in InObj *)
  962. END
  963. ELSE
  964. (* check private part, delay error message until really used *)
  965. IF impCtxt.pvfp[ref] # t.pvfp THEN old.history := inconsistent END ;
  966. IF old.fprint # obj.fprint THEN FPrintErr(old, 249) END
  967. END
  968. ELSIF impCtxt.self THEN obj.history := removed
  969. ELSE obj.history := same
  970. END ;
  971. INC(ref)
  972. END ;
  973. impCtxt.minr := maxStruct
  974. END
  975. END
  976. END InStruct;
  977. PROCEDURE InObj(mno: BYTE): Object; (* first number in impCtxt.nextTag *)
  978. VAR ch: SHORTCHAR; obj, old: Object; typ: Struct;
  979. tag, i, s: INTEGER; ext: ConstExt;
  980. BEGIN
  981. tag := impCtxt.nextTag;
  982. IF tag = Stype THEN
  983. InStruct(typ); obj := typ.strobj;
  984. IF ~impCtxt.self THEN obj.vis := external END (* type name visible now, obj.fprint already done *)
  985. ELSE
  986. obj := NewObj(); obj.mnolev := SHORT(SHORT(-mno)); obj.vis := external;
  987. IF tag = Ssys THEN obj.sysflag := SHORT(SHORT(DevCPM.SymRInt())); tag := DevCPM.SymRInt() END;
  988. IF tag = Slib THEN
  989. InName(obj.library); tag := DevCPM.SymRInt()
  990. END;
  991. IF tag = Sentry THEN
  992. InName(obj.entry); tag := DevCPM.SymRInt()
  993. END;
  994. IF tag >= Sxpro THEN
  995. IF obj.conval = NIL THEN obj.conval := NewConst() END;
  996. obj.conval.intval := -1;
  997. InSign(mno, obj.typ, obj.link);
  998. CASE tag OF
  999. | Sxpro: obj.mode := XProc
  1000. | Sipro: obj.mode := IProc
  1001. | Scpro: obj.mode := CProc;
  1002. s := DevCPM.SymRInt();
  1003. NEW(ext, s + 1); obj.conval.ext := ext;
  1004. ext^[0] := SHORT(CHR(s)); i := 1;
  1005. WHILE i <= s DO DevCPM.SymRCh(ext^[i]); INC(i) END
  1006. END
  1007. ELSIF tag = Salias THEN
  1008. obj.mode := Typ; InStruct(obj.typ)
  1009. ELSIF (tag = Svar) OR (tag = Srvar) THEN
  1010. obj.mode := Var;
  1011. IF tag = Srvar THEN obj.vis := externalR END ;
  1012. InStruct(obj.typ)
  1013. ELSE (* Constant *)
  1014. obj.conval := NewConst(); InConstant(tag, obj.conval);
  1015. IF (tag = Int8) OR (tag = Int16) THEN tag := Int32 END;
  1016. obj.mode := Con; obj.typ := impCtxt.ref[tag];
  1017. END ;
  1018. InName(obj.name)
  1019. END ;
  1020. FPrintObj(obj);
  1021. IF (obj.mode = Var) & ((obj.typ.strobj = NIL) OR (obj.typ.strobj.name = null)) THEN
  1022. (* compute a global fingerprint to avoid structural type equivalence for anonymous types *)
  1023. DevCPM.FPrint(impCtxt.reffp, obj.typ.ref - maxStruct)
  1024. END ;
  1025. IF tag # Stype THEN
  1026. InsertIn(obj, GlbMod[mno], old);
  1027. IF impCtxt.self THEN
  1028. IF old # NIL THEN
  1029. (* obj is from old symbol file, old is new declaration *)
  1030. IF old.vis = internal THEN old.history := removed
  1031. ELSE FPrintObj(old); FPrintStr(old.typ); (* FPrint(obj) already called *)
  1032. IF obj.fprint # old.fprint THEN old.history := pbmodified
  1033. ELSIF obj.typ.pvfp # old.typ.pvfp THEN old.history := pvmodified
  1034. ELSE old.history := same
  1035. END
  1036. END
  1037. ELSE obj.history := removed (* OutObj not called if mnolev < 0 *)
  1038. END
  1039. (* ELSE old = NIL, or file read twice, consistent, OutObj not called *)
  1040. END
  1041. ELSE (* obj already inserted in InStruct *)
  1042. IF impCtxt.self THEN (* obj.mnolev = 0 *)
  1043. IF obj.vis = internal THEN obj.history := removed
  1044. ELSIF obj.history = inserted THEN obj.history := same
  1045. END
  1046. (* ELSE OutObj not called for obj with mnolev < 0 *)
  1047. END
  1048. END ;
  1049. RETURN obj
  1050. END InObj;
  1051. PROCEDURE Import*(aliasName: Name; VAR name: Name; VAR done: BOOLEAN);
  1052. VAR obj, h: Object; mno: BYTE; tag, p: INTEGER; lib: String; (* done used in Browser *)
  1053. BEGIN
  1054. IF name = "SYSTEM" THEN
  1055. SYSimported := TRUE;
  1056. p := processor;
  1057. IF (p < 10) OR (p > 30) THEN p := DevCPM.sysImp END;
  1058. INCL(DevCPM.options, p); (* for sysflag handling *)
  1059. Insert(aliasName, obj); obj.mode := Mod; obj.mnolev := 0; obj.scope := syslink; obj.typ := notyp;
  1060. h := NewObj(); h.mode := Head; h.right := syslink; obj.scope := h
  1061. ELSIF name = "COM" THEN
  1062. IF DevCPM.comAware IN DevCPM.options THEN
  1063. INCL(DevCPM.options, DevCPM.com); (* for sysflag handling *)
  1064. Insert(aliasName, obj); obj.mode := Mod; obj.mnolev := 0; obj.scope := comlink; obj.typ := notyp;
  1065. h := NewObj(); h.mode := Head; h.right := comlink; obj.scope := h;
  1066. ELSE err(151)
  1067. END;
  1068. ELSIF name = "JAVA" THEN
  1069. INCL(DevCPM.options, DevCPM.java)
  1070. ELSE
  1071. impCtxt.nofr := FirstRef; impCtxt.minr := maxStruct; impCtxt.nofm := 0;
  1072. impCtxt.self := aliasName = "@self"; impCtxt.reffp := 0;
  1073. DevCPM.OldSym(name, done);
  1074. IF done THEN
  1075. lib := NIL;
  1076. impProc := SHORT(DevCPM.SymRInt());
  1077. IF (impProc # 0) & (processor # 0) & (impProc # processor) THEN err(151) END;
  1078. DevCPM.checksum := 0; (* start checksum here to avoid problems with proc id fixup *)
  1079. tag := DevCPM.SymRInt();
  1080. IF tag < Smname THEN version := tag; tag := DevCPM.SymRInt()
  1081. ELSE version := 0
  1082. END;
  1083. IF tag = Slib THEN InName(lib); tag := DevCPM.SymRInt() END;
  1084. InMod(tag, mno);
  1085. IF (name[0] # "@") & (GlbMod[mno].name^ # name) THEN (* symbol file name conflict *)
  1086. GlbMod[mno] := NIL; nofGmod := mno; DEC(impCtxt.nofm);
  1087. DevCPM.CloseOldSym; done := FALSE
  1088. END;
  1089. END;
  1090. IF done THEN
  1091. GlbMod[mno].library := lib;
  1092. impCtxt.nextTag := DevCPM.SymRInt();
  1093. WHILE ~DevCPM.eofSF() DO
  1094. obj := InObj(mno); impCtxt.nextTag := DevCPM.SymRInt()
  1095. END ;
  1096. Insert(aliasName, obj);
  1097. obj.mode := Mod; obj.scope := GlbMod[mno](*.right*);
  1098. GlbMod[mno].link := obj;
  1099. obj.mnolev := SHORT(SHORT(-mno)); obj.typ := notyp;
  1100. DevCPM.CloseOldSym
  1101. ELSIF impCtxt.self THEN
  1102. sfpresent := FALSE
  1103. ELSE err(152) (*sym file not found*)
  1104. END
  1105. END
  1106. END Import;
  1107. (*-------------------------- Export --------------------------*)
  1108. PROCEDURE OutName(VAR name: ARRAY OF SHORTCHAR);
  1109. VAR i: SHORTINT; ch: SHORTCHAR;
  1110. BEGIN i := 0;
  1111. REPEAT ch := name[i]; DevCPM.SymWCh(ch); INC(i) UNTIL ch = 0X
  1112. END OutName;
  1113. PROCEDURE OutMod(mno: SHORTINT);
  1114. VAR mod: Object;
  1115. BEGIN
  1116. IF expCtxt.locmno[mno] < 0 THEN (* new mod *)
  1117. mod := GlbMod[mno];
  1118. IF mod.library # NIL THEN
  1119. DevCPM.SymWInt(Slib); OutName(mod.library^)
  1120. END;
  1121. DevCPM.SymWInt(Smname);
  1122. expCtxt.locmno[mno] := expCtxt.nofm; INC(expCtxt.nofm);
  1123. OutName(mod.name^)
  1124. ELSE DevCPM.SymWInt(-expCtxt.locmno[mno])
  1125. END
  1126. END OutMod;
  1127. PROCEDURE ^OutStr(typ: Struct);
  1128. PROCEDURE ^OutFlds(fld: Object; adr: INTEGER; visible: BOOLEAN);
  1129. PROCEDURE OutHdFld(typ: Struct; fld: Object; adr: INTEGER);
  1130. VAR i, j, n: INTEGER; btyp: Struct;
  1131. BEGIN
  1132. IF typ.comp = Record THEN OutFlds(typ.link, adr, FALSE)
  1133. ELSIF typ.comp = Array THEN btyp := typ.BaseTyp; n := typ.n;
  1134. WHILE btyp.comp = Array DO n := btyp.n * n; btyp := btyp.BaseTyp END ;
  1135. IF (btyp.form = Pointer) OR (btyp.comp = Record) THEN
  1136. j := nofhdfld; OutHdFld(btyp, fld, adr);
  1137. IF j # nofhdfld THEN i := 1;
  1138. WHILE (i < n) (* & (nofhdfld <= DevCPM.MaxHdFld) *) DO (* !!! *)
  1139. INC(adr, btyp.size); OutHdFld(btyp, fld, adr); INC(i)
  1140. END
  1141. END
  1142. END
  1143. ELSIF DevCPM.ExpHdPtrFld &
  1144. ((typ.form = Pointer) & ~typ.untagged OR (fld.name^ = DevCPM.HdPtrName)) THEN (* !!! *)
  1145. DevCPM.SymWInt(Shdptr); DevCPM.SymWInt(adr); INC(nofhdfld)
  1146. ELSIF DevCPM.ExpHdUtPtrFld &
  1147. ((typ.form = Pointer) & typ.untagged OR (fld.name^ = DevCPM.HdUtPtrName)) THEN (* !!! *)
  1148. DevCPM.SymWInt(Ssys); (* DevCPM.SymWInt(Shdutptr); *)
  1149. IF typ.form = Pointer THEN n := typ.sysflag ELSE n := fld.sysflag END;
  1150. DevCPM.SymWInt(n);
  1151. DevCPM.SymWInt(adr); INC(nofhdfld);
  1152. IF n > 1 THEN portable := FALSE END (* hidden untagged pointer are portable *)
  1153. ELSIF DevCPM.ExpHdProcFld & ((typ.form = ProcTyp) OR (fld.name^ = DevCPM.HdProcName)) THEN
  1154. DevCPM.SymWInt(Shdpro); DevCPM.SymWInt(adr); INC(nofhdfld)
  1155. END
  1156. END OutHdFld;
  1157. PROCEDURE OutFlds(fld: Object; adr: INTEGER; visible: BOOLEAN);
  1158. BEGIN
  1159. WHILE (fld # NIL) & (fld.mode = Fld) DO
  1160. IF (fld.vis # internal) & visible THEN
  1161. IF fld.vis = externalR THEN DevCPM.SymWInt(Srfld) ELSE DevCPM.SymWInt(Sfld) END ;
  1162. OutStr(fld.typ); OutName(fld.name^); DevCPM.SymWInt(fld.adr)
  1163. ELSE OutHdFld(fld.typ, fld, fld.adr + adr)
  1164. END ;
  1165. fld := fld.link
  1166. END
  1167. END OutFlds;
  1168. PROCEDURE OutSign(result: Struct; par: Object);
  1169. BEGIN
  1170. OutStr(result);
  1171. WHILE par # NIL DO
  1172. IF par.sysflag # 0 THEN DevCPM.SymWInt(Ssys); DevCPM.SymWInt(par.sysflag) END;
  1173. IF par.mode = Var THEN DevCPM.SymWInt(Svalpar)
  1174. ELSIF par.vis = inPar THEN DevCPM.SymWInt(Sinpar)
  1175. ELSIF par.vis = outPar THEN DevCPM.SymWInt(Soutpar)
  1176. ELSE DevCPM.SymWInt(Svarpar)
  1177. END ;
  1178. OutStr(par.typ);
  1179. DevCPM.SymWInt(par.adr);
  1180. OutName(par.name^); par := par.link
  1181. END ;
  1182. DevCPM.SymWInt(Send)
  1183. END OutSign;
  1184. PROCEDURE OutTProcs(typ: Struct; obj: Object);
  1185. VAR bObj: Object;
  1186. BEGIN
  1187. IF obj # NIL THEN
  1188. IF obj.mode = TProc THEN
  1189. (*
  1190. IF (typ.BaseTyp # NIL) & (obj.num < typ.BaseTyp.n) & (obj.vis = internal) & (obj.scope # NIL) THEN
  1191. FindBaseField(obj.name^, typ, bObj);
  1192. ASSERT((bObj # NIL) & (bObj.num = obj.num));
  1193. IF bObj.vis # internal THEN DevCPM.Mark(109, typ.txtpos) END
  1194. (* hidden and overriding, not detected in OPP because record exported indirectly or via aliasing *)
  1195. END;
  1196. *)
  1197. IF obj.vis # internal THEN
  1198. IF obj.vis = externalR THEN DevCPM.SymWInt(Simpo) END;
  1199. IF obj.entry # NIL THEN
  1200. DevCPM.SymWInt(Sentry); OutName(obj.entry^); portable := FALSE
  1201. END;
  1202. IF limAttr IN obj.conval.setval THEN DevCPM.SymWInt(Slimpro)
  1203. ELSIF absAttr IN obj.conval.setval THEN DevCPM.SymWInt(Sabspro)
  1204. ELSIF empAttr IN obj.conval.setval THEN DevCPM.SymWInt(Semppro)
  1205. ELSIF extAttr IN obj.conval.setval THEN DevCPM.SymWInt(Sextpro)
  1206. ELSE DevCPM.SymWInt(Stpro)
  1207. END;
  1208. OutSign(obj.typ, obj.link); OutName(obj.name^);
  1209. DevCPM.SymWInt(obj.num)
  1210. ELSIF DevCPM.ExpHdTProc THEN
  1211. DevCPM.SymWInt(Shdtpro);
  1212. DevCPM.SymWInt(obj.num)
  1213. END
  1214. END;
  1215. OutTProcs(typ, obj.left);
  1216. OutTProcs(typ, obj.right)
  1217. END
  1218. END OutTProcs;
  1219. PROCEDURE OutStr(typ: Struct); (* OPV.TypeAlloc already applied *)
  1220. VAR strobj: Object;
  1221. BEGIN
  1222. IF typ.ref < expCtxt.ref THEN DevCPM.SymWInt(-typ.ref)
  1223. ELSE
  1224. DevCPM.SymWInt(Sstruct);
  1225. typ.ref := expCtxt.ref; INC(expCtxt.ref);
  1226. IF expCtxt.ref >= maxStruct THEN err(228) END ;
  1227. OutMod(typ.mno); strobj := typ.strobj;
  1228. IF (strobj # NIL) & (strobj.name # null) THEN OutName(strobj.name^);
  1229. CASE strobj.history OF
  1230. | pbmodified: FPrintErr(strobj, 252)
  1231. | pvmodified: FPrintErr(strobj, 251)
  1232. | inconsistent: FPrintErr(strobj, 249)
  1233. ELSE (* checked in OutObj or correct indirect export *)
  1234. END
  1235. ELSE DevCPM.SymWCh(0X) (* anonymous => never inconsistent, pvfp influences the client fp *)
  1236. END;
  1237. IF typ.sysflag # 0 THEN (* !!! *)
  1238. DevCPM.SymWInt(Ssys); DevCPM.SymWInt(typ.sysflag);
  1239. IF typ.sysflag > 0 THEN portable := FALSE END
  1240. END;
  1241. IF strobj # NIL THEN
  1242. IF strobj.library # NIL THEN
  1243. DevCPM.SymWInt(Slib); OutName(strobj.library^); portable := FALSE
  1244. END;
  1245. IF strobj.entry # NIL THEN
  1246. DevCPM.SymWInt(Sentry); OutName(strobj.entry^); portable := FALSE
  1247. END
  1248. END;
  1249. IF typ.ext # NIL THEN
  1250. DevCPM.SymWInt(String8); OutName(typ.ext^); portable := FALSE
  1251. END;
  1252. CASE typ.form OF
  1253. | Pointer:
  1254. DevCPM.SymWInt(Sptr); OutStr(typ.BaseTyp)
  1255. | ProcTyp:
  1256. DevCPM.SymWInt(Spro); OutSign(typ.BaseTyp, typ.link)
  1257. | Comp:
  1258. CASE typ.comp OF
  1259. | Array:
  1260. DevCPM.SymWInt(Sarr); OutStr(typ.BaseTyp); DevCPM.SymWInt(typ.n)
  1261. | DynArr:
  1262. DevCPM.SymWInt(Sdarr); OutStr(typ.BaseTyp)
  1263. | Record:
  1264. IF typ.attribute = limAttr THEN DevCPM.SymWInt(Slimrec)
  1265. ELSIF typ.attribute = absAttr THEN DevCPM.SymWInt(Sabsrec)
  1266. ELSIF typ.attribute = extAttr THEN DevCPM.SymWInt(Sextrec)
  1267. ELSE DevCPM.SymWInt(Srec)
  1268. END;
  1269. IF typ.BaseTyp = NIL THEN OutStr(notyp) ELSE OutStr(typ.BaseTyp) END ;
  1270. (* BaseTyp should be Notyp, too late to change *)
  1271. DevCPM.SymWInt(typ.size); DevCPM.SymWInt(typ.align); DevCPM.SymWInt(typ.n);
  1272. nofhdfld := 0; OutFlds(typ.link, 0, TRUE);
  1273. (*
  1274. IF nofhdfld > DevCPM.MaxHdFld THEN DevCPM.Mark(223, typ.txtpos) END ; (* !!! *)
  1275. *)
  1276. OutTProcs(typ, typ.link); DevCPM.SymWInt(Send)
  1277. END
  1278. ELSE (* alias structure *)
  1279. DevCPM.SymWInt(Salias); OutStr(typ.BaseTyp)
  1280. END
  1281. END
  1282. END OutStr;
  1283. PROCEDURE OutConstant(obj: Object);
  1284. VAR f, i: SHORTINT; rval: SHORTREAL; a, b, c: INTEGER; r: REAL;
  1285. BEGIN
  1286. f := obj.typ.form;
  1287. (*
  1288. IF obj.typ = guidtyp THEN f := Guid END;
  1289. *)
  1290. IF f = Int32 THEN
  1291. IF (obj.conval.intval >= -128) & (obj.conval.intval <= -127) THEN f := Int8
  1292. ELSIF (obj.conval.intval >= -32768) & (obj.conval.intval <= -32767) THEN f := Int16
  1293. END
  1294. END;
  1295. DevCPM.SymWInt(f);
  1296. CASE f OF
  1297. | Bool, Char8:
  1298. DevCPM.SymWCh(SHORT(CHR(obj.conval.intval)))
  1299. | Char16:
  1300. DevCPM.SymWCh(SHORT(CHR(obj.conval.intval MOD 256)));
  1301. DevCPM.SymWCh(SHORT(CHR(obj.conval.intval DIV 256)))
  1302. | Int8, Int16, Int32:
  1303. DevCPM.SymWInt(obj.conval.intval)
  1304. | Int64:
  1305. IF ABS(obj.conval.realval + obj.conval.intval) <= MAX(INTEGER) THEN
  1306. a := SHORT(ENTIER(obj.conval.realval + obj.conval.intval)); b := -1; c := -1
  1307. ELSIF ABS(obj.conval.realval + obj.conval.intval) <= 1125899906842624.0 (*2^50*) THEN
  1308. a := SHORT(ENTIER((obj.conval.realval + obj.conval.intval) / 2097152.0 (*2^21*)));
  1309. b := SHORT(ENTIER(obj.conval.realval + obj.conval.intval - a * 2097152.0 (*2^21*))); c := -1
  1310. ELSE
  1311. a := SHORT(ENTIER((obj.conval.realval + obj.conval.intval) / 4398046511104.0 (*2^42*)));
  1312. r := obj.conval.realval + obj.conval.intval - a * 4398046511104.0 (*2^42*);
  1313. b := SHORT(ENTIER(r / 2097152.0 (*2^21*)));
  1314. c := SHORT(ENTIER(r - b * 2097152.0 (*2^21*)))
  1315. END;
  1316. IF c >= 0 THEN
  1317. DevCPM.SymWCh(SHORT(CHR(c MOD 128 + 128))); c := c DIV 128;
  1318. DevCPM.SymWCh(SHORT(CHR(c MOD 128 + 128))); c := c DIV 128;
  1319. DevCPM.SymWCh(SHORT(CHR(c MOD 128 + 128)))
  1320. END;
  1321. IF b >= 0 THEN
  1322. DevCPM.SymWCh(SHORT(CHR(b MOD 128 + 128))); b := b DIV 128;
  1323. DevCPM.SymWCh(SHORT(CHR(b MOD 128 + 128))); b := b DIV 128;
  1324. DevCPM.SymWCh(SHORT(CHR(b MOD 128 + 128)))
  1325. END;
  1326. DevCPM.SymWInt(a)
  1327. | Set:
  1328. DevCPM.SymWSet(obj.conval.setval)
  1329. | Real32:
  1330. rval := SHORT(obj.conval.realval); DevCPM.SymWReal(rval)
  1331. | Real64:
  1332. DevCPM.SymWLReal(obj.conval.realval)
  1333. | String8, String16:
  1334. OutName(obj.conval.ext^)
  1335. | NilTyp:
  1336. (*
  1337. | Guid:
  1338. i := 0;
  1339. WHILE i < 16 DO DevCPM.SymWCh(obj.conval.ext[i]); INC(i) END
  1340. *)
  1341. ELSE err(127)
  1342. END
  1343. END OutConstant;
  1344. PROCEDURE OutObj(obj: Object);
  1345. VAR i, j: SHORTINT; ext: ConstExt;
  1346. BEGIN
  1347. IF obj # NIL THEN
  1348. OutObj(obj.left);
  1349. IF obj.mode IN {Con, Typ, Var, LProc, XProc, CProc, IProc} THEN
  1350. IF obj.history = removed THEN FPrintErr(obj, 250)
  1351. ELSIF obj.vis # internal THEN
  1352. CASE obj.history OF
  1353. | inserted: FPrintErr(obj, 253)
  1354. | same: (* ok *)
  1355. | pbmodified:
  1356. IF (obj.mode # Typ) OR (obj.typ.strobj # obj) THEN FPrintErr(obj, 252) END
  1357. | pvmodified:
  1358. IF (obj.mode # Typ) OR (obj.typ.strobj # obj) THEN FPrintErr(obj, 251) END
  1359. END ;
  1360. IF obj.sysflag < 0 THEN DevCPM.SymWInt(Ssys); DevCPM.SymWInt(obj.sysflag); portable := FALSE END;
  1361. IF obj.mode IN {LProc, XProc, CProc, Var, Con} THEN
  1362. (* name alias for types handled in OutStr *)
  1363. IF obj.library # NIL THEN
  1364. DevCPM.SymWInt(Slib); OutName(obj.library^); portable := FALSE
  1365. END;
  1366. IF obj.entry # NIL THEN
  1367. DevCPM.SymWInt(Sentry); OutName(obj.entry^); portable := FALSE
  1368. END
  1369. END;
  1370. CASE obj.mode OF
  1371. | Con:
  1372. OutConstant(obj); OutName(obj.name^)
  1373. | Typ:
  1374. IF obj.typ.strobj = obj THEN DevCPM.SymWInt(Stype); OutStr(obj.typ)
  1375. ELSE DevCPM.SymWInt(Salias); OutStr(obj.typ); OutName(obj.name^)
  1376. END
  1377. | Var:
  1378. IF obj.vis = externalR THEN DevCPM.SymWInt(Srvar) ELSE DevCPM.SymWInt(Svar) END ;
  1379. OutStr(obj.typ); OutName(obj.name^);
  1380. IF (obj.typ.strobj = NIL) OR (obj.typ.strobj.name = null) THEN
  1381. (* compute fingerprint to avoid structural type equivalence *)
  1382. DevCPM.FPrint(expCtxt.reffp, obj.typ.ref)
  1383. END
  1384. | XProc:
  1385. DevCPM.SymWInt(Sxpro); OutSign(obj.typ, obj.link); OutName(obj.name^)
  1386. | IProc:
  1387. DevCPM.SymWInt(Sipro); OutSign(obj.typ, obj.link); OutName(obj.name^)
  1388. | CProc:
  1389. DevCPM.SymWInt(Scpro); OutSign(obj.typ, obj.link); ext := obj.conval.ext;
  1390. j := ORD(ext^[0]); i := 1; DevCPM.SymWInt(j);
  1391. WHILE i <= j DO DevCPM.SymWCh(ext^[i]); INC(i) END ;
  1392. OutName(obj.name^); portable := FALSE
  1393. END
  1394. END
  1395. END ;
  1396. OutObj(obj.right)
  1397. END
  1398. END OutObj;
  1399. PROCEDURE Export*(VAR ext, new: BOOLEAN);
  1400. VAR i: SHORTINT; nofmod: BYTE; done: BOOLEAN; old: Object; oldCSum: INTEGER;
  1401. BEGIN
  1402. symExtended := FALSE; symNew := FALSE; nofmod := nofGmod;
  1403. Import("@self", SelfName, done); nofGmod := nofmod;
  1404. oldCSum := DevCPM.checksum;
  1405. ASSERT(GlbMod[0].name^ = SelfName);
  1406. IF DevCPM.noerr THEN (* ~DevCPM.noerr => ~done *)
  1407. DevCPM.NewSym(SelfName);
  1408. IF DevCPM.noerr THEN
  1409. DevCPM.SymWInt(0); (* portable symfile *)
  1410. DevCPM.checksum := 0; (* start checksum here to avoid problems with proc id fixup *)
  1411. DevCPM.SymWInt(actVersion);
  1412. old := GlbMod[0]; portable := TRUE;
  1413. IF libName # "" THEN
  1414. DevCPM.SymWInt(Slib); OutName(libName); portable := FALSE;
  1415. IF done & ((old.library = NIL) OR (old.library^ # libName)) THEN
  1416. FPrintErr(NIL, 252)
  1417. END
  1418. ELSIF done & (old.library # NIL) THEN FPrintErr(NIL, 252)
  1419. END;
  1420. DevCPM.SymWInt(Smname); OutName(SelfName);
  1421. expCtxt.reffp := 0; expCtxt.ref := FirstRef;
  1422. expCtxt.nofm := 1; expCtxt.locmno[0] := 0;
  1423. i := 1; WHILE i < maxImps DO expCtxt.locmno[i] := -1; INC(i) END ;
  1424. OutObj(topScope.right);
  1425. ext := sfpresent & symExtended;
  1426. new := ~sfpresent OR symNew OR (DevCPM.checksum # oldCSum);
  1427. IF DevCPM.noerr & ~portable THEN
  1428. DevCPM.SymReset;
  1429. DevCPM.SymWInt(processor) (* nonportable symfile *)
  1430. END;
  1431. IF DevCPM.noerr & sfpresent & (impCtxt.reffp # expCtxt.reffp) THEN
  1432. new := TRUE
  1433. END ;
  1434. IF ~DevCPM.noerr THEN DevCPM.DeleteNewSym END
  1435. (* DevCPM.RegisterNewSym is called in OP2 after writing the object file *)
  1436. END
  1437. END
  1438. END Export; (* no new symbol file if ~DevCPM.noerr *)
  1439. PROCEDURE InitStruct(VAR typ: Struct; form: BYTE);
  1440. BEGIN
  1441. typ := NewStr(form, Basic); typ.ref := form; typ.size := 1; typ.allocated := TRUE;
  1442. typ.strobj := NewObj(); typ.pbfp := form; typ.pvfp := form; typ.fpdone := TRUE;
  1443. typ.idfp := form; typ.idfpdone := TRUE
  1444. END InitStruct;
  1445. PROCEDURE EnterBoolConst(name: Name; val: INTEGER);
  1446. VAR obj: Object;
  1447. BEGIN
  1448. Insert(name, obj); obj.conval := NewConst();
  1449. obj.mode := Con; obj.typ := booltyp; obj.conval.intval := val
  1450. END EnterBoolConst;
  1451. PROCEDURE EnterRealConst(name: Name; val: REAL; VAR obj: Object);
  1452. BEGIN
  1453. Insert(name, obj); obj.conval := NewConst();
  1454. obj.mode := Con; obj.typ := real32typ; obj.conval.realval := val
  1455. END EnterRealConst;
  1456. PROCEDURE EnterTyp(name: Name; form: BYTE; size: SHORTINT; VAR res: Struct);
  1457. VAR obj: Object; typ: Struct;
  1458. BEGIN
  1459. Insert(name, obj);
  1460. typ := NewStr(form, Basic); obj.mode := Typ; obj.typ := typ; obj.vis := external;
  1461. typ.strobj := obj; typ.size := size; typ.ref := form; typ.allocated := TRUE;
  1462. typ.pbfp := form; typ.pvfp := form; typ.fpdone := TRUE;
  1463. typ.idfp := form; typ.idfpdone := TRUE; res := typ
  1464. END EnterTyp;
  1465. PROCEDURE EnterProc(name: Name; num: SHORTINT);
  1466. VAR obj: Object;
  1467. BEGIN Insert(name, obj);
  1468. obj.mode := SProc; obj.typ := notyp; obj.adr := num
  1469. END EnterProc;
  1470. PROCEDURE EnterAttr(name: Name; num: SHORTINT);
  1471. VAR obj: Object;
  1472. BEGIN Insert(name, obj);
  1473. obj.mode := Attr; obj.adr := num
  1474. END EnterAttr;
  1475. PROCEDURE EnterTProc(ptr, rec: Struct; name: Name; num, typ: SHORTINT);
  1476. VAR obj, par: Object;
  1477. BEGIN
  1478. InsertField(name, rec, obj);
  1479. obj.mnolev := -128; (* for correct implement only behaviour *)
  1480. obj.mode := TProc; obj.num := num; obj.conval := NewConst();
  1481. obj.conval.setval := obj.conval.setval + {newAttr};
  1482. IF typ = 0 THEN (* FINALIZE, RELEASE *)
  1483. obj.typ := notyp; obj.vis := externalR;
  1484. INCL(obj.conval.setval, empAttr)
  1485. ELSIF typ = 1 THEN (* QueryInterface *)
  1486. par := NewObj(); par.name := NewName("int"); par.mode := VarPar; par.vis := outPar;
  1487. par.sysflag := 8; par.adr := 16; par.typ := punktyp;
  1488. par.link := obj.link; obj.link := par;
  1489. par := NewObj(); par.name := NewName("iid"); par.mode := VarPar; par.vis := inPar;
  1490. par.sysflag := 16; par.adr := 12; par.typ := guidtyp;
  1491. par.link := obj.link; obj.link := par;
  1492. obj.typ := restyp; obj.vis := external;
  1493. INCL(obj.conval.setval, extAttr)
  1494. ELSIF typ = 2 THEN (* AddRef, Release *)
  1495. obj.typ := notyp; obj.vis := externalR;
  1496. INCL(obj.conval.setval, isHidden);
  1497. INCL(obj.conval.setval, extAttr)
  1498. END;
  1499. par := NewObj(); par.name := NewName("this"); par.mode := Var;
  1500. par.adr := 8; par.typ := ptr;
  1501. par.link := obj.link; obj.link := par;
  1502. END EnterTProc;
  1503. PROCEDURE EnterHdField(VAR root: Object; offs: SHORTINT);
  1504. VAR obj: Object;
  1505. BEGIN
  1506. obj := NewObj(); obj.mode := Fld;
  1507. obj.name := NewName(DevCPM.HdPtrName); obj.typ := undftyp; obj.adr := offs;
  1508. obj.link := root; root := obj
  1509. END EnterHdField;
  1510. BEGIN
  1511. NEW(null, 1); null^ := "";
  1512. topScope := NIL; OpenScope(0, NIL); DevCPM.errpos := 0;
  1513. InitStruct(undftyp, Undef); InitStruct(notyp, NoTyp);
  1514. InitStruct(string8typ, String8); InitStruct(niltyp, NilTyp); niltyp.size := DevCPM.PointerSize;
  1515. InitStruct(string16typ, String16);
  1516. undftyp.BaseTyp := undftyp;
  1517. (*initialization of module SYSTEM*)
  1518. (*
  1519. EnterTyp("BYTE", Byte, 1, bytetyp);
  1520. EnterProc("NEW", sysnewfn);
  1521. *)
  1522. EnterTyp("PTR", Pointer, DevCPM.PointerSize, sysptrtyp);
  1523. EnterProc("ADR", adrfn);
  1524. EnterProc("TYP", typfn);
  1525. EnterProc("CC", ccfn);
  1526. EnterProc("LSH", lshfn);
  1527. EnterProc("ROT", rotfn);
  1528. EnterProc("GET", getfn);
  1529. EnterProc("PUT", putfn);
  1530. EnterProc("GETREG", getrfn);
  1531. EnterProc("PUTREG", putrfn);
  1532. EnterProc("BIT", bitfn);
  1533. EnterProc("VAL", valfn);
  1534. EnterProc("MOVE", movefn);
  1535. EnterProc("THISRECORD", thisrecfn);
  1536. EnterProc("THISARRAY", thisarrfn);
  1537. syslink := topScope.right; topScope.right := NIL;
  1538. (* initialization of module COM *)
  1539. EnterProc("ID", iidfn);
  1540. EnterProc("QUERY", queryfn);
  1541. EnterTyp("RESULT", Int32, 4, restyp);
  1542. restyp.ref := Res;
  1543. EnterTyp("GUID", Guid, 16, guidtyp);
  1544. guidtyp.form := Comp; guidtyp.comp := Array; guidtyp.n := 16;
  1545. EnterTyp("IUnknown^", IUnk, 12, iunktyp);
  1546. iunktyp.form := Comp; iunktyp.comp := Record; iunktyp.n := 3;
  1547. iunktyp.attribute := absAttr;
  1548. (*
  1549. EnterHdField(iunktyp.link, 12);
  1550. *)
  1551. iunktyp.BaseTyp := NIL; iunktyp.align := 4;
  1552. iunktyp.sysflag := interface; iunktyp.untagged := TRUE;
  1553. NEW(iunktyp.ext, 40); iunktyp.ext^ := "{00000000-0000-0000-C000-000000000046}";
  1554. EnterTyp("IUnknown", PUnk, DevCPM.PointerSize, punktyp);
  1555. punktyp.form := Pointer; punktyp.BaseTyp := iunktyp;
  1556. punktyp.sysflag := interface; punktyp.untagged := TRUE;
  1557. EnterTProc(punktyp, iunktyp, "QueryInterface", 0, 1);
  1558. EnterTProc(punktyp, iunktyp, "AddRef", 1, 2);
  1559. EnterTProc(punktyp, iunktyp, "Release", 2, 2);
  1560. comlink := topScope.right; topScope.right := NIL;
  1561. universe := topScope;
  1562. EnterProc("LCHR", lchrfn);
  1563. EnterProc("LENTIER", lentierfcn);
  1564. EnterTyp("ANYREC", AnyRec, 0, anytyp);
  1565. anytyp.form := Comp; anytyp.comp := Record; anytyp.n := 1;
  1566. anytyp.BaseTyp := NIL; anytyp.extlev := -1; (* !!! *)
  1567. anytyp.attribute := absAttr;
  1568. EnterTyp("ANYPTR", AnyPtr, DevCPM.PointerSize, anyptrtyp);
  1569. anyptrtyp.form := Pointer; anyptrtyp.BaseTyp := anytyp;
  1570. EnterTProc(anyptrtyp, anytyp, "FINALIZE", 0, 0);
  1571. EnterTProc(anyptrtyp, iunktyp, "RELEASE", 1, 0);
  1572. EnterProc("VALID", validfn);
  1573. EnterTyp("SHORTCHAR", Char8, 1, char8typ);
  1574. string8typ.BaseTyp := char8typ;
  1575. EnterTyp("CHAR", Char16, 2, char16typ);
  1576. EnterTyp("LONGCHAR", Char16, 2, lchar16typ);
  1577. string16typ.BaseTyp := char16typ;
  1578. EnterTyp("SET", Set, 4, settyp);
  1579. EnterTyp("BYTE", Int8, 1, int8typ);
  1580. guidtyp.BaseTyp := int8typ;
  1581. EnterTyp("SHORTINT", Int16, 2, int16typ);
  1582. EnterTyp("INTEGER", Int32, 4, int32typ);
  1583. EnterTyp("LONGINT", Int64, 8, int64typ);
  1584. EnterTyp("LARGEINT", Int64, 8, lint64typ);
  1585. EnterTyp("SHORTREAL", Real32, 4, real32typ);
  1586. EnterTyp("REAL", Real64, 8, real64typ);
  1587. EnterTyp("LONGREAL", Real64, 8, lreal64typ);
  1588. EnterTyp("BOOLEAN", Bool, 1, booltyp);
  1589. EnterBoolConst("FALSE", 0); (* 0 and 1 are compiler internal representation only *)
  1590. EnterBoolConst("TRUE", 1);
  1591. EnterRealConst("INF", DevCPM.InfReal, infinity);
  1592. EnterProc("HALT", haltfn);
  1593. EnterProc("NEW", newfn);
  1594. EnterProc("ABS", absfn);
  1595. EnterProc("CAP", capfn);
  1596. EnterProc("ORD", ordfn);
  1597. EnterProc("ENTIER", entierfn);
  1598. EnterProc("ODD", oddfn);
  1599. EnterProc("MIN", minfn);
  1600. EnterProc("MAX", maxfn);
  1601. EnterProc("CHR", chrfn);
  1602. EnterProc("SHORT", shortfn);
  1603. EnterProc("LONG", longfn);
  1604. EnterProc("SIZE", sizefn);
  1605. EnterProc("INC", incfn);
  1606. EnterProc("DEC", decfn);
  1607. EnterProc("INCL", inclfn);
  1608. EnterProc("EXCL", exclfn);
  1609. EnterProc("LEN", lenfn);
  1610. EnterProc("COPY", copyfn);
  1611. EnterProc("ASH", ashfn);
  1612. EnterProc("ASSERT", assertfn);
  1613. (*
  1614. EnterProc("ADR", adrfn);
  1615. EnterProc("TYP", typfn);
  1616. *)
  1617. EnterProc("BITS", bitsfn);
  1618. EnterAttr("ABSTRACT", absAttr);
  1619. EnterAttr("LIMITED", limAttr);
  1620. EnterAttr("EMPTY", empAttr);
  1621. EnterAttr("EXTENSIBLE", extAttr);
  1622. NEW(intrealtyp); intrealtyp^ := real64typ^;
  1623. impCtxt.ref[Undef] := undftyp; impCtxt.ref[Byte] := bytetyp;
  1624. impCtxt.ref[Bool] := booltyp; impCtxt.ref[Char8] := char8typ;
  1625. impCtxt.ref[Int8] := int8typ; impCtxt.ref[Int16] := int16typ;
  1626. impCtxt.ref[Int32] := int32typ; impCtxt.ref[Real32] := real32typ;
  1627. impCtxt.ref[Real64] := real64typ; impCtxt.ref[Set] := settyp;
  1628. impCtxt.ref[String8] := string8typ; impCtxt.ref[NilTyp] := niltyp;
  1629. impCtxt.ref[NoTyp] := notyp; impCtxt.ref[Pointer] := sysptrtyp;
  1630. impCtxt.ref[AnyPtr] := anyptrtyp; impCtxt.ref[AnyRec] := anytyp;
  1631. impCtxt.ref[Char16] := char16typ; impCtxt.ref[String16] := string16typ;
  1632. impCtxt.ref[Int64] := int64typ;
  1633. impCtxt.ref[IUnk] := iunktyp; impCtxt.ref[PUnk] := punktyp;
  1634. impCtxt.ref[Guid] := guidtyp; impCtxt.ref[Res] := restyp;
  1635. END DevCPT.
  1636. Objects:
  1637. mode | adr conval link scope leaf
  1638. ------------------------------------------------
  1639. Undef | Not used
  1640. Var | vadr next regopt Glob or loc var or proc value parameter
  1641. VarPar| vadr next regopt Var parameter (vis = 0 | inPar | outPar)
  1642. Con | val Constant
  1643. Fld | off next Record field
  1644. Typ | Named type
  1645. LProc | entry sizes firstpar scope leaf Local procedure, entry adr set in back-end
  1646. XProc | entry sizes firstpar scope leaf External procedure, entry adr set in back-end
  1647. SProc | fno sizes Standard procedure
  1648. CProc | code firstpar scope Code procedure
  1649. IProc | entry sizes scope leaf Interrupt procedure, entry adr set in back-end
  1650. Mod | scope Module
  1651. Head | txtpos owner firstvar Scope anchor
  1652. TProc | entry sizes firstpar scope leaf Bound procedure, mthno = obj.num
  1653. Structures:
  1654. form comp | n BaseTyp link mno txtpos sysflag
  1655. ----------------------------------------------------------------------------------
  1656. Undef Basic |
  1657. Byte Basic |
  1658. Bool Basic |
  1659. Char8 Basic |
  1660. Int8 Basic |
  1661. Int16 Basic |
  1662. Int32 Basic |
  1663. Real32 Basic |
  1664. Real64 Basic |
  1665. Set Basic |
  1666. String8 Basic |
  1667. NilTyp Basic |
  1668. NoTyp Basic |
  1669. Pointer Basic | PBaseTyp mno txtpos sysflag
  1670. ProcTyp Basic | ResTyp params mno txtpos sysflag
  1671. Comp Array | nofel ElemTyp mno txtpos sysflag
  1672. Comp DynArr| dim ElemTyp mno txtpos sysflag
  1673. Comp Record| nofmth RBaseTyp fields mno txtpos sysflag
  1674. Char16 Basic |
  1675. String16Basic |
  1676. Int64 Basic |
  1677. Nodes:
  1678. design = Nvar|Nvarpar|Nfield|Nderef|Nindex|Nguard|Neguard|Ntype|Nproc.
  1679. expr = design|Nconst|Nupto|Nmop|Ndop|Ncall.
  1680. nextexpr = NIL|expr.
  1681. ifstat = NIL|Nif.
  1682. casestat = Ncaselse.
  1683. sglcase = NIL|Ncasedo.
  1684. stat = NIL|Ninittd|Nenter|Nassign|Ncall|Nifelse|Ncase|Nwhile|Nrepeat|
  1685. Nloop|Nexit|Nreturn|Nwith|Ntrap.
  1686. class subcl obj left right link
  1687. ---------------------------------------------------------
  1688. design Nvar var nextexpr
  1689. Nvarpar varpar nextexpr
  1690. Nfield field design nextexpr
  1691. Nderef ptr/str design nextexpr
  1692. Nindex design expr nextexpr
  1693. Nguard design nextexpr (typ = guard type)
  1694. Neguard design nextexpr (typ = guard type)
  1695. Ntype type nextexpr
  1696. Nproc normal proc nextexpr
  1697. super proc nextexpr
  1698. expr design
  1699. Nconst const (val = node.conval)
  1700. Nupto expr expr nextexpr
  1701. Nmop not expr nextexpr
  1702. minus expr nextexpr
  1703. is tsttype expr nextexpr
  1704. conv expr nextexpr
  1705. abs expr nextexpr
  1706. cap expr nextexpr
  1707. odd expr nextexpr
  1708. bit expr nextexpr {x}
  1709. adr expr nextexpr SYSTEM.ADR
  1710. typ expr nextexpr SYSTEM.TYP
  1711. cc Nconst nextexpr SYSTEM.CC
  1712. val expr nextexpr SYSTEM.VAL
  1713. Ndop times expr expr nextexpr
  1714. slash expr expr nextexpr
  1715. div expr expr nextexpr
  1716. mod expr expr nextexpr
  1717. and expr expr nextexpr
  1718. plus expr expr nextexpr
  1719. minus expr expr nextexpr
  1720. or expr expr nextexpr
  1721. eql expr expr nextexpr
  1722. neq expr expr nextexpr
  1723. lss expr expr nextexpr
  1724. leq expr expr nextexpr
  1725. grt expr expr nextexpr
  1726. geq expr expr nextexpr
  1727. in expr expr nextexpr
  1728. ash expr expr nextexpr
  1729. msk expr Nconst nextexpr
  1730. len design Nconst nextexpr
  1731. min expr expr nextexpr MIN
  1732. max expr expr nextexpr MAX
  1733. bit expr expr nextexpr SYSTEM.BIT
  1734. lsh expr expr nextexpr SYSTEM.LSH
  1735. rot expr expr nextexpr SYSTEM.ROT
  1736. Ncall fpar design nextexpr nextexpr
  1737. Ncomp stat expr nextexpr
  1738. nextexpr NIL
  1739. expr
  1740. ifstat NIL
  1741. Nif expr stat ifstat
  1742. casestat Ncaselse sglcase stat (minmax = node.conval)
  1743. sglcase NIL
  1744. Ncasedo Nconst stat sglcase
  1745. stat NIL
  1746. Ninittd stat (of node.typ)
  1747. Nenter proc stat stat stat (proc=NIL for mod)
  1748. Nassign assign design expr stat
  1749. newfn design nextexp stat
  1750. incfn design expr stat
  1751. decfn design expr stat
  1752. inclfn design expr stat
  1753. exclfn design expr stat
  1754. copyfn design expr stat
  1755. getfn design expr stat SYSTEM.GET
  1756. putfn expr expr stat SYSTEM.PUT
  1757. getrfn design Nconst stat SYSTEM.GETREG
  1758. putrfn Nconst expr stat SYSTEM.PUTREG
  1759. sysnewfn design expr stat SYSTEM.NEW
  1760. movefn expr expr stat SYSTEM.MOVE
  1761. (right.link = 3rd par)
  1762. Ncall fpar design nextexpr stat
  1763. Nifelse ifstat stat stat
  1764. Ncase expr casestat stat
  1765. Nwhile expr stat stat
  1766. Nrepeat stat expr stat
  1767. Nloop stat stat
  1768. Nexit stat
  1769. Nreturn proc nextexpr stat (proc = NIL for mod)
  1770. Nwith ifstat stat stat
  1771. Ntrap expr stat
  1772. Ncomp stat stat stat