diff --git a/collects/compiler/zo-parse.rkt b/collects/compiler/zo-parse.rkt index 6c9493537b..5f47e9cc54 100644 --- a/collects/compiler/zo-parse.rkt +++ b/collects/compiler/zo-parse.rkt @@ -111,12 +111,15 @@ (case (check-bit i) [(0) 'val] [(1) 'ref] - [(2) 'flonum])))] + [(2) 'flonum] + [else (error "both 'ref and 'flonum argument?")])))] [(closure-types) (for/list ([i (in-range closure-size)] [j (in-naturals num-params)]) (case (check-bit j) [(0) 'val/ref] - [(2) 'flonum]))]) + [(1) (error "invalid 'ref closure variable")] + [(2) 'flonum] + [else (error "both 'ref and 'flonum closure var?")]))]) (make-lam name (append (if (zero? (bitwise-and flags flags CLOS_PRESERVES_MARKS)) null '(preserves-marks)) diff --git a/src/racket/src/marshal.c b/src/racket/src/marshal.c index fdab4fd8c9..09d7dd8a63 100644 --- a/src/racket/src/marshal.c +++ b/src/racket/src/marshal.c @@ -672,6 +672,16 @@ static Scheme_Object *write_compiled_closure(Scheme_Object *obj) svec_size = data->closure_size; if (SCHEME_CLOSURE_DATA_FLAGS(data) & CLOS_HAS_TYPED_ARGS) { svec_size += ((2 * (data->num_params + data->closure_size)) + BITS_PER_MZSHORT - 1) / BITS_PER_MZSHORT; + { + int k, mv; + for (k = data->num_params + data->closure_size; --k; ) { + mv = ((data->closure_map[data->closure_size + ((2 * k) / BITS_PER_MZSHORT)] + >> ((2 * k) % BITS_PER_MZSHORT)) + & 0x3); + if (mv == 0x3) + scheme_signal_error("internal error: inconsistent closure/argument type"); + } + } } if (SCHEME_RPAIRP(data->code)) { diff --git a/src/racket/src/resolve.c b/src/racket/src/resolve.c index c8ade83fa1..0ea6766036 100644 --- a/src/racket/src/resolve.c +++ b/src/racket/src/resolve.c @@ -1927,6 +1927,13 @@ resolve_closure_compilation(Scheme_Object *_data, Resolve_Info *info, offset++; } + if (!convert && !just_compute_lift && (offset < data->closure_size) && expanded_already) { + /* shift boxmap down, since we're dropping closure elements */ + int bsz; + bsz = boxmap_size(data->num_params + offset); + memmove(closure_map + offset, closure_map + data->closure_size, sizeof(mzshort) * bsz); + } + /* Reset closure_size, in case a lifted variable was removed: */ closure_size = offset; if (!just_compute_lift) { @@ -1949,7 +1956,7 @@ resolve_closure_compilation(Scheme_Object *_data, Resolve_Info *info, data->num_params = 0; } else { 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); for (i = 0; i < data->num_params; i++) { resolve_info_add_mapping(new_info, i, i + closure_size + convert_size, (((cl->local_flags[i] & SCHEME_WAS_SET_BANGED) @@ -1959,7 +1966,7 @@ resolve_closure_compilation(Scheme_Object *_data, Resolve_Info *info, ? SCHEME_INFO_FLONUM_ARG : 0)), NULL); - if (cl->flonum_map && cl->flonum_map[i]) + if (cl->flonum_map && cl->flonum_map[i] && !just_compute_lift) boxmap_set(closure_map, i + convert_size, 2, closure_size); } if (expanded_already && !just_compute_lift)