Ticket #976: remove-struct-poking.patch

File remove-struct-poking.patch, 4.9 KB (added by darbelo, 5 years ago)
  • src/interp/inter_cb.c

     
    299299    PMC     *sub; 
    300300    STRING  *sig_str; 
    301301    char    *p; 
     302    char     ch; 
     303    char    *sig_cstr; 
    302304    char     pasm_sig[4]; 
    303305    INTVAL   i_param; 
    304306    PMC     *p_param; 
     
    311313    signature = VTABLE_getprop(interp, user_data, sc); 
    312314 
    313315    sig_str   = VTABLE_get_string(interp, signature); 
    314     p         = sig_str->strstart; 
     316    sig_cstr  = Parrot_str_to_cstring(interp, sig_str); 
     317    p         = sig_cstr; 
    315318    ++p;     /* Skip return type */ 
    316319 
    317320    pasm_sig[0] = 'v';  /* no return value supported yet */ 
     
    367370            param = Parrot_str_new(interp, external_data, 0); 
    368371            break; 
    369372        default: 
     373            ch = *p; 
     374            Parrot_str_free_cstring(sig_cstr); 
    370375            Parrot_ex_throw_from_c_args(interp, NULL, 1, 
    371                 "unhandled signature char '%c' in run_cb", *p); 
     376                "unhandled signature char '%c' in run_cb", ch); 
    372377    } 
     378    Parrot_str_free_cstring(sig_cstr); 
    373379    pasm_sig[3] = '\0'; 
    374380    Parrot_runops_fromc_args_event(interp, sub, pasm_sig, 
    375381            user_data, param); 
  • src/pmc/string.pmc

     
    734734                        enum_class_Integer)); 
    735735 
    736736        /* TODO verify encoding */ 
    737         const STRING *me         = VTABLE_get_string(INTERP, SELF); 
    738         const char   *start      = me->strstart; 
    739         const char   * const end = start + me->bufused; 
    740         UINTVAL              i   = 0; 
     737        const STRING *me  = VTABLE_get_string(INTERP, SELF); 
     738        char         *str = Parrot_str_to_cstring(INTERP, me); 
     739        UINTVAL       i   = 0; 
     740        size_t        j   = 0; 
     741        size_t        len = strlen(str); 
    741742 
    742743        if (base < 2 || base > 36) 
    743744            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_INVALID_OPERATION, 
    744745                    "invalid conversion to int - bad base %d", base); 
    745746 
    746         while (start < end) { 
    747             const unsigned char c = *start; 
     747        while ( j < len) { 
     748            const unsigned char c = str[j]; 
    748749            int dig; 
    749750 
    750751            if (isdigit((unsigned char)c)) 
     
    760761                break; 
    761762 
    762763            i = i * base + dig; 
    763             ++start; 
     764            j++; 
    764765        } 
    765766 
    766         if (start < end) 
     767        if (j < len) { 
     768            char ch = str[j]; 
     769            Parrot_str_free_cstring(str); 
    767770            Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_INVALID_OPERATION, 
    768                     "invalid conversion to int - bad char %c", *start); 
     771                    "invalid conversion to int - bad char %c", ch); 
     772        } 
    769773 
     774        Parrot_str_free_cstring(str); 
    770775        /* TODO: autopromote to BigInt instead of casting away the high bit */ 
    771776        VTABLE_set_integer_native(INTERP, result, (INTVAL)i); 
    772777        RETURN(PMC *result); 
  • src/pmc/hash.pmc

     
    620620 
    621621        for (j = 0; j < n; ++j) { 
    622622            STRING * const key       = VTABLE_shift_string(INTERP, iter); 
     623            char *         key_str; 
     624            size_t         i, str_len; 
    623625            int            all_digit = 1; 
    624             int            i; 
    625626            PMC           *val; 
    626627 
    627             for (i = 0; i < (int)key->strlen; ++i) { 
    628                 if (!isdigit((unsigned char)((const char *)key->strstart)[i])) { 
     628            key_str = Parrot_str_to_cstring(INTERP, key); 
     629            str_len = strlen(key_str); 
     630            for (i = 0; i < str_len; ++i) { 
     631                if (!isdigit(key_str[i])) { 
    629632                    all_digit = 0; 
    630633                    break; 
    631634                } 
    632635            } 
     636            Parrot_str_free_cstring(key_str); 
    633637 
    634638            if (all_digit) { 
    635639                res = Parrot_str_append(INTERP, res, key); 
  • src/packdump.c

     
    224224                    ct_index = PackFile_find_in_const(interp, ct, key, PFC_STRING); 
    225225                    Parrot_io_printf(interp, "        PFC_OFFSET  => %ld\n", ct_index); 
    226226                    detail = ct->constants[ct_index]; 
    227                     Parrot_io_printf(interp, "        DATA        => '%.*s'\n", 
    228                               (int)detail->u.string->bufused, 
    229                               (char *)detail->u.string->strstart); 
     227                    Parrot_io_printf(interp, "        DATA        => '%Ss'\n", 
     228                              detail->u.string); 
    230229                    Parrot_io_printf(interp, "       },\n"); 
    231230                    } 
    232231                    break;