Skip to content

Commit a528457

Browse files
committed
Fix PyTuple_Size of native tuples
1 parent 93b75b7 commit a528457

File tree

3 files changed

+111
-37
lines changed

3 files changed

+111
-37
lines changed

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

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@
4444
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError;
4545
import static com.oracle.graal.python.nodes.ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC_WAS_S_P;
4646
import static com.oracle.graal.python.nodes.ErrorMessages.NATIVE_S_SUBTYPES_NOT_IMPLEMENTED;
47+
4748
import java.util.List;
49+
4850
import com.oracle.graal.python.builtins.Builtin;
4951
import com.oracle.graal.python.builtins.CoreFunctions;
5052
import com.oracle.graal.python.builtins.Python3Core;
@@ -180,31 +182,15 @@ Object doPTuple(Object tuple, @SuppressWarnings("unused") Object key) {
180182
@GenerateNodeFactory
181183
public abstract static class PyTupleSizeNode extends PythonUnaryBuiltinNode {
182184
@Specialization
183-
public static int size(PTuple tuple,
185+
public static int size(VirtualFrame frame, Object tuple,
186+
@Cached com.oracle.graal.python.lib.PyTupleSizeNode pyTupleSizeNode,
184187
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode) {
185-
return tuple.getSequenceStorage().length();
186-
}
187-
188-
@Specialization(guards = {"!isPTuple(obj)", "isTupleSubtype(frame, obj, getClassNode, isSubtypeNode)"})
189-
public static Object sizeNative(VirtualFrame frame, @SuppressWarnings("unused") Object obj,
190-
@SuppressWarnings("unused") @Cached GetClassNode getClassNode,
191-
@SuppressWarnings("unused") @Cached IsSubtypeNode isSubtypeNode,
192-
@Cached PRaiseNativeNode raiseNativeNode) {
193-
return raiseNativeNode.raiseInt(frame, -1, PythonBuiltinClassType.NotImplementedError, NATIVE_S_SUBTYPES_NOT_IMPLEMENTED, "tuple");
194-
}
195-
196-
@SuppressWarnings("unused")
197-
@Specialization(guards = {"!isPTuple(obj)", "!isTupleSubtype(frame, obj, getClassNode, isSubtypeNode)"})
198-
public static Object size(VirtualFrame frame, Object obj,
199-
@SuppressWarnings("unused") @Cached GetClassNode getClassNode,
200-
@SuppressWarnings("unused") @Cached IsSubtypeNode isSubtypeNode,
201-
@Cached StrNode strNode,
202-
@Cached PRaiseNativeNode raiseNativeNode) {
203-
return raiseNativeNode.raiseInt(frame, -1, SystemError, BAD_ARG_TO_INTERNAL_FUNC_WAS_S_P, strNode.executeWith(frame, obj), obj);
204-
}
205-
206-
protected boolean isTupleSubtype(VirtualFrame frame, Object obj, GetClassNode getClassNode, IsSubtypeNode isSubtypeNode) {
207-
return isSubtypeNode.execute(frame, getClassNode.execute(obj), PythonBuiltinClassType.PTuple);
188+
try {
189+
return pyTupleSizeNode.execute(tuple);
190+
} catch (PException e) {
191+
transformExceptionToNativeNode.execute(frame, e);
192+
return -1;
193+
}
208194
}
209195
}
210196

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/TupleBuiltins.java

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2021, Oracle and/or its affiliates.
2+
* Copyright (c) 2017, 2022, Oracle and/or its affiliates.
33
* Copyright (c) 2014, Regents of the University of California
44
*
55
* All rights reserved.
@@ -67,11 +67,11 @@
6767
import com.oracle.graal.python.builtins.objects.iterator.PSequenceIterator;
6868
import com.oracle.graal.python.builtins.objects.slice.PSlice;
6969
import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltinsClinicProviders.IndexNodeClinicProviderGen;
70-
import com.oracle.graal.python.lib.PyLongAsIntNode;
7170
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
7271
import com.oracle.graal.python.lib.PyObjectHashNode;
7372
import com.oracle.graal.python.lib.PyObjectReprAsJavaStringNode;
7473
import com.oracle.graal.python.lib.PyObjectRichCompareBool;
74+
import com.oracle.graal.python.lib.PyTupleSizeNode;
7575
import com.oracle.graal.python.nodes.ErrorMessages;
7676
import com.oracle.graal.python.nodes.PGuards;
7777
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
@@ -178,17 +178,9 @@ long count(VirtualFrame frame, PTuple self, Object value,
178178
@GenerateNodeFactory
179179
public abstract static class LenNode extends PythonUnaryBuiltinNode {
180180
@Specialization
181-
public int doManaged(PTuple self,
182-
@Cached SequenceStorageNodes.LenNode lenNode) {
183-
return lenNode.execute(self.getSequenceStorage());
184-
}
185-
186-
@Specialization
187-
public int doNative(PythonNativeObject self,
188-
@Cached PCallCapiFunction callSizeNode,
189-
@Cached CExtNodes.ToSulongNode toSulongNode,
190-
@Cached PyLongAsIntNode asIntNode) {
191-
return asIntNode.execute(null, callSizeNode.call(NativeCAPISymbol.FUN_PY_TRUFFLE_OBJECT_SIZE, toSulongNode.execute(self)));
181+
public int len(Object self,
182+
@Cached PyTupleSizeNode pyTupleSizeNode) {
183+
return pyTupleSizeNode.execute(self);
192184
}
193185
}
194186

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
/*
2+
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* The Universal Permissive License (UPL), Version 1.0
6+
*
7+
* Subject to the condition set forth below, permission is hereby granted to any
8+
* person obtaining a copy of this software, associated documentation and/or
9+
* data (collectively the "Software"), free of charge and under any and all
10+
* copyright rights in the Software, and any and all patent rights owned or
11+
* freely licensable by each licensor hereunder covering either (i) the
12+
* unmodified Software as contributed to or provided by such licensor, or (ii)
13+
* the Larger Works (as defined below), to deal in both
14+
*
15+
* (a) the Software, and
16+
*
17+
* (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
18+
* one is included with the Software each a "Larger Work" to which the Software
19+
* is contributed by such licensors),
20+
*
21+
* without restriction, including without limitation the rights to copy, create
22+
* derivative works of, display, perform, and distribute the Software and make,
23+
* use, sell, offer for sale, import, export, have made, and have sold the
24+
* Software and the Larger Work(s), and to sublicense the foregoing rights on
25+
* either these or other terms.
26+
*
27+
* This license is subject to the following condition:
28+
*
29+
* The above copyright notice and either this complete permission notice or at a
30+
* minimum a reference to the UPL must be included in all copies or substantial
31+
* portions of the Software.
32+
*
33+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
39+
* SOFTWARE.
40+
*/
41+
package com.oracle.graal.python.lib;
42+
43+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError;
44+
import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_TRUFFLE_OBJECT_SIZE;
45+
import static com.oracle.graal.python.nodes.ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC_S;
46+
47+
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
48+
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
49+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes;
50+
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
51+
import com.oracle.graal.python.nodes.PNodeWithContext;
52+
import com.oracle.graal.python.nodes.PRaiseNode;
53+
import com.oracle.graal.python.nodes.classes.IsSubtypeNode;
54+
import com.oracle.graal.python.nodes.object.GetClassNode;
55+
import com.oracle.graal.python.nodes.util.CannotCastException;
56+
import com.oracle.graal.python.nodes.util.CastToJavaIntLossyNode;
57+
import com.oracle.truffle.api.CompilerDirectives;
58+
import com.oracle.truffle.api.dsl.Cached;
59+
import com.oracle.truffle.api.dsl.Fallback;
60+
import com.oracle.truffle.api.dsl.GenerateUncached;
61+
import com.oracle.truffle.api.dsl.Specialization;
62+
63+
@GenerateUncached
64+
public abstract class PyTupleSizeNode extends PNodeWithContext {
65+
public abstract int execute(Object tuple);
66+
67+
@Specialization
68+
static int size(PTuple tuple) {
69+
return tuple.getSequenceStorage().length();
70+
}
71+
72+
@Specialization(guards = "isTupleSubtype(tuple, getClassNode, isSubtypeNode)", limit = "1")
73+
static int sizeNative(PythonAbstractNativeObject tuple,
74+
@SuppressWarnings("unused") @Cached GetClassNode getClassNode,
75+
@SuppressWarnings("unused") @Cached IsSubtypeNode isSubtypeNode,
76+
@Cached CExtNodes.PCallCapiFunction callSizeNode,
77+
@Cached CExtNodes.ToSulongNode toSulongNode,
78+
@Cached CastToJavaIntLossyNode asIntNode) {
79+
try {
80+
return asIntNode.execute(callSizeNode.call(FUN_PY_TRUFFLE_OBJECT_SIZE, toSulongNode.execute(tuple)));
81+
} catch (CannotCastException e) {
82+
throw CompilerDirectives.shouldNotReachHere("Failed to cast result of PyTruffle_Object_Size");
83+
}
84+
}
85+
86+
@SuppressWarnings("unused")
87+
@Fallback
88+
static int size(Object obj,
89+
@Cached PRaiseNode raiseNode) {
90+
throw raiseNode.raise(SystemError, BAD_ARG_TO_INTERNAL_FUNC_S, "PyTuple_Size");
91+
}
92+
93+
protected boolean isTupleSubtype(Object obj, GetClassNode getClassNode, IsSubtypeNode isSubtypeNode) {
94+
return isSubtypeNode.execute(getClassNode.execute(obj), PythonBuiltinClassType.PTuple);
95+
}
96+
}

0 commit comments

Comments
 (0)