Skip to content

Commit 292af19

Browse files
committed
[GR-48700] Make interop nulls pass "is None" checks
PullRequest: graalpython/2978
2 parents bc1a421 + ff74b7e commit 292af19

File tree

3 files changed

+47
-48
lines changed
  • graalpython
    • com.oracle.graal.python/src/com/oracle/graal/python/nodes/object
    • com.oracle.graal.python.test/src/tests
    • com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/interop

3 files changed

+47
-48
lines changed

graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/interop/JavaInteropTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,18 @@ public void javaArrayBytes() {
193193
assertPrints("b'\\x01\\x02\\x03\\x04'\n", source);
194194
}
195195

196+
@Test
197+
public void javaNullIsNone() {
198+
String source = """
199+
def is_none(x):
200+
return x is None
201+
is_none
202+
""";
203+
Source script = Source.create("python", source);
204+
Value isNone = context.eval(script);
205+
assertTrue(isNone.execute((Object) null).asBoolean());
206+
}
207+
196208
@Test
197209
public void testPassingFloats() throws UnsupportedEncodingException {
198210
String source = "import polyglot\n" +

graalpython/com.oracle.graal.python.test/src/tests/test_interop.py

Lines changed: 14 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -473,39 +473,20 @@ def test_java_null_is_none():
473473
y = Integer.getInteger("something_what_does_not_exists2")
474474
z = None
475475

476-
if __graalpython__.jython_emulation_enabled:
477-
478-
assert x == None
479-
assert (x != None) == False
480-
assert x is None
481-
assert (x is not None) == False
482-
483-
assert x == y
484-
assert (x != y) == False
485-
assert x is y
486-
assert (x is not y) == False
487-
488-
assert x == z
489-
assert (x != z) == False
490-
assert x is z
491-
assert (x is not z) == False
492-
493-
else:
494-
495-
assert x == None
496-
assert (x != None) == False
497-
assert (x is None) == False
498-
assert x is not None
499-
500-
assert x == y
501-
assert (x != y) == False
502-
assert x is y
503-
assert (x is not y) == False
504-
505-
assert x == z
506-
assert (x != z) == False
507-
assert (x is z) == False
508-
assert x is not z
476+
assert x == None
477+
assert (x != None) == False
478+
assert x is None
479+
assert (x is not None) == False
480+
481+
assert x == y
482+
assert (x != y) == False
483+
assert x is y
484+
assert (x is not y) == False
485+
486+
assert x == z
487+
assert (x != z) == False
488+
assert x is z
489+
assert (x is not z) == False
509490

510491
def test_isinstance01():
511492
if __graalpython__.jython_emulation_enabled:

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/IsNode.java

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___EQ__;
4444
import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
4545

46-
import com.oracle.graal.python.PythonLanguage;
4746
import com.oracle.graal.python.builtins.Python3Core;
4847
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4948
import com.oracle.graal.python.builtins.objects.PNone;
@@ -63,9 +62,9 @@
6362
import com.oracle.graal.python.runtime.PythonOptions;
6463
import com.oracle.graal.python.util.OverflowException;
6564
import com.oracle.truffle.api.RootCallTarget;
66-
import com.oracle.truffle.api.TruffleLanguage;
6765
import com.oracle.truffle.api.dsl.Bind;
6866
import com.oracle.truffle.api.dsl.Cached;
67+
import com.oracle.truffle.api.dsl.Cached.Shared;
6968
import com.oracle.truffle.api.dsl.Fallback;
7069
import com.oracle.truffle.api.dsl.GenerateUncached;
7170
import com.oracle.truffle.api.dsl.ImportStatic;
@@ -133,7 +132,7 @@ static boolean doIL(int left, long right) {
133132
@Specialization
134133
static boolean doIP(int left, PInt right,
135134
@Bind("this") Node inliningTarget,
136-
@Cached.Shared("isBuiltin") @Cached IsAnyBuiltinObjectProfile isBuiltin) {
135+
@Shared("isBuiltin") @Cached IsAnyBuiltinObjectProfile isBuiltin) {
137136
if (isBuiltin.profileIsAnyBuiltinObject(inliningTarget, right)) {
138137
try {
139138
return right.intValueExact() == left;
@@ -158,7 +157,7 @@ static boolean doLL(long left, long right) {
158157
@Specialization
159158
static boolean doLP(long left, PInt right,
160159
@Bind("this") Node inliningTarget,
161-
@Cached.Shared("isBuiltin") @Cached IsAnyBuiltinObjectProfile isBuiltin) {
160+
@Shared("isBuiltin") @Cached IsAnyBuiltinObjectProfile isBuiltin) {
162161
if (isBuiltin.profileIsAnyBuiltinObject(inliningTarget, right)) {
163162
try {
164163
return left == right.longValueExact();
@@ -185,14 +184,14 @@ boolean doPB(PInt left, boolean right) {
185184
@Specialization
186185
static boolean doPI(PInt left, int right,
187186
@Bind("this") Node inliningTarget,
188-
@Cached.Shared("isBuiltin") @Cached IsAnyBuiltinObjectProfile isBuiltin) {
187+
@Shared("isBuiltin") @Cached IsAnyBuiltinObjectProfile isBuiltin) {
189188
return doIP(right, left, inliningTarget, isBuiltin);
190189
}
191190

192191
@Specialization
193192
static boolean doPL(PInt left, long right,
194193
@Bind("this") Node inliningTarget,
195-
@Cached.Shared("isBuiltin") @Cached IsAnyBuiltinObjectProfile isBuiltin) {
194+
@Shared("isBuiltin") @Cached IsAnyBuiltinObjectProfile isBuiltin) {
196195
return doLP(right, left, inliningTarget, isBuiltin);
197196
}
198197

@@ -246,18 +245,25 @@ static boolean doCode(PCode left, PCode right,
246245

247246
// none
248247
@Specialization
249-
boolean doObjectPNone(Object left, PNone right) {
250-
TruffleLanguage.Env env = PythonContext.get(this).getEnv();
251-
if (PythonLanguage.get(this).getEngineOption(PythonOptions.EmulateJython) && env.isHostObject(left) && env.asHostObject(left) == null &&
252-
right == PNone.NONE) {
248+
static boolean doObjectPNone(Object left, PNone right,
249+
@Bind("this") Node inliningTarget,
250+
@Shared @Cached IsForeignObjectNode isForeignObjectNode,
251+
@Shared @CachedLibrary(limit = "3") InteropLibrary lib) {
252+
if (left == right) {
253253
return true;
254254
}
255-
return left == right;
255+
if (isForeignObjectNode.execute(inliningTarget, left)) {
256+
return lib.isNull(left);
257+
}
258+
return false;
256259
}
257260

258261
@Specialization
259-
boolean doPNoneObject(PNone left, Object right) {
260-
return doObjectPNone(right, left);
262+
static boolean doPNoneObject(PNone left, Object right,
263+
@Bind("this") Node inliningTarget,
264+
@Shared @Cached IsForeignObjectNode isForeignObjectNode,
265+
@Shared @CachedLibrary(limit = "3") InteropLibrary lib) {
266+
return doObjectPNone(right, left, inliningTarget, isForeignObjectNode, lib);
261267
}
262268

263269
// pstring (may be interned)
@@ -277,8 +283,8 @@ static boolean doPString(PString left, PString right,
277283
@Fallback
278284
static boolean doOther(Object left, Object right,
279285
@Bind("this") Node inliningTarget,
280-
@Cached IsForeignObjectNode isForeignObjectNode,
281-
@CachedLibrary(limit = "3") InteropLibrary lib) {
286+
@Shared @Cached IsForeignObjectNode isForeignObjectNode,
287+
@Shared @CachedLibrary(limit = "3") InteropLibrary lib) {
282288
if (left == right) {
283289
return true;
284290
}

0 commit comments

Comments
 (0)