Runtime.Mod 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. (* Generic runtime support *)
  2. (* Copyright (C) Florian Negele *)
  3. MODULE Runtime;
  4. IMPORT SYSTEM, BaseTypes, Trace;
  5. TYPE TrapHandler* = PROCEDURE (number: SIZE);
  6. VAR trapHandler*: TrapHandler;
  7. (** This procedure aborts the program and prints the number of the trap that caused the program to fail. *)
  8. (** The compiler calls this procedure for HALT statements or for unsatisfied ASSERT statements. *)
  9. PROCEDURE {NORETURN} Trap- (number: SIZE);
  10. PROCEDURE Abort EXTERN "Environment.Abort";
  11. BEGIN {UNCOOPERATIVE, UNCHECKED}
  12. IF trapHandler # NIL THEN
  13. trapHandler (number);
  14. ELSE
  15. Trace.Red; Trace.String ("trap: "); Trace.Int (number, 0); Trace.Ln;
  16. Trace.Default; Trace.StackFrames (1, 8, 20 * SIZE OF ADDRESS);
  17. END;
  18. Abort;
  19. END Trap;
  20. (** This procedure acquires memory and returns the address to the first byte or NIL if the allocation fails. *)
  21. (** The compiler implements all NEW statements with a call to this procedure. *)
  22. PROCEDURE New- (size: SIZE): ADDRESS;
  23. VAR result: ADDRESS; tries: SIZE;
  24. PROCEDURE CollectGarbage EXTERN "GarbageCollector.Collect";
  25. PROCEDURE Allocate EXTERN "Environment.Allocate" (size: SIZE): ADDRESS;
  26. BEGIN {UNCOOPERATIVE, UNCHECKED}
  27. FOR tries := 1 TO 10 DO
  28. result := Allocate (size);
  29. IF result # NIL THEN RETURN result END;
  30. CollectGarbage;
  31. END;
  32. RETURN NIL;
  33. END New;
  34. (** This procedure releases memory that was previously acquired by a call to the [[Runtime.New]] procedure. *)
  35. (** The compiler implements DISPOSE statements on types marked as disposable with a call to this procedure. *)
  36. PROCEDURE Dispose- (VAR pointer {UNTRACED}: BaseTypes.Pointer);
  37. PROCEDURE Deallocate EXTERN "Environment.Deallocate" (address: ADDRESS);
  38. PROCEDURE Watch EXTERN "GarbageCollector.Watch" (pointer {UNTRACED}: BaseTypes.Pointer);
  39. BEGIN {UNCOOPERATIVE, UNCHECKED}
  40. ASSERT (pointer # NIL);
  41. IF pointer IS BaseTypes.Object THEN pointer(BaseTypes.Object).Finalize END;
  42. IF (pointer IS BaseTypes.Pointer) & (pointer(BaseTypes.Pointer).nextWatched = NIL) THEN Watch (pointer(BaseTypes.Pointer));
  43. ELSE Deallocate (pointer) END; pointer := NIL;
  44. END Dispose;
  45. END Runtime.
  46. Runtime.Obw