mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-11 14:21:10 +02:00
compile ecmascript's `return' as an abort
* module/language/ecmascript/compile-tree-il.scm (current-return-tag): (with-return-prompt, comp): Compile `return' as an abort instead of a primcall to `return'. Fixes beta-reduction by the optimizer -- it doesn't make sense for `return' to move from one function to another!
This commit is contained in:
parent
21b83fb795
commit
c0cfa9ef07
1 changed files with 24 additions and 3 deletions
|
@ -70,6 +70,26 @@
|
||||||
(set-source-properties! res (location x))))
|
(set-source-properties! res (location x))))
|
||||||
res)))
|
res)))
|
||||||
|
|
||||||
|
(define current-return-tag (make-parameter #f))
|
||||||
|
|
||||||
|
(define (return expr)
|
||||||
|
(-> (abort (or (current-return-tag) (error "return outside function"))
|
||||||
|
(list expr)
|
||||||
|
(-> (const '())))))
|
||||||
|
|
||||||
|
(define (with-return-prompt body-thunk)
|
||||||
|
(let ((tag (gensym "return")))
|
||||||
|
(parameterize ((current-return-tag
|
||||||
|
(-> (lexical 'return tag))))
|
||||||
|
(-> (let '(return) (list tag)
|
||||||
|
(list (-> (apply (-> (primitive 'make-prompt-tag)))))
|
||||||
|
(-> (prompt (current-return-tag)
|
||||||
|
(body-thunk)
|
||||||
|
(let ((val (gensym "val")))
|
||||||
|
(-> (lambda-case
|
||||||
|
`(((k val) #f #f #f () (,(gensym) ,val))
|
||||||
|
,(-> (lexical 'val val)))))))))))))
|
||||||
|
|
||||||
(define (comp x e)
|
(define (comp x e)
|
||||||
(let ((l (location x)))
|
(let ((l (location x)))
|
||||||
(define (let1 what proc)
|
(define (let1 what proc)
|
||||||
|
@ -330,7 +350,9 @@
|
||||||
`(lambda ()
|
`(lambda ()
|
||||||
(lambda-case
|
(lambda-case
|
||||||
((() ,formals #f #f ,(map (lambda (x) (@implv *undefined*)) formals) ,syms)
|
((() ,formals #f #f ,(map (lambda (x) (@implv *undefined*)) formals) ,syms)
|
||||||
,(comp-body e body formals syms))))))
|
,(with-return-prompt
|
||||||
|
(lambda ()
|
||||||
|
(comp-body e body formals syms))))))))
|
||||||
((call/this ,obj ,prop . ,args)
|
((call/this ,obj ,prop . ,args)
|
||||||
(@impl call/this*
|
(@impl call/this*
|
||||||
obj
|
obj
|
||||||
|
@ -352,8 +374,7 @@
|
||||||
`(apply ,(comp proc e)
|
`(apply ,(comp proc e)
|
||||||
,@(map (lambda (x) (comp x e)) args)))
|
,@(map (lambda (x) (comp x e)) args)))
|
||||||
((return ,expr)
|
((return ,expr)
|
||||||
(-> (apply (-> (primitive 'return))
|
(return (comp expr e)))
|
||||||
(comp expr e))))
|
|
||||||
((array . ,args)
|
((array . ,args)
|
||||||
`(apply ,(@implv new-array)
|
`(apply ,(@implv new-array)
|
||||||
,@(map (lambda (x) (comp x e)) args)))
|
,@(map (lambda (x) (comp x e)) args)))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue