Skip to content

Commit a5751a6

Browse files
committed
Use ExternalFunctionInvokeNode in PySequenceGetItemNode
1 parent e722efd commit a5751a6

File tree

3 files changed

+21
-45
lines changed

3 files changed

+21
-45
lines changed

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

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1591,17 +1591,6 @@ public static PCallCapiFunction getUncached() {
15911591
}
15921592
}
15931593

1594-
/**
1595-
* Simple enum to abstract over common error indication values used in C extensions. We use this
1596-
* enum instead of concrete values to be able to safely share them between contexts.
1597-
*/
1598-
public enum MayRaiseErrorResult {
1599-
NATIVE_NULL,
1600-
NONE,
1601-
INT,
1602-
FLOAT
1603-
}
1604-
16051594
// -----------------------------------------------------------------------------------------------------------------
16061595

16071596
@GenerateUncached

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

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
package com.oracle.graal.python.builtins.objects.cext.capi;
4242

4343
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError;
44+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
4445
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.CharPtrAsTruffleString;
4546
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.InitResult;
4647
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.InquiryResult;
@@ -63,7 +64,6 @@
6364
import java.util.Arrays;
6465

6566
import com.oracle.graal.python.PythonLanguage;
66-
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
6767
import com.oracle.graal.python.builtins.objects.PNone;
6868
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
6969
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PCallCapiFunction;
@@ -140,6 +140,7 @@
140140
import com.oracle.truffle.api.dsl.Fallback;
141141
import com.oracle.truffle.api.dsl.GenerateUncached;
142142
import com.oracle.truffle.api.dsl.ImportStatic;
143+
import com.oracle.truffle.api.dsl.NeverDefault;
143144
import com.oracle.truffle.api.dsl.Specialization;
144145
import com.oracle.truffle.api.dsl.TypeSystemReference;
145146
import com.oracle.truffle.api.frame.VirtualFrame;
@@ -739,13 +740,12 @@ public static MethDirectRoot create(PythonLanguage lang, TruffleString name, PEx
739740
/**
740741
* Like {@link com.oracle.graal.python.nodes.call.FunctionInvokeNode} but invokes a C function.
741742
*/
742-
static final class ExternalFunctionInvokeNode extends PNodeWithContext implements IndirectCallNode {
743+
public static final class ExternalFunctionInvokeNode extends PNodeWithContext implements IndirectCallNode {
743744
private final CApiTiming timing;
744745
@Child private CheckFunctionResultNode checkResultNode;
745746
@Child private PForeignToPTypeNode fromForeign = PForeignToPTypeNode.create();
746747
@Child private CExtToJavaNode convertReturnValue;
747748
@Child private InteropLibrary lib;
748-
@Child private PRaiseNode raiseNode;
749749
@Child private GetThreadStateNode getThreadStateNode = GetThreadStateNodeGen.create();
750750
@Child private GilNode gilNode = GilNode.create();
751751

@@ -810,13 +810,13 @@ public Object execute(VirtualFrame frame, TruffleString name, Object callable, O
810810
if (convertReturnValue != null) {
811811
result = convertReturnValue.execute(result);
812812
}
813-
return fromNative(result);
813+
return fromForeign.executeConvert(result);
814814
} catch (UnsupportedTypeException | UnsupportedMessageException e) {
815815
CompilerDirectives.transferToInterpreterAndInvalidate();
816-
throw ensureRaiseNode().raise(PythonBuiltinClassType.TypeError, ErrorMessages.CALLING_NATIVE_FUNC_FAILED, name, e);
816+
throw PRaiseNode.raiseUncached(this, TypeError, ErrorMessages.CALLING_NATIVE_FUNC_FAILED, name, e);
817817
} catch (ArityException e) {
818818
CompilerDirectives.transferToInterpreterAndInvalidate();
819-
throw ensureRaiseNode().raise(PythonBuiltinClassType.TypeError, ErrorMessages.CALLING_NATIVE_FUNC_EXPECTED_ARGS, name, e.getExpectedMinArity(), e.getActualArity());
819+
throw PRaiseNode.raiseUncached(this, TypeError, ErrorMessages.CALLING_NATIVE_FUNC_EXPECTED_ARGS, name, e.getExpectedMinArity(), e.getActualArity());
820820
} finally {
821821
CApiTiming.exit(timing);
822822
/*
@@ -830,23 +830,14 @@ public Object execute(VirtualFrame frame, TruffleString name, Object callable, O
830830
* Special case after calling a C function: transfer caught exception back to frame
831831
* to simulate the global state semantics.
832832
*/
833-
PArguments.setException(frame, threadState.getCaughtException());
833+
if (frame != null) {
834+
PArguments.setException(frame, threadState.getCaughtException());
835+
}
834836
IndirectCallContext.exit(frame, threadState, state);
835837
}
836838
}
837839

838-
private Object fromNative(Object result) {
839-
return fromForeign.executeConvert(result);
840-
}
841-
842-
private PRaiseNode ensureRaiseNode() {
843-
if (raiseNode == null) {
844-
CompilerDirectives.transferToInterpreterAndInvalidate();
845-
raiseNode = insert(PRaiseNode.create());
846-
}
847-
return raiseNode;
848-
}
849-
840+
@NeverDefault
850841
public static ExternalFunctionInvokeNode create(PExternalFunctionWrapper provider) {
851842
return new ExternalFunctionInvokeNode(provider);
852843
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceGetItemNode.java

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,20 +44,21 @@
4444

4545
import com.oracle.graal.python.builtins.objects.PNone;
4646
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
47-
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes;
4847
import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes;
4948
import com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol;
5049
import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions;
50+
import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes;
51+
import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot;
5152
import com.oracle.graal.python.nodes.ErrorMessages;
52-
import com.oracle.graal.python.nodes.PNodeWithRaiseAndIndirectCall;
53+
import com.oracle.graal.python.nodes.PGuards;
5354
import com.oracle.graal.python.nodes.PRaiseNode;
5455
import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode;
5556
import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode;
5657
import com.oracle.graal.python.nodes.object.InlinedGetClassNode;
57-
import com.oracle.graal.python.runtime.ExecutionContext;
5858
import com.oracle.graal.python.runtime.PythonContext;
5959
import com.oracle.truffle.api.dsl.Bind;
6060
import com.oracle.truffle.api.dsl.Cached;
61+
import com.oracle.truffle.api.dsl.ImportStatic;
6162
import com.oracle.truffle.api.dsl.Specialization;
6263
import com.oracle.truffle.api.frame.Frame;
6364
import com.oracle.truffle.api.frame.VirtualFrame;
@@ -67,7 +68,8 @@
6768
* Equivalent of CPython's {@code PySequence_GetItem}. For native object it would only call
6869
* {@code sq_item} and never {@code mp_item}.
6970
*/
70-
public abstract class PySequenceGetItemNode extends PNodeWithRaiseAndIndirectCall {
71+
@ImportStatic({PGuards.class, SpecialMethodSlot.class, ExternalFunctionNodes.PExternalFunctionWrapper.class})
72+
public abstract class PySequenceGetItemNode extends Node {
7173
public abstract Object execute(Frame frame, Object object, int index);
7274

7375
@Specialization(guards = "!isNativeObject(object)")
@@ -96,16 +98,10 @@ static Object doGenericManaged(VirtualFrame frame, Object object, int index,
9698
Object doNative(VirtualFrame frame, PythonAbstractNativeObject object, int index,
9799
@Bind("this") Node inliningTarget,
98100
@Cached CApiTransitions.PythonToNativeNode toNativeNode,
99-
@Cached CApiTransitions.NativeToPythonNode toPythonNode,
100-
@Cached CExtNodes.PCallCapiFunction callGetItem,
101-
@Cached ExternalFunctionNodes.DefaultCheckFunctionResultNode checkFunctionResultNode) {
102-
Object savedState = ExecutionContext.IndirectCallContext.enter(frame, this);
103-
try {
104-
Object nativeResult = callGetItem.call(NativeCAPISymbol.FUN_PY_TRUFFLE_PY_SEQUENCE_GET_ITEM, toNativeNode.execute(object), index);
105-
checkFunctionResultNode.execute(PythonContext.get(inliningTarget), NativeCAPISymbol.FUN_PY_TRUFFLE_PY_SEQUENCE_GET_ITEM.getTsName(), nativeResult);
106-
return toPythonNode.execute(nativeResult);
107-
} finally {
108-
ExecutionContext.IndirectCallContext.exit(frame, this, savedState);
109-
}
101+
@Cached CExtCommonNodes.ImportCExtSymbolNode importCExtSymbolNode,
102+
@Cached(parameters = "GETITEM") ExternalFunctionNodes.ExternalFunctionInvokeNode invokeNode) {
103+
NativeCAPISymbol symbol = NativeCAPISymbol.FUN_PY_TRUFFLE_PY_SEQUENCE_GET_ITEM;
104+
Object executable = importCExtSymbolNode.execute(PythonContext.get(inliningTarget).getCApiContext(), symbol);
105+
return invokeNode.execute(frame, symbol.getTsName(), executable, new Object[]{toNativeNode.execute(object), index});
110106
}
111107
}

0 commit comments

Comments
 (0)