4848import com .oracle .graal .python .builtins .objects .cext .NativeWrappers .PySequenceArrayWrapper ;
4949import com .oracle .graal .python .builtins .objects .cext .PySequenceArrayWrapperMRFactory .GetTypeIDNodeGen ;
5050import com .oracle .graal .python .builtins .objects .cext .PySequenceArrayWrapperMRFactory .ReadArrayItemNodeGen ;
51+ import com .oracle .graal .python .builtins .objects .cext .PySequenceArrayWrapperMRFactory .ToNativeArrayNodeGen ;
5152import com .oracle .graal .python .builtins .objects .cext .PySequenceArrayWrapperMRFactory .ToNativeStorageNodeGen ;
5253import com .oracle .graal .python .builtins .objects .cext .PySequenceArrayWrapperMRFactory .WriteArrayItemNodeGen ;
5354import com .oracle .graal .python .builtins .objects .common .SequenceStorageNodes ;
5859import com .oracle .graal .python .builtins .objects .tuple .PTuple ;
5960import com .oracle .graal .python .builtins .objects .tuple .TupleBuiltins ;
6061import com .oracle .graal .python .builtins .objects .tuple .TupleBuiltinsFactory ;
61- import com .oracle .graal .python .builtins .objects .type .PythonClass ;
6262import com .oracle .graal .python .nodes .PBaseNode ;
6363import com .oracle .graal .python .nodes .SpecialMethodNames ;
6464import com .oracle .graal .python .nodes .call .special .LookupAndCallBinaryNode ;
6565import com .oracle .graal .python .nodes .call .special .LookupAndCallTernaryNode ;
6666import com .oracle .graal .python .nodes .call .special .LookupAndCallUnaryNode ;
6767import com .oracle .graal .python .nodes .truffle .PythonTypes ;
6868import 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 ;
7169import 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 ;
7470import com .oracle .graal .python .runtime .sequence .storage .NativeSequenceStorage ;
75- import com .oracle .graal .python .runtime .sequence .storage .ObjectSequenceStorage ;
7671import com .oracle .graal .python .runtime .sequence .storage .SequenceStorage ;
7772import com .oracle .truffle .api .CompilerDirectives ;
7873import 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