This commit is contained in:
Justin Ethier 2016-07-14 23:31:03 -04:00
parent 11cb6579b3
commit c733e440d4

View file

@ -468,10 +468,19 @@
(not (adbv:reassigned? var)) (not (adbv:reassigned? var))
)))) ))))
(ast:lambda-formals->list (car exp))) (ast:lambda-formals->list (car exp)))
;; Check all args are valid primitives that can be inlined
(every (every
(lambda (arg) (lambda (arg)
(and (prim-call? arg) (and (prim-call? arg)
(not (prim:cont? (car arg))))) (not (prim:cont? (car arg)))
;; Disallow primitives that allocate a new obj,
;; because if the object is mutated all copies
;; must be modified.
;;
;; TODO: Technically this could be allowed if
;; there is only one reference of the variable
;(not (prim-creates-mutable-obj? (car arg)))
))
(cdr exp)) (cdr exp))
(inline-prim-call? (inline-prim-call?
(ast:lambda-body (car exp)) (ast:lambda-body (car exp))
@ -510,6 +519,16 @@
(else '()))) (else '())))
exps))) exps)))
;; Does the given primitive return a new instance of an object that
;; can be mutated?
;;
;; TODO: strings are a problem because there are
;; a lot of primitives that allocate them fresh!
(define (prim-creates-mutable-obj? prim)
(member
prim
'(cons make-vector make-bytevector)))
;; Find variables passed to a primitive ;; Find variables passed to a primitive
(define (prim-call->arg-variables exp) (define (prim-call->arg-variables exp)
(filter symbol? (cdr exp))) (filter symbol? (cdr exp)))