blob: a0b99980c7026743fdfdcbdb2d4a6077932da1b6 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Flags: --allow-natives-syntax
6
7var a = new Int32Array(100);
8a.__proto__ = null;
9
10function get(a) {
11 return a.length;
12}
13
14assertEquals(undefined, get(a));
15assertEquals(undefined, get(a));
16assertEquals(undefined, get(a));
17%OptimizeFunctionOnNextCall(get);
18assertEquals(undefined, get(a));
19
20get = function(a) {
21 return a.byteLength;
22}
23
24assertEquals(undefined, get(a));
25assertEquals(undefined, get(a));
26assertEquals(undefined, get(a));
27%OptimizeFunctionOnNextCall(get);
28assertEquals(undefined, get(a));
29
30get = function(a) {
31 return a.byteOffset;
32}
33
34assertEquals(undefined, get(a));
35assertEquals(undefined, get(a));
36assertEquals(undefined, get(a));
37%OptimizeFunctionOnNextCall(get);
38assertEquals(undefined, get(a));
39
40(function() {
41 "use strict";
42
43 class MyTypedArray extends Int32Array {
44 get length() {
45 return "length";
46 }
47 }
48
49 a = new MyTypedArray();
50
51 get = function(a) {
52 return a.length;
53 }
54
55 assertEquals("length", get(a));
56 assertEquals("length", get(a));
57 assertEquals("length", get(a));
58 %OptimizeFunctionOnNextCall(get);
59 assertEquals("length", get(a));
60
61 a.__proto__ = null;
62
63 get = function(a) {
64 return a.length;
65 }
66
67 assertEquals(undefined, get(a));
68 assertEquals(undefined, get(a));
69 assertEquals(undefined, get(a));
70 %OptimizeFunctionOnNextCall(get);
71 assertEquals(undefined, get(a));
72})();
73
74(function() {
75 "use strict";
76
77 class MyTypedArray extends Int32Array {
78 constructor(length) {
79 super(length);
80 }
81 }
82
83 a = new MyTypedArray(1024);
84
85 get = function(a) {
86 return a.length;
87 }
88
89 assertEquals(1024, get(a));
90 assertEquals(1024, get(a));
91 assertEquals(1024, get(a));
92 %OptimizeFunctionOnNextCall(get);
93 assertEquals(1024, get(a));
94})();
95
96(function() {
97 "use strict";
98 var a = new Uint8Array(4);
99 Object.defineProperty(a, "length", {get: function() { return "blah"; }});
100 get = function(a) {
101 return a.length;
102 }
103
104 assertEquals("blah", get(a));
105 assertEquals("blah", get(a));
106 assertEquals("blah", get(a));
107 %OptimizeFunctionOnNextCall(get);
108 assertEquals("blah", get(a));
109})();
110
111// Ensure we cannot delete length, byteOffset, byteLength.
112assertTrue(Int32Array.prototype.__proto__.hasOwnProperty("length"));
113assertTrue(Int32Array.prototype.__proto__.hasOwnProperty("byteOffset"));
114assertTrue(Int32Array.prototype.__proto__.hasOwnProperty("byteLength"));
115assertFalse(delete Int32Array.prototype.__proto__.length);
116assertFalse(delete Int32Array.prototype.__proto__.byteOffset);
117assertFalse(delete Int32Array.prototype.__proto__.byteLength);
118
119a = new Int32Array(100);
120
121get = function(a) {
122 return a.length;
123}
124
125assertEquals(100, get(a));
126assertEquals(100, get(a));
127assertEquals(100, get(a));
128%OptimizeFunctionOnNextCall(get);
129assertEquals(100, get(a));
130
131get = function(a) {
132 return a.byteLength;
133}
134
135assertEquals(400, get(a));
136assertEquals(400, get(a));
137assertEquals(400, get(a));
138%OptimizeFunctionOnNextCall(get);
139assertEquals(400, get(a));
140
141get = function(a) {
142 return a.byteOffset;
143}
144
145assertEquals(0, get(a));
146assertEquals(0, get(a));
147assertEquals(0, get(a));
148%OptimizeFunctionOnNextCall(get);
149assertEquals(0, get(a));