Chromium Code Reviews| Index: src/factory.cc |
| diff --git a/src/factory.cc b/src/factory.cc |
| index fece9a09c91779c6f360d842a7c2b3b9a7a51791..a2e91e64a5acfd3dc90469963aa195411bdc2ee8 100644 |
| --- a/src/factory.cc |
| +++ b/src/factory.cc |
| @@ -578,15 +578,31 @@ Handle<JSFunction> Factory::BaseNewFunctionFromSharedFunctionInfo( |
| } |
| +static Handle<Map> MapForNewFunction(Isolate *isolate, |
| + Handle<SharedFunctionInfo> function_info) { |
| + if (function_info->is_generator()) { |
| + if (function_info->is_classic_mode()) { |
| + return isolate->generator_function_map(); |
| + } else { |
| + return isolate->strict_mode_generator_function_map(); |
| + } |
| + } else { |
| + if (function_info->is_classic_mode()) { |
| + return isolate->function_map(); |
| + } else { |
| + return isolate->strict_mode_function_map(); |
| + } |
| + } |
| +} |
| + |
| + |
| Handle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo( |
| Handle<SharedFunctionInfo> function_info, |
| Handle<Context> context, |
| PretenureFlag pretenure) { |
| Handle<JSFunction> result = BaseNewFunctionFromSharedFunctionInfo( |
| function_info, |
| - function_info->is_classic_mode() |
| - ? isolate()->function_map() |
| - : isolate()->strict_mode_function_map(), |
| + MapForNewFunction(isolate(), function_info), |
| pretenure); |
| if (function_info->ic_age() != isolate()->heap()->global_ic_age()) { |
| @@ -595,6 +611,16 @@ Handle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo( |
| result->set_context(*context); |
| + if (function_info->is_generator()) { |
| + // Generator functions have specialized prototypes and instance types, so |
| + // they need their prototypes to be created eagerly. |
|
rossberg
2013/04/09 16:44:14
I don't understand. Why can't you make the case di
|
| + // TODO(wingo): Use JS_GENERATOR_TYPE. |
| + Handle<Map> instance_map = NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
| + Handle<JSObject> iterator_prototype = NewFunctionPrototype(result); |
| + instance_map->set_prototype(*iterator_prototype); |
| + result->set_initial_map(*instance_map); |
| + } |
| + |
| int index = function_info->SearchOptimizedCodeMap(context->native_context()); |
| if (!function_info->bound() && index < 0) { |
| int number_of_literals = function_info->num_literals(); |