4b235adecc
This was initially used to special case some weird date.js behavior, but has since been abused in other areas. In case of the string character access, everything that is outside the Smi range cannot be a valid string index anyways, so %NumberToSmi is perfect here in either case, and for ToPositiveInteger it's better to just use ToInteger adding +0 to turn -0 into +0. R=ishell@chromium.org BUG=v8:5049 Review-Url: https://codereview.chromium.org/2010183003 Cr-Commit-Position: refs/heads/master@{#36545}
119 lines
3.5 KiB
JavaScript
119 lines
3.5 KiB
JavaScript
// Copyright 2006-2008 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// This files contains runtime support implemented in JavaScript.
|
|
|
|
// CAUTION: Some of the functions specified in this file are called
|
|
// directly from compiled code. These are the functions with names in
|
|
// ALL CAPS. The compiled code passes the first argument in 'this'.
|
|
|
|
|
|
// The following declarations are shared with other native JS files.
|
|
// They are all declared at this one spot to avoid redeclaration errors.
|
|
|
|
(function(global, utils) {
|
|
|
|
%CheckIsBootstrapping();
|
|
|
|
var FLAG_harmony_species;
|
|
var GlobalArray = global.Array;
|
|
var GlobalBoolean = global.Boolean;
|
|
var GlobalString = global.String;
|
|
var MakeRangeError;
|
|
var MakeTypeError;
|
|
var speciesSymbol;
|
|
|
|
utils.Import(function(from) {
|
|
MakeRangeError = from.MakeRangeError;
|
|
MakeTypeError = from.MakeTypeError;
|
|
speciesSymbol = from.species_symbol;
|
|
});
|
|
|
|
utils.ImportFromExperimental(function(from) {
|
|
FLAG_harmony_species = from.FLAG_harmony_species;
|
|
});
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
|
/* ---------------------------------
|
|
- - - U t i l i t i e s - - -
|
|
---------------------------------
|
|
*/
|
|
|
|
|
|
function ToPositiveInteger(x, rangeErrorIndex) {
|
|
var i = TO_INTEGER(x) + 0;
|
|
if (i < 0) throw MakeRangeError(rangeErrorIndex);
|
|
return i;
|
|
}
|
|
|
|
|
|
function MaxSimple(a, b) {
|
|
return a > b ? a : b;
|
|
}
|
|
|
|
|
|
function MinSimple(a, b) {
|
|
return a > b ? b : a;
|
|
}
|
|
|
|
|
|
%SetForceInlineFlag(MaxSimple);
|
|
%SetForceInlineFlag(MinSimple);
|
|
|
|
|
|
// ES2015 7.3.20
|
|
// For the fallback with --harmony-species off, there are two possible choices:
|
|
// - "conservative": return defaultConstructor
|
|
// - "not conservative": return object.constructor
|
|
// This fallback path is only needed in the transition to ES2015, and the
|
|
// choice is made simply to preserve the previous behavior so that we don't
|
|
// have a three-step upgrade: old behavior, unspecified intermediate behavior,
|
|
// and ES2015.
|
|
// In some cases, we were "conservative" (e.g., ArrayBuffer, RegExp), and in
|
|
// other cases we were "not conservative (e.g., TypedArray, Promise).
|
|
function SpeciesConstructor(object, defaultConstructor, conservative) {
|
|
if (FLAG_harmony_species) {
|
|
var constructor = object.constructor;
|
|
if (IS_UNDEFINED(constructor)) {
|
|
return defaultConstructor;
|
|
}
|
|
if (!IS_RECEIVER(constructor)) {
|
|
throw MakeTypeError(kConstructorNotReceiver);
|
|
}
|
|
var species = constructor[speciesSymbol];
|
|
if (IS_NULL_OR_UNDEFINED(species)) {
|
|
return defaultConstructor;
|
|
}
|
|
if (%IsConstructor(species)) {
|
|
return species;
|
|
}
|
|
throw MakeTypeError(kSpeciesNotConstructor);
|
|
} else {
|
|
return conservative ? defaultConstructor : object.constructor;
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
// NOTE: Setting the prototype for Array must take place as early as
|
|
// possible due to code generation for array literals. When
|
|
// generating code for a array literal a boilerplate array is created
|
|
// that is cloned when running the code. It is essential that the
|
|
// boilerplate gets the right prototype.
|
|
%FunctionSetPrototype(GlobalArray, new GlobalArray(0));
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Exports
|
|
|
|
utils.Export(function(to) {
|
|
to.MaxSimple = MaxSimple;
|
|
to.MinSimple = MinSimple;
|
|
to.ToPositiveInteger = ToPositiveInteger;
|
|
to.SpeciesConstructor = SpeciesConstructor;
|
|
});
|
|
|
|
})
|