4545import com .oracle .graal .python .builtins .objects .cext .CExtNodesFactory .AsPythonObjectNodeGen ;
4646import com .oracle .graal .python .builtins .objects .cext .CExtNodesFactory .ToJavaNodeGen ;
4747import com .oracle .graal .python .builtins .objects .cext .CExtNodesFactory .ToSulongNodeGen ;
48+ import com .oracle .graal .python .builtins .objects .cext .NativeWrappers .PythonClassNativeWrapper ;
49+ import com .oracle .graal .python .builtins .objects .cext .NativeWrappers .PythonNativeWrapper ;
50+ import com .oracle .graal .python .builtins .objects .cext .NativeWrappers .PythonObjectNativeWrapper ;
51+ import com .oracle .graal .python .builtins .objects .cext .NativeWrappers .TruffleObjectNativeWrapper ;
4852import com .oracle .graal .python .builtins .objects .type .PythonClass ;
4953import com .oracle .graal .python .nodes .PBaseNode ;
5054import com .oracle .graal .python .nodes .PGuards ;
@@ -77,42 +81,42 @@ public abstract static class ToSulongNode extends PBaseNode {
7781 * passed from Python into C code need to wrap Strings into PStrings.
7882 */
7983 @ Specialization
80- Object run (String str ) {
84+ Object doString (String str ) {
8185 return PythonObjectNativeWrapper .wrap (factory ().createString (str ));
8286 }
8387
8488 @ Specialization
85- Object run (boolean b ) {
89+ Object doBoolean (boolean b ) {
8690 return PythonObjectNativeWrapper .wrap (factory ().createInt (b ));
8791 }
8892
8993 @ Specialization
90- Object run (int integer ) {
91- return PythonObjectNativeWrapper .wrap (factory ().createInt (integer ));
94+ Object doInteger (int i ) {
95+ return PythonObjectNativeWrapper .wrap (factory ().createInt (i ));
9296 }
9397
9498 @ Specialization
95- Object run (long integer ) {
96- return PythonObjectNativeWrapper .wrap (factory ().createInt (integer ));
99+ Object doLong (long l ) {
100+ return PythonObjectNativeWrapper .wrap (factory ().createInt (l ));
97101 }
98102
99103 @ Specialization
100- Object run (double number ) {
101- return PythonObjectNativeWrapper .wrap (factory ().createFloat (number ));
104+ Object doDouble (double d ) {
105+ return PythonObjectNativeWrapper .wrap (factory ().createFloat (d ));
102106 }
103107
104108 @ Specialization
105- Object runNativeClass (PythonNativeClass object ) {
106- return object .object ;
109+ Object doNativeClass (PythonNativeClass nativeClass ) {
110+ return nativeClass .object ;
107111 }
108112
109113 @ Specialization
110- Object runNativeObject (PythonNativeObject object ) {
111- return object .object ;
114+ Object doNativeObject (PythonNativeObject nativeObject ) {
115+ return nativeObject .object ;
112116 }
113117
114118 @ Specialization (guards = "!isNativeClass(object)" )
115- Object runNativeObject (PythonClass object ) {
119+ Object doPythonClass (PythonClass object ) {
116120 return PythonClassNativeWrapper .wrap (object );
117121 }
118122
@@ -122,6 +126,11 @@ Object runNativeObject(PythonAbstractObject object) {
122126 return PythonObjectNativeWrapper .wrap (object );
123127 }
124128
129+ @ Specialization (guards = {"isForeignObject(object)" })
130+ Object doPythonClass (TruffleObject object ) {
131+ return TruffleObjectNativeWrapper .wrap (object );
132+ }
133+
125134 @ Fallback
126135 Object run (Object obj ) {
127136 assert obj != null : "Java 'null' cannot be a Sulong value" ;
@@ -140,6 +149,10 @@ protected static boolean isNativeObject(PythonAbstractObject o) {
140149 return o instanceof PythonNativeObject ;
141150 }
142151
152+ protected static boolean isForeignObject (Object o ) {
153+ return !(o instanceof PythonAbstractObject );
154+ }
155+
143156 public static ToSulongNode create () {
144157 return ToSulongNodeGen .create ();
145158 }
@@ -156,11 +169,11 @@ public abstract static class AsPythonObjectNode extends PBaseNode {
156169 @ Child GetClassNode getClassNode ;
157170
158171 @ Specialization
159- PythonAbstractObject doNativeWrapper (PythonObjectNativeWrapper object ) {
160- return object .getPythonObject ();
172+ Object doNativeWrapper (PythonNativeWrapper object ) {
173+ return object .getDelegate ();
161174 }
162175
163- @ Specialization (guards = "isForeignObject(object)" )
176+ @ Specialization (guards = { "isForeignObject(object)" , "!isNativeWrapper(object)" } )
164177 PythonAbstractObject doNativeObject (TruffleObject object ) {
165178 return factory ().createNativeObjectWrapper (object );
166179 }
@@ -204,10 +217,14 @@ protected boolean isForeignObject(TruffleObject obj) {
204217 return getClassNode .execute (obj ) == getCore ().getForeignClass ();
205218 }
206219
220+ protected boolean isNativeWrapper (Object obj ) {
221+ return obj instanceof PythonNativeWrapper ;
222+ }
223+
207224 @ TruffleBoundary
208225 public static Object doSlowPath (Object object ) {
209- if (object instanceof PythonObjectNativeWrapper ) {
210- return ((PythonObjectNativeWrapper ) object ).getPythonObject ();
226+ if (object instanceof PythonNativeWrapper ) {
227+ return ((PythonNativeWrapper ) object ).getDelegate ();
211228 } else if (GetClassNode .getItSlowPath (object ) == PythonLanguage .getCore ().getForeignClass ()) {
212229 throw new AssertionError ("Unsupported slow path operation: converting 'to_java(" + object + ")" );
213230 }
0 commit comments