fix closure type tracking for a procedure with only an unused rest arg
Closes PR 14259
This commit is contained in:
parent
75daeecdb1
commit
fe12a32dc3
|
@ -3165,6 +3165,23 @@
|
||||||
(void (dynamic-require ''uses-too-much-memory-for-shift #f)))
|
(void (dynamic-require ''uses-too-much-memory-for-shift #f)))
|
||||||
|
|
||||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; Make sure that closure fields are correctly type-tagged
|
||||||
|
;; when a function has an unused rest arg:
|
||||||
|
|
||||||
|
(parameterize ([current-namespace (make-base-namespace)]
|
||||||
|
[read-on-demand-source #f]
|
||||||
|
[read-accept-compiled #t])
|
||||||
|
(let ([o (open-output-bytes)])
|
||||||
|
(write (compile '(module m racket/base
|
||||||
|
(require racket/fixnum)
|
||||||
|
(define (test l)
|
||||||
|
(define n (fxmax (length l) 1))
|
||||||
|
(lambda _ n))))
|
||||||
|
o)
|
||||||
|
;; Should succeed, as opposed to a validation error:
|
||||||
|
(eval (read (open-input-bytes (get-output-bytes o))))))
|
||||||
|
|
||||||
|
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
|
||||||
(report-errs)
|
(report-errs)
|
||||||
|
|
|
@ -2015,8 +2015,16 @@ resolve_closure_compilation(Scheme_Object *_data, Resolve_Info *info,
|
||||||
/* (lambda args E) where args is not in E => drop the argument */
|
/* (lambda args E) where args is not in E => drop the argument */
|
||||||
new_info = resolve_info_extend(info, 0, 1, cl->base_closure_size);
|
new_info = resolve_info_extend(info, 0, 1, cl->base_closure_size);
|
||||||
num_params = 0;
|
num_params = 0;
|
||||||
if (!just_compute_lift)
|
if (!just_compute_lift) {
|
||||||
data->num_params = 0;
|
data->num_params = 0;
|
||||||
|
if (expanded_already) {
|
||||||
|
/* shift type map down: */
|
||||||
|
for (i = 0; i < closure_size; i++) {
|
||||||
|
scheme_boxmap_set(closure_map, i, scheme_boxmap_get(closure_map, i + 1, closure_size), closure_size);
|
||||||
|
}
|
||||||
|
SCHEME_CLOSURE_DATA_FLAGS(data) |= CLOS_HAS_TYPED_ARGS;
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
new_info = resolve_info_extend(info, data->num_params, data->num_params,
|
new_info = resolve_info_extend(info, data->num_params, data->num_params,
|
||||||
cl->base_closure_size + data->num_params);
|
cl->base_closure_size + data->num_params);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user