Skip to content

Commit 4a23349

Browse files
committed
Proxy objects do not inherit internal slots of their target.
1 parent ba2eece commit 4a23349

File tree

2 files changed

+13
-7
lines changed

2 files changed

+13
-7
lines changed

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/builtins/ObjectPrototypeBuiltins.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@
8585
import com.oracle.truffle.js.runtime.builtins.BuiltinEnum;
8686
import com.oracle.truffle.js.runtime.builtins.JSClass;
8787
import com.oracle.truffle.js.runtime.builtins.JSOrdinary;
88-
import com.oracle.truffle.js.runtime.builtins.JSProxy;
8988
import com.oracle.truffle.js.runtime.objects.JSLazyString;
9089
import com.oracle.truffle.js.runtime.objects.JSObject;
9190
import com.oracle.truffle.js.runtime.objects.Null;
@@ -309,12 +308,13 @@ protected String doJSObject(DynamicObject thisObj,
309308
@Specialization(guards = "isJSProxy(thisObj)")
310309
protected String doJSProxy(DynamicObject thisObj,
311310
@Shared("builtinTag") @Cached("create()") GetBuiltinToStringTagNode getBuiltinToStringTagNode) {
312-
Object target = JSProxy.getTargetNonProxy(thisObj);
313-
String toString = getToStringTag(thisObj);
314-
if (toString == null) {
315-
toString = getBuiltinToStringTagNode.execute(target);
311+
// builtinTag must be read before tag because the latter may revoke the proxy
312+
String builtinTag = getBuiltinToStringTagNode.execute(thisObj);
313+
String tag = getToStringTag(thisObj);
314+
if (tag == null) {
315+
tag = builtinTag;
316316
}
317-
return formatString(toString);
317+
return formatString(tag);
318318
}
319319

320320
@Specialization(guards = "isJSNull(thisObj)")

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/runtime/builtins/JSProxy.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,13 @@ public boolean isExtensible(DynamicObject thisObj) {
548548
public String getBuiltinToStringTag(DynamicObject object) {
549549
Object targetNonProxy = getTargetNonProxy(object);
550550
if (JSDynamicObject.isJSDynamicObject(targetNonProxy)) {
551-
return JSObject.getJSClass((DynamicObject) targetNonProxy).getBuiltinToStringTag((DynamicObject) targetNonProxy);
551+
if (JSArray.isJSArray(targetNonProxy)) {
552+
return JSArray.CLASS_NAME;
553+
} else if (JSFunction.isJSFunction(targetNonProxy)) {
554+
return JSFunction.CLASS_NAME;
555+
} else {
556+
return "Object";
557+
}
552558
} else {
553559
return "Foreign";
554560
}

0 commit comments

Comments
 (0)