| // Copyright 2014 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Flags: --allow-natives-syntax |
| |
| function test(mode) { |
| var a = []; |
| Object.defineProperty(a, "length", { writable : false}); |
| |
| function check(f) { |
| try { |
| f(a); |
| } catch(e) { } |
| assertFalse(0 in a); |
| assertEquals(0, a.length); |
| } |
| |
| function push(a) { |
| a.push(3); |
| } |
| |
| if (mode == "fast properties") %ToFastProperties(a); |
| |
| check(push); |
| check(push); |
| check(push); |
| %OptimizeFunctionOnNextCall(push); |
| check(push); |
| |
| function unshift(a) { |
| a.unshift(3); |
| } |
| |
| check(unshift); |
| check(unshift); |
| check(unshift); |
| %OptimizeFunctionOnNextCall(unshift); |
| check(unshift); |
| } |
| |
| test("fast properties"); |
| |
| test("normalized"); |
| |
| var b = []; |
| Object.defineProperty(b.__proto__, "0", { |
| set : function(v) { |
| b.x = v; |
| Object.defineProperty(b, "length", { writable : false }); |
| }, |
| get: function() { |
| return b.x; |
| } |
| }); |
| |
| b = []; |
| try { |
| b.push(3, 4, 5); |
| } catch(e) { } |
| assertFalse(1 in b); |
| assertFalse(2 in b); |
| assertEquals(0, b.length); |
| |
| b = []; |
| try { |
| b.unshift(3, 4, 5); |
| } catch(e) { } |
| assertFalse(1 in b); |
| assertFalse(2 in b); |
| assertEquals(0, b.length); |
| |
| b = [1, 2]; |
| try { |
| b.unshift(3, 4, 5); |
| } catch(e) { } |
| assertEquals(3, b[0]); |
| assertEquals(4, b[1]); |
| assertEquals(5, b[2]); |
| assertEquals(1, b[3]); |
| assertEquals(2, b[4]); |
| assertEquals(5, b.length); |
| |
| b = [1, 2]; |
| |
| Object.defineProperty(b.__proto__, "4", { |
| set : function(v) { |
| b.z = v; |
| Object.defineProperty(b, "length", { writable : false }); |
| }, |
| get: function() { |
| return b.z; |
| } |
| }); |
| |
| try { |
| b.unshift(3, 4, 5); |
| } catch(e) { } |
| |
| // TODO(ulan): According to the ECMA-262 unshift should throw an exception |
| // when moving b[0] to b[3] (see 15.4.4.13 step 6.d.ii). This is difficult |
| // to do with our current implementation of SmartMove() in src/array.js and |
| // it will regress performance. Uncomment the following line once acceptable |
| // solution is found: |
| // assertFalse(2 in b); |
| // assertFalse(3 in b); |
| // assertEquals(2, b.length); |