primitives.scm 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey, Jonathan Rees, Marcus Crestani, Mike Sperber
  3. ; Alternate implementation of PRIMITIVES module.
  4. (define underlying-error error)
  5. (define (unspecific) (if #f #f))
  6. ; Records
  7. (define-record-type new-record :new-record
  8. (make-new-record fields)
  9. record?
  10. (fields new-record-fields))
  11. (define (make-record size init)
  12. (make-new-record (make-vector size init)))
  13. (define (record-ref r i)
  14. (vector-ref (new-record-fields r) i))
  15. (define (record-set! r i value)
  16. (vector-set! (new-record-fields r) i value))
  17. (define (record-length r)
  18. (vector-length (new-record-fields r)))
  19. ; Extended numbers
  20. (define-record-type new-extended-number :new-extended-number
  21. (make-new-extended-number fields)
  22. extended-number?
  23. (fields new-extended-number-fields))
  24. (define-record-discloser :new-extended-number
  25. (lambda (n) `(extended-number ,(new-extended-number-fields n))))
  26. (define (make-extended-number size init)
  27. (make-new-extended-number (make-vector size init)))
  28. (define (extended-number-ref n i)
  29. (vector-ref (new-extended-number-fields n) i))
  30. (define (extended-number-set! n i value)
  31. (vector-set! (new-extended-number-fields n) i value))
  32. (define (extended-number-length n)
  33. (vector-length (new-extended-number-fields n)))
  34. ; Current thread
  35. (define *current-thread* 'uninitialized-current-thread)
  36. (define (current-thread) *current-thread*)
  37. (define (set-current-thread! thread)
  38. (if (not (and (record? thread)
  39. (list? (record-ref thread 1))))
  40. (underlying-error "invalid current thread" thread))
  41. (set! *current-thread* thread))
  42. ; Etc.
  43. (define (close-port port)
  44. ((if (input-port? port) close-input-port close-output-port)
  45. port))
  46. (define (write-string s port)
  47. (display s port))
  48. (define (write-string-tail s start port)
  49. (display (substring s start (port))))
  50. (define (schedule-interrupt interval)
  51. (if (not (= interval 0))
  52. (warn "ignoring schedule-interrupt" interval)))
  53. (define *pseudo-enabled-interrupts* 0)
  54. (define (set-enabled-interrupts! ei)
  55. (let ((previous *pseudo-enabled-interrupts*))
  56. (set! *pseudo-enabled-interrupts* ei)
  57. ;; (if (bitwise-and *pseudo-pending-interrupts* ei) ...)
  58. previous))
  59. (define *pseudo-pending-interrupts* 0)
  60. (define *pseudo-exception-handlers* #f)
  61. (define (set-exception-handlers! h)
  62. (let ((old *pseudo-exception-handlers*))
  63. (set! *pseudo-exception-handlers* h)
  64. old))
  65. (define *pseudo-interrupt-handlers* #f)
  66. (define (set-interrupt-handlers! v)
  67. (let ((old *pseudo-interrupt-handlers*))
  68. (set! *pseudo-interrupt-handlers* v)
  69. old))
  70. (define (unimplemented name)
  71. (lambda args (underlying-error "unimplemented primitive" name args)))
  72. (define collect (unimplemented 'collect))
  73. (define call-external-value (unimplemented 'call-external-value))
  74. (define call-external-value-2 (unimplemented 'call-external-value-2))
  75. (define lookup-shared-binding (unimplemented 'lookup-shared-binding))
  76. (define define-shared-binding (unimplemented 'define-shared-binding))
  77. (define undefine-shared-binding (unimplemented 'undefine-shared-binding))
  78. (define (shared-binding? x) #f)
  79. (define make-shared-binding (unimplemented 'make-shared-binding))
  80. (define shared-binding-name (unimplemented 'shared-binding-name))
  81. (define shared-binding-is-import? (unimplemented 'shared-binding-is-import?))
  82. (define shared-binding-ref (unimplemented 'shared-binding-ref))
  83. (define shared-binding-set! (unimplemented 'shared-binding-set!))
  84. (define find-undefined-imported-bindings (unimplemented 'find-undefined-imported-bindings))
  85. (define find-all (unimplemented 'find-all))
  86. (define vm-extension (unimplemented 'vm-extension))
  87. (define (memory-status which arg)
  88. (case which
  89. ((2) 100)
  90. ((3) (display "(Ignoring set-minimum-recovered-space!)") (newline))
  91. (else (underlying-error "unimplemented memory-status" which arg))))
  92. (define (time which arg)
  93. (case which
  94. ((0) 1000)
  95. (else (underlying-error "unimplemented time" which arg))))
  96. ; end of definitions implementing PRIMITIVES structure
  97. ; --------------------
  98. ; Auxiliary crud.
  99. (define (maybe-handle-interrupt which)
  100. ;; Should actually do (get-highest-priority-interrupt!) ...
  101. (let ((bit (arithmetic-shift 1 which)))
  102. (cond ((= (bitwise-and *pseudo-enabled-interrupts* bit) 0)
  103. (set! *pseudo-pending-interrupts*
  104. (bitwise-ior *pseudo-pending-interrupts* bit))
  105. (display "(Interrupt deferred)")
  106. (newline)
  107. #f)
  108. (else
  109. (set! *pseudo-pending-interrupts*
  110. (bitwise-and *pseudo-pending-interrupts*
  111. (bitwise-not bit)))
  112. (display "(Handling interrupt)")
  113. (newline)
  114. ((vector-ref *pseudo-interrupt-handlers* which)
  115. (set-enabled-interrupts! 0))
  116. #t))))
  117. (define (raise-exception opcode exception arguments)
  118. (apply (vector-ref (get-exception-handlers) opcode)
  119. (cons exception arguments)))
  120. (define (get-exception-handlers)
  121. *pseudo-exception-handlers*)
  122. (define (clear-registers!)
  123. (set! *current-thread* 'uninitialized-current-thread)
  124. (set! *pseudo-enabled-interrupts* 0)
  125. (set! *pseudo-interrupt-handlers* #f)
  126. (set! *pseudo-exception-handlers* #f))
  127. (define *vm-return* #f)
  128. (define (vm-return . rest)
  129. (if *vm-return*
  130. (apply *vm-return* rest)
  131. (underlying-error "vm-return" rest)))
  132. (define (?start entry-point arg) ;E.g. (?start (usual-resumer bare #t) 0)
  133. (clear-registers!)
  134. (call-with-current-continuation
  135. (lambda (k)
  136. (set! *vm-return* k)
  137. (entry-point arg
  138. (current-input-port)
  139. (current-output-port)))))