3253
3253
((and (pair? e) (eq? (car e) 'with-static-parameters )) (free-vars- (cadr e) tab))
3254
3254
((or (atom? e) (quoted? e)) tab)
3255
3255
((eq? (car e) 'lambda )
3256
- (let ((bound (lambda-all-vars e)))
3257
- (for-each (lambda (v ) (if (not (memq v bound)) (put! tab v #t )))
3256
+ (let ((bound (table)))
3257
+ (for-each (lambda (b ) (put! bound b #t )) (lambda-all-vars e))
3258
+ (for-each (lambda (v ) (if (not (has? bound v)) (put! tab v #t )))
3258
3259
(free-vars (lam:body e))))
3259
3260
tab)
3260
3261
(else
@@ -3472,13 +3473,13 @@ f(x) = yt(x)
3472
3473
3473
3474
(define (convert-lambda lam fname interp capt-sp opaq )
3474
3475
(let ((body (add-box-inits-to-body
3475
- lam (cl-convert (cadddr lam) fname lam (table) (table) #f interp opaq))))
3476
+ lam (cl-convert (cadddr lam) fname lam (table) (table) #f interp opaq (table) (vinfo-to-table ( car (lam:vinfo lam))) ))))
3476
3477
`(lambda ,(lam:args lam)
3477
3478
(,(clear-capture-bits (car (lam:vinfo lam)))
3478
3479
()
3479
3480
,(caddr (lam:vinfo lam))
3480
3481
,(delete-duplicates (append (lam:sp lam) capt-sp)))
3481
- ,body)))
3482
+ ,body)))
3482
3483
3483
3484
; ; renumber ssavalues assigned in an expr, allowing it to be repeated
3484
3485
(define (renumber-assigned-ssavalues e )
@@ -3539,10 +3540,10 @@ f(x) = yt(x)
3539
3540
; ; declared types.
3540
3541
; ; when doing this, the original value needs to be preserved, to
3541
3542
; ; ensure the expression `a=b` always returns exactly `b`.
3542
- (define (convert-assignment var rhs0 fname lam interp opaq globals )
3543
+ (define (convert-assignment var rhs0 fname lam interp opaq globals locals )
3543
3544
(cond
3544
3545
((symbol? var)
3545
- (let* ((vi (assq var ( car (lam:vinfo lam)) ))
3546
+ (let* ((vi (get locals var #f ))
3546
3547
(cv (assq var (cadr (lam:vinfo lam))))
3547
3548
(vt (or (and vi (vinfo:type vi))
3548
3549
(and cv (vinfo:type cv))
@@ -3559,7 +3560,7 @@ f(x) = yt(x)
3559
3560
(make-ssavalue)))
3560
3561
(rhs (if (equal? vt ' (core Any))
3561
3562
rhs1
3562
- (convert-for-type-decl rhs1 (cl-convert vt fname lam #f #f #f interp opaq))))
3563
+ (convert-for-type-decl rhs1 (cl-convert vt fname lam #f #f #f interp opaq (table) locals ))))
3563
3564
(ex (cond (closed `(call (core setfield!)
3564
3565
,(if interp
3565
3566
`($ ,var)
@@ -3678,8 +3679,9 @@ f(x) = yt(x)
3678
3679
const atomic null true false ssavalue isdefined toplevel module lambda
3679
3680
error gc_preserve_begin gc_preserve_end import using export inline noinline)))
3680
3681
3681
- (define (local-in? s lam )
3682
- (or (assq s (car (lam:vinfo lam)))
3682
+ (define (local-in? s lam (tab #f ))
3683
+ (or (and tab (has? tab s))
3684
+ (assq s (car (lam:vinfo lam)))
3683
3685
(assq s (cadr (lam:vinfo lam)))))
3684
3686
3685
3687
; ; Try to identify never-undef variables, and then clear the `captured` flag for single-assigned,
@@ -3834,17 +3836,17 @@ f(x) = yt(x)
3834
3836
(define (toplevel-preserving? e )
3835
3837
(and (pair? e) (memq (car e) ' (if elseif block trycatch tryfinally trycatchelse))))
3836
3838
3837
- (define (map-cl-convert exprs fname lam namemap defined toplevel interp opaq (globals (table)))
3839
+ (define (map-cl-convert exprs fname lam namemap defined toplevel interp opaq (globals (table)) (locals (table)) )
3838
3840
(if toplevel
3839
3841
(map (lambda (x )
3840
3842
(let ((tl (lift-toplevel (cl-convert x fname lam namemap defined
3841
3843
(and toplevel (toplevel-preserving? x))
3842
- interp opaq globals))))
3844
+ interp opaq globals locals ))))
3843
3845
(if (null? (cdr tl))
3844
3846
(car tl)
3845
3847
`(block ,@(cdr tl) ,(car tl)))))
3846
3848
exprs)
3847
- (map (lambda (x ) (cl-convert x fname lam namemap defined #f interp opaq globals)) exprs)))
3849
+ (map (lambda (x ) (cl-convert x fname lam namemap defined #f interp opaq globals locals )) exprs)))
3848
3850
3849
3851
(define (prepare-lambda! lam )
3850
3852
; ; mark all non-arguments as assigned, since locals that are never assigned
@@ -3853,11 +3855,11 @@ f(x) = yt(x)
3853
3855
(list-tail (car (lam:vinfo lam)) (length (lam:args lam))))
3854
3856
(lambda-optimize-vars! lam))
3855
3857
3856
- (define (cl-convert e fname lam namemap defined toplevel interp opaq (globals (table)))
3858
+ (define (cl-convert e fname lam namemap defined toplevel interp opaq (globals (table)) (locals (table)) )
3857
3859
(if (and (not lam)
3858
3860
(not (and (pair? e) (memq (car e) ' (lambda method macro opaque_closure)))))
3859
3861
(if (atom? e) e
3860
- (cons (car e) (map-cl-convert (cdr e) fname lam namemap defined toplevel interp opaq globals)))
3862
+ (cons (car e) (map-cl-convert (cdr e) fname lam namemap defined toplevel interp opaq globals locals )))
3861
3863
(cond
3862
3864
((symbol? e)
3863
3865
(define (new-undef-var name )
@@ -3876,12 +3878,12 @@ f(x) = yt(x)
3876
3878
(val (if (equal? typ ' (core Any))
3877
3879
val
3878
3880
`(call (core typeassert) ,val
3879
- ,(cl-convert typ fname lam namemap defined toplevel interp opaq globals)))))
3881
+ ,(cl-convert typ fname lam namemap defined toplevel interp opaq globals locals )))))
3880
3882
`(block
3881
3883
,@(if (eq? box access) '() `((= ,access ,box)))
3882
3884
,undefcheck
3883
3885
,val)))
3884
- (let ((vi (assq e ( car (lam:vinfo lam)) ))
3886
+ (let ((vi (get locals e #f ))
3885
3887
(cv (assq e (cadr (lam:vinfo lam)))))
3886
3888
(cond ((eq? e fname) e)
3887
3889
((memq e (lam:sp lam)) e)
@@ -3908,15 +3910,15 @@ f(x) = yt(x)
3908
3910
e)
3909
3911
((=)
3910
3912
(let ((var (cadr e))
3911
- (rhs (cl-convert (caddr e) fname lam namemap defined toplevel interp opaq globals)))
3912
- (convert-assignment var rhs fname lam interp opaq globals)))
3913
+ (rhs (cl-convert (caddr e) fname lam namemap defined toplevel interp opaq globals locals )))
3914
+ (convert-assignment var rhs fname lam interp opaq globals locals )))
3913
3915
((local-def) ; ; make new Box for local declaration of defined variable
3914
- (let ((vi (assq (cadr e) ( car (lam:vinfo lam)) )))
3916
+ (let ((vi (get locals (cadr e) #f )))
3915
3917
(if (and vi (vinfo:asgn vi) (vinfo:capt vi))
3916
3918
`(= ,(cadr e) (call (core Box)))
3917
3919
' (null))))
3918
3920
((local) ; ; convert local declarations to newvar statements
3919
- (let ((vi (assq (cadr e) ( car (lam:vinfo lam)) )))
3921
+ (let ((vi (get locals (cadr e) #f )))
3920
3922
(if (and vi (vinfo:asgn vi) (vinfo:capt vi))
3921
3923
`(= ,(cadr e) (call (core Box)))
3922
3924
(if (vinfo:never-undef vi)
@@ -3927,12 +3929,12 @@ f(x) = yt(x)
3927
3929
e)
3928
3930
((atomic) e)
3929
3931
((const-if-global)
3930
- (if (local-in? (cadr e) lam)
3932
+ (if (local-in? (cadr e) lam locals )
3931
3933
' (null)
3932
3934
`(const ,(cadr e))))
3933
3935
((isdefined) ; ; convert isdefined expr to function for closure converted variables
3934
3936
(let* ((sym (cadr e))
3935
- (vi (and (symbol? sym) (assq sym ( car (lam:vinfo lam)) )))
3937
+ (vi (and (symbol? sym) (get locals sym #f )))
3936
3938
(cv (and (symbol? sym) (assq sym (cadr (lam:vinfo lam))))))
3937
3939
(cond ((eq? sym fname) e)
3938
3940
((memq sym (lam:sp lam)) e)
@@ -3972,13 +3974,13 @@ f(x) = yt(x)
3972
3974
(lam2 (if short #f (cadddr e)))
3973
3975
(vis (if short ' (() () ()) (lam:vinfo lam2)))
3974
3976
(cvs (map car (cadr vis)))
3975
- (local? (lambda (s ) (and lam (symbol? s) (local-in? s lam))))
3977
+ (local? (lambda (s ) (and lam (symbol? s) (local-in? s lam locals ))))
3976
3978
(local (and (not (outerref? (cadr e))) (local? name)))
3977
3979
(sig (and (not short) (caddr e)))
3978
3980
(sp-inits (if (or short (not (eq? (car sig) 'block )))
3979
3981
'()
3980
3982
(map-cl-convert (butlast (cdr sig))
3981
- fname lam namemap defined toplevel interp opaq globals)))
3983
+ fname lam namemap defined toplevel interp opaq globals locals )))
3982
3984
(sig (and sig (if (eq? (car sig) 'block )
3983
3985
(last sig)
3984
3986
sig))))
@@ -4005,10 +4007,11 @@ f(x) = yt(x)
4005
4007
; ; anonymous functions with keyword args generate global
4006
4008
; ; functions that refer to the type of a local function
4007
4009
(rename-sig-types sig namemap)
4008
- fname lam namemap defined toplevel interp opaq globals)
4010
+ fname lam namemap defined toplevel interp opaq globals locals )
4009
4011
,(let ((body (add-box-inits-to-body
4010
4012
lam2
4011
- (cl-convert (cadddr lam2) 'anon lam2 (table) (table) #f interp opaq))))
4013
+ (cl-convert (cadddr lam2) 'anon lam2 (table) (table) #f interp opaq (table)
4014
+ (vinfo-to-table (car (lam:vinfo lam2)))))))
4012
4015
`(lambda ,(cadr lam2)
4013
4016
(,(clear-capture-bits (car vis))
4014
4017
,@(cdr vis))
@@ -4019,7 +4022,7 @@ f(x) = yt(x)
4019
4022
(newlam (compact-and-renumber (linearize (car exprs)) 'none 0 )))
4020
4023
`(toplevel-butfirst
4021
4024
(block ,@sp-inits
4022
- (method ,name ,(cl-convert sig fname lam namemap defined toplevel interp opaq globals)
4025
+ (method ,name ,(cl-convert sig fname lam namemap defined toplevel interp opaq globals locals )
4023
4026
,(julia-bq-macro newlam)))
4024
4027
,@top-stmts))))
4025
4028
@@ -4122,7 +4125,7 @@ f(x) = yt(x)
4122
4125
(append (map (lambda (gs tvar )
4123
4126
(make-assignment gs `(call (core TypeVar) ',tvar (core Any))))
4124
4127
closure-param-syms closure-param-names)
4125
- `((method #f ,(cl-convert arg-defs fname lam namemap defined toplevel interp opaq globals)
4128
+ `((method #f ,(cl-convert arg-defs fname lam namemap defined toplevel interp opaq globals locals )
4126
4129
,(convert-lambda lam2
4127
4130
(if iskw
4128
4131
(caddr (lam:args lam2))
@@ -4161,50 +4164,51 @@ f(x) = yt(x)
4161
4164
(begin
4162
4165
(put! defined name #t )
4163
4166
`(toplevel-butfirst
4164
- ,(convert-assignment name mk-closure fname lam interp opaq globals)
4167
+ ,(convert-assignment name mk-closure fname lam interp opaq globals locals )
4165
4168
,@typedef
4166
4169
,@(map (lambda (v ) `(moved-local ,v)) moved-vars)
4167
4170
,@sp-inits
4168
4171
,@mk-method))))))))
4169
4172
((lambda) ; ; happens inside (thunk ...) and generated function bodies
4170
4173
(for-each (lambda (vi ) (vinfo:set-asgn! vi #t ))
4171
4174
(list-tail (car (lam:vinfo e)) (length (lam:args e))))
4175
+ (lambda-optimize-vars! e)
4172
4176
(let ((body (map-cl-convert (cdr (lam:body e)) 'anon
4173
- (lambda-optimize-vars! e)
4177
+ e
4174
4178
(table)
4175
4179
(table)
4176
4180
(null? (cadr e)) ; ; only toplevel thunks have 0 args
4177
- interp opaq globals)))
4181
+ interp opaq globals (vinfo-to-table ( car (lam:vinfo e))) )))
4178
4182
`(lambda ,(cadr e)
4179
4183
(,(clear-capture-bits (car (lam:vinfo e)))
4180
4184
() ,@(cddr (lam:vinfo e)))
4181
4185
(block ,@body))))
4182
4186
; ; remaining `::` expressions are type assertions
4183
4187
((|::|)
4184
- (cl-convert `(call (core typeassert) ,@(cdr e)) fname lam namemap defined toplevel interp opaq globals))
4188
+ (cl-convert `(call (core typeassert) ,@(cdr e)) fname lam namemap defined toplevel interp opaq globals locals ))
4185
4189
; ; remaining `decl` expressions are only type assertions if the
4186
4190
; ; argument is global or a non-symbol.
4187
4191
((decl)
4188
4192
(cond ((and (symbol? (cadr e))
4189
- (local-in? (cadr e) lam))
4193
+ (local-in? (cadr e) lam locals ))
4190
4194
' (null))
4191
4195
(else
4192
4196
(cl-convert
4193
- (let ((ref (binding-to-globalref (cadr e))))
4194
- (if ref
4195
- (begin
4196
- (put! globals ref #t )
4197
- `(block
4198
- (toplevel-only set_binding_type! ,(cadr e))
4199
- (call (core set_binding_type!) ,(cadr ref) (inert ,(caddr ref)) ,(caddr e))))
4200
- `(call (core typeassert) ,@(cdr e))))
4201
- fname lam namemap defined toplevel interp opaq globals))))
4197
+ (let ((ref (binding-to-globalref (cadr e))))
4198
+ (if ref
4199
+ (begin
4200
+ (put! globals ref #t )
4201
+ `(block
4202
+ (toplevel-only set_binding_type! ,(cadr e))
4203
+ (call (core set_binding_type!) ,(cadr ref) (inert ,(caddr ref)) ,(caddr e))))
4204
+ `(call (core typeassert) ,@(cdr e))))
4205
+ fname lam namemap defined toplevel interp opaq globals locals ))))
4202
4206
; ; `with-static-parameters` expressions can be removed now; used only by analyze-vars
4203
4207
((with-static-parameters)
4204
- (cl-convert (cadr e) fname lam namemap defined toplevel interp opaq globals))
4208
+ (cl-convert (cadr e) fname lam namemap defined toplevel interp opaq globals locals ))
4205
4209
(else
4206
4210
(cons (car e)
4207
- (map-cl-convert (cdr e) fname lam namemap defined toplevel interp opaq globals))))))))
4211
+ (map-cl-convert (cdr e) fname lam namemap defined toplevel interp opaq globals locals ))))))))
4208
4212
4209
4213
(define (closure-convert e ) (cl-convert e #f #f (table) (table) #f #f #f ))
4210
4214
@@ -4248,6 +4252,7 @@ f(x) = yt(x)
4248
4252
(current-loc #f )
4249
4253
(rett #f )
4250
4254
(global-const-error #f )
4255
+ (vinfo-table (vinfo-to-table (car (lam:vinfo lam))))
4251
4256
(arg-map #f ) ; ; map arguments to new names if they are assigned
4252
4257
(label-counter 0 ) ; ; counter for generating label addresses
4253
4258
(label-map (table)) ; ; maps label names to generated addresses
@@ -4723,7 +4728,7 @@ f(x) = yt(x)
4723
4728
; ; avoid duplicate newvar nodes
4724
4729
(if (and (not (and (pair? code) (equal? (car code) e)))
4725
4730
; ; exclude deleted vars
4726
- (assq (cadr e) ( car (lam:vinfo lam) )))
4731
+ (has? vinfo-table (cadr e)))
4727
4732
(emit e)
4728
4733
#f ))
4729
4734
((global) ; keep global declarations as statements
0 commit comments