Skip to content

Commit 55e6ae7

Browse files
committed
Fix: create deref handle for non-PSequence objects.
1 parent 24a0f75 commit 55e6ae7

File tree

1 file changed

+46
-47
lines changed

1 file changed

+46
-47
lines changed

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

Lines changed: 46 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import com.oracle.graal.python.builtins.objects.cext.NativeWrappers.PySequenceArrayWrapper;
4949
import com.oracle.graal.python.builtins.objects.cext.PySequenceArrayWrapperMRFactory.GetTypeIDNodeGen;
5050
import com.oracle.graal.python.builtins.objects.cext.PySequenceArrayWrapperMRFactory.ReadArrayItemNodeGen;
51+
import com.oracle.graal.python.builtins.objects.cext.PySequenceArrayWrapperMRFactory.ToNativeArrayNodeGen;
5152
import com.oracle.graal.python.builtins.objects.cext.PySequenceArrayWrapperMRFactory.ToNativeStorageNodeGen;
5253
import com.oracle.graal.python.builtins.objects.cext.PySequenceArrayWrapperMRFactory.WriteArrayItemNodeGen;
5354
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
@@ -58,21 +59,15 @@
5859
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
5960
import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltins;
6061
import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltinsFactory;
61-
import com.oracle.graal.python.builtins.objects.type.PythonClass;
6262
import com.oracle.graal.python.nodes.PBaseNode;
6363
import com.oracle.graal.python.nodes.SpecialMethodNames;
6464
import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode;
6565
import com.oracle.graal.python.nodes.call.special.LookupAndCallTernaryNode;
6666
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
6767
import com.oracle.graal.python.nodes.truffle.PythonTypes;
6868
import com.oracle.graal.python.runtime.sequence.PSequence;
69-
import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage;
70-
import com.oracle.graal.python.runtime.sequence.storage.DoubleSequenceStorage;
7169
import com.oracle.graal.python.runtime.sequence.storage.EmptySequenceStorage;
72-
import com.oracle.graal.python.runtime.sequence.storage.IntSequenceStorage;
73-
import com.oracle.graal.python.runtime.sequence.storage.LongSequenceStorage;
7470
import com.oracle.graal.python.runtime.sequence.storage.NativeSequenceStorage;
75-
import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage;
7671
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
7772
import com.oracle.truffle.api.CompilerDirectives;
7873
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
@@ -289,30 +284,41 @@ Object access(PySequenceArrayWrapper obj) {
289284
}
290285
}
291286

