Skip to content

Commit cd170a0

Browse files
committed
NativeProxy: fix set trap not passing receiver object
1 parent 1bce1a7 commit cd170a0

2 files changed

Lines changed: 55 additions & 3 deletions

File tree

rhino/src/main/java/org/mozilla/javascript/NativeProxy.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,7 @@ public void put(String name, Scriptable start, Object value) {
569569
Function trap = getTrap(TRAP_SET);
570570
if (trap != null) {
571571
boolean booleanTrapResult =
572-
ScriptRuntime.toBoolean(callTrap(trap, new Object[] {target, name, value}));
572+
ScriptRuntime.toBoolean(callTrap(trap, new Object[] {target, name, value, this}));
573573
if (!booleanTrapResult) {
574574
return; // false
575575
}
@@ -631,7 +631,7 @@ public void put(int index, Scriptable start, Object value) {
631631
ScriptRuntime.toBoolean(
632632
callTrap(
633633
trap,
634-
new Object[] {target, ScriptRuntime.toString(index), value}));
634+
new Object[] {target, ScriptRuntime.toString(index), value, this}));
635635
if (!booleanTrapResult) {
636636
return; // false
637637
}
@@ -691,7 +691,7 @@ public void put(Symbol key, Scriptable start, Object value) {
691691
Function trap = getTrap(TRAP_SET);
692692
if (trap != null) {
693693
boolean booleanTrapResult =
694-
ScriptRuntime.toBoolean(callTrap(trap, new Object[] {target, key, value}));
694+
ScriptRuntime.toBoolean(callTrap(trap, new Object[] {target, key, value, this}));
695695
if (!booleanTrapResult) {
696696
return; // false
697697
}

tests/src/test/java/org/mozilla/javascript/tests/es6/NativeProxyTest.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -954,4 +954,56 @@ public void keysPreventExtensions() {
954954

955955
Utils.assertWithAllModes_ES6(true, js);
956956
}
957+
958+
@Test
959+
public void setTrapReceivesReceiver() {
960+
String js =
961+
"var _receiver;\n"
962+
+ "var target = {};\n"
963+
+ "var proxy = new Proxy(target, {\n"
964+
+ " set: function(t, prop, value, receiver) {\n"
965+
+ " _receiver = receiver;\n"
966+
+ " t[prop] = value;\n"
967+
+ " return true;\n"
968+
+ " }\n"
969+
+ "});\n"
970+
+ "proxy.x = 1;\n"
971+
+ "'' + (_receiver === proxy) + ' ' + target.x";
972+
Utils.assertWithAllModes_ES6("true 1", js);
973+
}
974+
975+
@Test
976+
public void setTrapReceiverWithIndexProperty() {
977+
String js =
978+
"var _receiver;\n"
979+
+ "var target = [10, 20, 30];\n"
980+
+ "var proxy = new Proxy(target, {\n"
981+
+ " set: function(t, prop, value, receiver) {\n"
982+
+ " _receiver = receiver;\n"
983+
+ " t[prop] = value;\n"
984+
+ " return true;\n"
985+
+ " }\n"
986+
+ "});\n"
987+
+ "proxy[1] = 99;\n"
988+
+ "'' + (_receiver === proxy) + ' ' + target[1]";
989+
Utils.assertWithAllModes_ES6("true 99", js);
990+
}
991+
992+
@Test
993+
public void setTrapReceiverWithSymbolProperty() {
994+
String js =
995+
"var _receiver;\n"
996+
+ "var sym = Symbol('test');\n"
997+
+ "var target = {};\n"
998+
+ "var proxy = new Proxy(target, {\n"
999+
+ " set: function(t, prop, value, receiver) {\n"
1000+
+ " _receiver = receiver;\n"
1001+
+ " t[prop] = value;\n"
1002+
+ " return true;\n"
1003+
+ " }\n"
1004+
+ "});\n"
1005+
+ "proxy[sym] = 'hello';\n"
1006+
+ "'' + (_receiver === proxy) + ' ' + target[sym]";
1007+
Utils.assertWithAllModes_ES6("true hello", js);
1008+
}
9571009
}

0 commit comments

Comments
 (0)