mirror of
https://github.com/justinethier/cyclone.git
synced 2025-05-24 20:45:06 +02:00
Allow inlines if a var is passed to a continuation
This commit is contained in:
parent
72c1bb9bea
commit
93f87ac4c3
1 changed files with 6 additions and 1 deletions
|
@ -1081,6 +1081,7 @@
|
||||||
((and (not (prim? (car exp)))
|
((and (not (prim? (car exp)))
|
||||||
(ref? (car exp)))
|
(ref? (car exp)))
|
||||||
(define pure-fnc #f)
|
(define pure-fnc #f)
|
||||||
|
(define calling-cont #f)
|
||||||
(define ref-formals '())
|
(define ref-formals '())
|
||||||
;; Does ref refer to a pure function (no side effects)?
|
;; Does ref refer to a pure function (no side effects)?
|
||||||
(let ((var (adb:get/default (car exp) #f)))
|
(let ((var (adb:get/default (car exp) #f)))
|
||||||
|
@ -1096,6 +1097,10 @@
|
||||||
(with-fnc! (ast:lambda-id assigned-val) (lambda (fnc)
|
(with-fnc! (ast:lambda-id assigned-val) (lambda (fnc)
|
||||||
(if (not (adbf:side-effects fnc))
|
(if (not (adbf:side-effects fnc))
|
||||||
(set! pure-fnc #t)))))
|
(set! pure-fnc #t)))))
|
||||||
|
;; Experimental - if a cont, execution will leave fnc anyway,
|
||||||
|
;; so inlines there should be safe
|
||||||
|
((adbv:cont? var)
|
||||||
|
(set! calling-cont #t))
|
||||||
))))
|
))))
|
||||||
;;
|
;;
|
||||||
(with-var (car exp) (lambda (var)
|
(with-var (car exp) (lambda (var)
|
||||||
|
@ -1110,7 +1115,7 @@
|
||||||
))))
|
))))
|
||||||
;(trace:error `(DEBUG ref app ,(car exp) ,(cdr exp) ,ref-formals))
|
;(trace:error `(DEBUG ref app ,(car exp) ,(cdr exp) ,ref-formals))
|
||||||
(cond
|
(cond
|
||||||
(pure-fnc
|
((or pure-fnc calling-cont)
|
||||||
(for-each
|
(for-each
|
||||||
(lambda (e)
|
(lambda (e)
|
||||||
;; Skip refs since fnc is pure and cannot change them
|
;; Skip refs since fnc is pure and cannot change them
|
||||||
|
|
Loading…
Add table
Reference in a new issue