Index: src/interp/inter_cb.c =================================================================== --- src/interp/inter_cb.c (revision 40964) +++ src/interp/inter_cb.c (working copy) @@ -299,6 +299,8 @@ PMC *sub; STRING *sig_str; char *p; + char ch; + char *sig_cstr; char pasm_sig[4]; INTVAL i_param; PMC *p_param; @@ -311,7 +313,8 @@ signature = VTABLE_getprop(interp, user_data, sc); sig_str = VTABLE_get_string(interp, signature); - p = sig_str->strstart; + sig_cstr = Parrot_str_to_cstring(interp, sig_str); + p = sig_cstr; ++p; /* Skip return type */ pasm_sig[0] = 'v'; /* no return value supported yet */ @@ -367,9 +370,12 @@ param = Parrot_str_new(interp, external_data, 0); break; default: + ch = *p; + Parrot_str_free_cstring(sig_cstr); Parrot_ex_throw_from_c_args(interp, NULL, 1, - "unhandled signature char '%c' in run_cb", *p); + "unhandled signature char '%c' in run_cb", ch); } + Parrot_str_free_cstring(sig_cstr); pasm_sig[3] = '\0'; Parrot_runops_fromc_args_event(interp, sub, pasm_sig, user_data, param); Index: src/pmc/string.pmc =================================================================== --- src/pmc/string.pmc (revision 40964) +++ src/pmc/string.pmc (working copy) @@ -734,17 +734,18 @@ enum_class_Integer)); /* TODO verify encoding */ - const STRING *me = VTABLE_get_string(INTERP, SELF); - const char *start = me->strstart; - const char * const end = start + me->bufused; - UINTVAL i = 0; + const STRING *me = VTABLE_get_string(INTERP, SELF); + char *str = Parrot_str_to_cstring(INTERP, me); + UINTVAL i = 0; + size_t j = 0; + size_t len = strlen(str); if (base < 2 || base > 36) Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_INVALID_OPERATION, "invalid conversion to int - bad base %d", base); - while (start < end) { - const unsigned char c = *start; + while ( j < len) { + const unsigned char c = str[j]; int dig; if (isdigit((unsigned char)c)) @@ -760,13 +761,17 @@ break; i = i * base + dig; - ++start; + j++; } - if (start < end) + if (j < len) { + char ch = str[j]; + Parrot_str_free_cstring(str); Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_INVALID_OPERATION, - "invalid conversion to int - bad char %c", *start); + "invalid conversion to int - bad char %c", ch); + } + Parrot_str_free_cstring(str); /* TODO: autopromote to BigInt instead of casting away the high bit */ VTABLE_set_integer_native(INTERP, result, (INTVAL)i); RETURN(PMC *result); Index: src/pmc/hash.pmc =================================================================== --- src/pmc/hash.pmc (revision 40964) +++ src/pmc/hash.pmc (working copy) @@ -620,16 +620,20 @@ for (j = 0; j < n; ++j) { STRING * const key = VTABLE_shift_string(INTERP, iter); + char * key_str; + size_t i, str_len; int all_digit = 1; - int i; PMC *val; - for (i = 0; i < (int)key->strlen; ++i) { - if (!isdigit((unsigned char)((const char *)key->strstart)[i])) { + key_str = Parrot_str_to_cstring(INTERP, key); + str_len = strlen(key_str); + for (i = 0; i < str_len; ++i) { + if (!isdigit(key_str[i])) { all_digit = 0; break; } } + Parrot_str_free_cstring(key_str); if (all_digit) { res = Parrot_str_append(INTERP, res, key); Index: src/packdump.c =================================================================== --- src/packdump.c (revision 40964) +++ src/packdump.c (working copy) @@ -224,9 +224,8 @@ ct_index = PackFile_find_in_const(interp, ct, key, PFC_STRING); Parrot_io_printf(interp, " PFC_OFFSET => %ld\n", ct_index); detail = ct->constants[ct_index]; - Parrot_io_printf(interp, " DATA => '%.*s'\n", - (int)detail->u.string->bufused, - (char *)detail->u.string->strstart); + Parrot_io_printf(interp, " DATA => '%Ss'\n", + detail->u.string); Parrot_io_printf(interp, " },\n"); } break;