Home | History | Annotate | Download | only in js
      1 // Copyright 2006-2008 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // This files contains runtime support implemented in JavaScript.
      6 
      7 // CAUTION: Some of the functions specified in this file are called
      8 // directly from compiled code. These are the functions with names in
      9 // ALL CAPS. The compiled code passes the first argument in 'this'.
     10 
     11 
     12 // The following declarations are shared with other native JS files.
     13 // They are all declared at this one spot to avoid redeclaration errors.
     14 
     15 (function(global, utils) {
     16 
     17 %CheckIsBootstrapping();
     18 
     19 var GlobalArray = global.Array;
     20 var GlobalBoolean = global.Boolean;
     21 var GlobalString = global.String;
     22 var speciesSymbol;
     23 
     24 utils.Import(function(from) {
     25   speciesSymbol = from.species_symbol;
     26 });
     27 
     28 // ----------------------------------------------------------------------------
     29 
     30 
     31 /* ---------------------------------
     32    - - -   U t i l i t i e s   - - -
     33    ---------------------------------
     34 */
     35 
     36 
     37 function ToPositiveInteger(x, rangeErrorIndex) {
     38   var i = TO_INTEGER(x) + 0;
     39   if (i < 0) throw %make_range_error(rangeErrorIndex);
     40   return i;
     41 }
     42 
     43 
     44 function ToIndex(x, rangeErrorIndex) {
     45   var i = TO_INTEGER(x) + 0;
     46   if (i < 0 || i > kMaxSafeInteger) throw %make_range_error(rangeErrorIndex);
     47   return i;
     48 }
     49 
     50 
     51 function MaxSimple(a, b) {
     52   return a > b ? a : b;
     53 }
     54 
     55 
     56 function MinSimple(a, b) {
     57   return a > b ? b : a;
     58 }
     59 
     60 
     61 %SetForceInlineFlag(MaxSimple);
     62 %SetForceInlineFlag(MinSimple);
     63 
     64 
     65 // ES2015 7.3.20
     66 function SpeciesConstructor(object, defaultConstructor) {
     67   var constructor = object.constructor;
     68   if (IS_UNDEFINED(constructor)) {
     69     return defaultConstructor;
     70   }
     71   if (!IS_RECEIVER(constructor)) {
     72     throw %make_type_error(kConstructorNotReceiver);
     73   }
     74   var species = constructor[speciesSymbol];
     75   if (IS_NULL_OR_UNDEFINED(species)) {
     76     return defaultConstructor;
     77   }
     78   if (%IsConstructor(species)) {
     79     return species;
     80   }
     81   throw %make_type_error(kSpeciesNotConstructor);
     82 }
     83 
     84 //----------------------------------------------------------------------------
     85 
     86 // NOTE: Setting the prototype for Array must take place as early as
     87 // possible due to code generation for array literals.  When
     88 // generating code for a array literal a boilerplate array is created
     89 // that is cloned when running the code.  It is essential that the
     90 // boilerplate gets the right prototype.
     91 %FunctionSetPrototype(GlobalArray, new GlobalArray(0));
     92 
     93 // ----------------------------------------------------------------------------
     94 // Exports
     95 
     96 utils.Export(function(to) {
     97   to.MaxSimple = MaxSimple;
     98   to.MinSimple = MinSimple;
     99   to.ToPositiveInteger = ToPositiveInteger;
    100   to.ToIndex = ToIndex;
    101   to.SpeciesConstructor = SpeciesConstructor;
    102 });
    103 
    104 })
    105