vm-exception.scm 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. ; -*- Mode: Scheme; Syntax: Scheme; Package: Scheme; -*-
  2. ; Copyright (c) 1993-2008 by Richard Kelsey and Jonathan Rees. See file COPYING.
  3. ; A VM exception is an unusual situation detected by the virtual machine.
  4. ; Usual exception handler vector.
  5. (define (define-vm-exception-handler opcode proc)
  6. (vector-set! vm-exception-handlers opcode proc))
  7. (define signal-condition (unspecific))
  8. (define (signal-vm-exception opcode reason . args)
  9. (signal-condition (make-vm-exception opcode
  10. (if reason
  11. (enumerand->name reason exception)
  12. #f)
  13. args)))
  14. (define vm-exception-handlers
  15. (make-vector op-count signal-vm-exception))
  16. (define (initialize-vm-exceptions! the-signal-condition)
  17. (set! signal-condition the-signal-condition)
  18. (set-exception-handlers! vm-exception-handlers))
  19. ; TRAP is the same as SIGNAL-CONDITION.
  20. (define-vm-exception-handler (enum op trap)
  21. (lambda (opcode reason arg)
  22. (signal-condition arg)))
  23. ; The time opcode sometimes needs a little help.
  24. (define-vm-exception-handler (enum op time)
  25. (lambda (opcode reason option arg0 . maybe-arg1)
  26. (if (= reason (enum exception arithmetic-overflow))
  27. (+ (* arg0 1000) ; seconds
  28. (car maybe-arg1)) ; milliseconds
  29. (apply signal-vm-exception opcode reason option arg0 maybe-arg1))))
  30. ; This is for generic arithmetic, mostly
  31. (define (extend-opcode! opcode make-handler)
  32. (let* ((except (lambda args
  33. (apply signal-vm-exception
  34. opcode
  35. #f ; lost our reason
  36. args)))
  37. (handler (make-handler except)))
  38. (define-vm-exception-handler opcode
  39. (lambda (opcode reason . args)
  40. (apply handler args)))))