292-
static class ToNativeArrayNode extends TransformToNativeNode {
287+
abstract static class ToNativeArrayNode extends TransformToNativeNode {
293288
@CompilationFinal private TruffleObject PyObjectHandle_FromJavaObject;
294289
@Child private PCallNativeNode callNativeBinary;
295290
@Child private ToNativeStorageNode toNativeStorageNode;
296291

297-
public Object execute(PySequenceArrayWrapper object) {
292+
public abstract Object execute(PySequenceArrayWrapper object);
293+
294+
@Specialization(guards = "isPSequence(object.getDelegate())")
295+
Object doPSequence(PySequenceArrayWrapper object) {
296+
PSequence sequence = (PSequence) object.getDelegate();
297+
NativeSequenceStorage nativeStorage = getToNativeStorageNode().execute(sequence.getSequenceStorage());
298+
if (nativeStorage == null) {
299+
throw new AssertionError("could not allocate native storage");
300+
}
301+
// switch to native storage
302+
sequence.setSequenceStorage(nativeStorage);
303+
return nativeStorage.getPtr();
304+
}
305+
306+
@Fallback
307+
Object doGeneric(PySequenceArrayWrapper object) {
298308
// TODO correct element size
299-
Object delegate = object.getDelegate();
300-
if (delegate instanceof PSequence) {
301-
PSequence sequence = (PSequence) delegate;
302-
NativeSequenceStorage nativeStorage = getToNativeStorageNode().execute(sequence.getSequenceStorage());
303-
if (nativeStorage == null) {
304-
throw new AssertionError("could not allocate native storage");
305-
}
306-
// switch to native storage
307-
sequence.setSequenceStorage(nativeStorage);
308-
return nativeStorage.getPtr();
309+
return ensureIsPointer(callBinaryIntoCapi(getNativeHandleForArray(), object, 8L));
310+
}
309311

312+
private TruffleObject getNativeHandleForArray() {
313+
if (PyObjectHandle_FromJavaObject == null) {
314+
CompilerDirectives.transferToInterpreterAndInvalidate();
315+
PyObjectHandle_FromJavaObject = (TruffleObject) getContext().getEnv().importSymbol(NativeCAPISymbols.FUN_NATIVE_HANDLE_FOR_ARRAY);
310316
}
311-
return null;
317+
return PyObjectHandle_FromJavaObject;
312318
}
313319

314-
protected boolean isNonNative(PythonClass klass) {
315-
return !(klass instanceof PythonNativeClass);
320+
protected boolean isPSequence(Object obj) {
321+
return obj instanceof PSequence;
316322
}
317323

318324
private ToNativeStorageNode getToNativeStorageNode() {
@@ -323,8 +329,16 @@ private ToNativeStorageNode getToNativeStorageNode() {
323329
return toNativeStorageNode;
324330
}
325331

332+
private Object callBinaryIntoCapi(TruffleObject fun, Object arg0, Object arg1) {
333+
if (callNativeBinary == null) {
334+
CompilerDirectives.transferToInterpreterAndInvalidate();
335+
callNativeBinary = insert(PCallNativeNode.create());
336+
}
337+
return callNativeBinary.execute(fun, new Object[]{arg0, arg1});
338+
}
339+
326340
public static ToNativeArrayNode create() {
327-
return new ToNativeArrayNode();
341+
return ToNativeArrayNodeGen.create();
328342
}
329343
}
330344

@@ -440,33 +454,13 @@ static abstract class ToNativeStorageNode extends TransformToNativeNode {
440454

441455
public abstract NativeSequenceStorage execute(SequenceStorage object);
442456

443-
@Specialization
444-
NativeSequenceStorage doByteStorage(ByteSequenceStorage s) {
445-
return getStorageToNativeNode().execute(s.getInternalByteArray());
457+
@Specialization(guards = "!isNative(s)")
458+
NativeSequenceStorage doManaged(SequenceStorage s) {
459+
return getStorageToNativeNode().execute(s.getInternalArrayObject());
446460
}
447461

448462
@Specialization
449-
NativeSequenceStorage doIntStorage(IntSequenceStorage s) {
450-
return getStorageToNativeNode().execute(s.getInternalIntArray());
451-
}
452-
453-
@Specialization
454-
NativeSequenceStorage doLongStorage(LongSequenceStorage s) {
455-
return getStorageToNativeNode().execute(s.getInternalLongArray());
456-
}
457-
458-
@Specialization
459-
NativeSequenceStorage doDoubleStorage(DoubleSequenceStorage s) {
460-
return getStorageToNativeNode().execute(s.getInternalDoubleArray());
461-
}
462-
463-
@Specialization
464-
NativeSequenceStorage doObjectStorage(ObjectSequenceStorage s) {
465-
return getStorageToNativeNode().execute(s.getInternalArray());
466-
}
467-
468-
@Specialization
469-
NativeSequenceStorage doNativeStorage(NativeSequenceStorage s) {
463+
NativeSequenceStorage doNative(NativeSequenceStorage s) {
470464
return s;
471465
}
472466

@@ -478,7 +472,12 @@ NativeSequenceStorage doEmptyStorage(@SuppressWarnings("unused") EmptySequenceSt
478472

479473
@Fallback
480474
NativeSequenceStorage doGeneric(@SuppressWarnings("unused") SequenceStorage s) {
481-
return null;
475+
CompilerDirectives.transferToInterpreter();
476+
throw new UnsupportedOperationException("Unknown storage type: " + s);
477+
}
478+
479+
protected static boolean isNative(SequenceStorage s) {
480+
return s instanceof NativeSequenceStorage;
482481
}
483482

484483
private StorageToNativeNode getStorageToNativeNode() {

0 commit comments

Comments
 (0)