1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2014 the V8 project authors. All rights reserved.
2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file.
4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Flags: --allow-natives-syntax
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochObject.prototype["10"] = "unreachable";
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochObject.prototype["7"] = "unreachable";
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochObject.prototype["-1"] = "unreachable";
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochObject.prototype["-0"] = "unreachable";
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochObject.prototype["4294967295"] = "unreachable";
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvar array = new Int32Array(10);
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfunction check() {
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (var i = 0; i < 4; i++) {
17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    assertEquals(undefined, array["-1"]);
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    assertEquals(undefined, array["-0"]);
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    assertEquals(undefined, array["10"]);
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    assertEquals(undefined, array["4294967295"]);
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertEquals("unreachable", array.__proto__["-1"]);
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertEquals("unreachable", array.__proto__["-0"]);
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertEquals("unreachable", array.__proto__["10"]);
25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertEquals("unreachable", array.__proto__["4294967295"]);
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochcheck();
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdocharray["-1"] = "unreachable";
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdocharray["-0"] = "unreachable";
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdocharray["10"] = "unreachable";
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdocharray["4294967295"] = "unreachable";
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochcheck();
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochdelete array["-0"];
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochdelete array["-1"];
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochdelete array["10"];
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochdelete array["4294967295"];
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertEquals(undefined, Object.getOwnPropertyDescriptor(array, "-1"));
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertEquals(undefined, Object.getOwnPropertyDescriptor(array, "-0"));
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertEquals(undefined, Object.getOwnPropertyDescriptor(array, "10"));
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertEquals(undefined, Object.getOwnPropertyDescriptor(array, "4294967295"));
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertEquals(10, Object.keys(array).length);
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochcheck();
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfunction f() { return array["-1"]; }
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfor (var i = 0; i < 3; i++) {
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertEquals(undefined, f());
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch%OptimizeFunctionOnNextCall(f);
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertEquals(undefined, f());
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertThrows('Object.defineProperty(new Int32Array(100), -1, {value: 1})');
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// -0 gets converted to the string "0", so use "-0" instead.
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertThrows('Object.defineProperty(new Int32Array(100), "-0", {value: 1})');
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertThrows('Object.defineProperty(new Int32Array(100), -10, {value: 1})');
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertThrows('Object.defineProperty(new Int32Array(), 4294967295, {value: 1})');
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochcheck();
65