1f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
2f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
3f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// found in the LICENSE file.
4f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
5f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
6f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.orgfunction TestFunctionPrototypeSetter() {
7f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  var f = function() {};
8f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  var o = {__proto__: f};
9f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  o.prototype = 42;
10f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  assertEquals(42, o.prototype);
11f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  assertTrue(o.hasOwnProperty('prototype'));
12f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org}
13f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.orgTestFunctionPrototypeSetter();
14f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
15f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
16f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.orgfunction TestFunctionPrototypeSetterOnValue() {
17f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  var f = function() {};
18f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  var fp = f.prototype;
19f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  Number.prototype.__proto__ = f;
20f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  var n = 42;
21f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  var o = {};
22f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  n.prototype = o;
23f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  assertEquals(fp, n.prototype);
24f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  assertEquals(fp, f.prototype);
25f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  assertFalse(Number.prototype.hasOwnProperty('prototype'));
26f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org}
27f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.orgTestFunctionPrototypeSetterOnValue();
28f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
29f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
30f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.orgfunction TestArrayLengthSetter() {
31f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  var a = [1];
32f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  var o = {__proto__: a};
33f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  o.length = 2;
34f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  assertEquals(2, o.length);
35f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  assertEquals(1, a.length);
36f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  assertTrue(o.hasOwnProperty('length'));
37f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org}
38f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.orgTestArrayLengthSetter();
39f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
40f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
41f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.orgfunction TestArrayLengthSetterOnValue() {
42f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  Number.prototype.__proto__ = [1];
43f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  var n = 42;
44f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  n.length = 2;
45f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  assertEquals(1, n.length);
46f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  assertFalse(Number.prototype.hasOwnProperty('length'));
47f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org}
48f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.orgTestArrayLengthSetterOnValue();
49