Skip to content

Commit 6cc1611

Browse files
committed
[GR-80771] Prepare GraalPy invalid code and struct seq roots for Truffle root typed calls.
PullRequest: graalpython/4960
2 parents f30f603 + 721837f commit 6cc1611

5 files changed

Lines changed: 64 additions & 118 deletions

File tree

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
import com.oracle.graal.python.nodes.exception.TopLevelExceptionHandler;
9191
import com.oracle.graal.python.nodes.frame.GetFrameLocalsNode;
9292
import com.oracle.graal.python.nodes.frame.MaterializeFrameNode;
93+
import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode;
9394
import com.oracle.graal.python.pegparser.FutureFeature;
9495
import com.oracle.graal.python.pegparser.InputType;
9596
import com.oracle.graal.python.pegparser.NodeFactory;
@@ -1223,7 +1224,7 @@ public <T extends RootNode> T createCachedExternalFunWrapperRootNode(Function<Py
12231224
return createCachedRootNodeUnsafe(rootNodeFunction, true, klass, signature, name, doArgumentAndResultConversion, isStatic);
12241225
}
12251226

1226-
public <T extends RootNode> T createStructSeqIndexedMemberAccessCachedRootNode(Function<PythonLanguage, T> rootNodeFunction, int memberIndex) {
1227+
public BuiltinFunctionRootNode createStructSeqIndexedMemberAccessCachedRootNode(Function<PythonLanguage, BuiltinFunctionRootNode> rootNodeFunction, int memberIndex) {
12271228
return createCachedRootNodeUnsafe(rootNodeFunction, true, StructSequence.class, memberIndex);
12281229
}
12291230

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/code/CodeNodes.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
import com.oracle.graal.python.nodes.PNodeWithContext;
5050
import com.oracle.graal.python.nodes.PRootNode;
5151
import com.oracle.graal.python.nodes.bytecode_dsl.BytecodeDSLCodeUnit;
52-
import com.oracle.graal.python.nodes.util.BadOPCodeNode;
52+
import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNode;
5353
import com.oracle.graal.python.runtime.ExecutionContext.BoundaryCallContext;
5454
import com.oracle.graal.python.runtime.IndirectCallData.BoundaryCallData;
5555
import com.oracle.graal.python.runtime.PythonContext;
@@ -138,7 +138,7 @@ private static PCode createCode(PythonLanguage language, int argCount,
138138
PRootNode rootNode;
139139
Signature signature;
140140
if (codedata.length == 0) {
141-
rootNode = language.createCachedRootNode(l -> new BadOPCodeNode(l, name), BadOPCodeNode.class, name.toJavaStringUncached());
141+
rootNode = language.createCachedRootNode(l -> PBytecodeDSLRootNode.createBadOpcode(l, name), CreateCodeNode.class, name.toJavaStringUncached());
142142
/*
143143
* We need to create a proper signature because this code path is used to create
144144
* fake code objects for duck-typed function-like objects, such as Cython functions.

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

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -45,23 +45,21 @@
4545
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEW__;
4646
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___REDUCE__;
4747
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___REPR__;
48-
import static com.oracle.graal.python.util.PythonUtils.EMPTY_TRUFFLESTRING_ARRAY;
4948
import static com.oracle.graal.python.util.PythonUtils.toTruffleStringArrayUncached;
50-
import static com.oracle.graal.python.util.PythonUtils.tsArray;
5149
import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
5250

5351
import java.util.ArrayList;
5452
import java.util.List;
5553
import java.util.Objects;
5654

5755
import com.oracle.graal.python.PythonLanguage;
56+
import com.oracle.graal.python.annotations.Builtin;
5857
import com.oracle.graal.python.builtins.Python3Core;
5958
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
6059
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
6160
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
62-
import com.oracle.graal.python.builtins.objects.function.PArguments;
6361
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
64-
import com.oracle.graal.python.builtins.objects.function.Signature;
62+
import com.oracle.graal.python.builtins.objects.tuple.StructSequenceFactory.GetStructMemberNodeGen;
6563
import com.oracle.graal.python.builtins.objects.getsetdescriptor.GetSetDescriptor;
6664
import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass;
6765
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
@@ -74,14 +72,16 @@
7472
import com.oracle.graal.python.nodes.ErrorMessages;
7573
import com.oracle.graal.python.nodes.HiddenAttr;
7674
import com.oracle.graal.python.nodes.PRaiseNode;
77-
import com.oracle.graal.python.nodes.PRootNode;
7875
import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
7976
import com.oracle.graal.python.nodes.classes.IsSubtypeNode;
77+
import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode;
78+
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
8079
import com.oracle.graal.python.runtime.PythonContext;
8180
import com.oracle.graal.python.runtime.object.PFactory;
8281
import com.oracle.graal.python.runtime.sequence.storage.NativeSequenceStorage;
82+
import com.oracle.graal.python.util.PythonUtils.PrototypeNodeFactory;
8383
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
84-
import com.oracle.truffle.api.frame.VirtualFrame;
84+
import com.oracle.truffle.api.dsl.Specialization;
8585
import com.oracle.truffle.api.strings.TruffleString;
8686

8787
/**
@@ -228,47 +228,34 @@ private static void copyMethod(PythonLanguage language, PythonAbstractClass klas
228228
}
229229

230230
private static void createMember(PythonLanguage language, Object klass, TruffleString name, TruffleString doc, int idx) {
231-
GetStructMemberNode rootNode = language.createStructSeqIndexedMemberAccessCachedRootNode((l) -> new GetStructMemberNode(l, idx), idx);
232-
PBuiltinFunction getter = PFactory.createBuiltinFunction(language, name, klass, 0, 0, rootNode);
231+
BuiltinFunctionRootNode rootNode = language.createStructSeqIndexedMemberAccessCachedRootNode(
232+
l -> new BuiltinFunctionRootNode(l, GetStructMemberNode.BUILTIN, new PrototypeNodeFactory<>(GetStructMemberNodeGen.create(idx)), true), idx);
233+
int flags = PBuiltinFunction.getFlags(GetStructMemberNode.BUILTIN, rootNode.getSignature());
234+
PBuiltinFunction getter = PFactory.createBuiltinFunction(language, name, klass, 0, flags, rootNode);
233235
GetSetDescriptor callable = PFactory.createGetSetDescriptor(language, getter, null, name, klass, false);
234236
if (doc != null) {
235237
callable.setAttribute(T___DOC__, doc);
236238
}
237239
WriteAttributeToObjectNode.getUncached().execute(klass, name, callable);
238240
}
239241

240-
private static class GetStructMemberNode extends PRootNode {
241-
public static final Signature SIGNATURE = new Signature(-1, false, -1, tsArray("$self"), EMPTY_TRUFFLESTRING_ARRAY);
242+
@Builtin(name = "structseq_get_member", minNumOfPositionalArgs = 1, parameterNames = "$self")
243+
abstract static class GetStructMemberNode extends PythonUnaryBuiltinNode {
244+
private static final Builtin BUILTIN = GetStructMemberNode.class.getAnnotation(Builtin.class);
242245
private final int fieldIdx;
243246

244-
GetStructMemberNode(PythonLanguage language, int fieldIdx) {
245-
super(language);
247+
GetStructMemberNode(int fieldIdx) {
246248
this.fieldIdx = fieldIdx;
247249
}
248250

249-
@Override
250-
public Object execute(VirtualFrame frame) {
251-
PTuple self = (PTuple) PArguments.getArgument(frame, 0);
251+
@Specialization
252+
Object getMember(PTuple self) {
252253
if (self.getSequenceStorage() instanceof NativeSequenceStorage && fieldIdx >= self.getSequenceStorage().length()) {
253254
throw PRaiseNode.raiseStatic(this, NotImplementedError, ErrorMessages.UNSUPPORTED_ACCESS_OF_STRUCT_SEQUENCE_NATIVE_STORAGE);
254255
}
255256
return SequenceStorageNodes.GetItemScalarNode.executeUncached(self.getSequenceStorage(), fieldIdx);
256257
}
257258

258-
@Override
259-
public Signature getSignature() {
260-
return SIGNATURE;
261-
}
262-
263-
@Override
264-
public boolean isInternal() {
265-
return true;
266-
}
267-
268-
@Override
269-
public boolean isPythonInternal() {
270-
return true;
271-
}
272259
}
273260

274261
static TruffleString getTpName(Object cls) {

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/PBytecodeDSLRootNode.java‎

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@
5858
import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
5959
import static com.oracle.truffle.api.CompilerDirectives.shouldNotReachHere;
6060

61+
import java.io.ByteArrayOutputStream;
62+
import java.io.DataOutputStream;
63+
import java.io.IOException;
6164
import java.math.BigInteger;
6265
import java.util.HashMap;
6366
import java.util.Iterator;
@@ -476,6 +479,47 @@ public static PBytecodeDSLRootNode cast(RootNode root) {
476479
return PBytecodeDSLRootNodeGen.BYTECODE.cast(root);
477480
}
478481

482+
public static PBytecodeDSLRootNode createBadOpcode(PythonLanguage language, TruffleString name) {
483+
BytecodeDSLCodeUnit.BytecodeSupplier supplier = new BytecodeDSLCodeUnit.BytecodeSupplier() {
484+
@Override
485+
public PBytecodeDSLRootNode createRootNode(PythonLanguage rootLanguage) {
486+
return PBytecodeDSLRootNodeGen.create(rootLanguage, BytecodeConfig.DEFAULT, b -> {
487+
b.beginRoot();
488+
// Reserve the local used by exception tracing and profiling.
489+
b.createLocal();
490+
b.emitEnterInstrumentedRoot();
491+
b.beginRaise();
492+
b.beginCallUnaryMethod();
493+
b.emitLoadConstant(SystemError);
494+
b.emitLoadConstant(ErrorMessages.UNKNOWN_OPCODE);
495+
b.endCallUnaryMethod();
496+
b.emitLoadConstant(PNone.NO_VALUE);
497+
b.endRaise();
498+
b.endRoot();
499+
}).getNode(0);
500+
}
501+
502+
@Override
503+
public byte[] createSerializedBytecode(PythonLanguage rootLanguage) {
504+
try {
505+
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
506+
createRootNode(rootLanguage).getRootNodes().serialize(new DataOutputStream(bytes), new MarshalModuleBuiltins.PBytecodeDSLSerializer(rootLanguage));
507+
return bytes.toByteArray();
508+
} catch (IOException e) {
509+
throw shouldNotReachHere(e);
510+
}
511+
}
512+
};
513+
BytecodeDSLCodeUnit code = new BytecodeDSLCodeUnit(name, name, 0, 0, 0, 0,
514+
PythonUtils.EMPTY_TRUFFLESTRING_ARRAY, PythonUtils.EMPTY_TRUFFLESTRING_ARRAY,
515+
PythonUtils.EMPTY_TRUFFLESTRING_ARRAY, PythonUtils.EMPTY_TRUFFLESTRING_ARRAY,
516+
PythonUtils.EMPTY_OBJECT_ARRAY, 1, 0, 1, 0, -1, -1, -1, 0, 0, supplier);
517+
PBytecodeDSLRootNode root = code.createRootNode(language, false);
518+
// Preserve the empty co_code of these placeholder code objects.
519+
root.setCode(PythonUtils.EMPTY_BYTE_ARRAY);
520+
return root;
521+
}
522+
479523
@TruffleBoundary
480524
public static void updateAllToTracingConfig(PythonLanguage language) {
481525
PBytecodeDSLRootNodeGen.BYTECODE.update(language, BytecodeConfig.WITH_SOURCE);

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/BadOPCodeNode.java‎

Lines changed: 0 additions & 86 deletions
This file was deleted.

0 commit comments

Comments
 (0)