48
48
import com .oracle .graal .python .builtins .objects .cext .NativeWrappers .PySequenceArrayWrapper ;
49
49
import com .oracle .graal .python .builtins .objects .cext .PySequenceArrayWrapperMRFactory .GetTypeIDNodeGen ;
50
50
import com .oracle .graal .python .builtins .objects .cext .PySequenceArrayWrapperMRFactory .ReadArrayItemNodeGen ;
51
+ import com .oracle .graal .python .builtins .objects .cext .PySequenceArrayWrapperMRFactory .ToNativeArrayNodeGen ;
51
52
import com .oracle .graal .python .builtins .objects .cext .PySequenceArrayWrapperMRFactory .ToNativeStorageNodeGen ;
52
53
import com .oracle .graal .python .builtins .objects .cext .PySequenceArrayWrapperMRFactory .WriteArrayItemNodeGen ;
53
54
import com .oracle .graal .python .builtins .objects .common .SequenceStorageNodes ;
58
59
import com .oracle .graal .python .builtins .objects .tuple .PTuple ;
59
60
import com .oracle .graal .python .builtins .objects .tuple .TupleBuiltins ;
60
61
import com .oracle .graal .python .builtins .objects .tuple .TupleBuiltinsFactory ;
61
- import com .oracle .graal .python .builtins .objects .type .PythonClass ;
62
62
import com .oracle .graal .python .nodes .PBaseNode ;
63
63
import com .oracle .graal .python .nodes .SpecialMethodNames ;
64
64
import com .oracle .graal .python .nodes .call .special .LookupAndCallBinaryNode ;
65
65
import com .oracle .graal .python .nodes .call .special .LookupAndCallTernaryNode ;
66
66
import com .oracle .graal .python .nodes .call .special .LookupAndCallUnaryNode ;
67
67
import com .oracle .graal .python .nodes .truffle .PythonTypes ;
68
68
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 ;
71
69
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 ;
74
70
import com .oracle .graal .python .runtime .sequence .storage .NativeSequenceStorage ;
75
- import com .oracle .graal .python .runtime .sequence .storage .ObjectSequenceStorage ;
76
71
import com .oracle .graal .python .runtime .sequence .storage .SequenceStorage ;
77
72
import com .oracle .truffle .api .CompilerDirectives ;
78
73
import com .oracle .truffle .api .CompilerDirectives .CompilationFinal ;
@@ -289,30 +284,41 @@ Object access(PySequenceArrayWrapper obj) {
289
284
}
290
285
}
291
286
292
- static class ToNativeArrayNode extends TransformToNativeNode {
287
+ abstract static class ToNativeArrayNode extends TransformToNativeNode {
293
288
@ CompilationFinal private TruffleObject PyObjectHandle_FromJavaObject ;
294
289
@ Child private PCallNativeNode callNativeBinary ;
295
290
@ Child private ToNativeStorageNode toNativeStorageNode ;
296
291
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 ) {
298
308
// 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
+ }
309
311
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 );
310
316
}
311
- return null ;
317
+ return PyObjectHandle_FromJavaObject ;
312
318
}
313
319
314
- protected boolean isNonNative ( PythonClass klass ) {
315
- return !( klass instanceof PythonNativeClass ) ;
320
+ protected boolean isPSequence ( Object obj ) {
321
+ return obj instanceof PSequence ;
316
322
}
317
323
318
324
private ToNativeStorageNode getToNativeStorageNode () {
@@ -323,8 +329,16 @@ private ToNativeStorageNode getToNativeStorageNode() {
323
329
return toNativeStorageNode ;
324
330
}
325
331
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
+
326
340
public static ToNativeArrayNode create () {
327
- return new ToNativeArrayNode ();
341
+ return ToNativeArrayNodeGen . create ();
328
342
}
329
343
}
330
344
@@ -440,33 +454,13 @@ static abstract class ToNativeStorageNode extends TransformToNativeNode {
440
454
441
455
public abstract NativeSequenceStorage execute (SequenceStorage object );
442
456
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 ());
446
460
}
447
461
448
462
@ 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 ) {
470
464
return s ;
471
465
}
472
466
@@ -478,7 +472,12 @@ NativeSequenceStorage doEmptyStorage(@SuppressWarnings("unused") EmptySequenceSt
478
472
479
473
@ Fallback
480
474
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 ;
482
481
}
483
482
484
483
private StorageToNativeNode getStorageToNativeNode () {
0 commit comments