Skip to content

Commit bd3c32f

Browse files
[GR-22832] Backport: JavaScript objects are not instances of foreign objects.
PullRequest: js/1479
2 parents ecc8a49 + 31a8685 commit bd3c32f

File tree

3 files changed

+63
-17
lines changed

3 files changed

+63
-17
lines changed

common.jsonnet

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
2-
local labsjdk8 = {name: 'oraclejdk', version: '8u241-jvmci-20.1-b01', platformspecific: true},
2+
local labsjdk8 = {name: 'oraclejdk', version: '8u251+08-jvmci-20.1-b02', platformspecific: true},
33

4-
local labsjdk_ce_11 = {name : 'labsjdk', version : 'ce-11.0.6+9-jvmci-20.1-b01', platformspecific: true},
4+
local labsjdk_ce_11 = {name : 'labsjdk', version : 'ce-11.0.7+10-jvmci-20.1-b02', platformspecific: true},
55

66
jdk8: {
77
downloads+: {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright (c) 2020, 2020, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl.
6+
*/
7+
8+
load('../assert.js');
9+
10+
for (type of [java.lang.Runnable, java.beans.BeanInfo, java.lang.Math]) {
11+
assertFalse(null instanceof type);
12+
assertFalse(undefined instanceof type);
13+
assertFalse(true instanceof type);
14+
assertFalse(42 instanceof type);
15+
assertFalse(42n instanceof type);
16+
assertFalse("foo" instanceof type);
17+
assertFalse(Symbol.toStringTag instanceof type);
18+
assertFalse({} instanceof type);
19+
assertFalse(function() {} instanceof type);
20+
}
21+
var stringBuilder = new java.lang.StringBuilder();
22+
assertTrue(stringBuilder instanceof java.lang.StringBuilder);
23+
assertTrue(stringBuilder instanceof java.lang.CharSequence);
24+
assertTrue(stringBuilder instanceof java.lang.Object);
25+
assertFalse(stringBuilder instanceof java.lang.Runnable);
26+
27+
true;

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/nodes/binary/InstanceofNode.java

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,20 +43,17 @@
4343
import com.oracle.truffle.api.CompilerDirectives;
4444
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
4545
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
46-
import com.oracle.truffle.api.RootCallTarget;
4746
import com.oracle.truffle.api.dsl.Cached;
4847
import com.oracle.truffle.api.dsl.Specialization;
4948
import com.oracle.truffle.api.dsl.Cached.Shared;
5049
import com.oracle.truffle.api.instrumentation.Tag;
5150
import com.oracle.truffle.api.interop.InteropLibrary;
5251
import com.oracle.truffle.api.interop.UnsupportedMessageException;
5352
import com.oracle.truffle.api.library.CachedLibrary;
54-
import com.oracle.truffle.api.nodes.RootNode;
5553
import com.oracle.truffle.api.object.DynamicObject;
5654
import com.oracle.truffle.api.object.Shape;
5755
import com.oracle.truffle.api.profiles.BranchProfile;
5856
import com.oracle.truffle.api.profiles.ConditionProfile;
59-
import com.oracle.truffle.api.source.SourceSection;
6057
import com.oracle.truffle.js.nodes.JavaScriptBaseNode;
6158
import com.oracle.truffle.js.nodes.JavaScriptNode;
6259
import com.oracle.truffle.js.nodes.access.GetMethodNode;
@@ -67,6 +64,7 @@
6764
import com.oracle.truffle.js.nodes.binary.InstanceofNodeGen.OrdinaryHasInstanceNodeGen;
6865
import com.oracle.truffle.js.nodes.cast.JSToBooleanNode;
6966
import com.oracle.truffle.js.nodes.function.JSFunctionCallNode;
67+
import com.oracle.truffle.js.runtime.BigInt;
7068
import com.oracle.truffle.js.runtime.Errors;
7169
import com.oracle.truffle.js.runtime.JSArguments;
7270
import com.oracle.truffle.js.runtime.JSContext;
@@ -151,12 +149,42 @@ private static boolean isCallable(DynamicObject target, BranchProfile proxyBranc
151149
}
152150

153151
@Specialization(guards = {"isNullOrUndefined(target)"})
154-
protected boolean doInvalidTarget(@SuppressWarnings("unused") Object obj, Object target) {
152+
protected boolean doNullOrUndefinedTarget(@SuppressWarnings("unused") Object obj, DynamicObject target) {
155153
throw Errors.createTypeErrorInvalidInstanceofTarget(target, this);
156154
}
157155

158-
@Specialization(guards = {"!isJSType(target)"}, limit = "3")
159-
protected boolean doForeignTarget(@SuppressWarnings("unused") Object instance, Object target,
156+
@Specialization()
157+
protected boolean doStringTarget(@SuppressWarnings("unused") Object obj, String target) {
158+
throw Errors.createTypeErrorInvalidInstanceofTarget(target, this);
159+
}
160+
161+
@Specialization()
162+
protected boolean doDoubleTarget(@SuppressWarnings("unused") Object obj, double target) {
163+
throw Errors.createTypeErrorInvalidInstanceofTarget(target, this);
164+
}
165+
166+
@Specialization()
167+
protected boolean doBooleanTarget(@SuppressWarnings("unused") Object obj, boolean target) {
168+
throw Errors.createTypeErrorInvalidInstanceofTarget(target, this);
169+
}
170+
171+
@Specialization()
172+
protected boolean doBigIntTarget(@SuppressWarnings("unused") Object obj, BigInt target) {
173+
throw Errors.createTypeErrorInvalidInstanceofTarget(target, this);
174+
}
175+
176+
@Specialization()
177+
protected boolean doSymbolTarget(@SuppressWarnings("unused") Object obj, Symbol target) {
178+
throw Errors.createTypeErrorInvalidInstanceofTarget(target, this);
179+
}
180+
181+
@Specialization(guards = {"isForeignObject(target)", "isJSType(instance)"})
182+
protected boolean doForeignTargetJSType(@SuppressWarnings("unused") DynamicObject instance, @SuppressWarnings("unused") Object target) {
183+
return false;
184+
}
185+
186+
@Specialization(guards = {"isForeignObject(target)", "!isJSType(instance)"}, limit = "3")
187+
protected boolean doForeignTargetOther(Object instance, Object target,
160188
@CachedLibrary("target") InteropLibrary interop) {
161189
try {
162190
return interop.isMetaInstance(target, instance);
@@ -165,15 +193,6 @@ protected boolean doForeignTarget(@SuppressWarnings("unused") Object instance, O
165193
}
166194
}
167195

168-
@TruffleBoundary
169-
private static String functionToString(DynamicObject fnObj) {
170-
assert JSFunction.isJSFunction(fnObj);
171-
RootCallTarget dct = (RootCallTarget) JSFunction.getCallTarget(fnObj);
172-
RootNode rn = dct.getRootNode();
173-
SourceSection ssect = rn.getSourceSection();
174-
return ((ssect == null || !ssect.isAvailable()) ? "function " + JSFunction.getName(fnObj) + "() { [native code] }" : ssect.getCharacters().toString());
175-
}
176-
177196
@Override
178197
protected JavaScriptNode copyUninitialized(Set<Class<? extends Tag>> materializedTags) {
179198
return InstanceofNodeGen.create(context, cloneUninitialized(getLeft(), materializedTags), cloneUninitialized(getRight(), materializedTags));

0 commit comments

Comments
 (0)