Bug 1417962 - Don't unbox proxies when reporting strict assignment error. r=jandem

This commit is contained in:
Tom Schuster 2017-11-21 21:03:39 +01:00
parent d6ec9137a6
commit 77e0a65f28
2 changed files with 19 additions and 3 deletions

View File

@ -0,0 +1,14 @@
'use strict';
load(libdir + 'asserts.js');
let hook = {}
let Base = function() {}
Base.prototype = new Proxy(Base.prototype, hook);
class Derived extends Base {
testPrimitiveReceiver() {
super.foo = "Derived";
}
}
assertTypeErrorMessage(() => Derived.prototype.testPrimitiveReceiver.call(null),
`can't assign to property "foo" on ({}): not an object`)

View File

@ -182,9 +182,11 @@ JS::ObjectOpResult::reportStrictErrorOrWarning(JSContext* cx, HandleObject obj,
if (code_ == JSMSG_SET_NON_OBJECT_RECEIVER) { if (code_ == JSMSG_SET_NON_OBJECT_RECEIVER) {
// We know that the original receiver was a primitive, so unbox it. // We know that the original receiver was a primitive, so unbox it.
RootedValue val(cx); RootedValue val(cx, ObjectValue(*obj));
if (!Unbox(cx, obj, &val)) if (!obj->is<ProxyObject>()) {
return false; if (!Unbox(cx, obj, &val))
return false;
}
return ReportValueErrorFlags(cx, flags, code_, JSDVG_IGNORE_STACK, val, return ReportValueErrorFlags(cx, flags, code_, JSDVG_IGNORE_STACK, val,
nullptr, propName.ptr(), nullptr); nullptr, propName.ptr(), nullptr);
} }