Index: src/bootstrapper.cc |
diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc |
index 4bb0f4d0475ea21f6fb4a9cb0b611811800e068b..7dd6cfd8a25a47df2fb3d81b025a5ec6eba1a80c 100644 |
--- a/src/bootstrapper.cc |
+++ b/src/bootstrapper.cc |
@@ -350,22 +350,16 @@ static Handle<JSFunction> InstallFunction(Handle<JSObject> target, |
const char* name, |
InstanceType type, |
int instance_size, |
- Handle<JSObject> prototype, |
+ MaybeHandle<JSObject> maybe_prototype, |
Builtins::Name call, |
- bool install_initial_map, |
bool set_instance_class_name) { |
Isolate* isolate = target->GetIsolate(); |
Factory* factory = isolate->factory(); |
Handle<String> internalized_name = factory->InternalizeUtf8String(name); |
Handle<Code> call_code = Handle<Code>(isolate->builtins()->builtin(call)); |
- Handle<JSFunction> function = prototype.is_null() |
- ? factory->NewFunction(internalized_name, call_code) |
- : factory->NewFunctionWithPrototype(internalized_name, |
- type, |
- instance_size, |
- prototype, |
- call_code, |
- install_initial_map); |
+ Handle<JSFunction> function = factory->NewFunction( |
+ maybe_prototype, internalized_name, type, instance_size, call_code, |
+ !maybe_prototype.is_null()); |
PropertyAttributes attributes; |
if (target->IsJSBuiltinsObject()) { |
attributes = |
@@ -845,13 +839,13 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, |
// Install global Function object |
InstallFunction(global, "Function", JS_FUNCTION_TYPE, JSFunction::kSize, |
- empty_function, Builtins::kIllegal, true, true); |
+ empty_function, Builtins::kIllegal, true); |
{ // --- A r r a y --- |
Handle<JSFunction> array_function = |
InstallFunction(global, "Array", JS_ARRAY_TYPE, JSArray::kSize, |
isolate->initial_object_prototype(), |
- Builtins::kArrayCode, true, true); |
+ Builtins::kArrayCode, true); |
array_function->shared()->DontAdaptArguments(); |
array_function->shared()->set_function_data(Smi::FromInt(kArrayCode)); |
@@ -895,7 +889,7 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, |
Handle<JSFunction> number_fun = |
InstallFunction(global, "Number", JS_VALUE_TYPE, JSValue::kSize, |
isolate->initial_object_prototype(), |
- Builtins::kIllegal, true, true); |
+ Builtins::kIllegal, true); |
native_context()->set_number_function(*number_fun); |
} |
@@ -903,7 +897,7 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, |
Handle<JSFunction> boolean_fun = |
InstallFunction(global, "Boolean", JS_VALUE_TYPE, JSValue::kSize, |
isolate->initial_object_prototype(), |
- Builtins::kIllegal, true, true); |
+ Builtins::kIllegal, true); |
native_context()->set_boolean_function(*boolean_fun); |
} |
@@ -911,7 +905,7 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, |
Handle<JSFunction> string_fun = |
InstallFunction(global, "String", JS_VALUE_TYPE, JSValue::kSize, |
isolate->initial_object_prototype(), |
- Builtins::kIllegal, true, true); |
+ Builtins::kIllegal, true); |
string_fun->shared()->set_construct_stub( |
isolate->builtins()->builtin(Builtins::kStringConstructCode)); |
native_context()->set_string_function(*string_fun); |
@@ -936,7 +930,7 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, |
Handle<JSFunction> date_fun = |
InstallFunction(global, "Date", JS_DATE_TYPE, JSDate::kSize, |
isolate->initial_object_prototype(), |
- Builtins::kIllegal, true, true); |
+ Builtins::kIllegal, true); |
native_context()->set_date_function(*date_fun); |
} |
@@ -947,7 +941,7 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, |
Handle<JSFunction> regexp_fun = |
InstallFunction(global, "RegExp", JS_REGEXP_TYPE, JSRegExp::kSize, |
isolate->initial_object_prototype(), |
- Builtins::kIllegal, true, true); |
+ Builtins::kIllegal, true); |
native_context()->set_regexp_function(*regexp_fun); |
ASSERT(regexp_fun->has_initial_map()); |
@@ -1050,7 +1044,7 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, |
global, "ArrayBuffer", JS_ARRAY_BUFFER_TYPE, |
JSArrayBuffer::kSizeWithInternalFields, |
isolate->initial_object_prototype(), |
- Builtins::kIllegal, true, true); |
+ Builtins::kIllegal, true); |
native_context()->set_array_buffer_fun(*array_buffer_fun); |
} |
@@ -1074,7 +1068,7 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, |
global, "DataView", JS_DATA_VIEW_TYPE, |
JSDataView::kSizeWithInternalFields, |
isolate->initial_object_prototype(), |
- Builtins::kIllegal, true, true); |
+ Builtins::kIllegal, true); |
native_context()->set_data_view_fun(*data_view_fun); |
} |
@@ -1085,19 +1079,15 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, |
Handle<String> arguments_string = factory->InternalizeOneByteString( |
STATIC_ASCII_VECTOR("Arguments")); |
Handle<Code> code(isolate->builtins()->builtin(Builtins::kIllegal)); |
- Handle<JSObject> prototype( |
- JSObject::cast(native_context()->object_function()->prototype())); |
- Handle<JSFunction> function = |
- factory->NewFunctionWithPrototype(arguments_string, |
- JS_OBJECT_TYPE, |
- JSObject::kHeaderSize, |
- prototype, |
- code, |
- false); |
+ Handle<JSFunction> function = factory->NewFunction( |
+ MaybeHandle<Object>(), arguments_string, JS_OBJECT_TYPE, |
+ JSObject::kHeaderSize, code, false); |
ASSERT(!function->has_initial_map()); |
function->shared()->set_instance_class_name(*arguments_string); |
function->shared()->set_expected_nof_properties(2); |
+ function->set_prototype_or_initial_map( |
+ native_context()->object_function()->prototype()); |
Handle<JSObject> result = factory->NewJSObject(function); |
native_context()->set_sloppy_arguments_boilerplate(*result); |
@@ -1283,7 +1273,7 @@ void Genesis::InstallTypedArray( |
Handle<JSObject> global = Handle<JSObject>(native_context()->global_object()); |
Handle<JSFunction> result = InstallFunction(global, name, JS_TYPED_ARRAY_TYPE, |
JSTypedArray::kSize, isolate()->initial_object_prototype(), |
- Builtins::kIllegal, false, true); |
+ Builtins::kIllegal, true); |
Handle<Map> initial_map = isolate()->factory()->NewMap( |
JS_TYPED_ARRAY_TYPE, |
@@ -1309,21 +1299,19 @@ void Genesis::InitializeExperimentalGlobal() { |
Handle<JSFunction> symbol_fun = |
InstallFunction(global, "Symbol", JS_VALUE_TYPE, JSValue::kSize, |
isolate()->initial_object_prototype(), |
- Builtins::kIllegal, true, true); |
+ Builtins::kIllegal, true); |
native_context()->set_symbol_function(*symbol_fun); |
} |
if (FLAG_harmony_collections) { |
- { // -- M a p |
- InstallFunction(global, "Map", JS_MAP_TYPE, JSMap::kSize, |
- isolate()->initial_object_prototype(), |
- Builtins::kIllegal, true, true); |
- } |
- { // -- S e t |
- InstallFunction(global, "Set", JS_SET_TYPE, JSSet::kSize, |
- isolate()->initial_object_prototype(), |
- Builtins::kIllegal, true, true); |
- } |
+ // -- M a p |
+ InstallFunction(global, "Map", JS_MAP_TYPE, JSMap::kSize, |
+ isolate()->initial_object_prototype(), |
+ Builtins::kIllegal, true); |
+ // -- S e t |
+ InstallFunction(global, "Set", JS_SET_TYPE, JSSet::kSize, |
+ isolate()->initial_object_prototype(), |
+ Builtins::kIllegal, true); |
{ // -- S e t I t e r a t o r |
Handle<Map> map = isolate()->factory()->NewMap( |
JS_SET_ITERATOR_TYPE, JSSetIterator::kSize); |
@@ -1337,16 +1325,14 @@ void Genesis::InitializeExperimentalGlobal() { |
} |
if (FLAG_harmony_weak_collections) { |
- { // -- W e a k M a p |
- InstallFunction(global, "WeakMap", JS_WEAK_MAP_TYPE, JSWeakMap::kSize, |
- isolate()->initial_object_prototype(), |
- Builtins::kIllegal, true, true); |
- } |
- { // -- W e a k S e t |
- InstallFunction(global, "WeakSet", JS_WEAK_SET_TYPE, JSWeakSet::kSize, |
- isolate()->initial_object_prototype(), |
- Builtins::kIllegal, true, true); |
- } |
+ // -- W e a k M a p |
+ InstallFunction(global, "WeakMap", JS_WEAK_MAP_TYPE, JSWeakMap::kSize, |
+ isolate()->initial_object_prototype(), |
+ Builtins::kIllegal, true); |
+ // -- W e a k S e t |
+ InstallFunction(global, "WeakSet", JS_WEAK_SET_TYPE, JSWeakSet::kSize, |
+ isolate()->initial_object_prototype(), |
+ Builtins::kIllegal, true); |
} |
if (FLAG_harmony_generators) { |
@@ -1357,12 +1343,10 @@ void Genesis::InitializeExperimentalGlobal() { |
Handle<JSFunction> generator_function_prototype = |
InstallFunction(builtins, "GeneratorFunctionPrototype", |
JS_FUNCTION_TYPE, JSFunction::kHeaderSize, |
- generator_object_prototype, Builtins::kIllegal, |
- false, false); |
+ generator_object_prototype, Builtins::kIllegal, false); |
InstallFunction(builtins, "GeneratorFunction", |
JS_FUNCTION_TYPE, JSFunction::kSize, |
- generator_function_prototype, Builtins::kIllegal, |
- false, false); |
+ generator_function_prototype, Builtins::kIllegal, false); |
// Create maps for generator functions and their prototypes. Store those |
// maps in the native context. |
@@ -1600,14 +1584,10 @@ Handle<JSFunction> Genesis::InstallInternalArray( |
// doesn't inherit from Object.prototype. |
// To be used only for internal work by builtins. Instances |
// must not be leaked to user code. |
- Handle<JSFunction> array_function = |
- InstallFunction(builtins, |
- name, |
- JS_ARRAY_TYPE, |
- JSArray::kSize, |
- isolate()->initial_object_prototype(), |
- Builtins::kInternalArrayCode, |
- true, true); |
+ Handle<JSFunction> array_function = InstallFunction( |
+ builtins, name, JS_ARRAY_TYPE, JSArray::kSize, |
+ isolate()->initial_object_prototype(), Builtins::kInternalArrayCode, |
+ true); |
Handle<JSObject> prototype = |
factory()->NewJSObject(isolate()->object_function(), TENURED); |
Accessors::FunctionSetPrototype(array_function, prototype); |
@@ -1703,10 +1683,9 @@ bool Genesis::InstallNatives() { |
{ // -- S c r i p t |
// Builtin functions for Script. |
- Handle<JSFunction> script_fun = |
- InstallFunction(builtins, "Script", JS_VALUE_TYPE, JSValue::kSize, |
- isolate()->initial_object_prototype(), |
- Builtins::kIllegal, false, false); |
+ Handle<JSFunction> script_fun = InstallFunction( |
+ builtins, "Script", JS_VALUE_TYPE, JSValue::kSize, |
+ isolate()->initial_object_prototype(), Builtins::kIllegal, false); |
Handle<JSObject> prototype = |
factory()->NewJSObject(isolate()->object_function(), TENURED); |
Accessors::FunctionSetPrototype(script_fun, prototype); |
@@ -1829,11 +1808,9 @@ bool Genesis::InstallNatives() { |
// Builtin function for OpaqueReference -- a JSValue-based object, |
// that keeps its field isolated from JavaScript code. It may store |
// objects, that JavaScript code may not access. |
- Handle<JSFunction> opaque_reference_fun = |
- InstallFunction(builtins, "OpaqueReference", JS_VALUE_TYPE, |
- JSValue::kSize, |
- isolate()->initial_object_prototype(), |
- Builtins::kIllegal, false, false); |
+ Handle<JSFunction> opaque_reference_fun = InstallFunction( |
+ builtins, "OpaqueReference", JS_VALUE_TYPE, JSValue::kSize, |
+ isolate()->initial_object_prototype(), Builtins::kIllegal, false); |
Handle<JSObject> prototype = |
factory()->NewJSObject(isolate()->object_function(), TENURED); |
Accessors::FunctionSetPrototype(opaque_reference_fun, prototype); |
@@ -1892,14 +1869,12 @@ bool Genesis::InstallNatives() { |
// Install the call and the apply functions. |
Handle<JSFunction> call = |
InstallFunction(proto, "call", JS_OBJECT_TYPE, JSObject::kHeaderSize, |
- Handle<JSObject>::null(), |
- Builtins::kFunctionCall, |
- false, false); |
+ MaybeHandle<JSObject>(), |
+ Builtins::kFunctionCall, false); |
Handle<JSFunction> apply = |
InstallFunction(proto, "apply", JS_OBJECT_TYPE, JSObject::kHeaderSize, |
- Handle<JSObject>::null(), |
- Builtins::kFunctionApply, |
- false, false); |
+ MaybeHandle<JSObject>(), |
+ Builtins::kFunctionApply, false); |
// Make sure that Function.prototype.call appears to be compiled. |
// The code will never be called, but inline caching for call will |