|
2379 | 2379 | ((=)
|
2380 | 2380 | (let ((vi (var-info-for (cadr e) env)))
|
2381 | 2381 | (if vi
|
2382 |
| - (begin |
2383 |
| - (if (vinfo:asgn vi) |
2384 |
| - (vinfo:set-sa! vi #f) |
2385 |
| - (vinfo:set-sa! vi #t)) |
2386 |
| - (vinfo:set-asgn! vi #t)))) |
| 2382 | + (begin (if (vinfo:asgn vi) |
| 2383 | + (vinfo:set-sa! vi #f) |
| 2384 | + (vinfo:set-sa! vi #t)) |
| 2385 | + (vinfo:set-asgn! vi #t)))) |
2387 | 2386 | (analyze-vars (caddr e) env captvars sp))
|
2388 | 2387 | ((call)
|
2389 | 2388 | (let ((vi (var-info-for (cadr e) env)))
|
|
2411 | 2410 | (analyze-vars-lambda (cadr e) env captvars sp
|
2412 | 2411 | (cddr e)))
|
2413 | 2412 | ((method)
|
2414 |
| - (let ((vi (var-info-for (method-expr-name e) env))) |
2415 |
| - (if vi |
2416 |
| - (begin (vinfo:set-asgn! vi #t) |
2417 |
| - ;; note: method defs require a memory loc. (issue #7658) |
2418 |
| - (vinfo:set-sa! vi #f)))) |
2419 | 2413 | (if (length= e 2)
|
2420 |
| - e |
| 2414 | + (let ((vi (var-info-for (method-expr-name e) env))) |
| 2415 | + (if vi |
| 2416 | + (begin (if (vinfo:asgn vi) |
| 2417 | + (vinfo:set-sa! vi #f) |
| 2418 | + (vinfo:set-sa! vi #t)) |
| 2419 | + (vinfo:set-asgn! vi #t))) |
| 2420 | + e) |
2421 | 2421 | (begin (analyze-vars (caddr e) env captvars sp)
|
2422 | 2422 | (assert (eq? (car (cadddr e)) 'lambda))
|
2423 | 2423 | (analyze-vars-lambda (cadddr e) env captvars sp
|
@@ -2586,6 +2586,8 @@ f(x) = yt(x)
|
2586 | 2586 | ;; clear capture bit for vars assigned once at the top, to avoid allocating
|
2587 | 2587 | ;; some unnecessary Boxes.
|
2588 | 2588 | (define (lambda-optimize-vars! lam)
|
| 2589 | + ;; flattening blocks helps us find more dominating statements |
| 2590 | + (set-car! (cdddr lam) (flatten-blocks (lam:body lam))) |
2589 | 2591 | (define (expr-uses-var ex v)
|
2590 | 2592 | (cond ((assignment? ex) (expr-contains-eq v (caddr ex)))
|
2591 | 2593 | ((eq? (car ex) 'method)
|
@@ -2835,8 +2837,6 @@ f(x) = yt(x)
|
2835 | 2837 | '(null)
|
2836 | 2838 | (convert-assignment name mk-closure fname lam interp)))))))
|
2837 | 2839 | ((lambda) ;; should only happen inside (thunk ...)
|
2838 |
| - ;; flattening blocks helps lambda-optimize-vars! work |
2839 |
| - (set-car! (cdddr e) (flatten-blocks (lam:body e))) |
2840 | 2840 | `(lambda ,(cadr e)
|
2841 | 2841 | (,(clear-capture-bits (car (lam:vinfo e)))
|
2842 | 2842 | () ,@(cddr (lam:vinfo e)))
|
|
0 commit comments