From 799230d81837e1ed79cd4790e24ca00400e89941 Mon Sep 17 00:00:00 2001 From: hippi345 <13539685+hippi345@users.noreply.github.com> Date: Sat, 17 Oct 2026 01:09:05 +0000 Subject: [PATCH] Honor Py_UNICODE_ISSPACE when parsing int() from strings int() stripping now uses StringUtils.isSpace (str.isspace / Py_UNICODE_ISSPACE) so characters such as U+00A0 are accepted. Fixes #1209 Signed-off-by: hippi345 <13539685+hippi345@users.noreply.github.com> --- .../com.oracle.graal.python.test/src/tests/test_int.py | 7 +++++++ .../oracle/graal/python/lib/PyLongFromUnicodeObject.java | 8 +++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_int.py b/graalpython/com.oracle.graal.python.test/src/tests/test_int.py index 4a7bdf9c05..f96bb0c809 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_int.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_int.py @@ -451,6 +451,13 @@ def __index__(self): assert False, "expected TypeError" +def test_int_from_unicode_whitespace(): + # Py_UNICODE_ISSPACE includes NO-BREAK SPACE (U+00A0), unlike Java Character.isWhitespace + assert int("\xa0123") == 123 + assert int("123\xa0") == 123 + + + def test_create_int_from_float(): assert int(123.0) == 123 assert int(123.4) == 123 diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongFromUnicodeObject.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongFromUnicodeObject.java index 363f4d92eb..916b90d2d8 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongFromUnicodeObject.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongFromUnicodeObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2025, 2026, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,6 +47,7 @@ import com.oracle.graal.python.builtins.objects.bytes.BytesNodes; import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.str.StringNodes; +import com.oracle.graal.python.builtins.objects.str.StringUtils; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; @@ -174,11 +175,12 @@ private static BigInteger asciiToBigInteger(Node inliningTarget, String str, int int b = 0; int e = str.length(); - while (b < e && Character.isWhitespace(str.charAt(b))) { + // Py_UNICODE_ISSPACE / str.isspace, not Java Character.isWhitespace + while (b < e && StringUtils.isSpace(str.charAt(b))) { b++; } - while (e > b && Character.isWhitespace(str.charAt(e - 1))) { + while (e > b && StringUtils.isSpace(str.charAt(e - 1))) { e--; }