| Index: src/v8natives.js
|
| diff --git a/src/v8natives.js b/src/v8natives.js
|
| index eb259177e2a5e24cf859019a9286f3e03abaaba2..a14c446f2173d8ef4ff34a891780abb3354518e8 100644
|
| --- a/src/v8natives.js
|
| +++ b/src/v8natives.js
|
| @@ -681,14 +681,19 @@ function DefineObjectProperty(obj, p, desc, should_throw) {
|
| }
|
| // Step 10a
|
| if (IsDataDescriptor(current) && IsDataDescriptor(desc)) {
|
| - if (!current.isWritable() && desc.isWritable()) {
|
| - if (should_throw) {
|
| - throw MakeTypeError(kRedefineDisallowed, p);
|
| - } else {
|
| - return false;
|
| + var currentIsWritable = current.isWritable();
|
| + if (currentIsWritable != desc.isWritable()) {
|
| + if (!currentIsWritable || IS_STRONG(obj)) {
|
| + if (should_throw) {
|
| + throw currentIsWritable
|
| + ? MakeTypeError(kStrongRedefineDisallowed, obj, p)
|
| + : MakeTypeError(kRedefineDisallowed, p);
|
| + } else {
|
| + return false;
|
| + }
|
| }
|
| }
|
| - if (!current.isWritable() && desc.hasValue() &&
|
| + if (!currentIsWritable && desc.hasValue() &&
|
| !$sameValue(desc.getValue(), current.getValue())) {
|
| if (should_throw) {
|
| throw MakeTypeError(kRedefineDisallowed, p);
|
| @@ -1211,7 +1216,8 @@ function ObjectSealJS(obj) {
|
| function ObjectFreezeJS(obj) {
|
| if (!IS_SPEC_OBJECT(obj)) return obj;
|
| var isProxy = %_IsJSProxy(obj);
|
| - if (isProxy || %HasSloppyArgumentsElements(obj) || %IsObserved(obj)) {
|
| + if (isProxy || %HasSloppyArgumentsElements(obj) || %IsObserved(obj) ||
|
| + IS_STRONG(obj)) {
|
| if (isProxy) {
|
| ProxyFix(obj);
|
| }
|
|
|