diff --git a/src/racket/src/print.c b/src/racket/src/print.c index 06537a1334..ab327bf727 100644 --- a/src/racket/src/print.c +++ b/src/racket/src/print.c @@ -2252,9 +2252,9 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, && SCHEME_PREFABP(SCHEME_CHAPERONE_VAL(obj))))) { Scheme_Object *vec, *prefab; print_compact(pp, CPT_PREFAB); - prefab = ((Scheme_Structure *)obj)->stype->prefab_key; + prefab = scheme_prefab_struct_key(obj); vec = scheme_struct_to_vector(obj, (notdisplay >= 3) ? qq_ellipses : NULL, pp->inspector); - SCHEME_VEC_ELS(vec)[0] = SCHEME_CDR(prefab); + SCHEME_VEC_ELS(vec)[0] = prefab; print_vector(vec, notdisplay, compact, ht, mt, pp, 1); } else if (compact || !pp->print_unreadable) { cannot_print(pp, notdisplay, obj, ht, compact); @@ -2275,18 +2275,18 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, if (pb) { Scheme_Object *vec, *prefab; - prefab = ((Scheme_Structure *)obj)->stype->prefab_key; + prefab = scheme_prefab_struct_key(obj); vec = scheme_struct_to_vector(obj, (notdisplay >= 3) ? qq_ellipses : NULL, pp->inspector); - if (prefab) + if (SCHEME_TRUEP(prefab)) notdisplay = to_quoted(obj, pp, notdisplay); if (notdisplay == 3) { vec = scheme_vector_to_list(vec); vec = scheme_make_pair(scheme_object_name(obj), SCHEME_CDR(vec)); print_pair(vec, notdisplay, compact, ht, mt, pp, scheme_pair_type, !pp->print_pair_curly, 1); } else { - if (prefab) - SCHEME_VEC_ELS(vec)[0] = SCHEME_CDR(prefab); - print_vector(vec, notdisplay, compact, ht, mt, pp, !!prefab); + if (SCHEME_TRUEP(prefab)) + SCHEME_VEC_ELS(vec)[0] = prefab; + print_vector(vec, notdisplay, compact, ht, mt, pp, SCHEME_TRUEP(prefab)); } closed = 1; } else { diff --git a/src/racket/src/schpriv.h b/src/racket/src/schpriv.h index 6316f86aab..6fa8a325a8 100644 --- a/src/racket/src/schpriv.h +++ b/src/racket/src/schpriv.h @@ -746,6 +746,7 @@ Scheme_Struct_Type *scheme_make_prefab_struct_type_raw(Scheme_Object *base, int num_islots, Scheme_Object *uninit_val, char *immutable_pos_list); +Scheme_Object *scheme_prefab_struct_key(Scheme_Object *s); Scheme_Object *scheme_extract_checked_procedure(int argc, Scheme_Object **argv); diff --git a/src/racket/src/struct.c b/src/racket/src/struct.c index 3d7f459296..56e66229f1 100644 --- a/src/racket/src/struct.c +++ b/src/racket/src/struct.c @@ -117,6 +117,9 @@ static Scheme_Object *struct_to_vector(int argc, Scheme_Object *argv[]); static Scheme_Object *prefab_struct_key(int argc, Scheme_Object *argv[]); static Scheme_Object *make_prefab_struct(int argc, Scheme_Object *argv[]); static Scheme_Object *prefab_key_struct_type(int argc, Scheme_Object *argv[]); +#ifdef MZ_USE_PLACES +static Scheme_Object *convert_prefab_key_to_external_form(Scheme_Object *key); +#endif static Scheme_Object *struct_setter_p(int argc, Scheme_Object *argv[]); static Scheme_Object *struct_getter_p(int argc, Scheme_Object *argv[]); @@ -2687,14 +2690,25 @@ static Scheme_Object *struct_to_vector(int argc, Scheme_Object *argv[]) static Scheme_Object *prefab_struct_key(int argc, Scheme_Object *argv[]) { - Scheme_Structure *s = (Scheme_Structure *)argv[0]; + return scheme_prefab_struct_key(argv[0]); +} + +Scheme_Object *scheme_prefab_struct_key(Scheme_Object *so) +{ + Scheme_Structure *s = (Scheme_Structure *)so; if (SCHEME_CHAPERONEP((Scheme_Object *)s)) s = (Scheme_Structure *)SCHEME_CHAPERONE_VAL((Scheme_Object *)s); - if (SCHEME_STRUCTP(((Scheme_Object *)s)) - && s->stype->prefab_key) - return SCHEME_CDR(s->stype->prefab_key); + if (SCHEME_STRUCTP(((Scheme_Object *)s)) && s->stype->prefab_key) { + Scheme_Object *prefab_key; + prefab_key = SCHEME_CDR(s->stype->prefab_key); +#ifdef MZ_USE_PLACES + return convert_prefab_key_to_external_form(prefab_key); +#else + return prefab_key; +#endif + } return scheme_false; } @@ -4561,6 +4575,29 @@ static char *mutability_data_to_immutability_data(int icnt, Scheme_Object *mutab return immutable_array; } +#ifdef MZ_USE_PLACES +static Scheme_Object *convert_prefab_key_to_external_form(Scheme_Object *key) +{ + Scheme_Object *l; + Scheme_Object *nl; + + if (SCHEME_SYMBOLP(key)) return key; + if (SCHEME_BYTE_STRINGP(key)) + return scheme_intern_exact_symbol(SCHEME_BYTE_STR_VAL(key), SCHEME_BYTE_STRLEN_VAL(key)); + + nl = scheme_null; + for (l = key; SCHEME_PAIRP(l); l = SCHEME_CDR(l)) { + Scheme_Object *a; + a = SCHEME_CAR(l); + if (SCHEME_BYTE_STRINGP(a)) + a = scheme_intern_exact_symbol(SCHEME_BYTE_STR_VAL(a), SCHEME_BYTE_STRLEN_VAL(a)); + nl = scheme_make_pair(a, nl); + } + + return scheme_reverse(nl); +} +#endif + Scheme_Struct_Type *scheme_lookup_prefab_type(Scheme_Object *key, int field_count) { Scheme_Struct_Type *parent = NULL;