summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2022-06-21 23:45:27 +1000
committerDamien George <damien@micropython.org>2022-06-23 11:46:47 +1000
commit61ce260ff73b1191a9190c8cac7a7a1bd5b2f274 (patch)
tree10420f6c4f2bc59f24031d17de28690f41c40e38
parent0172292762649db91f588107b2163ab6449dc7ca (diff)
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>
-rw-r--r--py/parsenum.c12
-rw-r--r--tests/float/complex1.py5
2 files changed, 14 insertions, 3 deletions
diff --git a/py/parsenum.c b/py/parsenum.c
index 848a7732d..b90dfaaaf 100644
--- a/py/parsenum.c
+++ b/py/parsenum.c
@@ -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;
diff --git a/tests/float/complex1.py b/tests/float/complex1.py
index feede0eab..f4107a139 100644
--- a/tests/float/complex1.py
+++ b/tests/float/complex1.py
@@ -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))