Commit 30715157 authored by yangguo's avatar yangguo Committed by Commit bot

Install iterator meta objects via utils object.

R=cbruni@chromium.org, hpayer@chromium.org

Review URL: https://codereview.chromium.org/1411653002

Cr-Commit-Position: refs/heads/master@{#31331}
parent f2bfa126
...@@ -164,6 +164,7 @@ class Genesis BASE_EMBEDDED { ...@@ -164,6 +164,7 @@ class Genesis BASE_EMBEDDED {
void CreateStrictModeFunctionMaps(Handle<JSFunction> empty); void CreateStrictModeFunctionMaps(Handle<JSFunction> empty);
void CreateStrongModeFunctionMaps(Handle<JSFunction> empty); void CreateStrongModeFunctionMaps(Handle<JSFunction> empty);
void CreateIteratorMaps();
// Make the "arguments" and "caller" properties throw a TypeError on access. // Make the "arguments" and "caller" properties throw a TypeError on access.
void AddRestrictedFunctionProperties(Handle<Map> map); void AddRestrictedFunctionProperties(Handle<Map> map);
...@@ -199,6 +200,8 @@ class Genesis BASE_EMBEDDED { ...@@ -199,6 +200,8 @@ class Genesis BASE_EMBEDDED {
void InitializeExperimentalGlobal(); void InitializeExperimentalGlobal();
// Typed arrays are not serializable and have to initialized afterwards. // Typed arrays are not serializable and have to initialized afterwards.
void InitializeBuiltinTypedArrays(); void InitializeBuiltinTypedArrays();
// Depending on the situation, expose and/or get rid of the utils object.
void ConfigureUtilsObject(ContextType context_type);
#define DECLARE_FEATURE_INITIALIZATION(id, descr) \ #define DECLARE_FEATURE_INITIALIZATION(id, descr) \
void InitializeGlobal_##id(); void InitializeGlobal_##id();
...@@ -793,6 +796,57 @@ void Genesis::CreateStrongModeFunctionMaps(Handle<JSFunction> empty) { ...@@ -793,6 +796,57 @@ void Genesis::CreateStrongModeFunctionMaps(Handle<JSFunction> empty) {
} }
void Genesis::CreateIteratorMaps() {
// Create iterator-related meta-objects.
Handle<JSObject> iterator_prototype =
factory()->NewJSObject(isolate()->object_function(), TENURED);
Handle<JSObject> generator_object_prototype =
factory()->NewJSObject(isolate()->object_function(), TENURED);
Handle<JSObject> generator_function_prototype =
factory()->NewJSObject(isolate()->object_function(), TENURED);
SetObjectPrototype(generator_object_prototype, iterator_prototype);
JSObject::AddProperty(generator_function_prototype,
factory()->InternalizeUtf8String("prototype"),
generator_object_prototype,
static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
// Create maps for generator functions and their prototypes. Store those
// maps in the native context. The "prototype" property descriptor is
// writable, non-enumerable, and non-configurable (as per ES6 draft
// 04-14-15, section 25.2.4.3).
Handle<Map> strict_function_map(strict_function_map_writable_prototype_);
// Generator functions do not have "caller" or "arguments" accessors.
Handle<Map> sloppy_generator_function_map =
Map::Copy(strict_function_map, "SloppyGeneratorFunction");
Map::SetPrototype(sloppy_generator_function_map,
generator_function_prototype);
native_context()->set_sloppy_generator_function_map(
*sloppy_generator_function_map);
Handle<Map> strict_generator_function_map =
Map::Copy(strict_function_map, "StrictGeneratorFunction");
Map::SetPrototype(strict_generator_function_map,
generator_function_prototype);
native_context()->set_strict_generator_function_map(
*strict_generator_function_map);
Handle<Map> strong_function_map(native_context()->strong_function_map());
Handle<Map> strong_generator_function_map =
Map::Copy(strong_function_map, "StrongGeneratorFunction");
Map::SetPrototype(strong_generator_function_map,
generator_function_prototype);
native_context()->set_strong_generator_function_map(
*strong_generator_function_map);
Handle<JSFunction> object_function(native_context()->object_function());
Handle<Map> generator_object_prototype_map = Map::Create(isolate(), 0);
Map::SetPrototype(generator_object_prototype_map, generator_object_prototype);
native_context()->set_generator_object_prototype_map(
*generator_object_prototype_map);
}
static void ReplaceAccessors(Handle<Map> map, static void ReplaceAccessors(Handle<Map> map,
Handle<String> name, Handle<String> name,
PropertyAttributes attributes, PropertyAttributes attributes,
...@@ -1794,6 +1848,36 @@ void Genesis::InitializeBuiltinTypedArrays() { ...@@ -1794,6 +1848,36 @@ void Genesis::InitializeBuiltinTypedArrays() {
} }
void Genesis::ConfigureUtilsObject(ContextType context_type) {
switch (context_type) {
// We still need the utils object to find debug functions.
case DEBUG_CONTEXT:
return;
// Expose the natives in global if a valid name for it is specified.
case FULL_CONTEXT: {
// We still need the utils object after deserialization.
if (isolate()->serializer_enabled()) return;
if (FLAG_expose_natives_as == NULL) break;
if (strlen(FLAG_expose_natives_as) == 0) break;
HandleScope scope(isolate());
Handle<String> natives_key =
factory()->InternalizeUtf8String(FLAG_expose_natives_as);
uint32_t dummy_index;
if (natives_key->AsArrayIndex(&dummy_index)) break;
Handle<Object> utils = isolate()->natives_utils_object();
Handle<JSObject> global = isolate()->global_object();
JSObject::AddProperty(global, natives_key, utils, DONT_ENUM);
break;
}
case THIN_CONTEXT:
break;
}
// The utils object can be removed for cases that reach this point.
native_context()->set_natives_utils_object(heap()->undefined_value());
}
void Bootstrapper::ExportFromRuntime(Isolate* isolate, void Bootstrapper::ExportFromRuntime(Isolate* isolate,
Handle<JSObject> container) { Handle<JSObject> container) {
HandleScope scope(isolate); HandleScope scope(isolate);
...@@ -1837,6 +1921,58 @@ void Bootstrapper::ExportFromRuntime(Isolate* isolate, ...@@ -1837,6 +1921,58 @@ void Bootstrapper::ExportFromRuntime(Isolate* isolate,
construct->shared()->set_feedback_vector(*feedback_vector); construct->shared()->set_feedback_vector(*feedback_vector);
isolate->native_context()->set_reflect_construct(*construct); isolate->native_context()->set_reflect_construct(*construct);
} }
Handle<JSObject> iterator_prototype;
{
PrototypeIterator iter(
isolate->native_context()->generator_object_prototype_map());
iter.Advance(); // Advance to the prototype of generator_object_prototype.
iterator_prototype = Handle<JSObject>(iter.GetCurrent<JSObject>());
JSObject::AddProperty(container, isolate->factory()->InternalizeUtf8String(
"IteratorPrototype"),
iterator_prototype, NONE);
}
{
PrototypeIterator iter(
isolate->native_context()->sloppy_generator_function_map());
Handle<JSObject> generator_function_prototype(iter.GetCurrent<JSObject>());
JSObject::AddProperty(container, isolate->factory()->InternalizeUtf8String(
"GeneratorFunctionPrototype"),
generator_function_prototype, NONE);
static const bool kUseStrictFunctionMap = true;
Handle<JSFunction> generator_function_function =
InstallFunction(container, "GeneratorFunction", JS_FUNCTION_TYPE,
JSFunction::kSize, generator_function_prototype,
Builtins::kIllegal, kUseStrictFunctionMap);
generator_function_function->initial_map()->set_is_callable();
}
{ // -- S e t I t e r a t o r
Handle<JSObject> set_iterator_prototype =
isolate->factory()->NewJSObject(isolate->object_function(), TENURED);
SetObjectPrototype(set_iterator_prototype, iterator_prototype);
Handle<JSFunction> set_iterator_function = InstallFunction(
container, "SetIterator", JS_SET_ITERATOR_TYPE, JSSetIterator::kSize,
set_iterator_prototype, Builtins::kIllegal);
isolate->native_context()->set_set_iterator_map(
set_iterator_function->initial_map());
}
{ // -- M a p I t e r a t o r
Handle<JSObject> map_iterator_prototype =
isolate->factory()->NewJSObject(isolate->object_function(), TENURED);
SetObjectPrototype(map_iterator_prototype, iterator_prototype);
Handle<JSFunction> map_iterator_function = InstallFunction(
container, "MapIterator", JS_MAP_ITERATOR_TYPE, JSMapIterator::kSize,
map_iterator_prototype, Builtins::kIllegal);
isolate->native_context()->set_map_iterator_map(
map_iterator_function->initial_map());
}
} }
...@@ -1855,6 +1991,7 @@ void Bootstrapper::ExportExperimentalFromRuntime(Isolate* isolate, ...@@ -1855,6 +1991,7 @@ void Bootstrapper::ExportExperimentalFromRuntime(Isolate* isolate,
INITIALIZE_FLAG(FLAG_harmony_regexps) INITIALIZE_FLAG(FLAG_harmony_regexps)
INITIALIZE_FLAG(FLAG_harmony_unicode_regexps) INITIALIZE_FLAG(FLAG_harmony_unicode_regexps)
INITIALIZE_FLAG(FLAG_harmony_tostring) INITIALIZE_FLAG(FLAG_harmony_tostring)
INITIALIZE_FLAG(FLAG_harmony_tolength)
#undef INITIALIZE_FLAG #undef INITIALIZE_FLAG
} }
...@@ -1881,15 +2018,7 @@ EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_regexps) ...@@ -1881,15 +2018,7 @@ EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_regexps)
EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_unicode_regexps) EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_unicode_regexps)
EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_tostring) EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_tostring)
EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_completion) EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_completion)
EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_tolength)
void Genesis::InitializeGlobal_harmony_tolength() {
Handle<JSObject> builtins(native_context()->builtins());
Handle<Object> flag(factory()->ToBoolean(FLAG_harmony_tolength));
Runtime::SetObjectProperty(isolate(), builtins,
factory()->harmony_tolength_string(), flag,
STRICT).Assert();
}
static void SimpleInstallFunction(Handle<JSObject>& base, const char* name, static void SimpleInstallFunction(Handle<JSObject>& base, const char* name,
...@@ -2080,11 +2209,6 @@ bool Genesis::InstallNatives(ContextType context_type) { ...@@ -2080,11 +2209,6 @@ bool Genesis::InstallNatives(ContextType context_type) {
// A thin context is ready at this point. // A thin context is ready at this point.
if (context_type == THIN_CONTEXT) return true; if (context_type == THIN_CONTEXT) return true;
if (FLAG_expose_natives_as != NULL) {
Handle<String> utils_key = factory()->NewStringFromAsciiChecked("utils");
JSObject::AddProperty(builtins, utils_key, utils, NONE);
}
{ // -- S c r i p t { // -- S c r i p t
// Builtin functions for Script. // Builtin functions for Script.
Handle<JSFunction> script_fun = InstallFunction( Handle<JSFunction> script_fun = InstallFunction(
...@@ -2261,96 +2385,6 @@ bool Genesis::InstallNatives(ContextType context_type) { ...@@ -2261,96 +2385,6 @@ bool Genesis::InstallNatives(ContextType context_type) {
InstallInternalArray(utils, "InternalPackedArray", FAST_ELEMENTS); InstallInternalArray(utils, "InternalPackedArray", FAST_ELEMENTS);
} }
{ // -- S e t I t e r a t o r
Handle<JSFunction> set_iterator_function = InstallFunction(
builtins, "SetIterator", JS_SET_ITERATOR_TYPE, JSSetIterator::kSize,
isolate()->initial_object_prototype(), Builtins::kIllegal);
native_context()->set_set_iterator_map(
set_iterator_function->initial_map());
}
{ // -- M a p I t e r a t o r
Handle<JSFunction> map_iterator_function = InstallFunction(
builtins, "MapIterator", JS_MAP_ITERATOR_TYPE, JSMapIterator::kSize,
isolate()->initial_object_prototype(), Builtins::kIllegal);
native_context()->set_map_iterator_map(
map_iterator_function->initial_map());
}
{
// Create generator meta-objects and install them on the builtins object.
Handle<JSObject> builtins(native_context()->builtins());
Handle<JSObject> iterator_prototype =
factory()->NewJSObject(isolate()->object_function(), TENURED);
Handle<JSObject> generator_object_prototype =
factory()->NewJSObject(isolate()->object_function(), TENURED);
Handle<JSObject> generator_function_prototype =
factory()->NewJSObject(isolate()->object_function(), TENURED);
SetObjectPrototype(generator_object_prototype, iterator_prototype);
JSObject::AddProperty(
builtins, factory()->InternalizeUtf8String("$iteratorPrototype"),
iterator_prototype,
static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY));
JSObject::AddProperty(
builtins,
factory()->InternalizeUtf8String("GeneratorFunctionPrototype"),
generator_function_prototype,
static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY));
JSObject::AddProperty(
generator_function_prototype,
factory()->InternalizeUtf8String("prototype"),
generator_object_prototype,
static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
static const bool kUseStrictFunctionMap = true;
Handle<JSFunction> generator_function_function =
InstallFunction(builtins, "GeneratorFunction", JS_FUNCTION_TYPE,
JSFunction::kSize, generator_function_prototype,
Builtins::kIllegal, kUseStrictFunctionMap);
generator_function_function->initial_map()->set_is_callable();
// Create maps for generator functions and their prototypes. Store those
// maps in the native context. The "prototype" property descriptor is
// writable, non-enumerable, and non-configurable (as per ES6 draft
// 04-14-15, section 25.2.4.3).
Handle<Map> strict_function_map(strict_function_map_writable_prototype_);
// Generator functions do not have "caller" or "arguments" accessors.
Handle<Map> sloppy_generator_function_map =
Map::Copy(strict_function_map, "SloppyGeneratorFunction");
Map::SetPrototype(sloppy_generator_function_map,
generator_function_prototype);
native_context()->set_sloppy_generator_function_map(
*sloppy_generator_function_map);
Handle<Map> strict_generator_function_map =
Map::Copy(strict_function_map, "StrictGeneratorFunction");
Map::SetPrototype(strict_generator_function_map,
generator_function_prototype);
native_context()->set_strict_generator_function_map(
*strict_generator_function_map);
Handle<Map> strong_function_map(native_context()->strong_function_map());
Handle<Map> strong_generator_function_map =
Map::Copy(strong_function_map, "StrongGeneratorFunction");
Map::SetPrototype(strong_generator_function_map,
generator_function_prototype);
native_context()->set_strong_generator_function_map(
*strong_generator_function_map);
Handle<JSFunction> object_function(native_context()->object_function());
Handle<Map> generator_object_prototype_map = Map::Create(isolate(), 0);
Map::SetPrototype(generator_object_prototype_map,
generator_object_prototype);
native_context()->set_generator_object_prototype_map(
*generator_object_prototype_map);
}
if (FLAG_disable_native_files) {
PrintF("Warning: Running without installed natives!\n");
return true;
}
// Run the rest of the native scripts. // Run the rest of the native scripts.
while (builtin_index < Natives::GetBuiltinsCount()) { while (builtin_index < Natives::GetBuiltinsCount()) {
if (!Bootstrapper::CompileBuiltin(isolate(), builtin_index++)) return false; if (!Bootstrapper::CompileBuiltin(isolate(), builtin_index++)) return false;
...@@ -2768,16 +2802,6 @@ bool Genesis::InstallSpecialObjects(Handle<Context> native_context) { ...@@ -2768,16 +2802,6 @@ bool Genesis::InstallSpecialObjects(Handle<Context> native_context) {
Handle<Smi> stack_trace_limit(Smi::FromInt(FLAG_stack_trace_limit), isolate); Handle<Smi> stack_trace_limit(Smi::FromInt(FLAG_stack_trace_limit), isolate);
JSObject::AddProperty(Error, name, stack_trace_limit, NONE); JSObject::AddProperty(Error, name, stack_trace_limit, NONE);
// Expose the natives in global if a name for it is specified.
if (FLAG_expose_natives_as != NULL && strlen(FLAG_expose_natives_as) != 0) {
Handle<String> natives_key =
factory->InternalizeUtf8String(FLAG_expose_natives_as);
uint32_t dummy_index;
if (natives_key->AsArrayIndex(&dummy_index)) return true;
Handle<JSBuiltinsObject> natives(global->builtins());
JSObject::AddProperty(global, natives_key, natives, DONT_ENUM);
}
// Expose the debug global object in global if a name for it is specified. // Expose the debug global object in global if a name for it is specified.
if (FLAG_expose_debug_as != NULL && strlen(FLAG_expose_debug_as) != 0) { if (FLAG_expose_debug_as != NULL && strlen(FLAG_expose_debug_as) != 0) {
// If loading fails we just bail out without installing the // If loading fails we just bail out without installing the
...@@ -3221,6 +3245,7 @@ Genesis::Genesis(Isolate* isolate, ...@@ -3221,6 +3245,7 @@ Genesis::Genesis(Isolate* isolate,
Handle<JSFunction> empty_function = CreateEmptyFunction(isolate); Handle<JSFunction> empty_function = CreateEmptyFunction(isolate);
CreateStrictModeFunctionMaps(empty_function); CreateStrictModeFunctionMaps(empty_function);
CreateStrongModeFunctionMaps(empty_function); CreateStrongModeFunctionMaps(empty_function);
CreateIteratorMaps();
Handle<GlobalObject> global_object = Handle<GlobalObject> global_object =
CreateNewGlobals(global_proxy_template, global_proxy); CreateNewGlobals(global_proxy_template, global_proxy);
HookUpGlobalProxy(global_object, global_proxy); HookUpGlobalProxy(global_object, global_proxy);
...@@ -3249,10 +3274,6 @@ Genesis::Genesis(Isolate* isolate, ...@@ -3249,10 +3274,6 @@ Genesis::Genesis(Isolate* isolate,
if (FLAG_experimental_extras) { if (FLAG_experimental_extras) {
if (!InstallExperimentalExtraNatives()) return; if (!InstallExperimentalExtraNatives()) return;
} }
// By now the utils object is useless and can be removed.
native_context()->set_natives_utils_object(
isolate->heap()->undefined_value());
} }
// The serializer cannot serialize typed arrays. Reset those typed arrays // The serializer cannot serialize typed arrays. Reset those typed arrays
// for each new context. // for each new context.
...@@ -3263,6 +3284,8 @@ Genesis::Genesis(Isolate* isolate, ...@@ -3263,6 +3284,8 @@ Genesis::Genesis(Isolate* isolate,
if (!InstallDebuggerNatives()) return; if (!InstallDebuggerNatives()) return;
} }
ConfigureUtilsObject(context_type);
// Check that the script context table is empty except for the 'this' binding. // Check that the script context table is empty except for the 'this' binding.
// We do not need script contexts for native scripts. // We do not need script contexts for native scripts.
if (!FLAG_global_var_shortcuts) { if (!FLAG_global_var_shortcuts) {
......
...@@ -263,7 +263,6 @@ namespace internal { ...@@ -263,7 +263,6 @@ namespace internal {
V(multiline_string, "multiline") \ V(multiline_string, "multiline") \
V(sticky_string, "sticky") \ V(sticky_string, "sticky") \
V(unicode_string, "unicode") \ V(unicode_string, "unicode") \
V(harmony_tolength_string, "harmony_tolength") \
V(input_string, "input") \ V(input_string, "input") \
V(index_string, "index") \ V(index_string, "index") \
V(last_index_string, "lastIndex") \ V(last_index_string, "lastIndex") \
......
...@@ -18,6 +18,7 @@ var arrayIteratorNextIndexSymbol = ...@@ -18,6 +18,7 @@ var arrayIteratorNextIndexSymbol =
var arrayIteratorObjectSymbol = var arrayIteratorObjectSymbol =
utils.ImportNow("array_iterator_object_symbol"); utils.ImportNow("array_iterator_object_symbol");
var GlobalArray = global.Array; var GlobalArray = global.Array;
var IteratorPrototype = utils.ImportNow("IteratorPrototype");
var iteratorSymbol = utils.ImportNow("iterator_symbol"); var iteratorSymbol = utils.ImportNow("iterator_symbol");
var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol");
...@@ -121,7 +122,7 @@ function ArrayKeys() { ...@@ -121,7 +122,7 @@ function ArrayKeys() {
} }
%FunctionSetPrototype(ArrayIterator, {__proto__: $iteratorPrototype}); %FunctionSetPrototype(ArrayIterator, {__proto__: IteratorPrototype});
%FunctionSetInstanceClassName(ArrayIterator, 'Array Iterator'); %FunctionSetInstanceClassName(ArrayIterator, 'Array Iterator');
utils.InstallFunctions(ArrayIterator.prototype, DONT_ENUM, [ utils.InstallFunctions(ArrayIterator.prototype, DONT_ENUM, [
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
// Imports // Imports
var Delete; var Delete;
var FLAG_harmony_tolength;
var GlobalArray = global.Array; var GlobalArray = global.Array;
var InternalArray = utils.InternalArray; var InternalArray = utils.InternalArray;
var InternalPackedArray = utils.InternalPackedArray; var InternalPackedArray = utils.InternalPackedArray;
...@@ -37,6 +38,10 @@ utils.Import(function(from) { ...@@ -37,6 +38,10 @@ utils.Import(function(from) {
ObserveEnqueueSpliceRecord = from.ObserveEnqueueSpliceRecord; ObserveEnqueueSpliceRecord = from.ObserveEnqueueSpliceRecord;
}); });
utils.ImportFromExperimental(function(from) {
FLAG_harmony_tolength = from.FLAG_harmony_tolength;
});
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Global list of arrays visited during toString, toLocaleString and // Global list of arrays visited during toString, toLocaleString and
......
...@@ -11,7 +11,9 @@ ...@@ -11,7 +11,9 @@
var GlobalMap = global.Map; var GlobalMap = global.Map;
var GlobalSet = global.Set; var GlobalSet = global.Set;
var iteratorSymbol = utils.ImportNow("iterator_symbol"); var iteratorSymbol = utils.ImportNow("iterator_symbol");
var MapIterator = utils.ImportNow("MapIterator");
var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol");
var SetIterator = utils.ImportNow("SetIterator");
// ------------------------------------------------------------------- // -------------------------------------------------------------------
...@@ -65,7 +67,6 @@ function SetValues() { ...@@ -65,7 +67,6 @@ function SetValues() {
// ------------------------------------------------------------------- // -------------------------------------------------------------------
%SetCode(SetIterator, SetIteratorConstructor); %SetCode(SetIterator, SetIteratorConstructor);
%FunctionSetPrototype(SetIterator, {__proto__: $iteratorPrototype});
%FunctionSetInstanceClassName(SetIterator, 'Set Iterator'); %FunctionSetInstanceClassName(SetIterator, 'Set Iterator');
utils.InstallFunctions(SetIterator.prototype, DONT_ENUM, [ utils.InstallFunctions(SetIterator.prototype, DONT_ENUM, [
'next', SetIteratorNextJS 'next', SetIteratorNextJS
...@@ -144,7 +145,6 @@ function MapValues() { ...@@ -144,7 +145,6 @@ function MapValues() {
// ------------------------------------------------------------------- // -------------------------------------------------------------------
%SetCode(MapIterator, MapIteratorConstructor); %SetCode(MapIterator, MapIteratorConstructor);
%FunctionSetPrototype(MapIterator, {__proto__: $iteratorPrototype});
%FunctionSetInstanceClassName(MapIterator, 'Map Iterator'); %FunctionSetInstanceClassName(MapIterator, 'Map Iterator');
utils.InstallFunctions(MapIterator.prototype, DONT_ENUM, [ utils.InstallFunctions(MapIterator.prototype, DONT_ENUM, [
'next', MapIteratorNextJS 'next', MapIteratorNextJS
......
...@@ -15,16 +15,16 @@ var GlobalObject = global.Object; ...@@ -15,16 +15,16 @@ var GlobalObject = global.Object;
var GlobalSet = global.Set; var GlobalSet = global.Set;
var hashCodeSymbol = utils.ImportNow("hash_code_symbol"); var hashCodeSymbol = utils.ImportNow("hash_code_symbol");
var IntRandom; var IntRandom;
var MapIterator;
var NumberIsNaN;
var SetIterator;
var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol");
utils.Import(function(from) { utils.Import(function(from) {
IntRandom = from.IntRandom; IntRandom = from.IntRandom;
}); MapIterator = from.MapIterator;
var NumberIsNaN;
utils.Import(function(from) {
NumberIsNaN = from.NumberIsNaN; NumberIsNaN = from.NumberIsNaN;
SetIterator = from.SetIterator;
}); });
// ------------------------------------------------------------------- // -------------------------------------------------------------------
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Imports // Imports
var GeneratorFunctionPrototype = utils.ImportNow("GeneratorFunctionPrototype");
var GeneratorFunction = utils.ImportNow("GeneratorFunction");
var GlobalFunction = global.Function; var GlobalFunction = global.Function;
var NewFunctionString; var NewFunctionString;
var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol");
......
...@@ -9,6 +9,11 @@ ...@@ -9,6 +9,11 @@
%CheckIsBootstrapping(); %CheckIsBootstrapping();
var GlobalArray = global.Array; var GlobalArray = global.Array;
var SameValueZero;
utils.Import(function(from) {
SameValueZero = from.SameValueZero;
});
// ------------------------------------------------------------------- // -------------------------------------------------------------------
...@@ -34,7 +39,7 @@ function InnerArrayIncludes(searchElement, fromIndex, array, length) { ...@@ -34,7 +39,7 @@ function InnerArrayIncludes(searchElement, fromIndex, array, length) {
while (k < length) { while (k < length) {
var elementK = array[k]; var elementK = array[k];
if ($sameValueZero(searchElement, elementK)) { if (SameValueZero(searchElement, elementK)) {
return true; return true;
} }
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Imports // Imports
var FLAG_harmony_tolength;
var GetIterator; var GetIterator;
var GetMethod; var GetMethod;
var GlobalArray = global.Array; var GlobalArray = global.Array;
...@@ -21,6 +22,7 @@ var ObjectIsFrozen; ...@@ -21,6 +22,7 @@ var ObjectIsFrozen;
var ObjectDefineProperty; var ObjectDefineProperty;
utils.Import(function(from) { utils.Import(function(from) {
FLAG_harmony_tolength = from.FLAG_harmony_tolength;
GetIterator = from.GetIterator; GetIterator = from.GetIterator;
GetMethod = from.GetMethod; GetMethod = from.GetMethod;
MathMax = from.MathMax; MathMax = from.MathMax;
......
...@@ -2,13 +2,12 @@ ...@@ -2,13 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
var $iteratorPrototype;
(function(global, utils) { (function(global, utils) {
"use strict"; "use strict";
%CheckIsBootstrapping(); %CheckIsBootstrapping();
var GlobalObject = global.Object; var GlobalObject = global.Object;
var IteratorPrototype = utils.ImportNow("IteratorPrototype");
var iteratorSymbol = utils.ImportNow("iterator_symbol"); var iteratorSymbol = utils.ImportNow("iterator_symbol");
// 25.1.2.1 %IteratorPrototype% [ @@iterator ] ( ) // 25.1.2.1 %IteratorPrototype% [ @@iterator ] ( )
...@@ -17,6 +16,6 @@ var $iteratorPrototype; ...@@ -17,6 +16,6 @@ var $iteratorPrototype;
} }
utils.SetFunctionName(IteratorPrototypeIterator, iteratorSymbol); utils.SetFunctionName(IteratorPrototypeIterator, iteratorSymbol);
%AddNamedProperty($iteratorPrototype, iteratorSymbol, %AddNamedProperty(IteratorPrototype, iteratorSymbol,
IteratorPrototypeIterator, DONT_ENUM); IteratorPrototypeIterator, DONT_ENUM);
}) })
...@@ -147,8 +147,8 @@ macro TO_INTEGER_MAP_MINUS_ZERO(arg) = (%_IsSmi(%IS_VAR(arg)) ? arg : %NumberToI ...@@ -147,8 +147,8 @@ macro TO_INTEGER_MAP_MINUS_ZERO(arg) = (%_IsSmi(%IS_VAR(arg)) ? arg : %NumberToI
macro TO_INT32(arg) = ((arg) | 0); macro TO_INT32(arg) = ((arg) | 0);
macro TO_UINT32(arg) = ((arg) >>> 0); macro TO_UINT32(arg) = ((arg) >>> 0);
macro TO_LENGTH(arg) = (%ToLength(arg)); macro TO_LENGTH(arg) = (%ToLength(arg));
macro TO_LENGTH_OR_UINT32(arg) = (harmony_tolength ? TO_LENGTH(arg) : TO_UINT32(arg)); macro TO_LENGTH_OR_UINT32(arg) = (FLAG_harmony_tolength ? TO_LENGTH(arg) : TO_UINT32(arg));
macro TO_LENGTH_OR_INTEGER(arg) = (harmony_tolength ? TO_LENGTH(arg) : TO_INTEGER(arg)); macro TO_LENGTH_OR_INTEGER(arg) = (FLAG_harmony_tolength ? TO_LENGTH(arg) : TO_INTEGER(arg));
macro TO_STRING(arg) = (%_ToString(arg)); macro TO_STRING(arg) = (%_ToString(arg));
macro TO_NUMBER(arg) = (%_ToNumber(arg)); macro TO_NUMBER(arg) = (%_ToNumber(arg));
macro TO_OBJECT(arg) = (%_ToObject(arg)); macro TO_OBJECT(arg) = (%_ToObject(arg));
......
...@@ -182,6 +182,7 @@ function PostNatives(utils) { ...@@ -182,6 +182,7 @@ function PostNatives(utils) {
"InnerArrayToLocaleString", "InnerArrayToLocaleString",
"IsNaN", "IsNaN",
"MapEntries", "MapEntries",
"MapIterator",
"MapIteratorNext", "MapIteratorNext",
"MathMax", "MathMax",
"MathMin", "MathMin",
...@@ -190,6 +191,8 @@ function PostNatives(utils) { ...@@ -190,6 +191,8 @@ function PostNatives(utils) {
"ObserveArrayMethods", "ObserveArrayMethods",
"ObserveObjectMethods", "ObserveObjectMethods",
"OwnPropertyKeys", "OwnPropertyKeys",
"SameValueZero",
"SetIterator",
"SetIteratorNext", "SetIteratorNext",
"SetValues", "SetValues",
"SymbolToString", "SymbolToString",
...@@ -230,12 +233,9 @@ function PostExperimentals(utils) { ...@@ -230,12 +233,9 @@ function PostExperimentals(utils) {
imports_from_experimental(exports_container); imports_from_experimental(exports_container);
} }
exports_container = UNDEFINED;
utils.PostExperimentals = UNDEFINED;
utils.PostDebug = UNDEFINED;
utils.Import = UNDEFINED;
utils.Export = UNDEFINED; utils.Export = UNDEFINED;
utils.PostDebug = UNDEFINED;
utils.PostExperimentals = UNDEFINED;
} }
...@@ -246,12 +246,14 @@ function PostDebug(utils) { ...@@ -246,12 +246,14 @@ function PostDebug(utils) {
exports_container = UNDEFINED; exports_container = UNDEFINED;
utils.Export = UNDEFINED;
utils.Import = UNDEFINED;
utils.ImportNow = UNDEFINED;
utils.PostDebug = UNDEFINED; utils.PostDebug = UNDEFINED;
utils.PostExperimentals = UNDEFINED; utils.PostExperimentals = UNDEFINED;
utils.Import = UNDEFINED;
utils.Export = UNDEFINED;
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
%OptimizeObjectForAddingMultipleProperties(utils, 13); %OptimizeObjectForAddingMultipleProperties(utils, 13);
......
...@@ -12,12 +12,14 @@ var $regexpLastMatchInfoOverride; ...@@ -12,12 +12,14 @@ var $regexpLastMatchInfoOverride;
// Imports // Imports
var FLAG_harmony_regexps; var FLAG_harmony_regexps;
var FLAG_harmony_tolength;
var FLAG_harmony_unicode_regexps; var FLAG_harmony_unicode_regexps;
var GlobalRegExp = global.RegExp; var GlobalRegExp = global.RegExp;
var InternalPackedArray = utils.InternalPackedArray; var InternalPackedArray = utils.InternalPackedArray;
utils.ImportFromExperimental(function(from) { utils.ImportFromExperimental(function(from) {
FLAG_harmony_regexps = from.FLAG_harmony_regexps; FLAG_harmony_regexps = from.FLAG_harmony_regexps;
FLAG_harmony_tolength = from.FLAG_harmony_tolength;
FLAG_harmony_unicode_regexps = from.FLAG_harmony_unicode_regexps; FLAG_harmony_unicode_regexps = from.FLAG_harmony_unicode_regexps;
}); });
......
...@@ -11,10 +11,6 @@ ...@@ -11,10 +11,6 @@
// The following declarations are shared with other native JS files. // The following declarations are shared with other native JS files.
// They are all declared at this one spot to avoid redeclaration errors. // They are all declared at this one spot to avoid redeclaration errors.
var $sameValue;
var $sameValueZero;
var harmony_tolength = false;
(function(global, utils) { (function(global, utils) {
...@@ -232,11 +228,10 @@ function ToPositiveInteger(x, rangeErrorIndex) { ...@@ -232,11 +228,10 @@ function ToPositiveInteger(x, rangeErrorIndex) {
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// Exports // Exports
$sameValue = SameValue;
$sameValueZero = SameValueZero;
utils.Export(function(to) { utils.Export(function(to) {
to.ToPositiveInteger = ToPositiveInteger; to.ToPositiveInteger = ToPositiveInteger;
to.SameValue = SameValue;
to.SameValueZero = SameValueZero;
}); });
%InstallToContext([ %InstallToContext([
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
// Imports // Imports
var GlobalString = global.String; var GlobalString = global.String;
var IteratorPrototype = utils.ImportNow("IteratorPrototype");
var iteratorSymbol = utils.ImportNow("iterator_symbol"); var iteratorSymbol = utils.ImportNow("iterator_symbol");
var stringIteratorIteratedStringSymbol = var stringIteratorIteratedStringSymbol =
utils.ImportNow("string_iterator_iterated_string_symbol"); utils.ImportNow("string_iterator_iterated_string_symbol");
...@@ -80,7 +81,7 @@ function StringPrototypeIterator() { ...@@ -80,7 +81,7 @@ function StringPrototypeIterator() {
//------------------------------------------------------------------- //-------------------------------------------------------------------
%FunctionSetPrototype(StringIterator, {__proto__: $iteratorPrototype}); %FunctionSetPrototype(StringIterator, {__proto__: IteratorPrototype});
%FunctionSetInstanceClassName(StringIterator, 'String Iterator'); %FunctionSetInstanceClassName(StringIterator, 'String Iterator');
utils.InstallFunctions(StringIterator.prototype, DONT_ENUM, [ utils.InstallFunctions(StringIterator.prototype, DONT_ENUM, [
......
...@@ -25,6 +25,7 @@ var ObserveEnqueueSpliceRecord; ...@@ -25,6 +25,7 @@ var ObserveEnqueueSpliceRecord;
var ProxyDelegateCallAndConstruct; var ProxyDelegateCallAndConstruct;
var ProxyDerivedHasOwnTrap; var ProxyDerivedHasOwnTrap;
var ProxyDerivedKeysTrap; var ProxyDerivedKeysTrap;
var SameValue = utils.ImportNow("SameValue");
var StringIndexOf; var StringIndexOf;
var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol");
...@@ -653,17 +654,17 @@ function DefineObjectProperty(obj, p, desc, should_throw) { ...@@ -653,17 +654,17 @@ function DefineObjectProperty(obj, p, desc, should_throw) {
if ((IsGenericDescriptor(desc) || if ((IsGenericDescriptor(desc) ||
IsDataDescriptor(desc) == IsDataDescriptor(current)) && IsDataDescriptor(desc) == IsDataDescriptor(current)) &&
(!desc.hasEnumerable() || (!desc.hasEnumerable() ||
$sameValue(desc.isEnumerable(), current.isEnumerable())) && SameValue(desc.isEnumerable(), current.isEnumerable())) &&
(!desc.hasConfigurable() || (!desc.hasConfigurable() ||
$sameValue(desc.isConfigurable(), current.isConfigurable())) && SameValue(desc.isConfigurable(), current.isConfigurable())) &&
(!desc.hasWritable() || (!desc.hasWritable() ||
$sameValue(desc.isWritable(), current.isWritable())) && SameValue(desc.isWritable(), current.isWritable())) &&
(!desc.hasValue() || (!desc.hasValue() ||
$sameValue(desc.getValue(), current.getValue())) && SameValue(desc.getValue(), current.getValue())) &&
(!desc.hasGetter() || (!desc.hasGetter() ||
$sameValue(desc.getGet(), current.getGet())) && SameValue(desc.getGet(), current.getGet())) &&
(!desc.hasSetter() || (!desc.hasSetter() ||
$sameValue(desc.getSet(), current.getSet()))) { SameValue(desc.getSet(), current.getSet()))) {
return true; return true;
} }
if (!current.isConfigurable()) { if (!current.isConfigurable()) {
...@@ -702,7 +703,7 @@ function DefineObjectProperty(obj, p, desc, should_throw) { ...@@ -702,7 +703,7 @@ function DefineObjectProperty(obj, p, desc, should_throw) {
} }
} }
if (!currentIsWritable && desc.hasValue() && if (!currentIsWritable && desc.hasValue() &&
!$sameValue(desc.getValue(), current.getValue())) { !SameValue(desc.getValue(), current.getValue())) {
if (should_throw) { if (should_throw) {
throw MakeTypeError(kRedefineDisallowed, p); throw MakeTypeError(kRedefineDisallowed, p);
} else { } else {
...@@ -713,14 +714,14 @@ function DefineObjectProperty(obj, p, desc, should_throw) { ...@@ -713,14 +714,14 @@ function DefineObjectProperty(obj, p, desc, should_throw) {
// Step 11 // Step 11
if (IsAccessorDescriptor(desc) && IsAccessorDescriptor(current)) { if (IsAccessorDescriptor(desc) && IsAccessorDescriptor(current)) {
if (desc.hasSetter() && if (desc.hasSetter() &&
!$sameValue(desc.getSet(), current.getSet())) { !SameValue(desc.getSet(), current.getSet())) {
if (should_throw) { if (should_throw) {
throw MakeTypeError(kRedefineDisallowed, p); throw MakeTypeError(kRedefineDisallowed, p);
} else { } else {
return false; return false;
} }
} }
if (desc.hasGetter() && !$sameValue(desc.getGet(),current.getGet())) { if (desc.hasGetter() && !SameValue(desc.getGet(),current.getGet())) {
if (should_throw) { if (should_throw) {
throw MakeTypeError(kRedefineDisallowed, p); throw MakeTypeError(kRedefineDisallowed, p);
} else { } else {
...@@ -1259,12 +1260,6 @@ function ObjectIsExtensible(obj) { ...@@ -1259,12 +1260,6 @@ function ObjectIsExtensible(obj) {
} }
// ECMA-262, Edition 6, section 19.1.2.10
function ObjectIs(obj1, obj2) {
return $sameValue(obj1, obj2);
}
// ECMA-262, Edition 6, section 19.1.2.1 // ECMA-262, Edition 6, section 19.1.2.1
function ObjectAssign(target, sources) { function ObjectAssign(target, sources) {
// TODO(bmeurer): Move this to toplevel. // TODO(bmeurer): Move this to toplevel.
...@@ -1360,7 +1355,7 @@ utils.InstallFunctions(GlobalObject, DONT_ENUM, [ ...@@ -1360,7 +1355,7 @@ utils.InstallFunctions(GlobalObject, DONT_ENUM, [
"getOwnPropertyDescriptor", ObjectGetOwnPropertyDescriptor, "getOwnPropertyDescriptor", ObjectGetOwnPropertyDescriptor,
"getOwnPropertyNames", ObjectGetOwnPropertyNames, "getOwnPropertyNames", ObjectGetOwnPropertyNames,
// getOwnPropertySymbols is added in symbol.js. // getOwnPropertySymbols is added in symbol.js.
"is", ObjectIs, "is", SameValue, // ECMA-262, Edition 6, section 19.1.2.10
"isExtensible", ObjectIsExtensible, "isExtensible", ObjectIsExtensible,
"isFrozen", ObjectIsFrozen, "isFrozen", ObjectIsFrozen,
"isSealed", ObjectIsSealed, "isSealed", ObjectIsSealed,
......
...@@ -5884,7 +5884,9 @@ static void UtilsHasBeenCollected( ...@@ -5884,7 +5884,9 @@ static void UtilsHasBeenCollected(
TEST(BootstrappingExports) { TEST(BootstrappingExports) {
FLAG_expose_natives_as = "natives"; // Expose utils object and delete it to observe that it is indeed
// being garbage-collected.
FLAG_expose_natives_as = "utils";
CcTest::InitializeVM(); CcTest::InitializeVM();
v8::Isolate* isolate = CcTest::isolate(); v8::Isolate* isolate = CcTest::isolate();
...@@ -5896,10 +5898,9 @@ TEST(BootstrappingExports) { ...@@ -5896,10 +5898,9 @@ TEST(BootstrappingExports) {
{ {
v8::HandleScope scope(isolate); v8::HandleScope scope(isolate);
v8::Handle<v8::Object> natives = v8::Local<v8::String> name = v8_str("utils");
CcTest::global()->Get(v8_str("natives"))->ToObject(isolate); utils.Reset(isolate, CcTest::global()->Get(name)->ToObject(isolate));
utils.Reset(isolate, natives->Get(v8_str("utils"))->ToObject(isolate)); CcTest::global()->Delete(name);
natives->Delete(v8_str("utils"));
} }
utils.SetWeak(&utils, UtilsHasBeenCollected, utils.SetWeak(&utils, UtilsHasBeenCollected,
......
// Copyright 2011 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Flags: --allow-natives-syntax --expose-natives-as=builtins
// Verify that the builtin typed arrays have been pretenured.
assertFalse(%InNewSpace(builtins.kMath));
assertFalse(%InNewSpace(builtins.rempio2result));
assertFalse(%InNewSpace(builtins.rngstate));
// Checks that all function properties of the builtin object that are actually
// constructors (recognized by having properties on their .prototype object),
// have only unconfigurable properties on the prototype, and the methods
// are also non-writable.
var names = Object.getOwnPropertyNames(builtins);
function isFunction(obj) {
return typeof obj == "function";
}
function isV8Native(name) {
return name == "GeneratorFunction" ||
name == "GeneratorFunctionPrototype" ||
name == "SetIterator" ||
name == "MapIterator" ||
name == "ArrayIterator" ||
name == "StringIterator";
}
var V8NativePrototypes = {
GeneratorFunction: Function.prototype,
// TODO(jugglinmike): Update the following values to the %IteratorPrototype%
// intrinsic once it is implemented.
// Issue 3568: Generator Prototype should have an object between itself
// and Object.prototype
// https://code.google.com/p/v8/issues/detail?id=3568
GeneratorFunctionPrototype: Object.prototype,
SetIterator: Object.prototype,
MapIterator: Object.prototype,
ArrayIterator: Object.prototype,
StringIterator: Object.prototype
};
function checkConstructor(func, name) {
// A constructor is a function with a prototype and properties on the
// prototype object besides "constructor";
if (name.charAt(0) == "$") return;
if (typeof func.prototype != "object") return;
var propNames = Object.getOwnPropertyNames(func.prototype);
if (propNames.length == 0 ||
(propNames.length == 1 && propNames[0] == "constructor")) {
// Not a constructor.
return;
}
var proto_desc = Object.getOwnPropertyDescriptor(func, "prototype");
assertTrue(proto_desc.hasOwnProperty("value"), name);
assertFalse(proto_desc.writable, name);
assertFalse(proto_desc.configurable, name);
var prototype = proto_desc.value;
assertEquals(V8NativePrototypes[name] || null,
Object.getPrototypeOf(prototype),
name);
for (var i = 0; i < propNames.length; i++) {
var propName = propNames[i];
if (propName == "constructor") continue;
if (isV8Native(name)) continue;
var testName = name + "-" + propName;
var propDesc = Object.getOwnPropertyDescriptor(prototype, propName);
assertTrue(propDesc.hasOwnProperty("value"), testName);
assertFalse(propDesc.configurable, testName);
if (isFunction(propDesc.value)) {
assertFalse(propDesc.writable, testName);
}
}
}
for (var i = 0; i < names.length; i++) {
var name = names[i];
var desc = Object.getOwnPropertyDescriptor(builtins, name);
assertTrue(desc.hasOwnProperty("value"));
var value = desc.value;
if (isFunction(value)) {
checkConstructor(value, name);
}
}
// Copyright 2009 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Flags: --expose-natives-as natives
// Test keyed access to deleted property in a global object w/o access checks.
// Regression test that exposed the_hole value from Runtime_KeyedGetProperty.
var name = "fisk";
natives[name] = name;
function foo() { natives[name] + 12; }
for(var i = 0; i < 3; i++) foo();
delete natives[name];
for(var i = 0; i < 3; i++) foo();
...@@ -406,8 +406,8 @@ function TestEquality(type, lanes) { ...@@ -406,8 +406,8 @@ function TestEquality(type, lanes) {
function TestSameValue(type, lanes) { function TestSameValue(type, lanes) {
var simdFn = SIMD[type]; var simdFn = SIMD[type];
var instance = createInstance(type); var instance = createInstance(type);
var sameValue = natives.$sameValue; var sameValue = Object.is
var sameValueZero = natives.$sameValueZero; var sameValueZero = natives.ImportNow("SameValueZero");
// SIMD values should not be the same as instances of different types. // SIMD values should not be the same as instances of different types.
checkTypeMatrix(type, function(other) { checkTypeMatrix(type, function(other) {
......
...@@ -5,8 +5,10 @@ ...@@ -5,8 +5,10 @@
// Flags: --expose-natives-as=builtins // Flags: --expose-natives-as=builtins
// Should not crash or raise an exception. // Should not crash or raise an exception.
var SetIterator = builtins.ImportNow("SetIterator");
var s = new Set(); var s = new Set();
var setIterator = new builtins.SetIterator(s, 2); var setIterator = new SetIterator(s, 2);
var MapIterator = builtins.ImportNow("MapIterator");
var m = new Map(); var m = new Map();
var mapIterator = new builtins.MapIterator(m, 2); var mapIterator = new MapIterator(m, 2);
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
// Flags: --allow-natives-syntax --expose-natives-as=builtins --expose-gc // Flags: --allow-natives-syntax --expose-natives-as=builtins --expose-gc
var SetIterator = builtins.ImportNow("SetIterator");
var MapIterator = builtins.ImportNow("MapIterator");
var __v_7 = []; var __v_7 = [];
var __v_8 = {}; var __v_8 = {};
var __v_10 = {}; var __v_10 = {};
...@@ -21,9 +23,9 @@ assertEquals("good", __f_1()); ...@@ -21,9 +23,9 @@ assertEquals("good", __f_1());
} catch(e) { print("Caught: " + e); } } catch(e) { print("Caught: " + e); }
try { try {
__v_3 = new Set(); __v_3 = new Set();
__v_5 = new builtins.SetIterator(__v_3, -12); __v_5 = new SetIterator(__v_3, -12);
__v_4 = new Map(); __v_4 = new Map();
__v_6 = new builtins.MapIterator(__v_4, 2); __v_6 = new MapIterator(__v_4, 2);
__f_3(Array); __f_3(Array);
} catch(e) { print("Caught: " + e); } } catch(e) { print("Caught: " + e); }
function __f_4(__v_8, filter) { function __f_4(__v_8, filter) {
......
...@@ -32,8 +32,8 @@ ...@@ -32,8 +32,8 @@
var obj1 = {x: 10, y: 11, z: "test"}; var obj1 = {x: 10, y: 11, z: "test"};
var obj2 = {x: 10, y: 11, z: "test"}; var obj2 = {x: 10, y: 11, z: "test"};
var sameValue = natives.$sameValue; var sameValue = Object.is;
var sameValueZero = natives.$sameValueZero; var sameValueZero = natives.ImportNow("SameValueZero");
// Calls SameValue and SameValueZero and checks that their results match. // Calls SameValue and SameValueZero and checks that their results match.
function sameValueBoth(a, b) { function sameValueBoth(a, b) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment