4242mp_obj_t mp_parse_num_integer (const char * restrict str , uint len , int base ) {
4343 const char * restrict top = str + len ;
4444 bool neg = false;
45+ mp_obj_t ret_val ;
4546
4647 // check radix base
4748 if ((base != 0 && base < 2 ) || base > 36 ) {
@@ -96,16 +97,20 @@ mp_obj_t mp_parse_num_integer(const char *restrict str, uint len, int base) {
9697 }
9798 }
9899
99- // check we parsed something
100- if (str == str_val_start ) {
101- goto value_error ;
102- }
103-
104100 // negate value if needed
105101 if (neg ) {
106102 int_val = - int_val ;
107103 }
108104
105+ // create the small int
106+ ret_val = MP_OBJ_NEW_SMALL_INT (int_val );
107+
108+ have_ret_val :
109+ // check we parsed something
110+ if (str == str_val_start ) {
111+ goto value_error ;
112+ }
113+
109114 // skip trailing space
110115 for (; str < top && unichar_isspace (* str ); str ++ ) {
111116 }
@@ -116,14 +121,19 @@ mp_obj_t mp_parse_num_integer(const char *restrict str, uint len, int base) {
116121 }
117122
118123 // return the object
119- return MP_OBJ_NEW_SMALL_INT (int_val );
120-
121- value_error :
122- nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_ValueError , "invalid literal for int() with base %d: '%s'" , base , str ));
124+ return ret_val ;
123125
124126overflow :
125- // TODO reparse using bignum
126- nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError , "overflow parsing integer" ));
127+ // reparse using long int
128+ {
129+ const char * s2 = str_val_start ;
130+ ret_val = mp_obj_new_int_from_str_len (& s2 , top - str_val_start , neg , base );
131+ str = s2 ;
132+ goto have_ret_val ;
133+ }
134+
135+ value_error :
136+ nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_ValueError , "invalid syntax for integer with base %d: '%s'" , base , str ));
127137}
128138
129139#define PARSE_DEC_IN_INTG (1)
0 commit comments