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)])
|
[t2 (get-output-bytes s2)])
|
||||||
(or (bytes=? t1 t2)
|
(or (bytes=? t1 t2)
|
||||||
(begin
|
(begin
|
||||||
|
#;
|
||||||
(printf "~s\n~s\n"
|
(printf "~s\n~s\n"
|
||||||
(zo-parse (open-input-bytes t1))
|
(zo-parse (open-input-bytes t1))
|
||||||
(zo-parse (open-input-bytes t2)))
|
(zo-parse (open-input-bytes t2)))
|
||||||
|
@ -3015,6 +3016,33 @@
|
||||||
#f "")
|
#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->has_tymap = 1;
|
||||||
cl2->local_type_map = cl1->local_type_map;
|
cl2->local_type_map = cl1->local_type_map;
|
||||||
} else if (cl2->local_type_map) {
|
} else if (cl2->local_type_map) {
|
||||||
int i;
|
int i, recheck = 0;
|
||||||
for (i = data1->num_params; i--; ) {
|
for (i = data1->num_params; i--; ) {
|
||||||
if (cl1->local_type_map[i] != cl2->local_type_map[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;
|
cl1->local_type_map = NULL;
|
||||||
break;
|
cl2->local_type_map = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user