45
45
import com .oracle .graal .python .builtins .objects .cext .CExtNodesFactory .AsPythonObjectNodeGen ;
46
46
import com .oracle .graal .python .builtins .objects .cext .CExtNodesFactory .ToJavaNodeGen ;
47
47
import 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 ;
48
52
import com .oracle .graal .python .builtins .objects .type .PythonClass ;
49
53
import com .oracle .graal .python .nodes .PBaseNode ;
50
54
import com .oracle .graal .python .nodes .PGuards ;
@@ -77,42 +81,42 @@ public abstract static class ToSulongNode extends PBaseNode {
77
81
* passed from Python into C code need to wrap Strings into PStrings.
78
82
*/
79
83
@ Specialization
80
- Object run (String str ) {
84
+ Object doString (String str ) {
81
85
return PythonObjectNativeWrapper .wrap (factory ().createString (str ));
82
86
}
83
87
84
88
@ Specialization
85
- Object run (boolean b ) {
89
+ Object doBoolean (boolean b ) {
86
90
return PythonObjectNativeWrapper .wrap (factory ().createInt (b ));
87
91
}
88
92
89
93
@ 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 ));
92
96
}
93
97
94
98
@ 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 ));
97
101
}
98
102
99
103
@ 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 ));
102
106
}
103
107
104
108
@ Specialization
105
- Object runNativeClass (PythonNativeClass object ) {
106
- return object .object ;
109
+ Object doNativeClass (PythonNativeClass nativeClass ) {
110
+ return nativeClass .object ;
107
111
}
108
112
109
113
@ Specialization
110
- Object runNativeObject (PythonNativeObject object ) {
111
- return object .object ;
114
+ Object doNativeObject (PythonNativeObject nativeObject ) {
115
+ return nativeObject .object ;
112
116
}
113
117
114
118
@ Specialization (guards = "!isNativeClass(object)" )
115
- Object runNativeObject (PythonClass object ) {
119
+ Object doPythonClass (PythonClass object ) {
116
120
return PythonClassNativeWrapper .wrap (object );
117
121
}
118
122
@@ -122,6 +126,11 @@ Object runNativeObject(PythonAbstractObject object) {
122
126
return PythonObjectNativeWrapper .wrap (object );
123
127
}
124
128
129
+ @ Specialization (guards = {"isForeignObject(object)" })
130
+ Object doPythonClass (TruffleObject object ) {
131
+ return TruffleObjectNativeWrapper .wrap (object );
132
+ }
133
+
125
134
@ Fallback
126
135
Object run (Object obj ) {
127
136
assert obj != null : "Java 'null' cannot be a Sulong value" ;
@@ -140,6 +149,10 @@ protected static boolean isNativeObject(PythonAbstractObject o) {
140
149
return o instanceof PythonNativeObject ;
141
150
}
142
151
152
+ protected static boolean isForeignObject (Object o ) {
153
+ return !(o instanceof PythonAbstractObject );
154
+ }
155
+
143
156
public static ToSulongNode create () {
144
157
return ToSulongNodeGen .create ();
145
158
}
@@ -156,11 +169,11 @@ public abstract static class AsPythonObjectNode extends PBaseNode {
156
169
@ Child GetClassNode getClassNode ;
157
170
158
171
@ Specialization
159
- PythonAbstractObject doNativeWrapper (PythonObjectNativeWrapper object ) {
160
- return object .getPythonObject ();
172
+ Object doNativeWrapper (PythonNativeWrapper object ) {
173
+ return object .getDelegate ();
161
174
}
162
175
163
- @ Specialization (guards = "isForeignObject(object)" )
176
+ @ Specialization (guards = { "isForeignObject(object)" , "!isNativeWrapper(object)" } )
164
177
PythonAbstractObject doNativeObject (TruffleObject object ) {
165
178
return factory ().createNativeObjectWrapper (object );
166
179
}
@@ -204,10 +217,14 @@ protected boolean isForeignObject(TruffleObject obj) {
204
217
return getClassNode .execute (obj ) == getCore ().getForeignClass ();
205
218
}
206
219
220
+ protected boolean isNativeWrapper (Object obj ) {
221
+ return obj instanceof PythonNativeWrapper ;
222
+ }
223
+
207
224
@ TruffleBoundary
208
225
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 ();
211
228
} else if (GetClassNode .getItSlowPath (object ) == PythonLanguage .getCore ().getForeignClass ()) {
212
229
throw new AssertionError ("Unsupported slow path operation: converting 'to_java(" + object + ")" );
213
230
}
0 commit comments