mirror of
https://github.com/justinethier/cyclone.git
synced 2025-05-24 04:25:06 +02:00
Issue #172 - Allow inline but check for (set!)'s first
This commit is contained in:
parent
b50d7360e0
commit
915ae74fe1
1 changed files with 22 additions and 6 deletions
|
@ -54,6 +54,8 @@
|
||||||
adbv:set-global!
|
adbv:set-global!
|
||||||
adbv:defined-by
|
adbv:defined-by
|
||||||
adbv:set-defined-by!
|
adbv:set-defined-by!
|
||||||
|
adbv:mutated-by-set?
|
||||||
|
adbv:set-mutated-by-set!
|
||||||
adbv:reassigned?
|
adbv:reassigned?
|
||||||
adbv:set-reassigned!
|
adbv:set-reassigned!
|
||||||
adbv:assigned-value
|
adbv:assigned-value
|
||||||
|
@ -131,6 +133,7 @@
|
||||||
defines-lambda-id
|
defines-lambda-id
|
||||||
const const-value
|
const const-value
|
||||||
ref-count ref-by
|
ref-count ref-by
|
||||||
|
mutated-by-set
|
||||||
reassigned assigned-value
|
reassigned assigned-value
|
||||||
app-fnc-count app-arg-count
|
app-fnc-count app-arg-count
|
||||||
inlinable mutated-indirectly
|
inlinable mutated-indirectly
|
||||||
|
@ -148,6 +151,7 @@
|
||||||
(const-value adbv:const-value adbv:set-const-value!)
|
(const-value adbv:const-value adbv:set-const-value!)
|
||||||
(ref-count adbv:ref-count adbv:set-ref-count!)
|
(ref-count adbv:ref-count adbv:set-ref-count!)
|
||||||
(ref-by adbv:ref-by adbv:set-ref-by!)
|
(ref-by adbv:ref-by adbv:set-ref-by!)
|
||||||
|
(mutated-by-set adbv:mutated-by-set? adbv:set-mutated-by-set!)
|
||||||
;; TODO: need to set reassigned flag if variable is SET, however there is at least
|
;; TODO: need to set reassigned flag if variable is SET, however there is at least
|
||||||
;; one exception for local define's, which are initialized to #f and then assigned
|
;; one exception for local define's, which are initialized to #f and then assigned
|
||||||
;; a single time via set
|
;; a single time via set
|
||||||
|
@ -205,6 +209,7 @@
|
||||||
#f ; const-value
|
#f ; const-value
|
||||||
0 ; ref-count
|
0 ; ref-count
|
||||||
'() ; ref-by
|
'() ; ref-by
|
||||||
|
#f ; mutated-by-set
|
||||||
#f ; reassigned
|
#f ; reassigned
|
||||||
#f ; assigned-value
|
#f ; assigned-value
|
||||||
0 ; app-fnc-count
|
0 ; app-fnc-count
|
||||||
|
@ -556,6 +561,7 @@
|
||||||
(with-var! (set!->var exp) (lambda (var)
|
(with-var! (set!->var exp) (lambda (var)
|
||||||
(if (adbv:assigned-value var)
|
(if (adbv:assigned-value var)
|
||||||
(adbv:set-reassigned! var #t))
|
(adbv:set-reassigned! var #t))
|
||||||
|
(adbv:set-mutated-by-set! var #t)
|
||||||
(adbv-set-assigned-value-helper! (set!->var exp) var (set!->exp exp))
|
(adbv-set-assigned-value-helper! (set!->var exp) var (set!->exp exp))
|
||||||
(adbv:set-ref-count! var (+ 1 (adbv:ref-count var)))
|
(adbv:set-ref-count! var (+ 1 (adbv:ref-count var)))
|
||||||
(adbv:set-ref-by! var (cons lid (adbv:ref-by var)))
|
(adbv:set-ref-by! var (cons lid (adbv:ref-by var)))
|
||||||
|
@ -989,11 +995,7 @@
|
||||||
(cdr exp)
|
(cdr exp)
|
||||||
(ast:lambda-formals->list (car exp)))
|
(ast:lambda-formals->list (car exp)))
|
||||||
(or
|
(or
|
||||||
; Issue #172 - Cannot assume that just because a primitive
|
(prim-calls-inlinable? (cdr exp))
|
||||||
; deals with immutable objects that it is safe to inline.
|
|
||||||
; A (set!) could still mutate variables the primitive is
|
|
||||||
; using, causing invalid behavior.
|
|
||||||
;(prim-calls-inlinable? (cdr exp))
|
|
||||||
|
|
||||||
;; Testing - every arg only used once
|
;; Testing - every arg only used once
|
||||||
;(and
|
;(and
|
||||||
|
@ -1166,7 +1168,21 @@
|
||||||
(define (prim-calls-inlinable? prim-calls)
|
(define (prim-calls-inlinable? prim-calls)
|
||||||
(every
|
(every
|
||||||
(lambda (prim-call)
|
(lambda (prim-call)
|
||||||
(prim:immutable-args/result? (car prim-call)))
|
(and
|
||||||
|
(prim:immutable-args/result? (car prim-call))
|
||||||
|
; Issue #172 - Cannot assume that just because a primitive
|
||||||
|
; deals with immutable objects that it is safe to inline.
|
||||||
|
; A (set!) could still mutate variables the primitive is
|
||||||
|
; using, causing invalid behavior.
|
||||||
|
;
|
||||||
|
; So, make sure none of the args is mutated via (set!)
|
||||||
|
(every
|
||||||
|
(lambda (arg)
|
||||||
|
(or (not (ref? arg))
|
||||||
|
(with-var arg (lambda (var)
|
||||||
|
(not (adbv:mutated-by-set? var))))))
|
||||||
|
(cdr prim-call)))
|
||||||
|
)
|
||||||
prim-calls))
|
prim-calls))
|
||||||
|
|
||||||
;; Check each pair of primitive call / corresponding lambda arg,
|
;; Check each pair of primitive call / corresponding lambda arg,
|
||||||
|
|
Loading…
Add table
Reference in a new issue