diff --git a/pkgs/racket-doc/scribblings/raco/zo-struct.scrbl b/pkgs/racket-doc/scribblings/raco/zo-struct.scrbl index 17dc3e394b..bd9644c7f9 100644 --- a/pkgs/racket-doc/scribblings/raco/zo-struct.scrbl +++ b/pkgs/racket-doc/scribblings/raco/zo-struct.scrbl @@ -307,21 +307,27 @@ binding, constructor, etc.} values; also, this information is redundant, since it can be inferred by the bindings referenced though @racket[closure-map]. - Which a closure captures top-level or module-level variables, they - are represented in the closure by capturing a prefix (in the sense + Which a closure captures top-level or module-level variables or + refers to a syntax-object constant, the variables and constants are + represented in the closure by capturing a prefix (in the sense of @racket[prefix]). The @racket[toplevel-map] field indicates which top-level and lifted variables are actually used by the closure (so that variables in a prefix can be pruned by the run-time - system if they become unused). A @racket[#f] value indicates either - that no prefix is captured or all variables in the prefix should be + system if they become unused) and whether any syntax objects are + used (so that the syntax objects as a group can be similarly + pruned). A @racket[#f] value indicates either that no prefix is + captured or all variables and syntax objects in the prefix should be considered used. Otherwise, numbers in the set indicate which variables and lifted variables are used. Variables are numbered consecutively by position in the prefix starting from - @racket[0]. Lifted variables are numbered immediately + @racket[0], but the number equal to the number of non-lifted + variables corresponds to syntax objects (i.e., the number is + include if any syntax-object constant is used). Lifted variables + are numbered immediately afterward---which means that, if the prefix contains any syntax objects, lifted-variable numbers are shifted down relative to a - @racket[toplevel] by the number of syntax object in the prefix plus - one (which makes the @racket[toplevel-map] set more compact). + @racket[toplevel] by the number of syntax object in the prefix + (which makes the @racket[toplevel-map] set more compact). When the function is called, the rest-argument list (if any) is pushed onto the stack, then the normal arguments in reverse order, then the @@ -332,7 +338,12 @@ binding, constructor, etc.} The @racket[max-let-depth] field indicates the maximum stack depth created by @racket[body] plus the arguments and closure-captured values pushed onto the stack. The @racket[body] field is the - expression for the closure's body.} + expression for the closure's body. + + @history[#:changed "6.1.1.8" @elem{Added a number to + @racket[toplevel-map] to indicate whether any syntax object is used, + shifting numbers for lifted variables up by one if any syntax object + is in the prefix.}]} @defstruct+[(closure expr) ([code lam?] [gen-id symbol?])]{ diff --git a/racket/src/racket/src/cstartup.inc b/racket/src/racket/src/cstartup.inc index a1f0d8967e..93c61da303 100644 --- a/racket/src/racket/src/cstartup.inc +++ b/racket/src/racket/src/cstartup.inc @@ -1,5 +1,5 @@ { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,49,46,49,46,55,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,49,46,49,46,56,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,51,0,0,0,1,0,0,10,0,14,0, 19,0,24,0,37,0,42,0,45,0,52,0,56,0,60,0,67,0,74,0,83, 0,87,0,93,0,107,0,121,0,124,0,130,0,134,0,136,0,147,0,149,0, @@ -16,12 +16,12 @@ 108,101,116,114,101,99,45,118,97,108,117,101,115,66,108,97,109,98,100,97,1, 20,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,45,107,101,121, 61,118,73,100,101,102,105,110,101,45,118,97,108,117,101,115,97,36,11,8,240, -20,89,0,0,95,144,2,17,36,36,144,2,16,36,36,144,2,16,36,36,16, +61,89,0,0,95,144,2,17,36,36,144,2,16,36,36,144,2,16,36,36,16, 20,2,3,2,2,2,4,2,2,2,5,2,2,2,6,2,2,2,7,2,2, 2,8,2,2,2,9,2,2,2,10,2,2,2,11,2,2,2,12,2,2,97, -37,11,8,240,20,89,0,0,93,144,2,16,36,37,16,2,2,13,146,2,2, -37,2,13,2,2,2,13,96,11,11,8,240,20,89,0,0,16,0,96,38,11, -8,240,20,89,0,0,16,0,18,98,64,104,101,114,101,13,16,6,36,2,14, +37,11,8,240,61,89,0,0,93,144,2,16,36,37,16,2,2,13,146,2,2, +37,2,13,2,2,2,13,96,11,11,8,240,61,89,0,0,16,0,96,38,11, +8,240,61,89,0,0,16,0,18,98,64,104,101,114,101,13,16,6,36,2,14, 2,2,11,11,11,8,32,8,31,8,30,8,29,27,248,22,166,4,195,249,22, 159,4,80,143,39,36,251,22,92,2,18,248,22,104,199,12,249,22,82,2,19, 248,22,106,201,27,248,22,166,4,195,249,22,159,4,80,143,39,36,251,22,92, @@ -30,14 +30,14 @@ 84,194,248,22,159,20,193,249,22,159,4,80,143,39,36,251,22,92,2,18,248, 22,159,20,199,249,22,82,2,10,248,22,160,20,201,11,18,100,10,13,16,6, 36,2,14,2,2,11,11,11,8,32,8,31,8,30,8,29,16,4,11,11,2, -20,3,1,8,101,110,118,49,55,57,52,55,16,4,11,11,2,21,3,1,8, -101,110,118,49,55,57,52,56,27,248,22,84,248,22,166,4,196,28,248,22,90, +20,3,1,8,101,110,118,49,55,57,56,52,16,4,11,11,2,21,3,1,8, +101,110,118,49,55,57,56,53,27,248,22,84,248,22,166,4,196,28,248,22,90, 193,20,14,144,37,36,37,28,248,22,90,248,22,84,194,248,22,159,20,193,249, 22,159,4,80,143,39,36,250,22,92,2,22,248,22,92,249,22,92,248,22,92, 2,23,248,22,159,20,201,251,22,92,2,18,2,23,2,23,249,22,82,2,7, 248,22,160,20,204,18,100,11,13,16,6,36,2,14,2,2,11,11,11,8,32, 8,31,8,30,8,29,16,4,11,11,2,20,3,1,8,101,110,118,49,55,57, -53,48,16,4,11,11,2,21,3,1,8,101,110,118,49,55,57,53,49,248,22, +56,55,16,4,11,11,2,21,3,1,8,101,110,118,49,55,57,56,56,248,22, 166,4,193,27,248,22,166,4,194,249,22,82,248,22,92,248,22,83,196,248,22, 160,20,195,27,248,22,84,248,22,166,4,23,197,1,249,22,159,4,80,143,39, 36,28,248,22,66,248,22,160,4,248,22,83,23,198,2,27,249,22,2,32,0, @@ -68,8 +68,8 @@ 28,249,22,170,9,248,22,160,4,248,22,83,200,64,101,108,115,101,10,248,22, 159,20,197,250,22,93,2,22,9,248,22,160,20,200,249,22,82,2,3,248,22, 160,20,202,99,13,16,6,36,2,14,2,2,11,11,11,8,32,8,31,8,30, -8,29,16,4,11,11,2,20,3,1,8,101,110,118,49,55,57,55,51,16,4, -11,11,2,21,3,1,8,101,110,118,49,55,57,55,52,18,143,94,10,64,118, +8,29,16,4,11,11,2,20,3,1,8,101,110,118,49,56,48,49,48,16,4, +11,11,2,21,3,1,8,101,110,118,49,56,48,49,49,18,143,94,10,64,118, 111,105,100,8,48,27,248,22,84,248,22,166,4,196,249,22,159,4,80,143,39, 36,28,248,22,66,248,22,160,4,248,22,83,197,250,22,92,2,28,248,22,92, 248,22,159,20,199,248,22,104,198,27,248,22,160,4,248,22,159,20,197,250,22, @@ -85,22 +85,22 @@ 20,114,144,36,16,1,2,13,16,1,33,33,10,16,5,2,8,88,148,8,36, 37,53,37,9,223,0,33,34,36,20,114,144,36,16,1,2,13,16,0,11,16, 5,2,4,88,148,8,36,37,53,37,9,223,0,33,35,36,20,114,144,36,16, -1,2,13,16,0,11,16,5,2,10,88,148,8,36,37,53,37,9,223,0,33, +1,2,13,16,0,11,16,5,2,10,88,148,8,36,37,53,39,9,223,0,33, 36,36,20,114,144,36,16,1,2,13,16,1,33,37,11,16,5,2,7,88,148, -8,36,37,56,37,9,223,0,33,38,36,20,114,144,36,16,1,2,13,16,1, +8,36,37,56,39,9,223,0,33,38,36,20,114,144,36,16,1,2,13,16,1, 33,39,11,16,5,2,9,88,148,8,36,37,58,37,9,223,0,33,42,36,20, 114,144,36,16,1,2,13,16,0,11,16,5,2,12,88,148,8,36,37,53,37, 9,223,0,33,44,36,20,114,144,36,16,1,2,13,16,0,11,16,5,2,6, 88,148,8,36,37,54,37,9,223,0,33,45,36,20,114,144,36,16,1,2,13, 16,0,11,16,5,2,5,88,148,8,36,37,56,37,9,223,0,33,46,36,20, -114,144,36,16,1,2,13,16,0,11,16,5,2,3,88,148,8,36,37,58,37, +114,144,36,16,1,2,13,16,0,11,16,5,2,3,88,148,8,36,37,58,39, 9,223,0,33,47,36,20,114,144,36,16,1,2,13,16,1,33,49,11,16,5, 2,11,88,148,8,36,37,54,37,9,223,0,33,50,36,20,114,144,36,16,1, 2,13,16,0,11,16,0,94,2,16,2,17,93,2,16,9,9,36,9,0}; EVAL_ONE_SIZED_STR((char *)expr, 2056); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,49,46,49,46,55,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,49,46,49,46,56,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,193,0,0,0,1,0,0,8,0,21,0, 26,0,43,0,55,0,77,0,106,0,150,0,156,0,165,0,172,0,187,0,205, 0,217,0,233,0,247,0,13,1,32,1,39,1,73,1,90,1,107,1,130,1, @@ -1044,7 +1044,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 19746); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,49,46,49,46,55,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,49,46,49,46,56,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,14,0,0,0,1,0,0,15,0,40,0, 57,0,75,0,97,0,120,0,140,0,162,0,171,0,180,0,187,0,196,0,203, 0,0,0,231,1,0,0,74,35,37,112,108,97,99,101,45,115,116,114,117,99, @@ -1074,7 +1074,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 557); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,49,46,49,46,55,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,49,46,49,46,56,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,102,0,0,0,1,0,0,7,0,18,0, 45,0,51,0,60,0,67,0,89,0,102,0,128,0,145,0,167,0,175,0,187, 0,202,0,218,0,236,0,0,1,12,1,28,1,51,1,75,1,87,1,118,1, @@ -1541,7 +1541,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 9735); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,49,46,49,46,55,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,49,46,49,46,56,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,11,0,0,0,1,0,0,10,0,16,0, 29,0,44,0,58,0,78,0,90,0,104,0,118,0,170,0,0,0,101,1,0, 0,69,35,37,98,117,105,108,116,105,110,65,113,117,111,116,101,29,94,2,2, @@ -1549,7 +1549,7 @@ 114,107,11,29,94,2,2,68,35,37,112,97,114,97,109,122,11,29,94,2,2, 74,35,37,112,108,97,99,101,45,115,116,114,117,99,116,11,29,94,2,2,66, 35,37,98,111,111,116,11,29,94,2,2,68,35,37,101,120,112,111,98,115,11, -29,94,2,2,68,35,37,107,101,114,110,101,108,11,97,36,11,8,240,161,91, +29,94,2,2,68,35,37,107,101,114,110,101,108,11,97,36,11,8,240,202,91, 0,0,100,144,2,3,36,36,144,2,4,36,36,144,2,5,36,36,144,2,6, 36,36,144,2,7,36,36,144,2,8,36,36,144,2,9,36,36,144,2,9,36, 36,16,0,144,36,20,114,144,36,16,1,11,16,0,20,26,15,53,9,2,1, diff --git a/racket/src/racket/src/eval.c b/racket/src/racket/src/eval.c index 8b6e9d7f8a..c6fc48c7ef 100644 --- a/racket/src/racket/src/eval.c +++ b/racket/src/racket/src/eval.c @@ -5682,7 +5682,7 @@ Scheme_Object **scheme_push_prefix(Scheme_Env *genv, Resolve_Prefix *rp, } i += rp->num_lifts; - tl_map_len = ((rp->num_toplevels + rp->num_lifts) + 31) / 32; + tl_map_len = ((rp->num_toplevels + rp->num_lifts + (rp->num_stxes ? 1 : 0)) + 31) / 32; pf = scheme_malloc_tagged(sizeof(Scheme_Prefix) + ((i-mzFLEX_DELTA) * sizeof(Scheme_Object *)) @@ -5788,7 +5788,7 @@ static void mark_pruned_prefixes(struct NewGC *gc) XFORM_SKIP_PROC /* If not marked, only references are through closures: */ if (!GC_is_marked2(pf, gc)) { /* Clear slots that are not use in map */ - maxpos = (pf->num_slots - pf->num_stxes - (pf->num_stxes ? 1 : 0)); + maxpos = (pf->num_slots - pf->num_stxes); use_bits = PREFIX_TO_USE_BITS(pf); for (i = (maxpos + 31) / 32; i--; ) { int j; @@ -5797,12 +5797,19 @@ static void mark_pruned_prefixes(struct NewGC *gc) XFORM_SKIP_PROC int pos; pos = (i * 32) + j; if (pos < pf->num_toplevels) - pf->a[pos] = NULL; + pf->a[pos] = NULL; /* top level */ else if (pos < maxpos) { - if (pf->num_stxes) - pf->a[pos + pf->num_stxes + 1] = NULL; - else - pf->a[pos] = NULL; + if (pf->num_stxes) { + if (pos == pf->num_toplevels) { + /* any syntax object */ + int k; + for (k = pf->num_stxes+1; k--;) { + pf->a[k + pf->num_toplevels] = NULL; + } + } else + pf->a[pos + pf->num_stxes] = NULL; /* lifted */ + } else + pf->a[pos] = NULL; /* lifted */ } } } @@ -5817,7 +5824,7 @@ static void mark_pruned_prefixes(struct NewGC *gc) XFORM_SKIP_PROC /* Clear use map */ use_bits = PREFIX_TO_USE_BITS(pf); - maxpos = (pf->num_slots - pf->num_stxes - (pf->num_stxes ? 1 : 0)); + maxpos = (pf->num_slots - pf->num_stxes); for (i = (maxpos + 31) / 32; i--; ) use_bits[i] = 0; diff --git a/racket/src/racket/src/mzclpf_post.inc b/racket/src/racket/src/mzclpf_post.inc index 55838e3a3c..cf4392af4a 100644 --- a/racket/src/racket/src/mzclpf_post.inc +++ b/racket/src/racket/src/mzclpf_post.inc @@ -15,20 +15,16 @@ /* Since pf hasn't been marked, we don't need a GC_resolve(): */ int *use_bits = PREFIX_TO_USE_BITS(pf); uintptr_t map; + int mark_stxes; if (!pf->next_final) { /* We're the first to look at this prefix... */ - if (pf->num_stxes) { - /* Mark all syntax-object references */ - for (i = pf->num_stxes+1; i--;) { - gcMARK2(pf->a[i+pf->num_toplevels], gc); - } - } /* Add it to the chain of prefixes to finish after all other marking: */ pf->next_final = scheme_prefix_finalize; scheme_prefix_finalize = pf; } + mark_stxes = 0; /* Mark just the elements of the prefix that are (newly) used: */ if ((uintptr_t)data->tl_map & 0x1) { @@ -37,9 +33,11 @@ if (map & (1 << i)) { if (!(use_bits[0] & (1 << i))) { if ((i < pf->num_toplevels) || !pf->num_stxes) - gcMARK2(pf->a[i], gc); + gcMARK2(pf->a[i], gc); /* top level */ + else if (i == pf->num_toplevels) + mark_stxes = 1; /* any syntax object */ else - gcMARK2(pf->a[i + pf->num_stxes + 1], gc); + gcMARK2(pf->a[i + pf->num_stxes], gc); /* lifted */ } } } @@ -54,14 +52,22 @@ if (!(use_bits[i] & (1 << j))) { pos = (i * 32) + j; if ((pos < pf->num_toplevels) || !pf->num_stxes) - gcMARK2(pf->a[pos], gc); + gcMARK2(pf->a[pos], gc); /* top level */ + else if (pos == pf->num_toplevels) + mark_stxes = 1; /* any syntax object */ else - gcMARK2(pf->a[pos + pf->num_stxes + 1], gc); + gcMARK2(pf->a[pos + pf->num_stxes], gc); /* lifted */ } } } use_bits[i] |= map; } } + if (mark_stxes) { + /* Mark all syntax-object references */ + for (i = pf->num_stxes+1; i--;) { + gcMARK2(pf->a[i+pf->num_toplevels], gc); + } + } } } diff --git a/racket/src/racket/src/mzmark_type.inc b/racket/src/racket/src/mzmark_type.inc index f15b940996..549875afef 100644 --- a/racket/src/racket/src/mzmark_type.inc +++ b/racket/src/racket/src/mzmark_type.inc @@ -2449,7 +2449,7 @@ static int prefix_val_SIZE(void *p, struct NewGC *gc) { return gcBYTES_TO_WORDS((sizeof(Scheme_Prefix) + ((pf->num_slots-mzFLEX_DELTA) * sizeof(Scheme_Object *)) - + ((((pf->num_slots - (pf->num_stxes ? (pf->num_stxes+1) : 0)) + 31) / 32) + + ((((pf->num_slots - pf->num_stxes) + 31) / 32) * sizeof(int)))); } @@ -2461,7 +2461,7 @@ static int prefix_val_MARK(void *p, struct NewGC *gc) { return gcBYTES_TO_WORDS((sizeof(Scheme_Prefix) + ((pf->num_slots-mzFLEX_DELTA) * sizeof(Scheme_Object *)) - + ((((pf->num_slots - (pf->num_stxes ? (pf->num_stxes+1) : 0)) + 31) / 32) + + ((((pf->num_slots - pf->num_stxes) + 31) / 32) * sizeof(int)))); } @@ -2473,7 +2473,7 @@ static int prefix_val_FIXUP(void *p, struct NewGC *gc) { return gcBYTES_TO_WORDS((sizeof(Scheme_Prefix) + ((pf->num_slots-mzFLEX_DELTA) * sizeof(Scheme_Object *)) - + ((((pf->num_slots - (pf->num_stxes ? (pf->num_stxes+1) : 0)) + 31) / 32) + + ((((pf->num_slots - pf->num_stxes) + 31) / 32) * sizeof(int)))); } diff --git a/racket/src/racket/src/mzmarksrc.c b/racket/src/racket/src/mzmarksrc.c index 4ce76e608c..6aa3d580d2 100644 --- a/racket/src/racket/src/mzmarksrc.c +++ b/racket/src/racket/src/mzmarksrc.c @@ -990,7 +990,7 @@ prefix_val { size: gcBYTES_TO_WORDS((sizeof(Scheme_Prefix) + ((pf->num_slots-mzFLEX_DELTA) * sizeof(Scheme_Object *)) - + ((((pf->num_slots - (pf->num_stxes ? (pf->num_stxes+1) : 0)) + 31) / 32) + + ((((pf->num_slots - pf->num_stxes) + 31) / 32) * sizeof(int)))); } diff --git a/racket/src/racket/src/resolve.c b/racket/src/racket/src/resolve.c index 112c077189..440a711080 100644 --- a/racket/src/racket/src/resolve.c +++ b/racket/src/racket/src/resolve.c @@ -81,6 +81,7 @@ static Scheme_Object *shift_toplevel(Scheme_Object *expr, int delta); static int resolving_in_procedure(Resolve_Info *info); static int is_nonconstant_procedure(Scheme_Object *data, Resolve_Info *info, int skip); static int resolve_is_inside_proc(Resolve_Info *info); +static void set_tl_pos_used(Resolve_Info *info, int pos); #ifdef MZ_PRECISE_GC static void register_traversers(void); @@ -2421,6 +2422,8 @@ Scheme_Object *scheme_resolve_expr(Scheme_Object *expr, Resolve_Info *info) c = resolve_toplevel_pos(info); p = resolve_quote_syntax_pos(info); + set_tl_pos_used(info, i+p+1); + qs = MALLOC_ONE_TAGGED(Scheme_Quote_Syntax); qs->so.type = scheme_quote_syntax_type; qs->depth = c; @@ -2744,14 +2747,16 @@ static void set_tl_pos_used(Resolve_Info *info, int pos) /* Fixnum-like bit packing avoids allocation in the common case of a small prefix. We use 31 fixnum-like bits (even on a 64-bit - platform, and even though fixnums are only 30 bits). */ + platform, and even though fixnums are only 30 bits). There's one + bit for each normal top-level, one bit for all syntax objects, + and one bit for each lifted top-level. */ - if (pos >= info->prefix->num_toplevels) - tl_pos = pos - (info->prefix->num_stxes - ? (info->prefix->num_stxes + 1) - : 0); + if (pos > (info->prefix->num_toplevels + info->prefix->num_stxes)) + tl_pos = pos - info->prefix->num_stxes; /* lifted */ + else if (pos >= info->prefix->num_toplevels) + tl_pos = info->prefix->num_toplevels; /* any syntax object */ else - tl_pos = pos; + tl_pos = pos; /* normal top level */ tl_map = ensure_tl_map_len(info->tl_map, tl_pos + 1); info->tl_map = tl_map; diff --git a/racket/src/racket/src/validate.c b/racket/src/racket/src/validate.c index 1d1cd7cbf0..f039b50570 100644 --- a/racket/src/racket/src/validate.c +++ b/racket/src/racket/src/validate.c @@ -1350,7 +1350,9 @@ static int validate_expr(Mz_CPort *port, Scheme_Object *expr, if (tl_use_map) { int p2 = ((p < num_toplevels) ? p - : (num_stxes ? (p - num_stxes - 1) : p)); + : (p - num_stxes)); + if (num_stxes && (p >= num_toplevels) && (p < (num_toplevels + num_stxes + 1))) + scheme_ill_formed_code(port); if ((uintptr_t)tl_use_map & 0x1) { if (p2 > 31) scheme_ill_formed_code(port); @@ -1732,6 +1734,20 @@ static int validate_expr(Mz_CPort *port, Scheme_Object *expr, || (i >= num_stxes)) scheme_ill_formed_code(port); + if (tl_use_map) { + if ((uintptr_t)tl_use_map & 0x1) { + if (p > 31) + scheme_ill_formed_code(port); + if (!((uintptr_t)tl_use_map & (1 << (p + 1)))) + scheme_ill_formed_code(port); + } else { + if (p >= (*(int *)tl_use_map * 32)) + scheme_ill_formed_code(port); + if (!(((int *)tl_use_map)[1 + (p / 32)] & (1 << (p & 31)))) + scheme_ill_formed_code(port); + } + } + result = validate_join_const(result, expected_results); } break;