Skip to content

Commit 3582723

Browse files
committed
[GR-47565] Fixes for category-encoders etc
PullRequest: graalpython/2906
2 parents 7b19d34 + a93aecb commit 3582723

File tree

13 files changed

+742
-708
lines changed

13 files changed

+742
-708
lines changed

graalpython/com.oracle.graal.python.cext/src/capi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1833,7 +1833,7 @@ PyAPI_FUNC(PyObject*) PyLong_FromSsize_t(Py_ssize_t a) {
18331833
}
18341834
#undef PyLong_FromUnicodeObject
18351835
PyAPI_FUNC(PyObject*) PyLong_FromUnicodeObject(PyObject* a, int b) {
1836-
FUNC_NOT_IMPLEMENTED
1836+
return GraalPyLong_FromUnicodeObject(a, b);
18371837
}
18381838
#undef PyLong_FromUnsignedLong
18391839
PyAPI_FUNC(PyObject*) PyLong_FromUnsignedLong(unsigned long a) {

graalpython/com.oracle.graal.python.cext/src/capi.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ typedef struct {
199199
BUILTIN(PyLong_FromLongLong, PyObject*, long long) \
200200
BUILTIN(PyLong_FromSize_t, PyObject*, size_t) \
201201
BUILTIN(PyLong_FromSsize_t, PyObject*, Py_ssize_t) \
202+
BUILTIN(PyLong_FromUnicodeObject, PyObject*, PyObject*, int) \
202203
BUILTIN(PyLong_FromUnsignedLong, PyObject*, unsigned long) \
203204
BUILTIN(PyLong_FromUnsignedLongLong, PyObject*, unsigned long long) \
204205
BUILTIN(PyMapping_Check, int, PyObject*) \

graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_long.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,3 +406,19 @@ def compile_module(self, name):
406406
arguments=["PyObject* o"],
407407
cmpfunc=unhandled_error_compare
408408
)
409+
410+
test_PyLong_FromUnicodeObject = CPyExtFunction(
411+
lambda args: int(args[0], args[1]),
412+
lambda: (
413+
("10", 10),
414+
("-12341451234123512345", 8),
415+
("aa", 16),
416+
("asdf", 10),
417+
("", 10),
418+
("0", 0),
419+
),
420+
resultspec="O",
421+
argspec="Oi",
422+
arguments=["PyObject* n", "int base"],
423+
cmpfunc=unhandled_error_compare,
424+
)

graalpython/com.oracle.graal.python.test/src/tests/test_string.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ def test_format():
104104
assert "{0}.{1}".format("part1", "part2") == "part1.part2"
105105
assert "{1}.{0}".format("part1", "part2") == "part2.part1"
106106
assert "{}".format("part1") == "part1"
107+
assert "{0[-1]}".format({'-1': 'asdf'}) == 'asdf'
107108

108109

109110
class FormattingTestClass:

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBuiltinRegistry.java

Lines changed: 660 additions & 656 deletions
Large diffs are not rendered by default.

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextLongBuiltins.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@
6161

6262
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
6363
import com.oracle.graal.python.builtins.modules.BuiltinConstructors;
64+
import com.oracle.graal.python.builtins.modules.BuiltinConstructors.IntNode;
6465
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApi5BuiltinNode;
66+
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode;
6567
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin;
6668
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiNullaryBuiltinNode;
6769
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiTernaryBuiltinNode;
@@ -101,6 +103,7 @@
101103
import com.oracle.truffle.api.nodes.UnexpectedResultException;
102104
import com.oracle.truffle.api.profiles.BranchProfile;
103105
import com.oracle.truffle.api.profiles.InlinedConditionProfile;
106+
import com.oracle.truffle.api.strings.TruffleString;
104107

105108
public final class PythonCextLongBuiltins {
106109

@@ -458,4 +461,13 @@ static Object get(PInt value, Object bytes, long n, int littleEndian, int isSign
458461
return 0;
459462
}
460463
}
464+
465+
@CApiBuiltin(ret = PyObjectTransfer, args = {PyObjectAsTruffleString, Int}, call = Direct)
466+
abstract static class PyLong_FromUnicodeObject extends CApiBinaryBuiltinNode {
467+
@Specialization
468+
static Object convert(TruffleString s, int base,
469+
@Cached IntNode intNode) {
470+
return intNode.executeWith(null, s, base);
471+
}
472+
}
461473
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiFunction.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1169,7 +1169,6 @@ public final class CApiFunction {
11691169
@CApiBuiltin(name = "PyLineTable_InitAddressRange", ret = Void, args = {ConstCharPtr, Py_ssize_t, Int, PyCodeAddressRange}, call = NotImplemented)
11701170
@CApiBuiltin(name = "PyLineTable_NextAddressRange", ret = Int, args = {PyCodeAddressRange}, call = NotImplemented)
11711171
@CApiBuiltin(name = "PyLineTable_PreviousAddressRange", ret = Int, args = {PyCodeAddressRange}, call = NotImplemented)
1172-
@CApiBuiltin(name = "PyLong_FromUnicodeObject", ret = PyObject, args = {PyObject, Int}, call = NotImplemented)
11731172
@CApiBuiltin(name = "PyLong_GetInfo", ret = PyObject, args = {}, call = NotImplemented)
11741173
@CApiBuiltin(name = "PyMapping_HasKey", ret = Int, args = {PyObject, PyObject}, call = NotImplemented)
11751174
@CApiBuiltin(name = "PyMapping_HasKeyString", ret = Int, args = {PyObject, ConstCharPtrAsTruffleString}, call = NotImplemented)

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntBuiltins.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,12 @@
7373
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RDIVMOD__;
7474
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
7575
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RFLOORDIV__;
76+
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RLSHIFT__;
7677
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RMUL__;
7778
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROR__;
7879
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROUND__;
7980
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RPOW__;
81+
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RRSHIFT__;
8082
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RSHIFT__;
8183
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RSUB__;
8284
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RTRUEDIV__;
@@ -1518,6 +1520,7 @@ static BigInteger not(BigInteger value) {
15181520
}
15191521

15201522
@Builtin(name = J___LSHIFT__, minNumOfPositionalArgs = 2)
1523+
@Builtin(name = J___RLSHIFT__, minNumOfPositionalArgs = 2, reverseOperation = true)
15211524
@GenerateNodeFactory
15221525
@TypeSystemReference(PythonArithmeticTypes.class)
15231526
public abstract static class LShiftNode extends PythonBinaryBuiltinNode {
@@ -1721,6 +1724,7 @@ public static LShiftNode create() {
17211724
}
17221725

17231726
@Builtin(name = J___RSHIFT__, minNumOfPositionalArgs = 2)
1727+
@Builtin(name = J___RRSHIFT__, minNumOfPositionalArgs = 2, reverseOperation = true)
17241728
@TypeSystemReference(PythonArithmeticTypes.class)
17251729
@GenerateNodeFactory
17261730
public abstract static class RShiftNode extends PythonBinaryBuiltinNode {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/TemplateFormatter.java

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -75,7 +75,6 @@
7575
import com.oracle.graal.python.lib.PyObjectReprAsObjectNode;
7676
import com.oracle.graal.python.lib.PyObjectStrAsTruffleStringNode;
7777
import com.oracle.graal.python.nodes.PRaiseNode;
78-
import com.oracle.graal.python.runtime.exception.PException;
7978
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
8079
import com.oracle.truffle.api.nodes.Node;
8180
import com.oracle.truffle.api.strings.TruffleString;
@@ -262,11 +261,7 @@ private Object getArgument(Node node, String name, PyObjectGetItem getItemNode)
262261
if (isEmpty) {
263262
index = -1;
264263
} else {
265-
try {
266-
index = toInt(node, intString);
267-
} catch (NumberFormatException | ArrayIndexOutOfBoundsException nfe1) {
268-
index = -1;
269-
}
264+
index = toInt(node, intString);
270265
}
271266
boolean useNumeric = isEmpty || index != -1;
272267
if (this.autoNumberingState == ANS_INIT && useNumeric) {
@@ -348,19 +343,12 @@ private Object resolveLookups(Node node, Object obj, String name, int startArg,
348343
if (!gotBracket) {
349344
throw PRaiseNode.raiseUncached(node, ValueError, MISSING_S, "']'");
350345
}
351-
Object item = null;
352-
int index = -1;
353-
try {
354-
index = toInt(node, name.substring(start, i));
355-
} catch (NumberFormatException | ArrayIndexOutOfBoundsException nfe1) {
356-
item = toTruffleStringUncached(name.substring(start, i));
357-
}
358-
if (index > -1) {
359-
if (index > SysModuleBuiltins.MAXSIZE) {
360-
throw PRaiseNode.raiseUncached(node, ValueError, TOO_MANY_DECIMAL_DIGITS_IN_FORMAT_STRING);
361-
}
362-
item = index;
346+
String s = name.substring(start, i);
347+
if (s.isEmpty()) {
348+
throw PRaiseNode.raiseUncached(node, ValueError, EMPTY_ATTR_IN_FORMAT_STR);
363349
}
350+
int index = toInt(node, s);
351+
Object item = index != -1 ? index : toTruffleStringUncached(s);
364352
i += 1; // # Skip "]"
365353
if (result != null) {
366354
result = getItemNode.execute(null, result, item);
@@ -374,12 +362,18 @@ private Object resolveLookups(Node node, Object obj, String name, int startArg,
374362
return result;
375363
}
376364

377-
private static int toInt(Node node, String s) throws PException {
378-
BigInteger bigInt = new BigInteger(s);
379-
if (bigInt.compareTo(MAXSIZE) > 0) {
365+
private static int toInt(Node node, String s) {
366+
try {
367+
BigInteger bigInt = new BigInteger(s);
368+
if (bigInt.signum() >= 0) {
369+
return bigInt.intValueExact();
370+
}
371+
return -1;
372+
} catch (NumberFormatException e) {
373+
return -1;
374+
} catch (ArithmeticException e) {
380375
throw PRaiseNode.raiseUncached(node, ValueError, TOO_MANY_DECIMAL_DIGITS_IN_FORMAT_STRING);
381376
}
382-
return bigInt.intValue();
383377
}
384378

385379
private Object renderField(Node node, int start, int end, boolean recursive, int level, FormatNode formatNode, PyObjectGetItem getItemNode) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TypeNodes.java

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,6 @@
223223
import com.oracle.truffle.api.dsl.TypeSystemReference;
224224
import com.oracle.truffle.api.frame.VirtualFrame;
225225
import com.oracle.truffle.api.interop.InteropLibrary;
226-
import com.oracle.truffle.api.interop.UnsupportedMessageException;
227226
import com.oracle.truffle.api.library.CachedLibrary;
228227
import com.oracle.truffle.api.nodes.ControlFlowException;
229228
import com.oracle.truffle.api.nodes.Node;
@@ -1431,25 +1430,14 @@ static boolean doManaged(PythonBuiltinClass left, PythonBuiltinClassType right)
14311430

14321431
@Specialization
14331432
static boolean doNativeSingleContext(PythonAbstractNativeObject left, PythonAbstractNativeObject right,
1434-
@CachedLibrary(limit = "3") InteropLibrary lib1,
1435-
@CachedLibrary(limit = "3") InteropLibrary lib2) {
1436-
if (lib1.isPointer(left.getPtr())) {
1437-
if (lib2.isPointer(right.getPtr())) {
1438-
try {
1439-
return lib1.asPointer(left.getPtr()) == lib2.asPointer(right.getPtr());
1440-
} catch (UnsupportedMessageException e) {
1441-
throw CompilerDirectives.shouldNotReachHere(e);
1442-
}
1443-
} else {
1444-
return false;
1445-
}
1446-
} else {
1447-
if (lib2.isPointer(right.getPtr())) {
1448-
return false;
1449-
} else {
1450-
return lib1.isIdentical(left.getPtr(), right.getPtr(), lib2);
1451-
}
1433+
@CachedLibrary(limit = "1") InteropLibrary lib) {
1434+
if (left == right) {
1435+
return true;
1436+
}
1437+
if (left.getPtr() instanceof Long && right.getPtr() instanceof Long) {
1438+
return (long) left.getPtr() == (long) right.getPtr();
14521439
}
1440+
return lib.isIdentical(left.getPtr(), right.getPtr(), lib);
14531441
}
14541442

14551443
@Fallback

0 commit comments

Comments
 (0)