FoxInterpreterBackend.SymU 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. MODULE FoxInterpreterBackend;
  2. IMPORT Basic := FoxBasic, SYSTEM, Intermediate := FoxIntermediateCode, Sections := FoxSections, SyntaxTree := FoxSyntaxTree, Options, IntermediateBackend := FoxIntermediateBackend, Backend := FoxBackend, Global := FoxGlobal, Formats := FoxFormats, Trace := KernelLog, Streams, SymbolFileFormat := FoxTextualSymbolFile;
  3. CONST
  4. StackSize = 1024;
  5. AddressSize = SIZEOF(ADDRESS);
  6. TYPE
  7. PC = RECORD
  8. section: Intermediate.Section;
  9. index: LONGINT;
  10. END;
  11. Int1 = SHORTINT;
  12. Int2 = INTEGER;
  13. Int4 = LONGINT;
  14. Int8 = HUGEINT;
  15. Float4 = REAL;
  16. Float8 = LONGREAL;
  17. Value = RECORD
  18. int1: Int1;
  19. int2: Int2;
  20. int4: Int4;
  21. int8: Int8;
  22. float4: Float4;
  23. float8: Float8;
  24. END;
  25. Address = LONGINT;
  26. Size = LONGINT;
  27. Memory = POINTER TO ARRAY OF SYSTEM.BYTE;
  28. Heap = OBJECT
  29. VAR
  30. memory: Memory;
  31. currentSize: Size;
  32. PROCEDURE ^ & InitMemory;
  33. PROCEDURE ^ Allocate(size: Size): Address;
  34. PROCEDURE ^ IsValid(address: Address): BOOLEAN;
  35. PROCEDURE ^ GetObject(address: Address): OBJECT;
  36. PROCEDURE ^ PutObject(address: Address; object: OBJECT);
  37. PROCEDURE ^ GetValue(address: Address; CONST type: Intermediate.Type; VAR value: Value);
  38. PROCEDURE ^ PutValue(address: Address; CONST type: Intermediate.Type; CONST value: Value);
  39. PROCEDURE ^ Copy(dest, source, size: Address);
  40. PROCEDURE ^ Fill(dest, size: Address; CONST value: Value; CONST type: Intermediate.Type);
  41. END Heap;
  42. Interpreter = OBJECT
  43. VAR
  44. backend: InterpreterBackend;
  45. pc: PC;
  46. sp, fp: Address;
  47. registers: ARRAY 16 OF Value;
  48. addressType: Intermediate.Type;
  49. trace: Streams.Writer;
  50. module: Sections.Module;
  51. PROCEDURE ^ & InitInterpreter(backend: InterpreterBackend; addressSize: SHORTINT; m: Sections.Module);
  52. PROCEDURE ^ Dump(section: Intermediate.Section; address: Address; CONST instruction: Intermediate.Instruction);
  53. PROCEDURE ^ AllocateSection(s: Sections.Section);
  54. PROCEDURE ^ InitializeSection(s: Sections.Section);
  55. PROCEDURE ^ InitializeInstruction(VAR instruction: Intermediate.Instruction; address: Address; section: Intermediate.Section);
  56. PROCEDURE ^ Resolve(VAR op: Intermediate.Operand);
  57. PROCEDURE ^ Designate(VAR operand: Intermediate.Operand): Address;
  58. PROCEDURE ^ Evaluate(VAR operand: Intermediate.Operand; VAR value: Value);
  59. PROCEDURE ^ EvaluateAddress(VAR operand: Intermediate.Operand): Address;
  60. PROCEDURE ^ Store(VAR operand: Intermediate.Operand; CONST value: Value);
  61. PROCEDURE ^ CallSection(section: Intermediate.Section);
  62. PROCEDURE ^ Run;
  63. PROCEDURE ^ Stop;
  64. PROCEDURE ^ Error(CONST msg: ARRAY OF CHAR);
  65. PROCEDURE ^ Execute(VAR instr: Intermediate.Instruction; VAR pc: PC);
  66. PROCEDURE ^ Push(VAR operand: Intermediate.Operand);
  67. PROCEDURE ^ Pop(VAR operand: Intermediate.Operand);
  68. PROCEDURE ^ Branch(address: Address; VAR pc: PC);
  69. PROCEDURE ^ Call(address: Address; VAR pc: PC);
  70. PROCEDURE ^ Return(VAR pc: PC; size: Address);
  71. END Interpreter;
  72. InterpreterBackend = OBJECT (IntermediateBackend.IntermediateBackend)
  73. VAR
  74. heap: Heap;
  75. addressSize, setSize: LONGINT;
  76. PROCEDURE ^ & InitInterpreterBackend;
  77. PROCEDURE ^ GetSystem*(): Global.System;
  78. PROCEDURE ^ ProcessSyntaxTreeModule*(x: SyntaxTree.Module): Formats.GeneratedModule;
  79. PROCEDURE ^ DefineOptions*(options: Options.Options);
  80. PROCEDURE ^ GetOptions*(options: Options.Options);
  81. PROCEDURE ^ DefaultSymbolFileFormat*(): Formats.SymbolFileFormat;
  82. END InterpreterBackend;
  83. PROCEDURE ^ GetSizeOf(CONST instruction: Intermediate.Instruction): Size;
  84. PROCEDURE ^ SetInteger(VAR value: Value; CONST type: Intermediate.Type; integer: Int8);
  85. PROCEDURE ^ GetAddress(CONST value: Value; CONST type: Intermediate.Type): Address;
  86. PROCEDURE ^ SetFloat(VAR value: Value; CONST type: Intermediate.Type; float: Float8);
  87. PROCEDURE ^ Convert(VAR value: Value; CONST from, to: Intermediate.Type);
  88. PROCEDURE ^ Negate(VAR value: Value; CONST type: Intermediate.Type);
  89. PROCEDURE ^ Complement(VAR value: Value; CONST type: Intermediate.Type);
  90. PROCEDURE ^ Absolute(VAR value: Value; CONST type: Intermediate.Type);
  91. PROCEDURE ^ Multiply(VAR dest: Value; CONST source: Value; CONST type: Intermediate.Type);
  92. PROCEDURE ^ Divide(VAR dest: Value; CONST source: Value; CONST type: Intermediate.Type);
  93. PROCEDURE ^ Modulo(VAR dest: Value; CONST source: Value; CONST type: Intermediate.Type);
  94. PROCEDURE ^ Subtract(VAR dest: Value; CONST source: Value; CONST type: Intermediate.Type);
  95. PROCEDURE ^ Add(VAR dest: Value; CONST source: Value; CONST type: Intermediate.Type);
  96. PROCEDURE ^ And(VAR dest: Value; CONST source: Value; CONST type: Intermediate.Type);
  97. PROCEDURE ^ Or(VAR dest: Value; CONST source: Value; CONST type: Intermediate.Type);
  98. PROCEDURE ^ Xor(VAR dest: Value; CONST source: Value; CONST type: Intermediate.Type);
  99. PROCEDURE ^ ShiftLeft(VAR dest: Value; CONST source: Value; CONST type: Intermediate.Type);
  100. PROCEDURE ^ ShiftRight(VAR dest: Value; CONST source: Value; CONST type: Intermediate.Type);
  101. PROCEDURE ^ RotateLeft(VAR dest: Value; CONST source: Value; CONST type: Intermediate.Type);
  102. PROCEDURE ^ RotateRight(VAR dest: Value; CONST source: Value; CONST type: Intermediate.Type);
  103. PROCEDURE ^ IsEqual(CONST value1, value2: Value; CONST type: Intermediate.Type): BOOLEAN;
  104. PROCEDURE ^ IsLessThan(CONST value1, value2: Value; CONST type: Intermediate.Type): BOOLEAN;
  105. PROCEDURE ^ Traverse(list: Sections.SectionList; handle: PROCEDURE {DELEGATE}(section: Sections.Section));
  106. PROCEDURE ^ Get*(): Backend.Backend;
  107. BEGIN
  108. END FoxInterpreterBackend.