| Index: src/v8natives.js
|
| diff --git a/src/v8natives.js b/src/v8natives.js
|
| index 61b130c196db2462289abe12e9aea7a7012bdfe7..1d54e28e97687ca981372b41525ffbed6b150e3a 100644
|
| --- a/src/v8natives.js
|
| +++ b/src/v8natives.js
|
| @@ -873,29 +873,33 @@ function DefineArrayProperty(obj, p, desc, should_throw) {
|
| throw new $RangeError('defineProperty() array length out of range');
|
| }
|
| var length_desc = GetOwnProperty(obj, "length");
|
| + if (new_length != length && !length_desc.isWritable()) {
|
| + if (should_throw) {
|
| + throw MakeTypeError("redefine_disallowed", [p]);
|
| + } else {
|
| + return false;
|
| + }
|
| + }
|
| + var threw = false;
|
| + while (new_length < length--) {
|
| + if (!Delete(obj, ToString(length), false)) {
|
| + new_length = length + 1;
|
| + threw = true;
|
| + break;
|
| + }
|
| + }
|
| // Make sure the below call to DefineObjectProperty() doesn't overwrite
|
| // any magic "length" property by removing the value.
|
| + obj.length = new_length;
|
| desc.value_ = void 0;
|
| desc.hasValue_ = false;
|
| - if ((new_length != length && !length_desc.isWritable()) ||
|
| - !DefineObjectProperty(obj, "length", desc, should_throw)) {
|
| + if (!DefineObjectProperty(obj, "length", desc, should_throw) || threw) {
|
| if (should_throw) {
|
| throw MakeTypeError("redefine_disallowed", [p]);
|
| } else {
|
| return false;
|
| }
|
| }
|
| - obj.length = new_length;
|
| - while (new_length < length--) {
|
| - if (!Delete(obj, length, false)) {
|
| - obj.length = length + 1;
|
| - if (should_throw) {
|
| - throw MakeTypeError("redefine_disallowed", [p]);
|
| - } else {
|
| - return false;
|
| - }
|
| - }
|
| - }
|
| return true;
|
| }
|
|
|
|
|