|
73 | 73 | import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes;
|
74 | 74 | import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AddRefCntNode;
|
75 | 75 | import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AsPythonObjectNode;
|
| 76 | +import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PCallCapiFunction; |
76 | 77 | import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PRaiseNativeNode;
|
77 | 78 | import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ToNewRefNode;
|
| 79 | +import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ToSulongNode; |
78 | 80 | import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.TransformExceptionToNativeNode;
|
79 | 81 | import com.oracle.graal.python.builtins.objects.cext.capi.DynamicObjectNativeWrapper.PrimitiveNativeWrapper;
|
80 | 82 | import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes;
|
81 | 83 | import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
|
82 | 84 | import com.oracle.graal.python.builtins.objects.common.SequenceNodes;
|
| 85 | +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.DefaultCheckFunctionResultNode; |
| 86 | +import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_TRUFFLE_SEQUENCE_SIZE; |
83 | 87 | import com.oracle.graal.python.builtins.objects.dict.DictBuiltins.ItemsNode;
|
84 | 88 | import com.oracle.graal.python.builtins.objects.dict.DictBuiltins.KeysNode;
|
85 | 89 | import com.oracle.graal.python.builtins.objects.dict.DictBuiltins.ValuesNode;
|
|
112 | 116 | import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
|
113 | 117 | import com.oracle.graal.python.nodes.subscript.SliceLiteralNode;
|
114 | 118 | import com.oracle.graal.python.nodes.truffle.PythonTypes;
|
| 119 | +import com.oracle.graal.python.runtime.PythonContext; |
115 | 120 | import com.oracle.graal.python.runtime.exception.PException;
|
116 | 121 | import com.oracle.graal.python.runtime.sequence.PSequence;
|
117 | 122 | import com.oracle.truffle.api.CompilerDirectives;
|
@@ -928,7 +933,7 @@ Object run(VirtualFrame frame, Object o, Object i,
|
928 | 933 |
|
929 | 934 | @Builtin(name = "PySequence_Check", minNumOfPositionalArgs = 1)
|
930 | 935 | @GenerateNodeFactory
|
931 |
| - abstract static class PySequenceCheck extends PythonUnaryBuiltinNode { |
| 936 | + abstract static class PyCextSequenceCheckNode extends PythonUnaryBuiltinNode { |
932 | 937 | @Specialization
|
933 | 938 | static boolean check(Object object,
|
934 | 939 | @Cached PySequenceCheckNode check) {
|
@@ -962,6 +967,43 @@ Object doManaged(VirtualFrame frame, Object listWrapper, Object position,
|
962 | 967 | }
|
963 | 968 | }
|
964 | 969 |
|
| 970 | + @Builtin(name = "PySequence_Size", minNumOfPositionalArgs = 1) |
| 971 | + @GenerateNodeFactory |
| 972 | + @ImportStatic(SpecialMethodNames.class) |
| 973 | + abstract static class PySequenceSizeNode extends PythonUnaryBuiltinNode { |
| 974 | + |
| 975 | + @Specialization(guards = "checkNode.execute(obj)") |
| 976 | + static int doSequence(VirtualFrame frame, Object obj, |
| 977 | + @SuppressWarnings("unused") @Cached PySequenceCheckNode checkNode, |
| 978 | + @Cached PyObjectSizeNode sizeNode, |
| 979 | + @Cached TransformExceptionToNativeNode transformExceptionToNativeNode) { |
| 980 | + try { |
| 981 | + return sizeNode.execute(frame, obj); |
| 982 | + } catch (PException e) { |
| 983 | + transformExceptionToNativeNode.execute(frame, e); |
| 984 | + return -1; |
| 985 | + } |
| 986 | + } |
| 987 | + |
| 988 | + @Specialization(guards = "isNativeObject(obj)") |
| 989 | + static Object doNative(VirtualFrame frame, Object obj, |
| 990 | + @Cached ToSulongNode toSulongNode, |
| 991 | + @Cached AsPythonObjectNode asPythonObjectNode, |
| 992 | + @Cached PCallCapiFunction callCapiFunction, |
| 993 | + @Cached DefaultCheckFunctionResultNode checkFunctionResultNode) { |
| 994 | + Object result = callCapiFunction.call(FUN_PY_TRUFFLE_SEQUENCE_SIZE, toSulongNode.execute(obj)); |
| 995 | + checkFunctionResultNode.execute(PythonContext.get(callCapiFunction), FUN_PY_TRUFFLE_SEQUENCE_SIZE.getName(), result); |
| 996 | + return asPythonObjectNode.execute(result); |
| 997 | + } |
| 998 | + |
| 999 | + @Specialization(guards = {"!isNativeObject(obj)", "!checkNode.execute(obj)"}) |
| 1000 | + Object notSequence(VirtualFrame frame, Object obj, |
| 1001 | + @SuppressWarnings("unused") @Cached PySequenceCheckNode checkNode, |
| 1002 | + @Cached PRaiseNativeNode raiseNativeNode) { |
| 1003 | + return raiseNativeNode.raiseInt(frame, -1, TypeError, ErrorMessages.IS_NOT_A_SEQUENCE, obj); |
| 1004 | + } |
| 1005 | + } |
| 1006 | + |
965 | 1007 | /////// PyObject ///////
|
966 | 1008 |
|
967 | 1009 | @Builtin(name = "PyObject_GetItem", minNumOfPositionalArgs = 2)
|
|
0 commit comments