FoxGlobal.Mod 67 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736
  1. MODULE FoxGlobal; (** AUTHOR "fof & fn"; PURPOSE "Oberon Compiler Globally Defined Symbols"; *)
  2. (* (c) fof ETH Zürich, 2008 *)
  3. IMPORT
  4. SyntaxTree := FoxSyntaxTree, Basic := FoxBasic, Scanner := FoxScanner, Strings, Dates, D:= Debugging;
  5. CONST
  6. (* system flag names *)
  7. StringWinAPI* = "WINAPI";
  8. StringC* = "C";
  9. StringMovable*="MOVABLE";
  10. StringUntraced* = "UNTRACED";
  11. StringDelegate* = "DELEGATE";
  12. StringInterrupt*= "INTERRUPT";
  13. StringPcOffset* = "PCOFFSET";
  14. StringEntry* = "INITIAL";
  15. StringExit*= "FINAL";
  16. StringNoPAF*="NOPAF";
  17. StringFixed*="FIXED";
  18. StringFictive*="FICTIVE";
  19. StringAligned*="ALIGNED";
  20. StringAlignStack*="ALIGNSTACK";
  21. StringFinal*="FINAL";
  22. StringAbstract*="ABSTRACT";
  23. StringRegister*= "REGISTER";
  24. StringNoReturn*="NORETURN";
  25. StringUnsafe*="UNSAFE";
  26. StringPlain*="PLAIN";
  27. StringDisposable*="DISPOSABLE";
  28. StringUnchecked*="UNCHECKED";
  29. StringUncooperative*="UNCOOPERATIVE";
  30. (* block modifier flag names *)
  31. StringExclusive* = "EXCLUSIVE";
  32. StringActive* = "ACTIVE";
  33. StringPriority* = "PRIORITY";
  34. StringSafe* = "SAFE";
  35. StringRealtime* = "REALTIME";
  36. StringDynamic* = "DYNAMIC";
  37. StringInstructionWidth*="InstructionWidth";
  38. StringDataMemorySize*= "DataMemorySize";
  39. StringCodeMemorySize*= "CodeMemorySize";
  40. StringChannelWidth*= "ChannelWidth";
  41. StringChannelDepth*= "ChannelDepth";
  42. StringChannelModule*= "Channels";
  43. StringSystemModule* = "SYSTEM";
  44. StringsystemModule* = "system";
  45. StringBaseMem*= "BaseMem";
  46. StringBaseDiv*= "BaseDiv";
  47. StringVector*="Vector";
  48. StringFloatingPoint*="FloatingPoint";
  49. StringNoMul*="NoMul";
  50. StringNonBlockingIO*="HasNonBlockingIO";
  51. StringFrequencyDivider*="FrequencyDivider";
  52. StringEngine*="Engine";
  53. StringTRM*="TRM";
  54. StringTRMS*="TRMS";
  55. StringBackend*="Backend";
  56. StringRuntime*="Runtime";
  57. (* traps *)
  58. WithTrap* = 1;
  59. CaseTrap* = 2;
  60. ReturnTrap* = 3;
  61. TypeEqualTrap* = 5;
  62. TypeCheckTrap* = 6;
  63. IndexCheckTrap* = 7;
  64. AssertTrap* = 8;
  65. ArraySizeTrap* = 9;
  66. ArrayFormTrap*=10; (* fof: indicates that array cannot be (re-)allocated since shape, type or size does not match *)
  67. NoReturnTrap*=16;
  68. (** builtin procedures **)
  69. (* FoxProgTools.Enum -e -i
  70. (* global proper procedures *)
  71. Assert Copy Dec Excl Halt Inc Incl New Dispose GetProcedure Connect Delegate
  72. Read Write Reshape Wait
  73. (* global functions *)
  74. Abs Cap Chr Chr32 Entier EntierH Incr Len Long Max Min Odd Ord Ord32 Short Size
  75. Sum Dim Cas First Last Step Re Im Ash Lsh Rot
  76. (* system proper procedures *)
  77. systemGet systemPut systemMove systemNew systemRef
  78. systemTypeCode systemHalt
  79. systemPut8 systemPut16 systemPut32 systemPut64 systemTrace
  80. systemSetStackPointer systemSetFramePointer systemSetActivity
  81. (* system functions *)
  82. systemAdr systemSize systemBit systemGet64 systemGet32 systemGet16 systemGet8
  83. systemVal systemMsk
  84. systemGetStackPointer systemGetFramePointer systemGetActivity
  85. (* for active cells *)
  86. Send Receive
  87. (* for backend specific extensions *)
  88. systemSpecial
  89. (* compatibility with Oberon07 -- other mappings: LSL -> LSH, FLOOR -> Entier, Pack und Unpk currently unsupported *)
  90. Asr Ror Flt
  91. Conversion
  92. DotTimesPlus AtMulDec AtMulInc DecMul IncMul
  93. endFox
  94. ~
  95. *)
  96. (* global proper procedures *)
  97. Assert*= Scanner.EndOfText+1; Copy*= Assert+1; Dec*= Copy+1; Excl*= Dec+1; Halt*= Excl+1; Inc*= Halt+1; Incl*= Inc+1; New*= Incl+1; Dispose*= New+1; GetProcedure*= Dispose+1; Connect*= GetProcedure+1; Delegate*= Connect+1; Read*= Delegate+1; Write*= Read+1; Reshape*= Write+1; Wait*= Reshape+1;
  98. (* global functions *)
  99. Abs*= Wait+1; Cap*= Abs+1; Chr*= Cap+1; Chr32*= Chr+1; Entier*= Chr32+1; EntierH*= Entier+1; Incr*= EntierH+1; Len*= Incr+1; Long*= Len+1; Max*= Long+1; Min*= Max+1; Odd*= Min+1; Ord*= Odd+1; Ord32*= Ord+1; Short*= Ord32+1; Size*= Short+1; Sum*= Size+1; Dim*= Sum+1; Cas*= Dim+1; First*= Cas+1; Last*= First+1; Step*= Last+1; Re*= Step+1; Im*= Re+1; Ash*= Im+1; Lsh*= Ash+1; Rot*= Lsh+1;
  100. All* = Rot+1;
  101. (* system proper procedures *)
  102. systemGet*= All+1; systemPut*= systemGet+1; systemMove*= systemPut+1; systemNew*= systemMove+1; systemRef*= systemNew+1; systemTypeCode*= systemRef+1; systemHalt*= systemTypeCode+1; systemPut8*= systemHalt+1; systemPut16*= systemPut8+1; systemPut32*= systemPut16+1; systemPut64*= systemPut32+1; systemTrace*= systemPut64+1; systemSetStackPointer*= systemTrace+1; systemSetFramePointer*= systemSetStackPointer+1; systemSetActivity*= systemSetFramePointer+1;
  103. (* system functions *)
  104. systemAdr*= systemSetActivity+1; systemSize*= systemAdr+1; systemBit*= systemSize+1; systemGet64*= systemBit+1; systemGet32*= systemGet64+1; systemGet16*= systemGet32+1; systemGet8*= systemGet16+1; systemVal*= systemGet8+1; systemMsk*= systemVal+1; systemGetStackPointer*= systemMsk+1; systemGetFramePointer*= systemGetStackPointer+1; systemGetActivity*= systemGetFramePointer+1;
  105. (* for active cells *)
  106. Send*= systemGetActivity+1; Receive*= Send+1;
  107. (* for backend specific extensions *)
  108. systemSpecial*= Receive+1;
  109. (* compatibility with Oberon07 -- other mappings: LSL -> LSH, FLOOR -> Entier, Pack und Unpk currently unsupported *)
  110. Asr*= systemSpecial+1; Ror*= Asr+1; Flt*= Ror+1; Conversion*= Flt+1; DotTimesPlus*= Conversion+1; AtMulDec*= DotTimesPlus+1; AtMulInc*= AtMulDec+1; DecMul*= AtMulInc+1; IncMul*= DecMul+1; endFox*= IncMul+1;
  111. VectorCapability* = 0;
  112. FloatingPointCapability*= 1;
  113. EngineCapability*= 2;
  114. TRMSCapability*= 3;
  115. NoMulCapability*=4;
  116. NonBlockingIOCapability*=5;
  117. CONST
  118. (* LYNX extensions *)
  119. (* different naming schema to satisfy FoxScanner when parsing imports *)
  120. LynxChar* = "@lynx_char";
  121. LynxSbyte* = "@lynx_sbyte";
  122. LynxShort* = "@lynx_short";
  123. LynxInt* = "@lynx_int";
  124. LynxLong* = "@lynx_long";
  125. LynxFloat* = "@lynx_float";
  126. LynxDouble* = "@lynx_double";
  127. LynxBool* = "@lynx_bool";
  128. LynxObject* = "@lynx_object";
  129. LynxString* = "@lynx_string";
  130. LynxNewobj* = "lynx@newobj";
  131. LynxNewarr* = "lynx@newarr";
  132. LynxAsop* = "lynx@asop";
  133. LynxUnop* = "lynx@unop";
  134. LynxBinop* = "lynx@binop";
  135. LynxSend* = "lynx@send";
  136. LynxReceive* = "lynx@receive";
  137. LynxRecvnb* = "lynx@recvnb";
  138. LynxConnect* = "lynx@connect";
  139. LynxDelegate* = "lynx@delegate";
  140. LynxNewsel* = "lynx@newsel";
  141. LynxAddsel* = "lynx@addsel";
  142. LynxSelect* = "lynx@select";
  143. LynxSelidx* = "lynx@selidx";
  144. LynxOpAdd* = 1;
  145. LynxOpSub* = 2;
  146. LynxOpMul* = 3;
  147. LynxOpDiv* = 4;
  148. LynxOpRem* = 5;
  149. LynxOpAnd* = 6;
  150. LynxOpOr* = 7;
  151. LynxOpXor* = 8;
  152. LynxOpShl* = 9;
  153. LynxOpShr* = 10;
  154. LynxOpNot* = 11;
  155. SymLynxNewobj* = endFox;
  156. SymLynxNewarr* = endFox + 1;
  157. SymLynxAsop* = endFox + 2;
  158. SymLynxUnop* = endFox + 3;
  159. SymLynxBinop* = endFox + 4;
  160. SymLynxRecvnb* = endFox + 5;
  161. SymLynxNewsel* = endFox + 6;
  162. SymLynxAddsel* = endFox + 7;
  163. SymLynxSelect* = endFox + 8;
  164. SymLynxSelidx* = endFox + 9;
  165. end = endFox + 10;
  166. VAR
  167. (* names *)
  168. SelfParameterName-,ReturnParameterName-,SystemName-,systemName-,PointerReturnName-, ResultName-,
  169. A2Name-,OberonName-,ArrayBaseName-,RecordBodyName-,ModuleBodyName-,
  170. NameWinAPI-,NameC-,NameMovable-,NameUntraced-,NameDelegate-,NameInterrupt-, NamePcOffset-, NameNoPAF-,NameEntry-, NameExit-, NameFixed-,NameFictive-, NameAligned-,NameStackAligned-,
  171. NameExclusive-,NameActive-,NamePriority-,NameSafe-,NameRealtime-, NameDynamic-, NameDataMemorySize-, NameCodeMemorySize-
  172. , NameChannelWidth-, NameChannelDepth-, NameChannelModule-, NameVector-, NameFloatingPoint-, NameNoMul-,NameNonBlockingIO-, NameTRM-, NameTRMS-, NameEngine-, NameFinal-, NameAbstract-,
  173. NameBackend-, NameRuntime-, NameFrequencyDivider-, NameRegister-,NameNoReturn-,NamePlain-,NameUnsafe-,NameDisposable-,NameUnchecked-,NameUncooperative-: SyntaxTree.Identifier;
  174. identifiers: ARRAY 2 OF ARRAY end OF SyntaxTree.Identifier;
  175. (* some handy type variables for backend / checker implementers *)
  176. Boolean8-, Boolean32-: SyntaxTree.BooleanType;
  177. Integer8-, Integer16-, Integer32-, Integer64-: SyntaxTree.IntegerType;
  178. Unsigned8-, Unsigned16-, Unsigned32-, Unsigned64-: SyntaxTree.IntegerType;
  179. Character8-, Character16-, Character32-: SyntaxTree.CharacterType;
  180. Float32-, Float64-: SyntaxTree.FloatType;
  181. Complex64-, Complex128-: SyntaxTree.ComplexType;
  182. Byte8: SyntaxTree.ByteType;
  183. Byte32: SyntaxTree.ByteType;
  184. TYPE
  185. Position = SyntaxTree.Position;
  186. Alignment* = RECORD
  187. min, max: LONGINT; (* alignments in bits *)
  188. END;
  189. PassInRegisterProc = PROCEDURE {DELEGATE} (type: SyntaxTree.Type): BOOLEAN;
  190. System*= OBJECT
  191. VAR
  192. (* system and global scopes and modules (lowercase and uppercase each) *)
  193. systemScope-, globalScope-: ARRAY 2 OF SyntaxTree.ModuleScope;
  194. systemModule-,globalModule-: ARRAY 2 OF SyntaxTree.Module;
  195. activeCellsCapabilities-: SyntaxTree.Symbol; (* list of supported capabilities, filled by ActiveCells specification *)
  196. (* addressing granularity in code and data memory *)
  197. codeUnit-: LONGINT;
  198. dataUnit-: LONGINT;
  199. (* alignment (variables, record entries) *)
  200. (* alignment (parameters & stack frames) *)
  201. variableAlignment-, parameterAlignment-: Alignment;
  202. (* offset of first parameter *)
  203. offsetFirstParameter-: LONGINT;
  204. (* to determine if a builtin-procedure can be operator-overloaded *)
  205. operatorDefined-: ARRAY end OF BOOLEAN;
  206. (* type sizes defined by backend *)
  207. addressSize-: LONGINT;
  208. (* system type mapping, in a later version only the global (unisgned) types should be used
  209. the following two types are only there for compatibility with the system as is
  210. problematic are mainly the conversions between (signed) Oberon types and (unsigned) addressType.
  211. A good concept has to be derived.
  212. *)
  213. addressType-, sizeType-, shortintType-, integerType-, longintType-, hugeintType-, wordType-, longWordType-, characterType-, characterType8-, characterType16-, characterType32-, setType-, booleanType-, anyType-,byteType-,
  214. realType-, longrealType-, complexType-, longcomplexType-, objectType-, nilType-, rangeType-: SyntaxTree.Type;
  215. CanPassInRegister-: PassInRegisterProc;
  216. cellsAreObjects-: BOOLEAN;
  217. PROCEDURE &InitSystem*(codeUnit, dataUnit: LONGINT; addressSize, minVarAlign, maxVarAlign, minParAlign, maxParAlign, offsetFirstPar: LONGINT; cooperative: BOOLEAN);
  218. VAR i: LONGINT;
  219. BEGIN
  220. ASSERT(dataUnit > 0);
  221. ASSERT(minVarAlign > 0);
  222. ASSERT(maxVarAlign > 0);
  223. ASSERT(minParAlign > 0);
  224. ASSERT(maxParAlign > 0);
  225. SELF.dataUnit := dataUnit;
  226. SELF.codeUnit := codeUnit;
  227. SELF.addressSize := addressSize;
  228. SELF.variableAlignment.min := minVarAlign;
  229. SELF.variableAlignment.max := maxVarAlign;
  230. SELF.parameterAlignment.min := minParAlign;
  231. SELF.parameterAlignment.max := maxParAlign;
  232. SELF.offsetFirstParameter := offsetFirstPar;
  233. IF cooperative THEN INC(SELF.offsetFirstParameter,addressSize) END;
  234. activeCellsCapabilities := NIL;
  235. BuildScopes(SELF);
  236. FOR i := 0 TO LEN(operatorDefined)-1 DO
  237. operatorDefined[i] := FALSE;
  238. END;
  239. CanPassInRegister :=NIL;
  240. cellsAreObjects := FALSE;
  241. END InitSystem;
  242. PROCEDURE SetCellsAreObjects*(c: BOOLEAN);
  243. BEGIN
  244. cellsAreObjects := c;
  245. END SetCellsAreObjects;
  246. PROCEDURE SetRegisterPassCallback*(canPassInRegister: PassInRegisterProc);
  247. BEGIN
  248. CanPassInRegister := canPassInRegister;
  249. END SetRegisterPassCallback;
  250. PROCEDURE AddCapability*(name: SyntaxTree.Identifier);
  251. VAR symbol: SyntaxTree.Symbol;
  252. BEGIN
  253. symbol := SyntaxTree.NewSymbol(name);
  254. symbol.SetNext(activeCellsCapabilities);
  255. activeCellsCapabilities := symbol
  256. END AddCapability;
  257. PROCEDURE GenerateRecordOffsets*(x: SyntaxTree.RecordType): BOOLEAN; (* normally done in checker but the binary symbol file format makes this necessary *)
  258. VAR baseType: SyntaxTree.RecordType; offset,baseOffset, size: LONGINT; alignment, thisAlignment: LONGINT; variable: SyntaxTree.Variable;
  259. BEGIN
  260. baseType :=x.GetBaseRecord();
  261. IF (baseType # NIL) & (baseType.sizeInBits < 0) THEN
  262. IF~ GenerateRecordOffsets(baseType) THEN RETURN FALSE END;
  263. END;
  264. IF baseType # NIL THEN
  265. offset := baseType.sizeInBits;
  266. alignment := baseType.alignmentInBits;
  267. ELSE
  268. offset := 0; alignment := x.alignmentInBits;
  269. IF alignment <= 0 THEN alignment := dataUnit END;
  270. END;
  271. baseOffset := offset;
  272. variable := x.recordScope.firstVariable;
  273. WHILE (variable # NIL) DO
  274. IF ~variable.fictive THEN
  275. size := SizeOf(variable.type.resolved);
  276. IF size < 0 THEN RETURN FALSE END;
  277. IF variable.alignment > 0 THEN
  278. thisAlignment := variable.alignment*dataUnit;
  279. ELSE
  280. thisAlignment := AlignmentOf(SELF.variableAlignment, variable.type.resolved);
  281. END;
  282. Basic.Align(offset, thisAlignment);
  283. IF thisAlignment > alignment THEN alignment := thisAlignment END;
  284. variable.SetOffset(offset);
  285. INC(offset,size);
  286. ELSE
  287. variable.SetOffset(baseOffset + variable.fictiveOffset * dataUnit);
  288. END;
  289. variable := variable.nextVariable;
  290. END;
  291. x.SetAlignmentInBits(alignment);
  292. Basic.Align(offset, alignment); (* strictly speaking not necessary, but with the old object file format otherwise problems with the GC show up *)
  293. x.SetSize(offset);
  294. RETURN TRUE
  295. END GenerateRecordOffsets;
  296. PROCEDURE GenerateCellOffsets(x: SyntaxTree.CellType): BOOLEAN;
  297. VAR baseType: SyntaxTree.Type; offset,size: LONGINT; alignment, thisAlignment: LONGINT; variable: SyntaxTree.Variable;
  298. parameter: SyntaxTree.Parameter; property: SyntaxTree.Property;
  299. BEGIN
  300. baseType := x.baseType;
  301. IF (baseType # NIL) THEN
  302. baseType := baseType.resolved;
  303. IF baseType IS SyntaxTree.PointerType THEN
  304. baseType := baseType(SyntaxTree.PointerType).pointerBase.resolved
  305. END;
  306. IF (baseType IS SyntaxTree.CellType) THEN
  307. IF~ GenerateCellOffsets(baseType(SyntaxTree.CellType)) THEN RETURN FALSE END;
  308. ELSE ASSERT (baseType IS SyntaxTree.RecordType);
  309. IF~GenerateRecordOffsets(baseType(SyntaxTree.RecordType)) THEN RETURN FALSE END;
  310. END;
  311. END;
  312. IF baseType # NIL THEN
  313. offset := baseType.sizeInBits;
  314. alignment := baseType.alignmentInBits;
  315. ELSE
  316. offset := 0; alignment := x.alignmentInBits;
  317. IF alignment <= 0 THEN alignment := dataUnit END;
  318. END;
  319. IF cellsAreObjects THEN
  320. (* ports *)
  321. parameter := x.cellScope.ownerCell.firstParameter;
  322. WHILE (parameter # NIL) DO
  323. size := SizeOf(parameter.type.resolved);
  324. IF size < 0 THEN RETURN FALSE END;
  325. IF parameter.alignment > 0 THEN
  326. thisAlignment := parameter.alignment*dataUnit;
  327. ELSE
  328. thisAlignment := AlignmentOf(SELF.variableAlignment, parameter.type.resolved);
  329. END;
  330. Basic.Align(offset, thisAlignment);
  331. IF thisAlignment > alignment THEN alignment := thisAlignment END;
  332. parameter.SetOffset(offset);
  333. INC(offset,size);
  334. parameter := parameter.nextParameter;
  335. END;
  336. (* properties *)
  337. property := x.cellScope.ownerCell.firstProperty;
  338. WHILE (property # NIL) DO
  339. size := SizeOf(property.type.resolved);
  340. IF size < 0 THEN RETURN FALSE END;
  341. IF property.alignment > 0 THEN
  342. thisAlignment := property.alignment*dataUnit;
  343. ELSE
  344. thisAlignment := AlignmentOf(SELF.variableAlignment, property.type.resolved);
  345. END;
  346. Basic.Align(offset, thisAlignment);
  347. IF thisAlignment > alignment THEN alignment := thisAlignment END;
  348. property.SetOffset(offset);
  349. INC(offset,size);
  350. property := property.nextProperty;
  351. END;
  352. END;
  353. (* variables *)
  354. variable := x.cellScope.firstVariable;
  355. WHILE (variable # NIL) DO
  356. IF ~variable.fictive THEN
  357. size := SizeOf(variable.type.resolved);
  358. IF size < 0 THEN RETURN FALSE END;
  359. IF variable.alignment > 0 THEN
  360. thisAlignment := variable.alignment*dataUnit;
  361. ELSE
  362. thisAlignment := AlignmentOf(SELF.variableAlignment, variable.type.resolved);
  363. END;
  364. Basic.Align(offset, thisAlignment);
  365. IF thisAlignment > alignment THEN alignment := thisAlignment END;
  366. variable.SetOffset(offset);
  367. INC(offset,size);
  368. END;
  369. variable := variable.nextVariable;
  370. END;
  371. x.SetAlignmentInBits(alignment);
  372. Basic.Align(offset, alignment); (* strictly speaking not necessary, but with the old object file format otherwise problems with the GC show up *)
  373. x.SetSize(offset);
  374. RETURN TRUE
  375. END GenerateCellOffsets;
  376. PROCEDURE GenerateVariableOffsets*(scope: SyntaxTree.Scope): BOOLEAN;
  377. VAR variable: SyntaxTree.Variable; offset,size: LONGINT; alignment: LONGINT;
  378. BEGIN
  379. IF scope IS SyntaxTree.RecordScope THEN (* increasing indices *)
  380. RETURN GenerateRecordOffsets(scope(SyntaxTree.RecordScope).ownerRecord)
  381. ELSIF scope IS SyntaxTree.CellScope THEN
  382. RETURN GenerateCellOffsets(scope(SyntaxTree.CellScope).ownerCell);
  383. ELSE (* module scope or procedure scope: decreasing indices *)
  384. ASSERT((scope IS SyntaxTree.ModuleScope) OR (scope IS SyntaxTree.ProcedureScope));
  385. offset := 0;
  386. variable := scope.firstVariable;
  387. WHILE (variable # NIL) DO
  388. IF (variable.externalName = NIL) & ~variable.fictive THEN
  389. size := SizeOf(variable.type.resolved);
  390. IF size < 0 THEN RETURN FALSE END;
  391. DEC(offset,size);
  392. IF variable.alignment > 0 THEN
  393. Basic.Align(offset, -variable.alignment*dataUnit);
  394. ELSE
  395. alignment := AlignmentOf(SELF.variableAlignment,variable.type.resolved);
  396. Basic.Align(offset,-alignment);
  397. END;
  398. variable.SetOffset(offset);
  399. END;
  400. variable := variable.nextVariable;
  401. END;
  402. END;
  403. RETURN TRUE
  404. END GenerateVariableOffsets;
  405. PROCEDURE GenerateParameterOffsets*(procedure : SyntaxTree.Procedure; nestedProcedure: BOOLEAN): BOOLEAN;
  406. VAR offset,size: LONGINT;parameter: SyntaxTree.Parameter; procedureType: SyntaxTree.ProcedureType;
  407. BEGIN
  408. procedureType := procedure.type(SyntaxTree.ProcedureType);
  409. IF (procedure.isInline) THEN
  410. offset := 0
  411. ELSE
  412. offset := SELF.offsetFirstParameter + procedureType.parametersOffset * addressSize;
  413. END;
  414. IF nestedProcedure THEN
  415. INC(offset,addressSize); (* parameter offset of static link *) (*! check alternative: add hidden parameter *)
  416. END;
  417. IF procedureType.callingConvention = SyntaxTree.OberonCallingConvention THEN
  418. parameter := procedureType.lastParameter;
  419. WHILE (parameter # NIL) DO
  420. Basic.Align(offset,addressSize);
  421. parameter.SetOffset(offset);
  422. size := SizeOfParameter(parameter);
  423. IF size < 0 THEN RETURN FALSE END;
  424. INC(offset,SizeOfParameter(parameter));
  425. parameter := parameter.prevParameter;
  426. END;
  427. parameter := procedureType.returnParameter;
  428. IF parameter # NIL THEN
  429. Basic.Align(offset,addressSize);
  430. parameter.SetOffset(offset);
  431. size := SizeOfParameter(parameter);
  432. IF size < 0 THEN RETURN FALSE END;
  433. INC(offset,SizeOfParameter(parameter));
  434. END;
  435. ELSE
  436. parameter := procedureType.firstParameter;
  437. WHILE (parameter # NIL) DO
  438. Basic.Align(offset,addressSize);
  439. parameter.SetOffset(offset);
  440. size := SizeOfParameter(parameter);
  441. IF size < 0 THEN RETURN FALSE END;
  442. INC(offset,size);
  443. parameter := parameter.nextParameter;
  444. END;
  445. END;
  446. IF (procedureType.isDelegate) THEN
  447. INC(offset,addressSize); (* parameter offset of delegate *)
  448. END;
  449. RETURN TRUE
  450. END GenerateParameterOffsets;
  451. PROCEDURE SizeOf*(type: SyntaxTree.Type): LONGINT;
  452. VAR size: LONGINT; base: SyntaxTree.Type;
  453. BEGIN
  454. IF type = NIL THEN RETURN -1 END;
  455. type := type.resolved;
  456. IF type IS SyntaxTree.BasicType THEN
  457. size := type.sizeInBits
  458. ELSIF type IS SyntaxTree.PointerType THEN
  459. size := addressSize
  460. ELSIF type IS SyntaxTree.ProcedureType THEN
  461. IF type(SyntaxTree.ProcedureType).isDelegate THEN
  462. size := 2*addressSize
  463. ELSE
  464. size := addressSize
  465. END;
  466. ELSIF type IS SyntaxTree.RecordType THEN
  467. (* do not treat a record type like a pointer even if the Pointer field is set, this leads to problems in object files
  468. rather make sure that each reference type is a POINTER TO at least behind the secenes!
  469. *)
  470. IF ~(SyntaxTree.Resolved IN type.state) THEN
  471. size := -1
  472. ELSE
  473. size :=type.sizeInBits;
  474. IF size < 0 THEN
  475. IF GenerateRecordOffsets(type(SyntaxTree.RecordType)) THEN
  476. size :=type.sizeInBits;
  477. ELSE
  478. size := -1
  479. END;
  480. END;
  481. END;
  482. ELSIF type IS SyntaxTree.ArrayType THEN
  483. IF ~(SyntaxTree.Resolved IN type.state) THEN
  484. size := -1
  485. ELSIF type.sizeInBits >= 0 THEN
  486. size := type.sizeInBits
  487. ELSIF type(SyntaxTree.ArrayType).form = SyntaxTree.Static THEN
  488. size := AlignedSizeOf(type(SyntaxTree.ArrayType).arrayBase.resolved)*type(SyntaxTree.ArrayType).staticLength;
  489. type.SetSize(size);
  490. ELSE
  491. size := 0; base := type;
  492. WHILE(base IS SyntaxTree.ArrayType) DO
  493. base := base(SyntaxTree.ArrayType).arrayBase.resolved;
  494. INC(size); (* length field *)
  495. END;
  496. size := size*addressSize+addressSize;
  497. type.SetSize(size)
  498. END;
  499. ELSIF type IS SyntaxTree.MathArrayType THEN
  500. IF ~(SyntaxTree.Resolved IN type.state) THEN
  501. size := -1
  502. ELSIF type(SyntaxTree.MathArrayType).form = SyntaxTree.Static THEN
  503. size := SizeOf(type(SyntaxTree.MathArrayType).arrayBase.resolved)*type(SyntaxTree.MathArrayType).staticLength
  504. ELSIF type(SyntaxTree.MathArrayType).form = SyntaxTree.Tensor THEN
  505. size := addressSize (* pointer to geometry descriptor *)
  506. ELSE
  507. size := 0;
  508. WHILE(type # NIL) & (type IS SyntaxTree.MathArrayType) DO
  509. type := type(SyntaxTree.MathArrayType).arrayBase;
  510. IF type # NIL THEN type := type.resolved END;
  511. INC(size);
  512. END;
  513. size := size*2*addressSize (* length and increments *) +5*addressSize (* data ptr, adr ptr, flags, dim and elementsize *);
  514. END;
  515. ELSIF type IS SyntaxTree.StringType THEN
  516. ASSERT(SyntaxTree.Resolved IN type.state);
  517. size := type(SyntaxTree.StringType).length * SizeOf(type(SyntaxTree.StringType).baseType);
  518. ELSIF type IS SyntaxTree.EnumerationType THEN
  519. size := addressSize
  520. ELSIF type = SyntaxTree.invalidType THEN size := 0
  521. ELSIF type IS SyntaxTree.QualifiedType THEN
  522. HALT(101); (* hint that unresolved type has been taken for type size computation *)
  523. ELSIF type IS SyntaxTree.PortType THEN
  524. size := addressSize
  525. ELSIF type IS SyntaxTree.CellType THEN
  526. size := addressSize;
  527. ELSIF type IS SyntaxTree.RangeType THEN
  528. size := 3 * SizeOf(longintType);
  529. ELSE
  530. HALT(100)
  531. END;
  532. RETURN size
  533. END SizeOf;
  534. PROCEDURE SizeOfParameter*(par: SyntaxTree.Parameter):LONGINT;
  535. BEGIN
  536. IF (par.type.resolved IS SyntaxTree.ArrayType) OR (par.type.resolved IS SyntaxTree.MathArrayType) THEN
  537. IF (par.type.resolved IS SyntaxTree.ArrayType) & (par.type.resolved(SyntaxTree.ArrayType).form = SyntaxTree.Static) &
  538. (par.kind IN {SyntaxTree.ConstParameter,SyntaxTree.VarParameter})
  539. OR
  540. (par.type.resolved IS SyntaxTree.MathArrayType) & (par.type.resolved(SyntaxTree.MathArrayType).form = SyntaxTree.Static) &
  541. (par.kind IN {SyntaxTree.ConstParameter,SyntaxTree.VarParameter})
  542. OR (par.type.resolved IS SyntaxTree.MathArrayType) & (par.kind = SyntaxTree.VarParameter)
  543. THEN
  544. RETURN addressSize
  545. ELSIF IsOberonProcedure(par.ownerType) THEN
  546. RETURN SizeOf(par.type);
  547. ELSE RETURN addressSize
  548. END
  549. ELSIF par.type.resolved IS SyntaxTree.RangeType THEN
  550. IF par.kind = SyntaxTree.VarParameter THEN
  551. RETURN addressSize
  552. ELSE
  553. RETURN SizeOf(rangeType) (* array range components are materialized on stack for both value and const parameters *)
  554. END
  555. ELSIF par.type.resolved IS SyntaxTree.RecordType THEN
  556. IF (par.kind IN {SyntaxTree.ConstParameter,SyntaxTree.VarParameter}) THEN
  557. IF IsOberonProcedure(par.ownerType) THEN
  558. RETURN 2*addressSize
  559. ELSE
  560. RETURN addressSize
  561. END
  562. ELSE
  563. RETURN SizeOf(par.type);
  564. END;
  565. ELSIF par.kind = SyntaxTree.VarParameter THEN
  566. RETURN addressSize
  567. ELSIF par.kind = SyntaxTree.ConstParameter THEN
  568. RETURN SizeOf(par.type)
  569. ELSE
  570. RETURN SizeOf(par.type);
  571. END;
  572. END SizeOfParameter;
  573. PROCEDURE AlignmentOf*(CONST alignment: Alignment;type: SyntaxTree.Type): LONGINT;
  574. VAR result: LONGINT;
  575. BEGIN
  576. type := type.resolved;
  577. IF type IS SyntaxTree.RecordType THEN
  578. IF type.alignmentInBits <= 0 THEN
  579. IF GenerateRecordOffsets(type(SyntaxTree.RecordType)) THEN
  580. result := type.alignmentInBits
  581. END
  582. ELSE
  583. result := type.alignmentInBits
  584. END;
  585. ELSIF type IS SyntaxTree.ArrayType THEN
  586. IF type.alignmentInBits <= 0 THEN
  587. IF type(SyntaxTree.ArrayType).form = SyntaxTree.Static THEN
  588. result := AlignmentOf(alignment,type(SyntaxTree.ArrayType).arrayBase.resolved);
  589. ELSE
  590. result := alignment.max
  591. END;
  592. type.SetAlignmentInBits(result)
  593. ELSE
  594. result := type.alignmentInBits
  595. END;
  596. ELSIF type IS SyntaxTree.StringType THEN
  597. result := SizeOf(type(SyntaxTree.StringType).baseType);
  598. ELSE
  599. result := SizeOf(type);
  600. IF result > alignment.max THEN result := alignment.max END;
  601. IF result < alignment.min THEN result := alignment.min END;
  602. END;
  603. ASSERT(result # 0);
  604. RETURN result
  605. END AlignmentOf;
  606. PROCEDURE AlignedSizeOf*(type: SyntaxTree.Type): LONGINT;
  607. VAR size: LONGINT;
  608. BEGIN
  609. size := SizeOf(type);
  610. Basic.Align(size, AlignmentOf(variableAlignment, type));
  611. RETURN size
  612. END AlignedSizeOf;
  613. (* LYNX+ *)
  614. PROCEDURE IsLynx*(): BOOLEAN;
  615. BEGIN
  616. RETURN TRUE;
  617. END IsLynx;
  618. (* -LYNX *)
  619. END System;
  620. PROCEDURE BuildScopes(system: System);
  621. VAR i: LONGINT;
  622. BEGIN
  623. FOR i := 0 TO end-1 DO
  624. system.operatorDefined[i] := FALSE
  625. END;
  626. system.globalScope[Scanner.Uppercase] := SyntaxTree.NewModuleScope();
  627. system.globalScope[Scanner.Lowercase] := SyntaxTree.NewModuleScope();
  628. system.globalModule[Scanner.Uppercase] := SyntaxTree.NewModule("",SyntaxTree.invalidPosition,SyntaxTree.NewIdentifier("@GLOBAL"),system.globalScope[Scanner.Uppercase],Scanner.Uppercase);
  629. system.globalModule[Scanner.Lowercase] := SyntaxTree.NewModule("",SyntaxTree.invalidPosition,SyntaxTree.NewIdentifier("@global"),system.globalScope[Scanner.Lowercase],Scanner.Lowercase);
  630. system.systemScope[Scanner.Uppercase] := SyntaxTree.NewModuleScope();
  631. system.systemScope[Scanner.Lowercase] := SyntaxTree.NewModuleScope();
  632. system.systemModule[Scanner.Uppercase] := SyntaxTree.NewModule("",SyntaxTree.invalidPosition,SystemName,system.systemScope[Scanner.Uppercase],Scanner.Uppercase);
  633. system.systemModule[Scanner.Lowercase] := SyntaxTree.NewModule("",SyntaxTree.invalidPosition,systemName,system.systemScope[Scanner.Lowercase],Scanner.Lowercase);
  634. END BuildScopes;
  635. PROCEDURE SetDefaultDeclarations*(system: System; minBits: LONGINT);
  636. VAR now: Dates.DateTime; date, time: ARRAY 20 OF CHAR;
  637. BEGIN
  638. (* types *)
  639. system.longintType := SyntaxTree.NewIntegerType(32, TRUE);
  640. system.hugeintType := SyntaxTree.NewIntegerType(64, TRUE);
  641. system.wordType := SyntaxTree.NewIntegerType(MIN(system.addressSize,32),TRUE);
  642. system.longWordType := SyntaxTree.NewIntegerType(system.addressSize,TRUE);
  643. system.realType := SyntaxTree.NewFloatType(32);
  644. system.longrealType := SyntaxTree.NewFloatType(64);
  645. (*
  646. system.longintType := Integer32;
  647. system.hugeintType := Integer64;
  648. system.realType := Float32;
  649. system.longrealType := Float64;
  650. *)
  651. IF minBits = 32 THEN
  652. system.shortintType := SyntaxTree.NewIntegerType(32, TRUE);
  653. system.integerType := SyntaxTree.NewIntegerType(32, TRUE);
  654. system.booleanType := SyntaxTree.NewBooleanType(32);
  655. system.byteType := SyntaxTree.NewByteType(32);
  656. system.characterType := SyntaxTree.NewCharacterType(32);
  657. system.characterType8 := SyntaxTree.NewCharacterType(32);
  658. system.characterType16 := SyntaxTree.NewCharacterType(32);
  659. system.characterType32 := SyntaxTree.NewCharacterType(32);
  660. (*
  661. system.shortintType := Integer32;
  662. system.integerType := Integer32;
  663. system.booleanType := Boolean32;
  664. system.byteType := Byte32;
  665. system.characterType := Character32;
  666. *)
  667. ELSE
  668. ASSERT(minBits = 8); (* nothing else is currently implemented *)
  669. system.shortintType := SyntaxTree.NewIntegerType(8, TRUE);
  670. system.integerType := SyntaxTree.NewIntegerType(16, TRUE);
  671. system.booleanType := SyntaxTree.NewBooleanType(8);
  672. system.byteType := SyntaxTree.NewByteType(8);
  673. system.characterType := SyntaxTree.NewCharacterType(8);;
  674. system.characterType8 := SyntaxTree.NewCharacterType(8);;
  675. system.characterType16 := SyntaxTree.NewCharacterType(16);;
  676. system.characterType32 := SyntaxTree.NewCharacterType(32);;
  677. (*
  678. system.shortintType := Integer8;
  679. system.integerType := Integer16;
  680. system.booleanType := Boolean8;
  681. system.byteType := Byte8;
  682. system.characterType := Character8;
  683. *)
  684. END;
  685. system.anyType := SyntaxTree.NewAnyType(system.addressSize);
  686. system.objectType := SyntaxTree.NewObjectType(system.addressSize);
  687. system.nilType := SyntaxTree.NewNilType(system.addressSize);
  688. system.addressType := SyntaxTree.NewAddressType(system.addressSize);
  689. system.sizeType := SyntaxTree.NewSizeType(system.addressSize);
  690. system.rangeType := SyntaxTree.NewRangeType(3 * system.SizeOf(system.longintType));
  691. system.complexType := Complex64;
  692. system.longcomplexType := Complex128;
  693. system.setType := SyntaxTree.NewSetType(system.addressSize);
  694. (* type declarations *)
  695. DeclareType(system.byteType,"BYTE",system.systemScope);
  696. DeclareType(system.addressType,"ADDRESS",system.globalScope);
  697. DeclareType(system.sizeType,"SIZE",system.globalScope);
  698. (*DeclareType(Same,"SAME",system.systemScope);*)
  699. (* system builtin procedures *)
  700. NewBuiltin(systemGet,"GET",system.systemScope,TRUE);
  701. NewBuiltin(systemPut,"PUT",system.systemScope,TRUE);
  702. NewBuiltin(systemPut64,"PUT64",system.systemScope,TRUE);
  703. NewBuiltin(systemPut32,"PUT32",system.systemScope,TRUE);
  704. NewBuiltin(systemPut16,"PUT16",system.systemScope,TRUE);
  705. NewBuiltin(systemPut8,"PUT8",system.systemScope,TRUE);
  706. NewBuiltin(systemGet64,"GET64",system.systemScope,TRUE);
  707. NewBuiltin(systemGet32,"GET32",system.systemScope,TRUE);
  708. NewBuiltin(systemGet16,"GET16",system.systemScope,TRUE);
  709. NewBuiltin(systemGet8,"GET8",system.systemScope,TRUE);
  710. NewBuiltin(systemVal,"VAL",system.systemScope,TRUE);
  711. NewBuiltin(systemMove,"MOVE",system.systemScope,TRUE);
  712. NewBuiltin(systemRef,"REF",system.systemScope,FALSE);
  713. NewBuiltin(systemNew,"NEW",system.systemScope,FALSE);
  714. NewBuiltin(systemTypeCode,"TYPECODE",system.systemScope,TRUE);
  715. NewBuiltin(systemHalt,"HALT",system.systemScope,TRUE);
  716. NewBuiltin(systemSize,"SIZE",system.systemScope,TRUE);
  717. NewBuiltin(systemAdr,"ADR",system.systemScope,TRUE);
  718. NewBuiltin(systemMsk,"MSK",system.systemScope,TRUE);
  719. NewBuiltin(systemBit,"BIT",system.systemScope,TRUE);
  720. now := Dates.Now ();
  721. Strings.FormatDateTime ("hh:nn:ss", now, time);
  722. Strings.FormatDateTime ("mmm dd yyyy", now, date);
  723. NewStringConstantCamelCase("Time", Strings.NewString (time), system.characterType, system.systemScope);
  724. NewStringConstantCamelCase("Date", Strings.NewString (date), system.characterType, system.systemScope);
  725. NewBuiltinCamelCase(systemGetStackPointer,"GetStackPointer",system.systemScope,TRUE);
  726. NewBuiltinCamelCase(systemSetStackPointer,"SetStackPointer",system.systemScope,TRUE);
  727. NewBuiltinCamelCase(systemGetFramePointer,"GetFramePointer",system.systemScope,TRUE);
  728. NewBuiltinCamelCase(systemSetFramePointer,"SetFramePointer",system.systemScope,TRUE);
  729. NewBuiltinCamelCase(systemGetActivity,"GetActivity",system.systemScope,TRUE);
  730. NewBuiltinCamelCase(systemSetActivity,"SetActivity",system.systemScope,TRUE);
  731. (* Set up system types *)
  732. DeclareType(system.characterType,"CHAR",system.globalScope);
  733. DeclareType(system.characterType8,"CHAR8",system.globalScope);
  734. DeclareType(system.characterType16,"CHAR16",system.globalScope);
  735. DeclareType(system.characterType32,"CHAR32",system.globalScope);
  736. DeclareType(system.rangeType,"RANGE",system.globalScope);
  737. DeclareType(system.shortintType,"SHORTINT",system.globalScope);
  738. DeclareType(system.integerType,"INTEGER",system.globalScope);
  739. DeclareType(system.longintType,"LONGINT",system.globalScope);
  740. DeclareType(system.hugeintType,"HUGEINT",system.globalScope);
  741. DeclareType(system.wordType,"WORD",system.globalScope);
  742. DeclareType(system.longWordType,"LONGWORD",system.globalScope);
  743. DeclareType(Integer8, "SIGNED8", system.globalScope);
  744. DeclareType(Integer16, "SIGNED16", system.globalScope);
  745. DeclareType(Integer32, "SIGNED32", system.globalScope);
  746. DeclareType(Integer64, "SIGNED64", system.globalScope);
  747. DeclareType(Unsigned8, "UNSIGNED8", system.globalScope);
  748. DeclareType(Unsigned16, "UNSIGNED16", system.globalScope);
  749. DeclareType(Unsigned32, "UNSIGNED32", system.globalScope);
  750. DeclareType(Unsigned64, "UNSIGNED64", system.globalScope);
  751. DeclareType(system.realType,"REAL",system.globalScope);
  752. DeclareType(system.longrealType,"LONGREAL",system.globalScope);
  753. DeclareType(system.complexType,"COMPLEX",system.globalScope);
  754. DeclareType(system.longcomplexType,"LONGCOMPLEX",system.globalScope);
  755. DeclareType(system.booleanType,"BOOLEAN",system.globalScope);
  756. DeclareType(system.setType,"SET",system.globalScope);
  757. DeclareType(system.anyType,"ANY",system.globalScope);
  758. DeclareType(system.objectType,"OBJECT",system.globalScope);
  759. (* global functions *)
  760. NewBuiltin(Abs,"ABS",system.globalScope,TRUE);
  761. NewBuiltin(Ash,"ASH",system.globalScope,TRUE);
  762. NewBuiltin(Asr,"ASR",system.globalScope,TRUE);
  763. NewBuiltin(Cap,"CAP",system.globalScope,TRUE);
  764. NewBuiltin(Chr,"CHR",system.globalScope,TRUE);
  765. NewBuiltin(Chr32,"CHR32",system.globalScope,TRUE);
  766. NewBuiltin(Entier,"ENTIER",system.globalScope,TRUE);
  767. NewBuiltin(Entier,"FLOOR",system.globalScope,TRUE);
  768. NewBuiltin(EntierH,"ENTIERH",system.globalScope,TRUE);
  769. NewBuiltin(Len,"LEN",system.globalScope,TRUE);
  770. NewBuiltin(Long,"LONG",system.globalScope,TRUE);
  771. NewBuiltin(Max,"MAX",system.globalScope,TRUE);
  772. NewBuiltin(Min,"MIN",system.globalScope,TRUE);
  773. NewBuiltin(Odd,"ODD",system.globalScope,TRUE);
  774. NewBuiltin(Ord,"ORD",system.globalScope,TRUE);
  775. NewBuiltin(Ord32,"ORD32",system.globalScope,TRUE);
  776. NewBuiltin(Lsh,"LSH",system.globalScope,TRUE);
  777. NewBuiltin(Lsh,"LSL",system.globalScope,TRUE);
  778. NewBuiltin(Rot,"ROT",system.globalScope,TRUE);
  779. NewBuiltin(Ror,"ROR",system.globalScope,TRUE);
  780. NewBuiltin(Incr,"INCR",system.globalScope,TRUE);
  781. NewBuiltin(Short,"SHORT",system.globalScope,TRUE);
  782. NewBuiltin(Sum,"SUM",system.globalScope,TRUE);
  783. NewBuiltin(Dim,"DIM",system.globalScope,TRUE);
  784. NewBuiltin(Cas,"CAS",system.globalScope,TRUE);
  785. NewBuiltin(First,"FIRST",system.globalScope,TRUE);
  786. NewBuiltin(Last,"LAST",system.globalScope,TRUE);
  787. NewBuiltin(Step,"STEP",system.globalScope,TRUE);
  788. NewBuiltin(Re,"RE",system.globalScope,TRUE);
  789. NewBuiltin(Im,"IM",system.globalScope,TRUE);
  790. NewBuiltin(systemAdr,"ADDRESSOF",system.globalScope,TRUE);
  791. NewBuiltin(systemSize,"SIZEOF",system.globalScope,TRUE);
  792. (* global proper procedures *)
  793. NewBuiltin(Assert,"ASSERT",system.globalScope,TRUE);
  794. NewBuiltin(Copy,"COPY",system.globalScope,TRUE);
  795. NewBuiltin(Dec,"DEC",system.globalScope,TRUE);
  796. NewBuiltin(Excl,"EXCL",system.globalScope,TRUE);
  797. NewBuiltin(Halt,"HALT",system.globalScope,TRUE);
  798. NewBuiltin(Inc,"INC",system.globalScope,TRUE);
  799. NewBuiltin(Incl,"INCL",system.globalScope,TRUE);
  800. NewBuiltin(New,"NEW",system.globalScope,FALSE);
  801. NewBuiltin(Dispose,"DISPOSE",system.globalScope, FALSE);
  802. NewBuiltin(GetProcedure,"GETPROCEDURE",system.globalScope,TRUE);
  803. NewBuiltin(systemTrace,"TRACE",system.globalScope,TRUE);
  804. NewBuiltin(Reshape,"RESHAPE",system.globalScope,TRUE);
  805. NewBuiltin(All,"ALL",system.globalScope,TRUE);
  806. NewBuiltin(Wait,"WAIT",system.globalScope,FALSE);
  807. NewBuiltin(Connect,"CONNECT",system.globalScope,FALSE);
  808. NewBuiltin(Receive,"RECEIVE",system.globalScope,FALSE);
  809. NewBuiltin(Send,"SEND",system.globalScope,FALSE);
  810. NewBuiltin(Delegate,"DELEGATE",system.globalScope,FALSE);
  811. (*!
  812. (* Following is LYNX version: *)
  813. IF minBits = 8 THEN
  814. system.characterType := Character16;
  815. END;
  816. (* LYNX builtin types *)
  817. DeclareLynxType(system.characterType, LynxChar, system.globalScope);
  818. DeclareLynxType(system.shortintType, LynxSbyte, system.globalScope);
  819. DeclareLynxType(system.integerType, LynxShort, system.globalScope);
  820. DeclareLynxType(system.longintType, LynxInt, system.globalScope);
  821. DeclareLynxType(system.hugeintType, LynxLong, system.globalScope);
  822. DeclareLynxType(system.realType, LynxFloat, system.globalScope);
  823. DeclareLynxType(system.longrealType, LynxDouble, system.globalScope);
  824. DeclareLynxType(system.booleanType, LynxBool, system.globalScope);
  825. (* TODO: object, string *)
  826. (* LYNX global functions *)
  827. NewBuiltin(SymLynxNewobj, LynxNewobj, system.globalScope, TRUE);
  828. NewBuiltin(SymLynxNewarr, LynxNewarr, system.globalScope, TRUE);
  829. NewBuiltin(SymLynxAsop, LynxAsop, system.globalScope, TRUE);
  830. NewBuiltin(SymLynxUnop, LynxUnop, system.globalScope, TRUE);
  831. NewBuiltin(SymLynxBinop, LynxBinop, system.globalScope, TRUE);
  832. NewBuiltin(SymLynxRecvnb, LynxRecvnb, system.globalScope, TRUE);
  833. (*
  834. LynxCompiler will register builtins for send/receive/connect/delegate
  835. under "lynx@*" names but with their original Fox numeric identifiers,
  836. so that no modifications will be required in the semantic checker and
  837. intermediate backend.
  838. *)
  839. NewBuiltin(SymLynxNewsel, LynxNewsel, system.globalScope, TRUE);
  840. NewBuiltin(SymLynxAddsel, LynxAddsel, system.globalScope, TRUE);
  841. NewBuiltin(SymLynxSelect, LynxSelect, system.globalScope, TRUE);
  842. NewBuiltin(SymLynxSelidx, LynxSelidx, system.globalScope, TRUE);
  843. *)
  844. END SetDefaultDeclarations;
  845. PROCEDURE OperatorDefined*(system: System; op: LONGINT; defined: BOOLEAN);
  846. BEGIN
  847. system.operatorDefined[op] := defined;
  848. END OperatorDefined;
  849. PROCEDURE SetDefaultOperators*(system: System);
  850. VAR i: LONGINT;
  851. BEGIN
  852. FOR i := Scanner.Equal TO Scanner.Not DO
  853. OperatorDefined(system,i,TRUE);
  854. END;
  855. OperatorDefined(system, Conversion, TRUE);
  856. OperatorDefined(system, DotTimesPlus, TRUE);
  857. OperatorDefined(system, AtMulDec, TRUE);
  858. OperatorDefined(system, AtMulInc, TRUE);
  859. OperatorDefined(system, DecMul, TRUE);
  860. OperatorDefined(system, IncMul, TRUE);
  861. OperatorDefined(system,Scanner.Transpose,TRUE);
  862. OperatorDefined(system,Scanner.Becomes,TRUE);
  863. OperatorDefined(system,Dec,TRUE);
  864. OperatorDefined(system,Excl,TRUE);
  865. OperatorDefined(system,Inc,TRUE);
  866. OperatorDefined(system,Incl,TRUE);
  867. OperatorDefined(system,Abs,TRUE);
  868. OperatorDefined(system,Ash,TRUE);
  869. OperatorDefined(system,Cap,TRUE);
  870. OperatorDefined(system,Chr,TRUE);
  871. OperatorDefined(system,Entier,TRUE);
  872. OperatorDefined(system,EntierH,TRUE);
  873. OperatorDefined(system,Len,TRUE);
  874. OperatorDefined(system,Long,TRUE);
  875. OperatorDefined(system,Max,TRUE);
  876. OperatorDefined(system,Min,TRUE);
  877. OperatorDefined(system,Odd,TRUE);
  878. OperatorDefined(system,Short,TRUE);
  879. OperatorDefined(system,Sum,TRUE);
  880. OperatorDefined(system,Dim,TRUE);
  881. OperatorDefined(system,Scanner.Address, TRUE);
  882. OperatorDefined(system,Scanner.Size, TRUE);
  883. OperatorDefined(system,Scanner.Alias, TRUE);
  884. OperatorDefined(system,All,TRUE);
  885. OperatorDefined(system, Scanner.Questionmarks, TRUE);
  886. OperatorDefined(system, Scanner.GreaterGreater, TRUE);
  887. OperatorDefined(system, Scanner.LessLess, TRUE);
  888. END SetDefaultOperators;
  889. PROCEDURE DefaultSystem*(): System;
  890. VAR system: System;
  891. BEGIN
  892. NEW(system,8,8,32, 8,32,32,32,64,FALSE);
  893. SetDefaultDeclarations(system,8);
  894. SetDefaultOperators(system);
  895. RETURN system
  896. END DefaultSystem;
  897. PROCEDURE IsOberonProcedure*(type: SyntaxTree.Type): BOOLEAN;
  898. BEGIN
  899. RETURN (type IS SyntaxTree.ProcedureType) & (type(SyntaxTree.ProcedureType).callingConvention = SyntaxTree.OberonCallingConvention)
  900. END IsOberonProcedure;
  901. PROCEDURE AlignedSizeOf*(system: System; CONST alignment: Alignment; type: SyntaxTree.Type):LONGINT;
  902. VAR value: LONGINT;
  903. BEGIN
  904. value := SHORT(system.SizeOf(type));
  905. INC(value, (-value) MOD system.AlignmentOf(alignment, type));
  906. RETURN value;
  907. END AlignedSizeOf;
  908. (* returns if a module is the system module *)
  909. PROCEDURE IsSystemModule*(module: SyntaxTree.Module): BOOLEAN;
  910. BEGIN RETURN (module.name=systemName) OR (module.name=SystemName)
  911. END IsSystemModule;
  912. (** Various factories *)
  913. PROCEDURE DeclareType0(type: SyntaxTree.Type; CONST name: ARRAY OF CHAR; in: SyntaxTree.Scope);
  914. VAR basic: SyntaxTree.TypeDeclaration; duplicate: BOOLEAN;
  915. BEGIN
  916. basic := SyntaxTree.NewTypeDeclaration(SyntaxTree.invalidPosition,SyntaxTree.NewIdentifier(name));
  917. basic.SetDeclaredType(type);
  918. basic.SetState(SyntaxTree.Resolved);
  919. basic.SetAccess(SyntaxTree.ReadOnly);
  920. in.AddTypeDeclaration(basic);
  921. in.EnterSymbol(basic,duplicate);
  922. ASSERT(~duplicate);
  923. END DeclareType0;
  924. (** External interface backends can use to add their types etc. to the global scope *)
  925. PROCEDURE DeclareType*(type: SyntaxTree.Type; CONST name: ARRAY OF CHAR; CONST scope: ARRAY OF SyntaxTree.ModuleScope);
  926. VAR nameL,nameU: Scanner.IdentifierString;
  927. BEGIN
  928. Basic.Lowercase(name,nameL);
  929. Basic.Uppercase(name,nameU);
  930. DeclareType0(type,nameU,scope[Scanner.Uppercase]);
  931. DeclareType0(type,nameL,scope[Scanner.Lowercase]);
  932. END DeclareType;
  933. (* LYNX+ *)
  934. PROCEDURE DeclareLynxType*(
  935. type: SyntaxTree.Type; CONST name: ARRAY OF CHAR; CONST scope: ARRAY OF SyntaxTree.ModuleScope);
  936. BEGIN
  937. DeclareType0(type, name, scope[Scanner.Uppercase]);
  938. DeclareType0(type, name, scope[Scanner.Lowercase]);
  939. END DeclareLynxType;
  940. (* -LYNX *)
  941. PROCEDURE NewConstant0(CONST name: ARRAY OF CHAR; int: LONGINT; type: SyntaxTree.Type; in: SyntaxTree.Scope);
  942. VAR constant: SyntaxTree.Constant; value: SyntaxTree.IntegerValue;duplicate: BOOLEAN;
  943. BEGIN
  944. value := SyntaxTree.NewIntegerValue(SyntaxTree.invalidPosition,int);
  945. value.SetType(type);
  946. constant := SyntaxTree.NewConstant(SyntaxTree.invalidPosition,SyntaxTree.NewIdentifier(name));
  947. constant.SetValue(value);
  948. constant.SetType(value.type);
  949. constant.SetAccess(SyntaxTree.ReadOnly);
  950. constant.SetState(SyntaxTree.Resolved);
  951. in.AddConstant(constant);
  952. in.EnterSymbol(constant,duplicate);
  953. ASSERT(~duplicate);
  954. END NewConstant0;
  955. PROCEDURE NewConstant*(CONST name: ARRAY OF CHAR; int: LONGINT; type: SyntaxTree.Type; CONST scope: ARRAY OF SyntaxTree.ModuleScope);
  956. VAR nameL,nameU: Scanner.IdentifierString;
  957. BEGIN
  958. Basic.Lowercase(name,nameL);
  959. Basic.Uppercase(name,nameU);
  960. NewConstant0(nameU,int,type,scope[Scanner.Uppercase]);
  961. NewConstant0(nameL,int,type,scope[Scanner.Lowercase]);
  962. END NewConstant;
  963. PROCEDURE NewStringConstant0(CONST name: ARRAY OF CHAR; string: SyntaxTree.String; baseType: SyntaxTree.Type; in: SyntaxTree.Scope);
  964. VAR constant: SyntaxTree.Constant; value: SyntaxTree.StringValue;duplicate: BOOLEAN;
  965. BEGIN
  966. value := SyntaxTree.NewStringValue(SyntaxTree.invalidPosition,string);
  967. value.SetType(SyntaxTree.NewStringType(SyntaxTree.invalidPosition,baseType,value.length));
  968. constant := SyntaxTree.NewConstant(SyntaxTree.invalidPosition,SyntaxTree.NewIdentifier(name));
  969. constant.SetValue(value);
  970. constant.SetType(value.type);
  971. constant.SetAccess(SyntaxTree.ReadOnly);
  972. constant.SetState(SyntaxTree.Resolved);
  973. in.AddConstant(constant);
  974. in.EnterSymbol(constant,duplicate);
  975. ASSERT(~duplicate);
  976. END NewStringConstant0;
  977. PROCEDURE NewStringConstant*(CONST name: ARRAY OF CHAR; string: SyntaxTree.String; type: SyntaxTree.Type; CONST scope: ARRAY OF SyntaxTree.ModuleScope);
  978. VAR nameL,nameU: Scanner.IdentifierString;
  979. BEGIN
  980. Basic.Lowercase(name,nameL);
  981. Basic.Uppercase(name,nameU);
  982. NewStringConstant0(nameU,string,type,scope[Scanner.Uppercase]);
  983. NewStringConstant0(nameL,string,type,scope[Scanner.Lowercase]);
  984. END NewStringConstant;
  985. PROCEDURE NewStringConstantCamelCase*(CONST name: ARRAY OF CHAR; string: SyntaxTree.String; type: SyntaxTree.Type; CONST scope: ARRAY OF SyntaxTree.ModuleScope);
  986. BEGIN
  987. NewStringConstant0(name,string,type,scope[Scanner.Uppercase]);
  988. NewStringConstant0(name,string,type,scope[Scanner.Lowercase]);
  989. END NewStringConstantCamelCase;
  990. PROCEDURE NewBuiltin0( id: LONGINT; CONST name: ARRAY OF CHAR; in: SyntaxTree.ModuleScope; realtime: BOOLEAN);
  991. VAR basic: SyntaxTree.Builtin; duplicate: BOOLEAN; type: SyntaxTree.ProcedureType;
  992. BEGIN
  993. basic := SyntaxTree.NewBuiltin(SyntaxTree.invalidPosition,SyntaxTree.NewIdentifier(name),id);
  994. basic.SetAccess(SyntaxTree.ReadOnly);
  995. type := SyntaxTree.NewProcedureType(SyntaxTree.invalidPosition,in);
  996. type.SetRealtime(realtime);
  997. type.SetReturnType(SyntaxTree.invalidType); (* make incompatible to any procedure *)
  998. basic.SetType(type);
  999. basic.SetState(SyntaxTree.Resolved);
  1000. in.EnterSymbol(basic,duplicate);
  1001. in.AddBuiltin(basic);
  1002. ASSERT(~duplicate);
  1003. END NewBuiltin0;
  1004. PROCEDURE NewBuiltin*(id: LONGINT; CONST name: ARRAY OF CHAR; CONST scope: ARRAY OF SyntaxTree.ModuleScope; realtime: BOOLEAN);
  1005. VAR nameL,nameU: Scanner.IdentifierString;
  1006. BEGIN
  1007. Basic.Lowercase(name,nameL);
  1008. Basic.Uppercase(name,nameU);
  1009. NewBuiltin0(id,nameU,scope[Scanner.Uppercase],realtime);
  1010. NewBuiltin0(id,nameL,scope[Scanner.Lowercase],realtime);
  1011. END NewBuiltin;
  1012. PROCEDURE NewBuiltinCamelCase*(id: LONGINT; CONST name: ARRAY OF CHAR; CONST scope: ARRAY OF SyntaxTree.ModuleScope; realtime: BOOLEAN);
  1013. BEGIN
  1014. NewBuiltin0(id,name,scope[Scanner.Uppercase],realtime);
  1015. NewBuiltin0(id,name,scope[Scanner.Lowercase],realtime);
  1016. END NewBuiltinCamelCase;
  1017. PROCEDURE NewCustomBuiltin0(CONST name: ARRAY OF CHAR; scope: SyntaxTree.ModuleScope; subType: SHORTINT; procedureType: SyntaxTree.ProcedureType);
  1018. VAR
  1019. isDuplicate: BOOLEAN;
  1020. customBuiltin: SyntaxTree.CustomBuiltin;
  1021. BEGIN
  1022. customBuiltin := SyntaxTree.NewCustomBuiltin(SyntaxTree.invalidPosition, SyntaxTree.NewIdentifier(name), systemSpecial, subType);
  1023. customBuiltin.SetAccess(SyntaxTree.ReadOnly); (* TODO: this might be changed *)
  1024. procedureType.SetRealtime(TRUE);
  1025. customBuiltin.SetType(procedureType); (* TODO: make incompatible to any procedure *)
  1026. customBuiltin.SetState(SyntaxTree.Resolved);
  1027. scope.EnterSymbol(customBuiltin, isDuplicate);
  1028. scope.AddBuiltin(customBuiltin);
  1029. ASSERT(~isDuplicate)
  1030. END NewCustomBuiltin0;
  1031. PROCEDURE NewCustomBuiltin*(CONST name: ARRAY OF CHAR; CONST scope: ARRAY OF SyntaxTree.ModuleScope; subType: SHORTINT; procedureType: SyntaxTree.ProcedureType);
  1032. VAR
  1033. nameL, nameU: Scanner.IdentifierString;
  1034. BEGIN
  1035. Basic.Lowercase(name, nameL);
  1036. Basic.Uppercase(name, nameU);
  1037. NewCustomBuiltin0(nameU, scope[Scanner.Uppercase], subType, procedureType);
  1038. NewCustomBuiltin0(nameL, scope[Scanner.Lowercase], subType, procedureType)
  1039. END NewCustomBuiltin;
  1040. PROCEDURE ModuleFileName*(moduleName,context: SyntaxTree.Identifier; VAR fileName: ARRAY OF CHAR);
  1041. VAR prefix,name: Scanner.IdentifierString;
  1042. BEGIN
  1043. Basic.GetString(moduleName,name);
  1044. IF (context = SyntaxTree.invalidIdentifier) OR (context = A2Name) THEN
  1045. COPY(name,fileName);
  1046. ELSE
  1047. ASSERT(context=OberonName);
  1048. Basic.GetString(context,prefix);
  1049. Basic.Concat(fileName,prefix,".",name);
  1050. END;
  1051. END ModuleFileName;
  1052. PROCEDURE ContextFromName*(CONST fileName: ARRAY OF CHAR; VAR module,context: SyntaxTree.Identifier);
  1053. VAR moduleName, contextName: Scanner.IdentifierString; i,j: LONGINT;
  1054. BEGIN
  1055. i := 0; j := 0;
  1056. WHILE (fileName[i] # 0X) & (fileName[i] # ".") DO
  1057. moduleName[i] := fileName[i];
  1058. INC(i);
  1059. END;
  1060. moduleName[i] := 0X;
  1061. IF fileName[i] # 0X THEN
  1062. COPY(moduleName, contextName);
  1063. INC(i);
  1064. WHILE(fileName[i] # 0X) DO
  1065. moduleName[j] := fileName[i];
  1066. INC(i); INC(j);
  1067. END;
  1068. moduleName[j] := 0X;
  1069. ELSE
  1070. contextName := "A2";
  1071. END;
  1072. module := SyntaxTree.NewIdentifier(moduleName);
  1073. context := SyntaxTree.NewIdentifier(contextName);
  1074. END ContextFromName;
  1075. PROCEDURE GetModuleName*(module: SyntaxTree.Module; VAR name: ARRAY OF CHAR);
  1076. VAR n: SyntaxTree.IdentifierString;
  1077. BEGIN
  1078. name := "";
  1079. IF module.context # SyntaxTree.invalidIdentifier THEN
  1080. Basic.GetString(module.context,n);
  1081. IF n# "A2" THEN Strings.Append(name,n);Strings.Append(name,".") END;
  1082. END;
  1083. module.GetName(n);
  1084. Strings.Append(name,n);
  1085. END GetModuleName;
  1086. PROCEDURE GetModuleSegmentedName*(module: SyntaxTree.Module; VAR name: Basic.SegmentedName);
  1087. BEGIN
  1088. Basic.InitSegmentedName(name);
  1089. IF (module.context # SyntaxTree.invalidIdentifier) & (module.context # A2Name) THEN
  1090. name[0] := module.context;
  1091. name[1] := module.name;
  1092. name[2] := -1;
  1093. ELSE
  1094. name[0] :=module.name;
  1095. name[1] := -1;
  1096. END;
  1097. END GetModuleSegmentedName;
  1098. PROCEDURE FindSymbol*(CONST name: Basic.SegmentedName; scope: SyntaxTree.Scope): SyntaxTree.Symbol;
  1099. VAR s: LONGINT; symbol : SyntaxTree.Symbol;
  1100. PROCEDURE GetSymbolScope;
  1101. VAR type: SyntaxTree.Type;
  1102. BEGIN
  1103. IF symbol IS SyntaxTree.Module THEN
  1104. scope := symbol(SyntaxTree.Module).moduleScope
  1105. ELSIF symbol IS SyntaxTree.Import THEN
  1106. scope := symbol(SyntaxTree.Import).module.moduleScope;
  1107. ELSIF symbol IS SyntaxTree.Procedure THEN
  1108. scope := symbol(SyntaxTree.Procedure).procedureScope
  1109. ELSIF symbol IS SyntaxTree.TypeDeclaration THEN
  1110. type := symbol(SyntaxTree.TypeDeclaration).declaredType.resolved;
  1111. IF type IS SyntaxTree.RecordType THEN
  1112. scope := type(SyntaxTree.RecordType).recordScope
  1113. END;
  1114. ELSE
  1115. scope := NIL
  1116. END
  1117. END GetSymbolScope;
  1118. PROCEDURE FindSymbol(name: SyntaxTree.Identifier): SyntaxTree.Symbol;
  1119. VAR symbols: SyntaxTree.Symbol;
  1120. BEGIN
  1121. IF scope = scope.ownerModule.moduleScope THEN
  1122. symbol := scope.ownerModule.moduleScope.ImportByModuleName(name, scope.ownerModule.context);
  1123. IF symbol = NIL THEN
  1124. symbol := scope.FindSymbol(name)
  1125. END;
  1126. ELSE
  1127. symbol := scope.FindSymbol(name)
  1128. END;
  1129. RETURN symbol
  1130. END FindSymbol;
  1131. BEGIN
  1132. s := 0;
  1133. IF name[0] = scope.ownerModule.name THEN
  1134. INC(s)
  1135. END;
  1136. scope := scope.ownerModule.moduleScope; (* expect fully qualified (segmented) name *)
  1137. REPEAT
  1138. IF scope = NIL THEN RETURN NIL END;
  1139. symbol := FindSymbol(name[s]);
  1140. IF symbol = NIL THEN RETURN NIL
  1141. ELSE
  1142. GetSymbolScope
  1143. END;
  1144. INC(s);
  1145. UNTIL (s = LEN(name)) OR (name[s] < 0);
  1146. RETURN symbol;
  1147. END FindSymbol;
  1148. PROCEDURE GetSymbolNameInScope*(symbol: SyntaxTree.Symbol; inScope: SyntaxTree.Scope; VAR name: ARRAY OF CHAR);
  1149. VAR n: SyntaxTree.IdentifierString; td: SyntaxTree.TypeDeclaration;
  1150. PROCEDURE Scope(scope: SyntaxTree.Scope);
  1151. BEGIN
  1152. IF scope = NIL THEN (* do nothing, locally declared temporary symbol *)
  1153. ELSIF scope = inScope THEN (* do not traverse further *)
  1154. ELSIF scope IS SyntaxTree.ModuleScope THEN
  1155. GetModuleName(scope.ownerModule, name);
  1156. Strings.Append(name,".");
  1157. ELSIF scope IS SyntaxTree.RecordScope THEN
  1158. Scope(scope.outerScope);
  1159. td := scope(SyntaxTree.RecordScope).ownerRecord.typeDeclaration;
  1160. IF td = NIL THEN
  1161. td := scope(SyntaxTree.RecordScope).ownerRecord.pointerType.typeDeclaration;
  1162. END;
  1163. td.GetName(n);
  1164. Strings.Append(name,n); Strings.Append(name,".")
  1165. ELSIF scope IS SyntaxTree.ProcedureScope THEN
  1166. Scope(scope.outerScope);
  1167. scope(SyntaxTree.ProcedureScope).ownerProcedure.GetName(n);
  1168. Strings.Append(name,n); Strings.Append(name,".")
  1169. ELSIF scope IS SyntaxTree.CellScope THEN
  1170. Scope(scope.outerScope);
  1171. td := scope(SyntaxTree.CellScope).ownerCell.typeDeclaration;
  1172. td.GetName(n);
  1173. Strings.Append(name,n); Strings.Append(name,".")
  1174. END;
  1175. END Scope;
  1176. BEGIN
  1177. name := "";
  1178. Scope(symbol.scope);
  1179. symbol.GetName(n);
  1180. IF symbol IS SyntaxTree.Operator THEN (*! append some more bits to make discrimintation possible *)
  1181. END;
  1182. Strings.Append(name,n);
  1183. END GetSymbolNameInScope;
  1184. PROCEDURE GetSymbolName*(symbol: SyntaxTree.Symbol; VAR name: ARRAY OF CHAR);
  1185. BEGIN GetSymbolNameInScope(symbol,NIL,name)
  1186. END GetSymbolName;
  1187. PROCEDURE GetSymbolSegmentedNameInScope*(symbol: SyntaxTree.Symbol; inScope: SyntaxTree.Scope; VAR pooledName: Basic.SegmentedName);
  1188. VAR n: SyntaxTree.String; td: SyntaxTree.TypeDeclaration; i: LONGINT;
  1189. PROCEDURE Scope(scope: SyntaxTree.Scope);
  1190. BEGIN
  1191. IF scope = NIL THEN (* do nothing, locally declared temporary symbol *)
  1192. ELSIF scope = inScope THEN (* do not traverse further *)
  1193. ELSIF scope IS SyntaxTree.ModuleScope THEN
  1194. IF scope(SyntaxTree.ModuleScope).ownerModule.context # A2Name THEN
  1195. Basic.SuffixSegmentedName(pooledName, scope(SyntaxTree.ModuleScope).ownerModule.context);
  1196. END;
  1197. Basic.SuffixSegmentedName(pooledName,scope.ownerModule.name);
  1198. ELSIF scope IS SyntaxTree.RecordScope THEN
  1199. Scope(scope.outerScope);
  1200. td := scope(SyntaxTree.RecordScope).ownerRecord.typeDeclaration;
  1201. IF td = NIL THEN
  1202. td := scope(SyntaxTree.RecordScope).ownerRecord.pointerType.typeDeclaration;
  1203. END;
  1204. Basic.SuffixSegmentedName(pooledName,td.name);
  1205. ELSIF scope IS SyntaxTree.ProcedureScope THEN
  1206. Scope(scope.outerScope);
  1207. Basic.SuffixSegmentedName(pooledName,scope(SyntaxTree.ProcedureScope).ownerProcedure.name);
  1208. ELSIF scope IS SyntaxTree.CellScope THEN
  1209. Scope(scope.outerScope);
  1210. td := scope(SyntaxTree.CellScope).ownerCell.typeDeclaration;
  1211. Basic.SuffixSegmentedName(pooledName, td.name);
  1212. END;
  1213. END Scope;
  1214. BEGIN
  1215. FOR i := 0 TO LEN(pooledName)-1 DO pooledName[i] := -1 END;
  1216. Scope(symbol.scope);
  1217. Basic.SuffixSegmentedName(pooledName, symbol.name);
  1218. END GetSymbolSegmentedNameInScope;
  1219. PROCEDURE GetSymbolSegmentedName*(symbol: SyntaxTree.Symbol; VAR pooledName: Basic.SegmentedName);
  1220. BEGIN
  1221. GetSymbolSegmentedNameInScope(symbol,NIL,pooledName);
  1222. END GetSymbolSegmentedName;
  1223. PROCEDURE Level*(t: SyntaxTree.Type): LONGINT;
  1224. VAR level: LONGINT;
  1225. BEGIN
  1226. IF t IS SyntaxTree.IntegerType THEN
  1227. CASE t.sizeInBits OF
  1228. 8: level := 0;
  1229. |16: level := 1;
  1230. |32: level := 2;
  1231. |64: level := 3;
  1232. END;
  1233. ELSIF t IS SyntaxTree.FloatType THEN
  1234. CASE t.sizeInBits OF
  1235. 32: level := 4;
  1236. |64: level := 5;
  1237. END
  1238. ELSE HALT(100)
  1239. END;
  1240. RETURN level
  1241. END Level;
  1242. PROCEDURE ConvertSigned*(this: HUGEINT; bits: LONGINT): HUGEINT;
  1243. BEGIN
  1244. bits := 64-bits;
  1245. RETURN ASH (ASH (this, bits), -bits);
  1246. END ConvertSigned;
  1247. PROCEDURE ConvertUnsigned*(this: HUGEINT; bits: LONGINT): HUGEINT;
  1248. BEGIN
  1249. bits := 64-bits;
  1250. RETURN LSH (LSH (this, bits), -bits);
  1251. END ConvertUnsigned;
  1252. PROCEDURE MaxInteger*(system: System; type: SyntaxTree.BasicType): HUGEINT;
  1253. BEGIN
  1254. RETURN ASH (HUGEINT(1), system.SizeOf (type) - 1) - 1;
  1255. END MaxInteger;
  1256. PROCEDURE MinInteger*(system: System; type: SyntaxTree.BasicType): HUGEINT;
  1257. BEGIN
  1258. RETURN -ASH (HUGEINT(1), system.SizeOf (type) - 1);
  1259. END MinInteger;
  1260. (*! make architecture independent ! *)
  1261. PROCEDURE MaxFloat*(system: System; type: SyntaxTree.FloatType): LONGREAL;
  1262. BEGIN
  1263. IF system.SizeOf(type) = 32 THEN RETURN MAX(REAL) ELSE RETURN MAX(LONGREAL) END;
  1264. END MaxFloat;
  1265. PROCEDURE MinFloat*(system: System; type: SyntaxTree.FloatType): LONGREAL;
  1266. BEGIN
  1267. IF system.SizeOf(type) = 32 THEN RETURN MIN(REAL) ELSE RETURN MIN(LONGREAL) END;
  1268. END MinFloat;
  1269. PROCEDURE IsUnsignedInteger*(this: HUGEINT; sizeInBits: LONGINT): BOOLEAN;
  1270. VAR m: HUGEINT;
  1271. BEGIN
  1272. m := ASH(HUGEINT(1),sizeInBits);
  1273. RETURN (this >= 0) & (this < m)
  1274. END IsUnsignedInteger;
  1275. PROCEDURE IsSignedInteger*(this: HUGEINT; sizeInBits: LONGINT): BOOLEAN;
  1276. VAR m: HUGEINT;
  1277. BEGIN
  1278. m := ASH(HUGEINT(1),sizeInBits-1);
  1279. RETURN (this < m) & (-this <= m)
  1280. END IsSignedInteger;
  1281. PROCEDURE GetSignedIntegerType*(system: System; this: HUGEINT): SyntaxTree.IntegerType;
  1282. (* code snippets for unsigned
  1283. ELSE
  1284. m := Runtime.AslH(1,system.SizeOf(type));
  1285. RETURN (this >= 0) & (this < m)
  1286. END;
  1287. PROCEDURE Bits(x: HUGEINT): BOOLEAN;
  1288. BEGIN
  1289. WHILE x > 0 DO INC(bits); x := x DIV 2 END;
  1290. END Bits;
  1291. IF a = MIN(HUGEINT) THEN (* -a does not work on lowest possible number, ~a+1 would overflow *)
  1292. RETURN Integer[64]
  1293. ELSIF a < 0 THEN
  1294. RETURN Integer[Bits(-a-1)+1]
  1295. ELSE
  1296. RETURN Unisgned[Bits(a)]
  1297. END;
  1298. *)
  1299. BEGIN
  1300. IF IsSignedInteger(this,8) THEN RETURN Integer8
  1301. ELSIF IsSignedInteger(this, 16) THEN RETURN Integer16
  1302. ELSIF IsSignedInteger(this, 32) THEN RETURN Integer32
  1303. ELSE RETURN Integer64
  1304. END;
  1305. END GetSignedIntegerType;
  1306. PROCEDURE GetIntegerType*(system: System; this: HUGEINT): SyntaxTree.IntegerType;
  1307. BEGIN
  1308. IF IsSignedInteger(this,8) THEN RETURN Integer8
  1309. (* system.SizeOf(...) = 8 : detect special backends with no sizes smaller than 32 *)
  1310. ELSIF (system.SizeOf(Unsigned8) = 8) & IsUnsignedInteger(this,8) THEN RETURN Unsigned8
  1311. ELSIF IsSignedInteger(this, 16) THEN RETURN Integer16
  1312. ELSIF (system.SizeOf(Unsigned16) = 16) & IsUnsignedInteger(this,16) THEN RETURN Unsigned16
  1313. ELSIF IsSignedInteger(this, 32) THEN RETURN Integer32
  1314. ELSIF IsUnsignedInteger(this,32) THEN RETURN Unsigned32
  1315. ELSE RETURN Integer64
  1316. END;
  1317. END GetIntegerType;
  1318. PROCEDURE NewIntegerValue*(system: System; position: Position; hugeint: HUGEINT): SyntaxTree.Value;
  1319. VAR value: SyntaxTree.IntegerValue;
  1320. BEGIN
  1321. value := SyntaxTree.NewIntegerValue(position,hugeint);
  1322. value.SetType(GetIntegerType(system,hugeint));
  1323. RETURN value
  1324. END NewIntegerValue;
  1325. PROCEDURE NewBooleanValue*(system: System; position: Position; b: BOOLEAN): SyntaxTree.Value;
  1326. VAR value: SyntaxTree.BooleanValue;
  1327. BEGIN
  1328. value := SyntaxTree.NewBooleanValue(position,b);
  1329. value.SetType(system.booleanType);
  1330. RETURN value
  1331. END NewBooleanValue;
  1332. PROCEDURE NewSetValue*(system: System; position: Position; s: SET): SyntaxTree.Value;
  1333. VAR value: SyntaxTree.SetValue;
  1334. BEGIN
  1335. value := SyntaxTree.NewSetValue(position,s);
  1336. value.SetType(system.setType);
  1337. RETURN value
  1338. END NewSetValue;
  1339. PROCEDURE NewCharacterValue*(system: System; position: Position; c: CHAR): SyntaxTree.Value;
  1340. VAR value: SyntaxTree.CharacterValue;
  1341. BEGIN
  1342. value := SyntaxTree.NewCharacterValue(position,c);
  1343. value.SetType(system.characterType);
  1344. RETURN value
  1345. END NewCharacterValue;
  1346. PROCEDURE NewNilValue*(system: System; position: Position): SyntaxTree.Value;
  1347. VAR value: SyntaxTree.NilValue;
  1348. BEGIN
  1349. value := SyntaxTree.NewNilValue(position);
  1350. value.SetType(system.anyType);
  1351. RETURN value
  1352. END NewNilValue;
  1353. (* distance for assignment to <- from *)
  1354. PROCEDURE BasicTypeDistance*(system: System; from, to: SyntaxTree.BasicType): LONGINT;
  1355. VAR fromSize, toSize, distance: LONGINT;
  1356. BEGIN
  1357. fromSize := system.SizeOf(from); toSize := system.SizeOf(to);
  1358. distance := -1;
  1359. IF (from IS SyntaxTree.IntegerType) & (to IS SyntaxTree.IntegerType) & (toSize >= fromSize) THEN
  1360. IF from(SyntaxTree.IntegerType).signed # to(SyntaxTree.IntegerType).signed THEN
  1361. IF (toSize=fromSize) & to(SyntaxTree.IntegerType).signed THEN
  1362. distance := MIN(LONGINT)
  1363. ELSE
  1364. INC(distance,2);
  1365. END;
  1366. END;
  1367. WHILE toSize >= fromSize DO
  1368. toSize := toSize DIV 2; INC(distance);
  1369. END;
  1370. ELSIF (from IS SyntaxTree.CharacterType) & (to IS SyntaxTree.CharacterType) & (toSize >= fromSize) OR
  1371. (from IS SyntaxTree.FloatType) & (to IS SyntaxTree.FloatType) & (toSize >= fromSize)
  1372. THEN
  1373. WHILE toSize >= fromSize DO
  1374. toSize := toSize DIV 2; INC(distance);
  1375. END;
  1376. ELSIF (from IS SyntaxTree.IntegerType) & (to IS SyntaxTree.FloatType) THEN
  1377. IF toSize = 64 THEN distance := 1 ELSE distance := 0 END;
  1378. toSize := 64;
  1379. WHILE toSize >= fromSize DO
  1380. toSize := toSize DIV 2; INC(distance);
  1381. END;
  1382. ELSIF (from IS SyntaxTree.RangeType) & (to IS SyntaxTree.RangeType) THEN
  1383. distance := 0;
  1384. ELSIF (from IS SyntaxTree.BooleanType) & (to IS SyntaxTree.BooleanType) THEN
  1385. distance := 0;
  1386. END;
  1387. IF distance < 0 THEN distance := MAX(LONGINT) END;
  1388. RETURN distance
  1389. END BasicTypeDistance;
  1390. PROCEDURE GetIdentifier*(symbol: LONGINT; case: LONGINT): SyntaxTree.Identifier;
  1391. BEGIN
  1392. IF (symbol >= 0) & (symbol < LEN(identifiers,1)) THEN
  1393. RETURN identifiers[case,symbol]
  1394. ELSE
  1395. RETURN SyntaxTree.invalidIdentifier
  1396. END;
  1397. END GetIdentifier;
  1398. PROCEDURE GetSymbol*(case: LONGINT; id: SyntaxTree.Identifier): LONGINT;
  1399. VAR i: LONGINT;
  1400. BEGIN
  1401. (*! quick and dirty implementation, optimize ! *)
  1402. FOR i := 0 TO LEN(identifiers,1)-1 DO
  1403. IF id=identifiers[case,i] THEN RETURN i END;
  1404. END;
  1405. RETURN -1
  1406. END GetSymbol;
  1407. PROCEDURE InitIdentifiers;
  1408. VAR i: LONGINT;
  1409. PROCEDURE NewKeywordIdentifier(op: LONGINT);
  1410. VAR id: Scanner.IdentifierType;
  1411. BEGIN
  1412. Scanner.GetKeyword(Scanner.Uppercase,op,id);
  1413. identifiers[Scanner.Uppercase,op] := id;
  1414. Scanner.GetKeyword(Scanner.Lowercase,op,id);
  1415. identifiers[Scanner.Lowercase,op] := id;
  1416. END NewKeywordIdentifier;
  1417. PROCEDURE NewBuiltinIdentifier(op: LONGINT; CONST name: ARRAY OF CHAR);
  1418. VAR nameL,nameU: Scanner.IdentifierString;
  1419. BEGIN
  1420. ASSERT(op < LEN(identifiers[0]));
  1421. Basic.Lowercase(name,nameL);
  1422. Basic.Uppercase(name,nameU);
  1423. identifiers[Scanner.Lowercase,op] := SyntaxTree.NewIdentifier(nameL);
  1424. identifiers[Scanner.Uppercase,op] := SyntaxTree.NewIdentifier(nameU);
  1425. END NewBuiltinIdentifier;
  1426. BEGIN
  1427. FOR i := 0 TO LEN(identifiers,1)-1 DO
  1428. identifiers[Scanner.Uppercase,i] := SyntaxTree.invalidIdentifier; identifiers[Scanner.Lowercase,i] := SyntaxTree.invalidIdentifier;
  1429. END;
  1430. FOR i := 0 TO Scanner.EndOfText-1 DO
  1431. NewKeywordIdentifier(i);
  1432. END;
  1433. NewBuiltinIdentifier(Abs,"ABS");
  1434. NewBuiltinIdentifier(Ash,"ASH");
  1435. NewBuiltinIdentifier(Asr,"ASR");
  1436. NewBuiltinIdentifier(Cap,"CAP");
  1437. NewBuiltinIdentifier(Chr,"CHR");
  1438. NewBuiltinIdentifier(Chr32,"CHR32");
  1439. NewBuiltinIdentifier(Entier,"ENTIER");
  1440. NewBuiltinIdentifier(EntierH,"ENTIERH");
  1441. NewBuiltinIdentifier(Len,"LEN");
  1442. NewBuiltinIdentifier(Long,"LONG");
  1443. NewBuiltinIdentifier(Lsh,"LSH");
  1444. NewBuiltinIdentifier(Max,"MAX");
  1445. NewBuiltinIdentifier(Min,"MIN");
  1446. NewBuiltinIdentifier(Odd,"ODD");
  1447. NewBuiltinIdentifier(Ord,"ORD");
  1448. NewBuiltinIdentifier(Ord32,"ORD32");
  1449. NewBuiltinIdentifier(Ror,"ROR");
  1450. NewBuiltinIdentifier(Rot,"ROT");
  1451. NewBuiltinIdentifier(Short,"SHORT");
  1452. NewBuiltinIdentifier(Sum,"SUM");
  1453. NewBuiltinIdentifier(Dim,"DIM");
  1454. NewBuiltinIdentifier(Cas,"CAS");
  1455. NewBuiltinIdentifier(Dec,"DEC");
  1456. NewBuiltinIdentifier(Excl,"EXCL");
  1457. NewBuiltinIdentifier(Inc,"INC");
  1458. NewBuiltinIdentifier(Incl,"INCL");
  1459. NewBuiltinIdentifier(All,"ALL");
  1460. (* TODO: check if ok. The operators defined in FoxArrayBase require the following identifiers *)
  1461. (* TODO: ".*+" should preferably be added as a new token in the scanner *)
  1462. identifiers[Scanner.Lowercase, Scanner.Becomes] := SyntaxTree.NewIdentifier(":=");
  1463. identifiers[Scanner.Uppercase, Scanner.Becomes] := SyntaxTree.NewIdentifier(":=");
  1464. identifiers[Scanner.Lowercase, Scanner.Transpose] := SyntaxTree.NewIdentifier("`");
  1465. identifiers[Scanner.Uppercase, Scanner.Transpose] := SyntaxTree.NewIdentifier("`");
  1466. identifiers[Scanner.Lowercase, DotTimesPlus] := SyntaxTree.NewIdentifier(".*+");
  1467. identifiers[Scanner.Uppercase, DotTimesPlus] := SyntaxTree.NewIdentifier(".*+");
  1468. identifiers[Scanner.Lowercase, AtMulDec] := SyntaxTree.NewIdentifier("@MulDec");
  1469. identifiers[Scanner.Uppercase, AtMulDec] := SyntaxTree.NewIdentifier("@MulDec");
  1470. identifiers[Scanner.Lowercase, AtMulInc] := SyntaxTree.NewIdentifier("@MulInc");
  1471. identifiers[Scanner.Uppercase, AtMulInc] := SyntaxTree.NewIdentifier("@MulInc");
  1472. identifiers[Scanner.Lowercase, DecMul] := SyntaxTree.NewIdentifier("DecMul");
  1473. identifiers[Scanner.Uppercase, DecMul] := SyntaxTree.NewIdentifier("DecMul");
  1474. identifiers[Scanner.Lowercase, IncMul] := SyntaxTree.NewIdentifier("IncMul");
  1475. identifiers[Scanner.Uppercase, IncMul] := SyntaxTree.NewIdentifier("IncMul");
  1476. identifiers[Scanner.Lowercase,Conversion] := SyntaxTree.NewIdentifier("@Convert");
  1477. identifiers[Scanner.Uppercase,Conversion] := SyntaxTree.NewIdentifier("@Convert");
  1478. END InitIdentifiers;
  1479. (** initialize the global namespace *)
  1480. PROCEDURE Init;
  1481. BEGIN
  1482. InitIdentifiers;
  1483. (* names are not arbitrary, do not change unless you know what you do (compatibilty with paco!) *)
  1484. SystemName := SyntaxTree.NewIdentifier("SYSTEM");
  1485. systemName := SyntaxTree.NewIdentifier("system");
  1486. SelfParameterName := SyntaxTree.NewIdentifier("@Self");
  1487. ReturnParameterName := SyntaxTree.NewIdentifier("@ReturnParameter");
  1488. PointerReturnName := SyntaxTree.NewIdentifier("@PtrReturnType");
  1489. ResultName := SyntaxTree.NewIdentifier("RESULT");
  1490. A2Name := SyntaxTree.NewIdentifier("A2");
  1491. OberonName := SyntaxTree.NewIdentifier("Oberon");
  1492. ArrayBaseName := SyntaxTree.NewIdentifier("FoxArrayBase");
  1493. RecordBodyName := SyntaxTree.NewIdentifier("@Body");
  1494. ModuleBodyName := SyntaxTree.NewIdentifier("@Body");
  1495. NameWinAPI := SyntaxTree.NewIdentifier(StringWinAPI);
  1496. NameC := SyntaxTree.NewIdentifier(StringC);
  1497. NameMovable := SyntaxTree.NewIdentifier(StringMovable);
  1498. NameUntraced := SyntaxTree.NewIdentifier(StringUntraced);
  1499. NameDelegate := SyntaxTree.NewIdentifier(StringDelegate);
  1500. NameInterrupt := SyntaxTree.NewIdentifier(StringInterrupt);
  1501. NamePcOffset := SyntaxTree.NewIdentifier(StringPcOffset);
  1502. NameNoPAF := SyntaxTree.NewIdentifier(StringNoPAF);
  1503. NameEntry := SyntaxTree.NewIdentifier(StringEntry);
  1504. NameExit := SyntaxTree.NewIdentifier(StringExit);
  1505. NameFixed := SyntaxTree.NewIdentifier(StringFixed);
  1506. NameFictive := SyntaxTree.NewIdentifier(StringFictive);
  1507. NameAligned := SyntaxTree.NewIdentifier(StringAligned);
  1508. NameStackAligned := SyntaxTree.NewIdentifier(StringAlignStack);
  1509. NameExclusive := SyntaxTree.NewIdentifier(StringExclusive);
  1510. NameActive := SyntaxTree.NewIdentifier(StringActive);
  1511. NamePriority := SyntaxTree.NewIdentifier(StringPriority);
  1512. NameSafe := SyntaxTree.NewIdentifier(StringSafe);
  1513. NameRealtime := SyntaxTree.NewIdentifier(StringRealtime);
  1514. NameDynamic := SyntaxTree.NewIdentifier(StringDynamic);
  1515. NameDataMemorySize := SyntaxTree.NewIdentifier(StringDataMemorySize);
  1516. NameCodeMemorySize := SyntaxTree.NewIdentifier(StringCodeMemorySize);
  1517. NameChannelWidth := SyntaxTree.NewIdentifier(StringChannelWidth);
  1518. NameChannelDepth := SyntaxTree.NewIdentifier(StringChannelDepth);
  1519. NameChannelModule := SyntaxTree.NewIdentifier(StringChannelModule);
  1520. NameVector := SyntaxTree.NewIdentifier(StringVector);
  1521. NameFloatingPoint := SyntaxTree.NewIdentifier(StringFloatingPoint);
  1522. NameNoMul:= SyntaxTree.NewIdentifier(StringNoMul);
  1523. NameNonBlockingIO:=SyntaxTree.NewIdentifier(StringNonBlockingIO);
  1524. NameTRM := SyntaxTree.NewIdentifier(StringTRM);
  1525. NameTRMS := SyntaxTree.NewIdentifier(StringTRMS);
  1526. NameBackend := SyntaxTree.NewIdentifier(StringBackend);
  1527. NameRuntime := SyntaxTree.NewIdentifier(StringRuntime);
  1528. NameEngine := SyntaxTree.NewIdentifier(StringEngine);
  1529. NameFinal := SyntaxTree.NewIdentifier(StringFinal);
  1530. NameAbstract := SyntaxTree.NewIdentifier(StringAbstract);
  1531. NameFrequencyDivider := SyntaxTree.NewIdentifier(StringFrequencyDivider);
  1532. NameRegister := SyntaxTree.NewIdentifier(StringRegister);
  1533. NameNoReturn := SyntaxTree.NewIdentifier(StringNoReturn);
  1534. NamePlain := SyntaxTree.NewIdentifier(StringPlain);
  1535. NameUnsafe := SyntaxTree.NewIdentifier(StringUnsafe);
  1536. NameDisposable := SyntaxTree.NewIdentifier(StringDisposable);
  1537. NameUnchecked := SyntaxTree.NewIdentifier(StringUnchecked);
  1538. NameUncooperative := SyntaxTree.NewIdentifier(StringUncooperative);
  1539. (* types *)
  1540. Boolean8 := SyntaxTree.NewBooleanType(8);
  1541. Boolean32 := SyntaxTree.NewBooleanType(32);
  1542. Integer8 := SyntaxTree.NewIntegerType(8, TRUE);
  1543. Integer16 := SyntaxTree.NewIntegerType(16, TRUE);
  1544. Integer32 := SyntaxTree.NewIntegerType(32, TRUE);
  1545. Integer64 := SyntaxTree.NewIntegerType(64, TRUE);
  1546. Unsigned8 := SyntaxTree.NewIntegerType(8, FALSE);
  1547. Unsigned16 := SyntaxTree.NewIntegerType(16, FALSE);
  1548. Unsigned32 := SyntaxTree.NewIntegerType(32, FALSE);
  1549. Unsigned64 := SyntaxTree.NewIntegerType(64, FALSE);
  1550. Float32 := SyntaxTree.NewFloatType(32);
  1551. Float64 := SyntaxTree.NewFloatType(64);
  1552. Complex64 := SyntaxTree.NewComplexType(Float32);
  1553. Complex128 := SyntaxTree.NewComplexType(Float64);
  1554. Byte8 := SyntaxTree.NewByteType(8);
  1555. Byte32 := SyntaxTree.NewByteType(32);
  1556. Character8 := SyntaxTree.NewCharacterType(8);
  1557. Character16 := SyntaxTree.NewCharacterType(16);
  1558. Character32 := SyntaxTree.NewCharacterType(32);
  1559. END Init;
  1560. BEGIN
  1561. Init;
  1562. END FoxGlobal.