1a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved. 2a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 3a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// found in the LICENSE file. 4a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// 5a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// Flags: --harmony-classes --allow-natives-syntax 6a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 7a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 8a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org(function TestSingleClass() { 9a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org function f(x) { 10a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org var a = [0, 1, 2] 11a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org return a[x]; 12a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org } 13a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 14a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org function ClassD() { } 15a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 16a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(1, f(1)); 17a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org var g = f.toMethod(ClassD.prototype); 18a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(1, g(1)); 19a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(undefined, f[%HomeObjectSymbol()]); 20a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(ClassD.prototype, g[%HomeObjectSymbol()]); 21a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}()); 22a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 23a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 24a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org(function TestClassHierarchy() { 25a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org function f(x) { 26a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org return function g(y) { x++; return x + y; }; 27a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org } 28a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 29a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org function Base() {} 30a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org function Derived() { } 31a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Derived.prototype = Object.create(Base.prototype); 32a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 33a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org var q = f(0); 34a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(2, q(1)); 35a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(3, q(1)); 36a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org var g = q.toMethod(Derived.prototype); 37a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertFalse(g === q); 38a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(4, g(1)); 39a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(5, q(1)); 40a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}()); 41a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 42a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 43a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org(function TestErrorCases() { 44a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org var sFun = Function.prototype.toMethod; 45a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertThrows(function() { sFun.call({}); }, TypeError); 46a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertThrows(function() { sFun.call({}, {}); }, TypeError); 47a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org function f(){}; 48a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertThrows(function() { f.toMethod(1); }, TypeError); 49a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}()); 50a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 51a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 52a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org(function TestPrototypeChain() { 53a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org var o = {}; 54a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org var o1 = {}; 55a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org function f() { } 56a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 57a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org function g() { } 58a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 59a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org var fMeth = f.toMethod(o); 60a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(o, fMeth[%HomeObjectSymbol()]); 61a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org g.__proto__ = fMeth; 62a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(undefined, g[%HomeObjectSymbol()]); 63a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org var gMeth = g.toMethod(o1); 64a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(fMeth, gMeth.__proto__); 65a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(o, fMeth[%HomeObjectSymbol()]); 66a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(o1, gMeth[%HomeObjectSymbol()]); 67a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}()); 68a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 69a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 70a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org(function TestBoundFunction() { 71a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org var o = {}; 72a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org var p = {}; 73a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 74a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 75a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org function f(x, y, z, w) { 76a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(o, this); 77a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(1, x); 78a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(2, y); 79a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(3, z); 80a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(4, w); 81a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org return x+y+z+w; 82a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org } 83a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 84a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org var fBound = f.bind(o, 1, 2, 3); 85a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org var fMeth = fBound.toMethod(p); 86a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(10, fMeth(4)); 87a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(10, fMeth.call(p, 4)); 88a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org var fBound1 = fBound.bind(o, 4); 89a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(10, fBound1()); 90a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org var fMethBound = fMeth.bind(o, 4); 91a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(10, fMethBound()); 92a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}()); 93a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 94a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org(function TestOptimized() { 95a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org function f(o) { 96a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org return o.x; 97a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org } 98a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org var o = {x : 15}; 99a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(15, f(o)); 100a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(15, f(o)); 101a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org %OptimizeFunctionOnNextCall(f); 102a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals(15, f(o)); 103a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org var g = f.toMethod({}); 104a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org var o1 = {y : 1024, x : "abc"}; 105a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals("abc", f(o1)); 106a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertEquals("abc", g(o1)); 107a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org} ()); 108a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 109a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org(function TestExtensibility() { 110a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org function f() {} 111a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Object.preventExtensions(f); 112a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertFalse(Object.isExtensible(f)); 113a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org var m = f.toMethod({}); 114a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assertTrue(Object.isExtensible(m)); 115a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}()); 116