diff --git a/js/src/tests/ecma_6/Reflect/browser.js b/js/src/tests/ecma_6/Reflect/browser.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/js/src/tests/ecma_6/Reflect/set.js b/js/src/tests/ecma_6/Reflect/set.js new file mode 100644 index 000000000000..3c57d3c76b79 --- /dev/null +++ b/js/src/tests/ecma_6/Reflect/set.js @@ -0,0 +1,16 @@ +if (this.Reflect && Reflect.set) + throw new Error("Congrats on implementing Reflect.set! Uncomment this test for 1 karma point."); + +/* +// Per spec, this should first call p.[[Set]]("0", 42, a) and +// then (since p has no own properties) a.[[Set]]("0", 42, a). +// Obviously the latter should not define a property on p. + +var a = [0, 1, 2, 3]; +var p = Object.create(a); +Reflect.set(p, "0", 42, a); +assertEq(p.hasOwnProperty("0"), false); +assertEq(a[0], 42); +*/ + +reportCompare(0, 0, 'ok'); diff --git a/js/src/tests/ecma_6/Reflect/shell.js b/js/src/tests/ecma_6/Reflect/shell.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/js/src/vm/NativeObject.cpp b/js/src/vm/NativeObject.cpp index b2ac7832b7e8..cd977cfa0601 100644 --- a/js/src/vm/NativeObject.cpp +++ b/js/src/vm/NativeObject.cpp @@ -2170,12 +2170,12 @@ template static bool SetExistingProperty(typename ExecutionModeTraits::ContextType cxArg, HandleNativeObject obj, HandleObject receiver, HandleId id, - HandleObject pobj, HandleShape shape, MutableHandleValue vp, bool strict) + HandleNativeObject pobj, HandleShape shape, MutableHandleValue vp, bool strict) { if (IsImplicitDenseOrTypedArrayElement(shape)) { /* ES5 8.12.4 [[Put]] step 2, for a dense data property on pobj. */ if (pobj == receiver) - return SetDenseOrTypedArrayElement(cxArg, obj, JSID_TO_INT(id), vp, strict); + return SetDenseOrTypedArrayElement(cxArg, pobj, JSID_TO_INT(id), vp, strict); } else { /* ES5 8.12.4 [[Put]] step 2. */ if (shape->isAccessorDescriptor()) { @@ -2270,8 +2270,10 @@ baseops::SetPropertyHelper(typename ExecutionModeTraits::ContextType cxArg if (!shape) return SetNonexistentProperty(cxArg, receiver, id, qualified, vp, strict); - if (pobj->isNative()) - return SetExistingProperty(cxArg, obj, receiver, id, pobj, shape, vp, strict); + if (pobj->isNative()) { + RootedNativeObject nativePObj(cxArg, &pobj->as()); + return SetExistingProperty(cxArg, obj, receiver, id, nativePObj, shape, vp, strict); + } if (pobj->is()) { if (mode == ParallelExecution)