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