Issue #293 - Added adbf:vars-mutated-by-set

This commit is contained in:
Justin Ethier 2019-01-17 13:24:16 -05:00
parent 7bbd70df22
commit 8cb0dd1b20

View file

@ -105,6 +105,8 @@
adbf:closure-size adbf:set-closure-size! adbf:closure-size adbf:set-closure-size!
adbf:self-closure-index adbf:set-self-closure-index! adbf:self-closure-index adbf:set-self-closure-index!
adbf:calls-self? adbf:set-calls-self! adbf:calls-self? adbf:set-calls-self!
adbf:vars-mutated-by-set
adbf:set-vars-mutated-by-set!
with-fnc with-fnc
with-fnc! with-fnc!
) )
@ -257,6 +259,7 @@
closure-size closure-size
self-closure-index self-closure-index
calls-self calls-self
vars-mutated-by-set
) )
adb:function? adb:function?
(simple adbf:simple adbf:set-simple!) (simple adbf:simple adbf:set-simple!)
@ -278,6 +281,8 @@
(self-closure-index adbf:self-closure-index adbf:set-self-closure-index!) (self-closure-index adbf:self-closure-index adbf:set-self-closure-index!)
;; Does this function call itself? ;; Does this function call itself?
(calls-self adbf:calls-self? adbf:set-calls-self!) (calls-self adbf:calls-self? adbf:set-calls-self!)
;; Variables this function mutates via (set!)
(vars-mutated-by-set adbf:vars-mutated-by-set adbf:set-vars-mutated-by-set!)
) )
(define (adb:make-fnc) (define (adb:make-fnc)
(%adb:make-fnc (%adb:make-fnc
@ -291,6 +296,7 @@
-1 ;; closure-size -1 ;; closure-size
-1 ;; self-closure-index -1 ;; self-closure-index
#f ;; calls-self #f ;; calls-self
'() ;; vars-mutated-by-set
)) ))
;; A constant value that cannot be mutated ;; A constant value that cannot be mutated
@ -560,7 +566,17 @@
(for-each (for-each
(lambda (expr) (lambda (expr)
(analyze expr scope-sym id)) (analyze expr scope-sym id))
(ast:lambda-body exp)))) (ast:lambda-body exp))
;; Keep track of mutations made by child lambda's
(when (> lid 0)
(with-fnc id (lambda (inner-fnc)
(let ((vars-set (adbf:vars-mutated-by-set inner-fnc)))
(when (pair? vars-set)
(with-fnc! lid (lambda (outer-fnc)
(adbf:set-vars-mutated-by-set!
outer-fnc
(append vars-set (adbf:vars-mutated-by-set outer-fnc))))))))))
))
((const? exp) #f) ((const? exp) #f)
((quote? exp) #f) ((quote? exp) #f)
((ref? exp) ((ref? exp)
@ -579,6 +595,11 @@
(adbv:set-const-value! var #f))) (adbv:set-const-value! var #f)))
(analyze (define->exp exp) (define->var exp) lid)) (analyze (define->exp exp) (define->var exp) lid))
((set!? exp) ((set!? exp)
(when (ref? (set!->var exp))
(with-fnc! lid (lambda (fnc)
(adbf:set-vars-mutated-by-set!
fnc
(cons (set!->var exp) (adbf:vars-mutated-by-set fnc))))))
;(let ((var (adb:get/default (set!->var exp) (adb:make-var)))) ;(let ((var (adb:get/default (set!->var exp) (adb:make-var))))
(with-var! (set!->var exp) (lambda (var) (with-var! (set!->var exp) (lambda (var)
(if (adbv:assigned-value var) (if (adbv:assigned-value var)