fix interference of unboxing inference for different arguments
This commit is contained in:
parent
77163fe8d1
commit
f24b91a1cc
|
@ -872,6 +872,7 @@
|
|||
[t2 (get-output-bytes s2)])
|
||||
(or (bytes=? t1 t2)
|
||||
(begin
|
||||
#;
|
||||
(printf "~s\n~s\n"
|
||||
(zo-parse (open-input-bytes t1))
|
||||
(zo-parse (open-input-bytes t2)))
|
||||
|
@ -3015,6 +3016,33 @@
|
|||
#f "")
|
||||
)
|
||||
|
||||
|
||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Make sure the compiler unboxes the `v'
|
||||
;; argument in the loop below:
|
||||
|
||||
(let ()
|
||||
(define l '(module m racket/base
|
||||
(require racket/flonum)
|
||||
(define (f)
|
||||
(let loop ([n 1000][v 0.0])
|
||||
(if (zero? n)
|
||||
v
|
||||
(loop (- n 1)
|
||||
(fl+ v 2.0)))))))
|
||||
(define b
|
||||
(let ([o (open-output-bytes)])
|
||||
(write (compile l) o)
|
||||
(parameterize ([read-accept-compiled #t])
|
||||
(zo-parse (open-input-bytes (get-output-bytes o))))))
|
||||
(let* ([m (compilation-top-code b)]
|
||||
[d (car (mod-body m))]
|
||||
[b (closure-code (def-values-rhs d))]
|
||||
[c (application-rator (lam-body b))]
|
||||
[l (closure-code c)]
|
||||
[ts (lam-param-types l)])
|
||||
(test 'flonum cadr ts)))
|
||||
|
||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
|
|
|
@ -4925,12 +4925,21 @@ static void merge_closure_local_type_map(Scheme_Closure_Data *data1, Scheme_Clos
|
|||
cl2->has_tymap = 1;
|
||||
cl2->local_type_map = cl1->local_type_map;
|
||||
} else if (cl2->local_type_map) {
|
||||
int i;
|
||||
int i, recheck = 0;
|
||||
for (i = data1->num_params; i--; ) {
|
||||
if (cl1->local_type_map[i] != cl2->local_type_map[i]) {
|
||||
cl2->local_type_map = NULL;
|
||||
cl1->local_type_map[i] = 0;
|
||||
cl2->local_type_map[i] = 0;
|
||||
recheck = 1;
|
||||
}
|
||||
}
|
||||
if (recheck) {
|
||||
for (i = data1->num_params; i--; ) {
|
||||
if (cl1->local_type_map[i]) break;
|
||||
}
|
||||
if (i < 0) {
|
||||
cl1->local_type_map = NULL;
|
||||
break;
|
||||
cl2->local_type_map = NULL;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
|
Loading…
Reference in New Issue
Block a user