Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(421)

Side by Side Diff: test/mjsunit/array-methods-read-only-length.js

Issue 726773002: Throw as per spec when modifying an Array with builtin methods (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Added a TODO Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/objects.cc ('k') | test/mjsunit/array-push-unshift-read-only-length.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Flags: --allow-natives-syntax 5 // Flags: --allow-natives-syntax
6 6
7 function test(mode) { 7 function testAdd(mode) {
8 var a = []; 8 var a = [];
9 Object.defineProperty(a, "length", { writable : false}); 9 Object.defineProperty(a, "length", { writable : false});
10 10
11 function check(f) { 11 function check(f) {
12 try { 12 assertThrows(function() { f(a) }, TypeError);
13 f(a);
14 } catch(e) { }
15 assertFalse(0 in a); 13 assertFalse(0 in a);
16 assertEquals(0, a.length); 14 assertEquals(0, a.length);
17 } 15 }
18 16
19 function push(a) { 17 function push(a) {
20 a.push(3); 18 a.push(3);
21 } 19 }
22 20
23 if (mode == "fast properties") %ToFastProperties(a); 21 if (mode == "fast properties") %ToFastProperties(a);
24 22
25 check(push); 23 check(push);
26 check(push); 24 check(push);
27 check(push); 25 check(push);
28 %OptimizeFunctionOnNextCall(push); 26 %OptimizeFunctionOnNextCall(push);
29 check(push); 27 check(push);
30 28
31 function unshift(a) { 29 function unshift(a) {
32 a.unshift(3); 30 a.unshift(3);
33 } 31 }
34 32
35 check(unshift); 33 check(unshift);
36 check(unshift); 34 check(unshift);
37 check(unshift); 35 check(unshift);
38 %OptimizeFunctionOnNextCall(unshift); 36 %OptimizeFunctionOnNextCall(unshift);
39 check(unshift); 37 check(unshift);
38
39 function splice(a) {
40 a.splice(0, 0, 3);
41 }
42
43 check(splice);
44 check(splice);
45 check(splice);
46 %OptimizeFunctionOnNextCall(splice);
47 check(splice);
40 } 48 }
41 49
42 test("fast properties"); 50 testAdd("fast properties");
43 51
44 test("normalized"); 52 testAdd("normalized");
53
54 function testRemove(mode) {
55 var a = [1, 2, 3];
56 Object.defineProperty(a, "length", { writable : false});
57
58 function check(f) {
59 assertThrows(function() { f(a) }, TypeError);
60 assertEquals(3, a.length);
61 }
62
63 if (mode == "fast properties") %ToFastProperties(a);
64
65 function pop(a) {
66 a.pop();
67 }
68
69 check(pop);
70 check(pop);
71 check(pop);
72 %OptimizeFunctionOnNextCall(pop);
73 check(pop);
74
75 function shift(a) {
76 a.shift();
77 }
78
79 check(shift);
80 check(shift);
81 check(shift);
82 %OptimizeFunctionOnNextCall(shift);
83 check(shift);
84
85 function splice(a) {
86 a.splice(0, 1);
87 }
88
89 check(splice);
90 check(splice);
91 check(splice);
92 %OptimizeFunctionOnNextCall(splice);
93 check(splice);
94 }
95
96 testRemove("fast properties");
97
98 testRemove("normalized");
45 99
46 var b = []; 100 var b = [];
47 Object.defineProperty(b.__proto__, "0", { 101 Object.defineProperty(b.__proto__, "0", {
48 set : function(v) { 102 set : function(v) {
49 b.x = v; 103 b.x = v;
50 Object.defineProperty(b, "length", { writable : false }); 104 Object.defineProperty(b, "length", { writable : false });
51 }, 105 },
52 get: function() { 106 get: function() {
53 return b.x; 107 return b.x;
54 } 108 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 }, 144 },
91 get: function() { 145 get: function() {
92 return b.z; 146 return b.z;
93 } 147 }
94 }); 148 });
95 149
96 try { 150 try {
97 b.unshift(3, 4, 5); 151 b.unshift(3, 4, 5);
98 } catch(e) { } 152 } catch(e) { }
99 153
100 // TODO(ulan): According to the ECMA-262 unshift should throw an exception 154 assertFalse(2 in b);
101 // when moving b[0] to b[3] (see 15.4.4.13 step 6.d.ii). This is difficult 155 assertFalse(3 in b);
102 // to do with our current implementation of SmartMove() in src/array.js and 156 assertEquals(2, b.length);
103 // it will regress performance. Uncomment the following line once acceptable
104 // solution is found:
105 // assertFalse(2 in b);
106 // assertFalse(3 in b);
107 // assertEquals(2, b.length);
OLDNEW
« no previous file with comments | « src/objects.cc ('k') | test/mjsunit/array-push-unshift-read-only-length.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698