| Index: src/array.js
|
| diff --git a/src/array.js b/src/array.js
|
| index a233c63972d7a7bca667e481735a7e6d378e299f..104fe3f6418746914ec8cc200263036e800ce4f4 100644
|
| --- a/src/array.js
|
| +++ b/src/array.js
|
| @@ -415,24 +415,20 @@ function ObservedArrayPop(n) {
|
| function ArrayPop() {
|
| CHECK_OBJECT_COERCIBLE(this, "Array.prototype.pop");
|
|
|
| - var n = TO_UINT32(this.length);
|
| + var array = TO_OBJECT_INLINE(this);
|
| + var n = TO_UINT32(array.length);
|
| if (n == 0) {
|
| - this.length = n;
|
| + array.length = n;
|
| return;
|
| }
|
|
|
| - if (ObjectIsSealed(this)) {
|
| - throw MakeTypeError("array_functions_change_sealed",
|
| - ["Array.prototype.pop"]);
|
| - }
|
| -
|
| - if (%IsObserved(this))
|
| - return ObservedArrayPop.call(this, n);
|
| + if (%IsObserved(array))
|
| + return ObservedArrayPop.call(array, n);
|
|
|
| n--;
|
| - var value = this[n];
|
| - Delete(this, ToName(n), true);
|
| - this.length = n;
|
| + var value = array[n];
|
| + Delete(array, ToName(n), true);
|
| + array.length = n;
|
| return value;
|
| }
|
|
|
| @@ -461,24 +457,21 @@ function ObservedArrayPush() {
|
| function ArrayPush() {
|
| CHECK_OBJECT_COERCIBLE(this, "Array.prototype.push");
|
|
|
| - var n = TO_UINT32(this.length);
|
| - var m = %_ArgumentsLength();
|
| -
|
| if (%IsObserved(this))
|
| return ObservedArrayPush.apply(this, arguments);
|
|
|
| + var array = TO_OBJECT_INLINE(this);
|
| + var n = TO_UINT32(array.length);
|
| + var m = %_ArgumentsLength();
|
| +
|
| for (var i = 0; i < m; i++) {
|
| // Use SetProperty rather than a direct keyed store to ensure that the store
|
| // site doesn't become poisened with an elements transition KeyedStoreIC.
|
| - //
|
| - // TODO(danno): Using %SetProperty is a temporary workaround. The spec says
|
| - // that ToObject needs to be called for primitive values (and
|
| - // Runtime_SetProperty seem to ignore them).
|
| - %SetProperty(this, i+n, %_Arguments(i), 0, kStrictMode);
|
| + %SetProperty(array, i+n, %_Arguments(i), 0, kStrictMode);
|
| }
|
|
|
| var new_length = n + m;
|
| - this.length = new_length;
|
| + array.length = new_length;
|
| return new_length;
|
| }
|
|
|
| @@ -596,30 +589,31 @@ function ObservedArrayShift(len) {
|
| function ArrayShift() {
|
| CHECK_OBJECT_COERCIBLE(this, "Array.prototype.shift");
|
|
|
| - var len = TO_UINT32(this.length);
|
| + var array = TO_OBJECT_INLINE(this);
|
| + var len = TO_UINT32(array.length);
|
|
|
| if (len === 0) {
|
| - this.length = 0;
|
| + array.length = 0;
|
| return;
|
| }
|
|
|
| - if (ObjectIsSealed(this)) {
|
| + if (ObjectIsSealed(array)) {
|
| throw MakeTypeError("array_functions_change_sealed",
|
| ["Array.prototype.shift"]);
|
| }
|
|
|
| - if (%IsObserved(this))
|
| - return ObservedArrayShift.call(this, len);
|
| + if (%IsObserved(array))
|
| + return ObservedArrayShift.call(array, len);
|
|
|
| - var first = this[0];
|
| + var first = array[0];
|
|
|
| - if (IS_ARRAY(this)) {
|
| - SmartMove(this, 0, 1, len, 0);
|
| + if (IS_ARRAY(array)) {
|
| + SmartMove(array, 0, 1, len, 0);
|
| } else {
|
| - SimpleMove(this, 0, 1, len, 0);
|
| + SimpleMove(array, 0, 1, len, 0);
|
| }
|
|
|
| - this.length = len - 1;
|
| + array.length = len - 1;
|
|
|
| return first;
|
| }
|
| @@ -647,25 +641,26 @@ function ObservedArrayUnshift() {
|
| function ArrayUnshift(arg1) { // length == 1
|
| CHECK_OBJECT_COERCIBLE(this, "Array.prototype.unshift");
|
|
|
| - var len = TO_UINT32(this.length);
|
| - var num_arguments = %_ArgumentsLength();
|
| - var is_sealed = ObjectIsSealed(this);
|
| -
|
| if (%IsObserved(this))
|
| return ObservedArrayUnshift.apply(this, arguments);
|
|
|
| - if (IS_ARRAY(this) && !is_sealed) {
|
| - SmartMove(this, 0, 0, len, num_arguments);
|
| + var array = TO_OBJECT_INLINE(this);
|
| + var len = TO_UINT32(array.length);
|
| + var num_arguments = %_ArgumentsLength();
|
| + var is_sealed = ObjectIsSealed(array);
|
| +
|
| + if (IS_ARRAY(array) && !is_sealed) {
|
| + SmartMove(array, 0, 0, len, num_arguments);
|
| } else {
|
| - SimpleMove(this, 0, 0, len, num_arguments);
|
| + SimpleMove(array, 0, 0, len, num_arguments);
|
| }
|
|
|
| for (var i = 0; i < num_arguments; i++) {
|
| - this[i] = %_Arguments(i);
|
| + array[i] = %_Arguments(i);
|
| }
|
|
|
| var new_length = len + num_arguments;
|
| - this.length = new_length;
|
| + array.length = new_length;
|
| return new_length;
|
| }
|
|
|
|
|