Index: src/factory.cc |
diff --git a/src/factory.cc b/src/factory.cc |
index 879b9b74ef1e1e85f63880c4038275752b6f42d5..5e11b8d97d85cf8188bbc3b39e5a09e02fa13701 100644 |
--- a/src/factory.cc |
+++ b/src/factory.cc |
@@ -975,35 +975,21 @@ Handle<ConstantPoolArray> Factory::CopyConstantPoolArray( |
} |
-static Handle<Map> MapForNewFunction(Isolate *isolate, |
- Handle<SharedFunctionInfo> function_info) { |
- Context *context = isolate->context()->native_context(); |
- int map_index = Context::FunctionMapIndex(function_info->strict_mode(), |
- function_info->is_generator()); |
- return Handle<Map>(Map::cast(context->get(map_index))); |
-} |
- |
- |
Handle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo( |
- Handle<SharedFunctionInfo> function_info, |
+ Handle<SharedFunctionInfo> info, |
Handle<Context> context, |
PretenureFlag pretenure) { |
- Handle<JSFunction> result = NewFunctionHelper( |
- MapForNewFunction(isolate(), function_info), |
- function_info, |
- the_hole_value(), |
- pretenure); |
+ Handle<JSFunction> result = NewFunction( |
+ info, context, the_hole_value(), pretenure); |
- if (function_info->ic_age() != isolate()->heap()->global_ic_age()) { |
- function_info->ResetForNewContext(isolate()->heap()->global_ic_age()); |
+ if (info->ic_age() != isolate()->heap()->global_ic_age()) { |
+ info->ResetForNewContext(isolate()->heap()->global_ic_age()); |
} |
- result->set_context(*context); |
- |
- int index = function_info->SearchOptimizedCodeMap(context->native_context(), |
- BailoutId::None()); |
- if (!function_info->bound() && index < 0) { |
- int number_of_literals = function_info->num_literals(); |
+ int index = info->SearchOptimizedCodeMap(context->native_context(), |
+ BailoutId::None()); |
+ if (!info->bound() && index < 0) { |
+ int number_of_literals = info->num_literals(); |
Handle<FixedArray> literals = NewFixedArray(number_of_literals, pretenure); |
if (number_of_literals > 0) { |
// Store the native context in the literals array prefix. This |
@@ -1017,10 +1003,9 @@ Handle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo( |
if (index > 0) { |
// Caching of optimized code enabled and optimized code found. |
- FixedArray* literals = |
- function_info->GetLiteralsFromOptimizedCodeMap(index); |
+ FixedArray* literals = info->GetLiteralsFromOptimizedCodeMap(index); |
if (literals != NULL) result->set_literals(literals); |
- Code* code = function_info->GetCodeFromOptimizedCodeMap(index); |
+ Code* code = info->GetCodeFromOptimizedCodeMap(index); |
ASSERT(!code->marked_for_deoptimization()); |
result->ReplaceCode(code); |
return result; |
@@ -1029,9 +1014,9 @@ Handle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo( |
if (isolate()->use_crankshaft() && |
FLAG_always_opt && |
result->is_compiled() && |
- !function_info->is_toplevel() && |
- function_info->allows_lazy_compilation() && |
- !function_info->optimization_disabled() && |
+ !info->is_toplevel() && |
+ info->allows_lazy_compilation() && |
+ !info->optimization_disabled() && |
!isolate()->DebuggerHasBreakPoints()) { |
result->MarkForOptimization(); |
} |
@@ -1752,8 +1737,9 @@ void Factory::ReinitializeJSReceiver(Handle<JSReceiver> object, |
if (type == JS_FUNCTION_TYPE) { |
map->set_function_with_prototype(true); |
Handle<JSFunction> js_function = Handle<JSFunction>::cast(object); |
- InitializeFunction(js_function, shared.ToHandleChecked(), the_hole_value()); |
- js_function->set_context(isolate()->context()->native_context()); |
+ Handle<Context> context(isolate()->context()->native_context()); |
+ InitializeFunction(js_function, shared.ToHandleChecked(), |
+ context, null_value()); |
} |
// Put in filler if the new object is smaller than the old. |
@@ -1983,52 +1969,68 @@ Handle<UnseededNumberDictionary> Factory::DictionaryAtNumberPut( |
void Factory::InitializeFunction(Handle<JSFunction> function, |
- Handle<SharedFunctionInfo> shared, |
- Handle<Object> prototype) { |
- ASSERT(!prototype->IsMap()); |
+ Handle<SharedFunctionInfo> info, |
+ Handle<Context> context, |
+ MaybeHandle<Object> maybe_prototype) { |
function->initialize_properties(); |
function->initialize_elements(); |
- function->set_shared(*shared); |
- function->set_code(shared->code()); |
+ function->set_shared(*info); |
+ function->set_code(info->code()); |
+ function->set_context(*context); |
+ Handle<Object> prototype; |
+ if (maybe_prototype.ToHandle(&prototype)) { |
+ ASSERT(!prototype->IsMap()); |
+ } else { |
+ prototype = the_hole_value(); |
+ } |
function->set_prototype_or_initial_map(*prototype); |
- function->set_context(*undefined_value()); |
function->set_literals_or_bindings(*empty_fixed_array()); |
function->set_next_function_link(*undefined_value()); |
} |
-Handle<JSFunction> Factory::NewFunctionHelper(Handle<Map> function_map, |
- Handle<SharedFunctionInfo> shared, |
- Handle<Object> prototype, |
- PretenureFlag pretenure) { |
- AllocationSpace space = |
- (pretenure == TENURED) ? OLD_POINTER_SPACE : NEW_SPACE; |
- Handle<JSFunction> fun = New<JSFunction>(function_map, space); |
- InitializeFunction(fun, shared, prototype); |
- return fun; |
+static Handle<Map> MapForNewFunction(Isolate* isolate, |
+ Handle<SharedFunctionInfo> function_info, |
+ MaybeHandle<Object> maybe_prototype) { |
+ if (maybe_prototype.is_null()) { |
+ return function_info->strict_mode() == SLOPPY |
+ ? isolate->sloppy_function_without_prototype_map() |
+ : isolate->strict_function_without_prototype_map(); |
+ } |
+ |
+ Context* context = isolate->context()->native_context(); |
+ int map_index = Context::FunctionMapIndex(function_info->strict_mode(), |
+ function_info->is_generator()); |
+ return Handle<Map>(Map::cast(context->get(map_index))); |
+} |
+ |
+ |
+Handle<JSFunction> Factory::NewFunction(Handle<SharedFunctionInfo> info, |
+ Handle<Context> context, |
+ MaybeHandle<Object> maybe_prototype, |
+ PretenureFlag pretenure) { |
+ Handle<Map> map = MapForNewFunction(isolate(), info, maybe_prototype); |
+ AllocationSpace space = pretenure == TENURED ? OLD_POINTER_SPACE : NEW_SPACE; |
+ Handle<JSFunction> result = New<JSFunction>(map, space); |
+ InitializeFunction(result, info, context, maybe_prototype); |
+ return result; |
} |
Handle<JSFunction> Factory::NewFunction(Handle<String> name, |
Handle<Object> prototype) { |
- Handle<SharedFunctionInfo> function_share = NewSharedFunctionInfo(name); |
- Handle<JSFunction> fun = NewFunctionHelper( |
- isolate()->sloppy_function_map(), function_share, prototype); |
- fun->set_context(isolate()->context()->native_context()); |
- return fun; |
+ Handle<SharedFunctionInfo> info = NewSharedFunctionInfo(name); |
+ Handle<Context> context(isolate()->context()->native_context()); |
+ return NewFunction(info, context, prototype); |
} |
Handle<JSFunction> Factory::NewFunctionWithoutPrototype( |
Handle<String> name, |
StrictMode strict_mode) { |
- Handle<SharedFunctionInfo> function_share = NewSharedFunctionInfo(name); |
- Handle<Map> map = strict_mode == SLOPPY |
- ? isolate()->sloppy_function_without_prototype_map() |
- : isolate()->strict_function_without_prototype_map(); |
- Handle<JSFunction> fun = |
- NewFunctionHelper(map, function_share, the_hole_value()); |
- fun->set_context(isolate()->context()->native_context()); |
+ Handle<SharedFunctionInfo> info = NewSharedFunctionInfo(name); |
+ Handle<Context> context(isolate()->context()->native_context()); |
+ Handle<JSFunction> fun = NewFunction(info, context, MaybeHandle<Object>()); |
return fun; |
} |
@@ -2111,12 +2113,8 @@ Handle<JSFunction> Factory::CreateApiFunction( |
break; |
} |
- Handle<JSFunction> result = |
- NewFunction(Factory::empty_string(), |
- type, |
- instance_size, |
- code, |
- true); |
+ Handle<JSFunction> result = NewFunction( |
+ Factory::empty_string(), type, instance_size, code, true); |
// Set length. |
result->shared()->set_length(obj->length()); |