py/parsenum: Fix parsing of complex "j" and also "nanj", "infj".

Prior to this commit, complex("j") would return 0j, and complex("nanj")
would return nan+0j.  This commit makes sure "j" is tested for after
parsing the number (nan, inf or a decimal), and also supports the case of
"j" on its own.

Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
Damien George 2022-06-21 23:45:27 +10:00
parent 0172292762
commit 61ce260ff7
2 changed files with 14 additions and 3 deletions

View File

@ -291,9 +291,6 @@ parse_start:
if (str == top) {
goto value_error;
}
} else if (allow_imag && (dig | 0x20) == 'j') {
real_imag_state |= REAL_IMAG_STATE_HAVE_IMAG;
break;
} else if (dig == '_') {
continue;
} else {
@ -327,6 +324,15 @@ parse_start:
}
}
if (allow_imag && str < top && (*str | 0x20) == 'j') {
if (str == str_val_start) {
// Convert "j" to "1j".
dec_val = 1;
}
++str;
real_imag_state |= REAL_IMAG_STATE_HAVE_IMAG;
}
// negate value if needed
if (dec_neg) {
dec_val = -dec_val;

View File

@ -4,14 +4,19 @@
print(complex(1))
print(complex(1.2))
print(complex(1.2j))
print(complex("j"))
print(complex("J"))
print(complex("1"))
print(complex("1.2"))
print(complex("1.2j"))
print(complex("1+j"))
print(complex("1+2j"))
print(complex("-1-2j"))
print(complex("+1-2j"))
print(complex(" -1-2j "))
print(complex(" +1-2j "))
print(complex("nanj"))
print(complex("nan-infj"))
print(complex(1, 2))
print(complex(1j, 2j))