Index: src/factory.cc |
diff --git a/src/factory.cc b/src/factory.cc |
index 38243e77d5bb50db3c48f4eec0b6b1887ca78146..0119896c7f45d079ed43548e66735d8f76f57eed 100644 |
--- a/src/factory.cc |
+++ b/src/factory.cc |
@@ -906,36 +906,6 @@ Handle<Map> Factory::NewMap(InstanceType type, |
} |
-Handle<JSObject> Factory::NewFunctionPrototype(Handle<JSFunction> function) { |
- // Make sure to use globals from the function's context, since the function |
- // can be from a different context. |
- Handle<Context> native_context(function->context()->native_context()); |
- Handle<Map> new_map; |
- if (function->shared()->is_generator()) { |
- // Generator prototypes can share maps since they don't have "constructor" |
- // properties. |
- new_map = handle(native_context->generator_object_prototype_map()); |
- } else { |
- // Each function prototype gets a fresh map to avoid unwanted sharing of |
- // maps between prototypes of different constructors. |
- Handle<JSFunction> object_function(native_context->object_function()); |
- ASSERT(object_function->has_initial_map()); |
- new_map = Map::Copy(handle(object_function->initial_map())); |
- } |
- |
- Handle<JSObject> prototype = NewJSObjectFromMap(new_map); |
- |
- if (!function->shared()->is_generator()) { |
- JSObject::SetLocalPropertyIgnoreAttributes(prototype, |
- constructor_string(), |
- function, |
- DONT_ENUM).Assert(); |
- } |
- |
- return prototype; |
-} |
- |
- |
Handle<JSObject> Factory::CopyJSObject(Handle<JSObject> object) { |
CALL_HEAP_FUNCTION(isolate(), |
isolate()->heap()->CopyJSObject(*object, NULL), |
@@ -994,55 +964,6 @@ Handle<ConstantPoolArray> Factory::CopyConstantPoolArray( |
} |
-Handle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo( |
- Handle<SharedFunctionInfo> info, |
- Handle<Context> context, |
- PretenureFlag pretenure) { |
- Handle<JSFunction> result = NewFunction( |
- info, context, the_hole_value(), pretenure); |
- |
- if (info->ic_age() != isolate()->heap()->global_ic_age()) { |
- info->ResetForNewContext(isolate()->heap()->global_ic_age()); |
- } |
- |
- 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 |
- // context will be used when creating object, regexp and array |
- // literals in this function. |
- literals->set(JSFunction::kLiteralNativeContextIndex, |
- context->native_context()); |
- } |
- result->set_literals(*literals); |
- } |
- |
- if (index > 0) { |
- // Caching of optimized code enabled and optimized code found. |
- FixedArray* literals = info->GetLiteralsFromOptimizedCodeMap(index); |
- if (literals != NULL) result->set_literals(literals); |
- Code* code = info->GetCodeFromOptimizedCodeMap(index); |
- ASSERT(!code->marked_for_deoptimization()); |
- result->ReplaceCode(code); |
- return result; |
- } |
- |
- if (isolate()->use_crankshaft() && |
- FLAG_always_opt && |
- result->is_compiled() && |
- !info->is_toplevel() && |
- info->allows_lazy_compilation() && |
- !info->optimization_disabled() && |
- !isolate()->DebuggerHasBreakPoints()) { |
- result->MarkForOptimization(); |
- } |
- return result; |
-} |
- |
- |
Handle<Object> Factory::NewNumber(double value, |
PretenureFlag pretenure) { |
// We need to distinguish the minus zero value and this cannot be |
@@ -1256,6 +1177,62 @@ Handle<Object> Factory::NewError(const char* constructor, |
} |
+void Factory::InitializeFunction(Handle<JSFunction> function, |
+ Handle<SharedFunctionInfo> info, |
+ Handle<Context> context) { |
+ function->initialize_properties(); |
+ function->initialize_elements(); |
+ function->set_shared(*info); |
+ function->set_code(info->code()); |
+ function->set_context(*context); |
+ function->set_prototype_or_initial_map(*the_hole_value()); |
+ function->set_literals_or_bindings(*empty_fixed_array()); |
+ function->set_next_function_link(*undefined_value()); |
+} |
+ |
+ |
+Handle<JSFunction> Factory::NewFunction(Handle<Map> map, |
+ Handle<SharedFunctionInfo> info, |
+ Handle<Context> context, |
+ PretenureFlag pretenure) { |
+ AllocationSpace space = pretenure == TENURED ? OLD_POINTER_SPACE : NEW_SPACE; |
+ Handle<JSFunction> result = New<JSFunction>(map, space); |
+ InitializeFunction(result, info, context); |
+ return result; |
+} |
+ |
+ |
+Handle<JSFunction> Factory::NewFunction(Handle<String> name, |
+ Handle<Code> code, |
+ MaybeHandle<Object> maybe_prototype) { |
+ Handle<SharedFunctionInfo> info = NewSharedFunctionInfo(name); |
+ ASSERT(info->strict_mode() == SLOPPY); |
+ info->set_code(*code); |
+ Handle<Context> context(isolate()->context()->native_context()); |
+ Handle<Map> map = maybe_prototype.is_null() |
+ ? isolate()->sloppy_function_without_prototype_map() |
+ : isolate()->sloppy_function_map(); |
+ Handle<JSFunction> result = NewFunction(map, info, context); |
+ Handle<Object> prototype; |
+ if (maybe_prototype.ToHandle(&prototype)) { |
+ result->set_prototype_or_initial_map(*prototype); |
+ } |
+ return result; |
+} |
+ |
+ |
+Handle<JSFunction> Factory::NewFunctionWithPrototype(Handle<String> name, |
+ Handle<Object> prototype) { |
+ Handle<SharedFunctionInfo> info = NewSharedFunctionInfo(name); |
+ ASSERT(info->strict_mode() == SLOPPY); |
+ Handle<Context> context(isolate()->context()->native_context()); |
+ Handle<Map> map = isolate()->sloppy_function_map(); |
+ Handle<JSFunction> result = NewFunction(map, info, context); |
+ result->set_prototype_or_initial_map(*prototype); |
+ return result; |
+} |
+ |
+ |
Handle<JSFunction> Factory::NewFunction(MaybeHandle<Object> maybe_prototype, |
Handle<String> name, |
InstanceType type, |
@@ -1326,6 +1303,87 @@ Handle<JSFunction> Factory::NewFunctionWithPrototype(Handle<String> name, |
} |
+Handle<JSObject> Factory::NewFunctionPrototype(Handle<JSFunction> function) { |
+ // Make sure to use globals from the function's context, since the function |
+ // can be from a different context. |
+ Handle<Context> native_context(function->context()->native_context()); |
+ Handle<Map> new_map; |
+ if (function->shared()->is_generator()) { |
+ // Generator prototypes can share maps since they don't have "constructor" |
+ // properties. |
+ new_map = handle(native_context->generator_object_prototype_map()); |
+ } else { |
+ // Each function prototype gets a fresh map to avoid unwanted sharing of |
+ // maps between prototypes of different constructors. |
+ Handle<JSFunction> object_function(native_context->object_function()); |
+ ASSERT(object_function->has_initial_map()); |
+ new_map = Map::Copy(handle(object_function->initial_map())); |
+ } |
+ |
+ Handle<JSObject> prototype = NewJSObjectFromMap(new_map); |
+ |
+ if (!function->shared()->is_generator()) { |
+ JSObject::SetLocalPropertyIgnoreAttributes(prototype, |
+ constructor_string(), |
+ function, |
+ DONT_ENUM).Assert(); |
+ } |
+ |
+ return prototype; |
+} |
+ |
+ |
+Handle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo( |
+ Handle<SharedFunctionInfo> info, |
+ Handle<Context> context, |
+ PretenureFlag pretenure) { |
+ int map_index = Context::FunctionMapIndex(info->strict_mode(), |
+ info->is_generator()); |
+ Handle<Map> map(Map::cast(context->native_context()->get(map_index))); |
+ Handle<JSFunction> result = NewFunction(map, info, context, pretenure); |
+ |
+ if (info->ic_age() != isolate()->heap()->global_ic_age()) { |
+ info->ResetForNewContext(isolate()->heap()->global_ic_age()); |
+ } |
+ |
+ 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 |
+ // context will be used when creating object, regexp and array |
+ // literals in this function. |
+ literals->set(JSFunction::kLiteralNativeContextIndex, |
+ context->native_context()); |
+ } |
+ result->set_literals(*literals); |
+ } |
+ |
+ if (index > 0) { |
+ // Caching of optimized code enabled and optimized code found. |
+ FixedArray* literals = info->GetLiteralsFromOptimizedCodeMap(index); |
+ if (literals != NULL) result->set_literals(literals); |
+ Code* code = info->GetCodeFromOptimizedCodeMap(index); |
+ ASSERT(!code->marked_for_deoptimization()); |
+ result->ReplaceCode(code); |
+ return result; |
+ } |
+ |
+ if (isolate()->use_crankshaft() && |
+ FLAG_always_opt && |
+ result->is_compiled() && |
+ !info->is_toplevel() && |
+ info->allows_lazy_compilation() && |
+ !info->optimization_disabled() && |
+ !isolate()->DebuggerHasBreakPoints()) { |
+ result->MarkForOptimization(); |
+ } |
+ return result; |
+} |
+ |
+ |
Handle<JSObject> Factory::NewIteratorResultObject(Handle<Object> value, |
bool done) { |
Handle<Map> map(isolate()->native_context()->iterator_result_map()); |
@@ -1759,8 +1817,7 @@ void Factory::ReinitializeJSReceiver(Handle<JSReceiver> object, |
map->set_function_with_prototype(true); |
Handle<JSFunction> js_function = Handle<JSFunction>::cast(object); |
Handle<Context> context(isolate()->context()->native_context()); |
- InitializeFunction(js_function, shared.ToHandleChecked(), |
- context, null_value()); |
+ InitializeFunction(js_function, shared.ToHandleChecked(), context); |
} |
// Put in filler if the new object is smaller than the old. |
@@ -1994,73 +2051,6 @@ Handle<String> Factory::NumberToString(Handle<Object> number, |
} |
-void Factory::InitializeFunction(Handle<JSFunction> function, |
- Handle<SharedFunctionInfo> info, |
- Handle<Context> context, |
- MaybeHandle<Object> maybe_prototype) { |
- function->initialize_properties(); |
- function->initialize_elements(); |
- 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_literals_or_bindings(*empty_fixed_array()); |
- function->set_next_function_link(*undefined_value()); |
-} |
- |
- |
-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<Code> code, |
- MaybeHandle<Object> maybe_prototype) { |
- Handle<SharedFunctionInfo> info = NewSharedFunctionInfo(name); |
- info->set_code(*code); |
- Handle<Context> context(isolate()->context()->native_context()); |
- return NewFunction(info, context, maybe_prototype); |
-} |
- |
- |
-Handle<JSFunction> Factory::NewFunctionWithPrototype(Handle<String> name, |
- Handle<Object> prototype) { |
- Handle<SharedFunctionInfo> info = NewSharedFunctionInfo(name); |
- Handle<Context> context(isolate()->context()->native_context()); |
- return NewFunction(info, context, prototype); |
-} |
- |
- |
Handle<DebugInfo> Factory::NewDebugInfo(Handle<SharedFunctionInfo> shared) { |
// Get the original code of the function. |
Handle<Code> code(shared->code()); |