* Engine handler is functional.
This commit is contained in:
parent
3aa22ea200
commit
0af5f6cc2a
BIN
src/ikarus.boot
BIN
src/ikarus.boot
Binary file not shown.
|
@ -236,6 +236,7 @@
|
||||||
(define-record primcall (op arg*))
|
(define-record primcall (op arg*))
|
||||||
(define-record primref (name))
|
(define-record primref (name))
|
||||||
(define-record conditional (test conseq altern))
|
(define-record conditional (test conseq altern))
|
||||||
|
(define-record interrupt-call (test handler))
|
||||||
(define-record bind (lhs* rhs* body))
|
(define-record bind (lhs* rhs* body))
|
||||||
(define-record recbind (lhs* rhs* body))
|
(define-record recbind (lhs* rhs* body))
|
||||||
(define-record fix (lhs* rhs* body))
|
(define-record fix (lhs* rhs* body))
|
||||||
|
@ -386,6 +387,8 @@
|
||||||
[(primref x) x]
|
[(primref x) x]
|
||||||
[(conditional test conseq altern)
|
[(conditional test conseq altern)
|
||||||
`(if ,(E test) ,(E conseq) ,(E altern))]
|
`(if ,(E test) ,(E conseq) ,(E altern))]
|
||||||
|
[(interrupt-call e0 e1)
|
||||||
|
`(interrupt-call ,(E e0) ,(E e1))]
|
||||||
[(primcall op arg*) `(,op . ,(map E arg*))]
|
[(primcall op arg*) `(,op . ,(map E arg*))]
|
||||||
[(bind lhs* rhs* body)
|
[(bind lhs* rhs* body)
|
||||||
`(let ,(map (lambda (lhs rhs) (list (E lhs) (E rhs))) lhs* rhs*)
|
`(let ,(map (lambda (lhs rhs) (list (E lhs) (E rhs))) lhs* rhs*)
|
||||||
|
@ -2383,6 +2386,28 @@
|
||||||
(make-codes (map CodeExpr list) (Tail body))]))
|
(make-codes (map CodeExpr list) (Tail body))]))
|
||||||
(CodesExpr x))
|
(CodesExpr x))
|
||||||
|
|
||||||
|
|
||||||
|
(define (insert-engine-checks x)
|
||||||
|
(define (Tail x)
|
||||||
|
(make-seq
|
||||||
|
(make-interrupt-call
|
||||||
|
(make-primcall '$engine-check '())
|
||||||
|
(make-funcall (make-primref '$engine-expired) '()))
|
||||||
|
x))
|
||||||
|
(define (CaseExpr x)
|
||||||
|
(record-case x
|
||||||
|
[(clambda-case info body)
|
||||||
|
(make-clambda-case info (Tail body))]))
|
||||||
|
(define (CodeExpr x)
|
||||||
|
(record-case x
|
||||||
|
[(clambda L cases free)
|
||||||
|
(make-clambda L (map CaseExpr cases) free)]))
|
||||||
|
(define (CodesExpr x)
|
||||||
|
(record-case x
|
||||||
|
[(codes list body)
|
||||||
|
(make-codes (map CodeExpr list) (Tail body))]))
|
||||||
|
(CodesExpr x))
|
||||||
|
|
||||||
(define (remove-local-variables x)
|
(define (remove-local-variables x)
|
||||||
(define who 'remove-local-variables)
|
(define who 'remove-local-variables)
|
||||||
(define (Body orig-x orig-si orig-r orig-live save-cp?)
|
(define (Body orig-x orig-si orig-r orig-live save-cp?)
|
||||||
|
@ -2574,6 +2599,10 @@
|
||||||
(do-new-frame label op rand* si r 'direct 'effect live)]
|
(do-new-frame label op rand* si r 'direct 'effect live)]
|
||||||
[(appcall op rand*)
|
[(appcall op rand*)
|
||||||
(do-new-frame #f op rand* si r 'apply 'effect live)]
|
(do-new-frame #f op rand* si r 'apply 'effect live)]
|
||||||
|
[(interrupt-call e0 e1)
|
||||||
|
(make-interrupt-call
|
||||||
|
(Expr e0 si r live)
|
||||||
|
(Effect e1 si r live))]
|
||||||
[else (error who "invalid effect expression ~s" (unparse x))]))
|
[else (error who "invalid effect expression ~s" (unparse x))]))
|
||||||
(define (Expr x si r live)
|
(define (Expr x si r live)
|
||||||
(record-case x
|
(record-case x
|
||||||
|
@ -2741,6 +2770,11 @@
|
||||||
[(new-frame base-idx size body)
|
[(new-frame base-idx size body)
|
||||||
(let-values ([(body f) (NonTail body f)])
|
(let-values ([(body f) (NonTail body f)])
|
||||||
(values (make-new-frame base-idx size body) f))]
|
(values (make-new-frame base-idx size body) f))]
|
||||||
|
[(interrupt-call e0 e1) ;;; FIXME: suboptimal
|
||||||
|
(let-values ([(e0 f0) (NonTail e0 f)])
|
||||||
|
(let-values ([(e1 f1) (NonTail e1 f0)])
|
||||||
|
(values (make-interrupt-call e0 e1)
|
||||||
|
(min f0 f1))))]
|
||||||
[else (error who "invalid nontail expression ~s" (unparse x))]))
|
[else (error who "invalid nontail expression ~s" (unparse x))]))
|
||||||
(define CaseExpr
|
(define CaseExpr
|
||||||
(lambda (x)
|
(lambda (x)
|
||||||
|
@ -3202,6 +3236,9 @@
|
||||||
[else
|
[else
|
||||||
(error 'compile
|
(error 'compile
|
||||||
"BUG: second arg to $memq should be constant")])]
|
"BUG: second arg to $memq should be constant")])]
|
||||||
|
[($engine-check)
|
||||||
|
(list* (addl (int 1) (pcb-ref 'engine-counter))
|
||||||
|
(cond-branch 'je Lt Lf ac))]
|
||||||
[($vector-ref top-level-value car cdr $record-ref)
|
[($vector-ref top-level-value car cdr $record-ref)
|
||||||
(do-value-prim op rand*
|
(do-value-prim op rand*
|
||||||
(do-simple-test eax Lt Lf ac))]
|
(do-simple-test eax Lt Lf ac))]
|
||||||
|
@ -4346,6 +4383,15 @@
|
||||||
(Pred test Ljoin #f altern-ac)]
|
(Pred test Ljoin #f altern-ac)]
|
||||||
[else
|
[else
|
||||||
(Pred test #f Lf conseq-ac)]))]))]
|
(Pred test #f Lf conseq-ac)]))]))]
|
||||||
|
[(interrupt-call test handler)
|
||||||
|
(let ([Ljoin (unique-label)]
|
||||||
|
[Lint (unique-label)])
|
||||||
|
(let ([handler
|
||||||
|
(Effect handler
|
||||||
|
(list* (jmp Ljoin) '()))])
|
||||||
|
(add-handler! (cons Lint handler))
|
||||||
|
(Pred test Lint #f
|
||||||
|
(cons Ljoin ac))))]
|
||||||
[(seq e0 e1)
|
[(seq e0 e1)
|
||||||
(Effect e0 (Effect e1 ac))]
|
(Effect e0 (Effect e1 ac))]
|
||||||
[(fix lhs* rhs* body)
|
[(fix lhs* rhs* body)
|
||||||
|
@ -4821,6 +4867,7 @@
|
||||||
[p (simplify-operands p)]
|
[p (simplify-operands p)]
|
||||||
[p (insert-stack-overflow-checks p)]
|
[p (insert-stack-overflow-checks p)]
|
||||||
[p (insert-allocation-checks p)]
|
[p (insert-allocation-checks p)]
|
||||||
|
[p (insert-engine-checks p)]
|
||||||
[p (remove-local-variables p)]
|
[p (remove-local-variables p)]
|
||||||
[p (optimize-ap-check p)])
|
[p (optimize-ap-check p)])
|
||||||
(let ([ls* (generate-code p)])
|
(let ([ls* (generate-code p)])
|
||||||
|
|
|
@ -71,3 +71,8 @@
|
||||||
(primitive-set! 'fx+-overflow-error
|
(primitive-set! 'fx+-overflow-error
|
||||||
(lambda (x y)
|
(lambda (x y)
|
||||||
(error 'fx+ "overflow")))
|
(error 'fx+ "overflow")))
|
||||||
|
|
||||||
|
(primitive-set! '$engine-expired
|
||||||
|
(lambda ()
|
||||||
|
(display "Engine Expired\n" (console-output-port))))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue