py: Put back proper ValueError for badly parsed integers.

This commit is contained in:
Damien George 2014-03-21 20:46:38 +00:00
parent b035db355a
commit 7b4b78bc33

View File

@ -41,6 +41,7 @@ mp_obj_t mp_parse_num_integer(const char *restrict str, uint len, int base) {
// string should be an integer number
machine_int_t int_val = 0;
const char *restrict str_val_start = str;
for (; str < top; str++) {
machine_int_t old_val = int_val;
int dig = *str;
@ -69,6 +70,11 @@ mp_obj_t mp_parse_num_integer(const char *restrict str, uint len, int base) {
}
}
// check we parsed something
if (str == str_val_start) {
goto value_error;
}
// negate value if needed
if (neg) {
int_val = -int_val;
@ -80,12 +86,15 @@ mp_obj_t mp_parse_num_integer(const char *restrict str, uint len, int base) {
// check we reached the end of the string
if (str != top) {
nlr_jump(mp_obj_new_exception_msg(&mp_type_SyntaxError, "invalid syntax for number"));
goto value_error;
}
// return the object
return MP_OBJ_NEW_SMALL_INT(int_val);
value_error:
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "invalid literal for int() with base %d: '%s'", base, str));
overflow:
// TODO reparse using bignum
nlr_jump(mp_obj_new_exception_msg(&mp_type_ValueError, "overflow parsing integer"));