12311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 22311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// Redistribution and use in source and binary forms, with or without 32311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// modification, are permitted provided that the following conditions are 42311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// met: 52311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// 62311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// * Redistributions of source code must retain the above copyright 72311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// notice, this list of conditions and the following disclaimer. 82311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// * Redistributions in binary form must reproduce the above 92311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// copyright notice, this list of conditions and the following 102311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// disclaimer in the documentation and/or other materials provided 112311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// with the distribution. 122311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// * Neither the name of Google Inc. nor the names of its 132311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// contributors may be used to endorse or promote products derived 142311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// from this software without specific prior written permission. 152311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// 162311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org 282311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.orgvar extend = function (d, b) { 292311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org function __() { this.constructor = d; } 302311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org __.prototype = b.prototype; 312311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org d.prototype = new __(); 322311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org}; 332311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org 342311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.orgvar Car = (function (Super) { 352311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org var Car = function () { 362311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org var self = this; 372311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org 382311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org Super.call(self); 392311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org 402311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org Object.defineProperties(self, { 412311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org "make": { 422311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org enumerable: true, 432311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org configurable: true, 442311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org get: function () { 452311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org return "Ford"; 462311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org } 472311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org } 482311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org }); 492311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org 502311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org self.copy = function () { 512311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org throw new Error("Meant to be overriden"); 522311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org }; 532311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org 542311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org return self; 552311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org }; 562311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org 572311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org extend(Car, Super); 582311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org 592311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org return Car; 602311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org}(Object)); 612311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org 622311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org 632311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.orgvar SuperCar = ((function (Super) { 642311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org var SuperCar = function (make) { 652311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org var self = this; 662311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org 672311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org Super.call(self); 682311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org 692311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org 702311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org Object.defineProperties(self, { 712311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org "make": { 722311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org enumerable: true, 732311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org configurable: true, 742311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org get: function () { 752311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org return make; 762311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org } 772311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org } 782311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org }); 792311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org 802311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org // Convert self.copy from CONSTANT to FIELD. 812311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org self.copy = function () { }; 822311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org 832311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org return self; 842311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org }; 852311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org extend(SuperCar, Super); 862311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org return SuperCar; 872311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org})(Car)); 882311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org 892311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.orgassertEquals("Ford", new Car().make); 902311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.orgassertEquals("Bugatti", new SuperCar("Bugatti").make); 912311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.orgassertEquals("Lambo", new SuperCar("Lambo").make); 922311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.orgassertEquals("Shelby", new SuperCar("Shelby").make); 93