| Index: src/compiler/js-create-lowering.cc
|
| diff --git a/src/compiler/js-create-lowering.cc b/src/compiler/js-create-lowering.cc
|
| index 6d383caac0ba7e209cce1fb4ba6702141ec56cf2..57eedfada202a67abea11df572acaa6e5e6cb977 100644
|
| --- a/src/compiler/js-create-lowering.cc
|
| +++ b/src/compiler/js-create-lowering.cc
|
| @@ -228,6 +228,8 @@ Reduction JSCreateLowering::Reduce(Node* node) {
|
| return ReduceJSCreateCatchContext(node);
|
| case IrOpcode::kJSCreateBlockContext:
|
| return ReduceJSCreateBlockContext(node);
|
| + case IrOpcode::kJSCreateGeneratorObject:
|
| + return ReduceJSCreateGeneratorObject(node);
|
| default:
|
| break;
|
| }
|
| @@ -548,6 +550,71 @@ Reduction JSCreateLowering::ReduceJSCreateArguments(Node* node) {
|
| return NoChange();
|
| }
|
|
|
| +Reduction JSCreateLowering::ReduceJSCreateGeneratorObject(Node* node) {
|
| + DCHECK_EQ(IrOpcode::kJSCreateGeneratorObject, node->opcode());
|
| + Node* const closure = NodeProperties::GetValueInput(node, 0);
|
| + Node* const receiver = NodeProperties::GetValueInput(node, 1);
|
| + Node* const context = NodeProperties::GetContextInput(node);
|
| + Type* const closure_type = NodeProperties::GetType(closure);
|
| + Node* effect = NodeProperties::GetEffectInput(node);
|
| + Node* const control = NodeProperties::GetControlInput(node);
|
| + // Extract constructor and original constructor function.
|
| + if (closure_type->IsHeapConstant()) {
|
| + DCHECK(closure_type->AsHeapConstant()->Value()->IsJSFunction());
|
| + Handle<JSFunction> js_function =
|
| + Handle<JSFunction>::cast(closure_type->AsHeapConstant()->Value());
|
| + JSFunction::EnsureHasInitialMap(js_function);
|
| + Handle<Map> initial_map(js_function->initial_map());
|
| + initial_map->CompleteInobjectSlackTracking();
|
| + DCHECK(initial_map->instance_type() == JS_GENERATOR_OBJECT_TYPE ||
|
| + initial_map->instance_type() == JS_ASYNC_GENERATOR_OBJECT_TYPE);
|
| +
|
| + // Add a dependency on the {initial_map} to make sure that this code is
|
| + // deoptimized whenever the {initial_map} of the {original_constructor}
|
| + // changes.
|
| + dependencies()->AssumeInitialMapCantChange(initial_map);
|
| +
|
| + DCHECK(js_function->shared()->HasBytecodeArray());
|
| + int size = js_function->shared()->bytecode_array()->register_count();
|
| + Node* elements = effect = AllocateElements(
|
| + effect, control, FAST_HOLEY_ELEMENTS, size, NOT_TENURED);
|
| +
|
| + AllocationBuilder a(jsgraph(), effect, control);
|
| + a.Allocate(initial_map->instance_size());
|
| + Node* empty_fixed_array = jsgraph()->EmptyFixedArrayConstant();
|
| + Node* undefined = jsgraph()->UndefinedConstant();
|
| + a.Store(AccessBuilder::ForMap(), initial_map);
|
| + a.Store(AccessBuilder::ForJSObjectProperties(), empty_fixed_array);
|
| + a.Store(AccessBuilder::ForJSObjectElements(), empty_fixed_array);
|
| + a.Store(AccessBuilder::ForJSGeneratorObjectContext(), context);
|
| + a.Store(AccessBuilder::ForJSGeneratorObjectFunction(), closure);
|
| + a.Store(AccessBuilder::ForJSGeneratorObjectReceiver(), receiver);
|
| + a.Store(AccessBuilder::ForJSGeneratorObjectInputOrDebugPos(), undefined);
|
| + a.Store(AccessBuilder::ForJSGeneratorObjectResumeMode(),
|
| + jsgraph()->Constant(JSGeneratorObject::kNext));
|
| + a.Store(AccessBuilder::ForJSGeneratorObjectContinuation(),
|
| + jsgraph()->Constant(JSGeneratorObject::kGeneratorExecuting));
|
| + a.Store(AccessBuilder::ForJSGeneratorObjectRegisterFile(), elements);
|
| +
|
| + if (initial_map->instance_type() == JS_ASYNC_GENERATOR_OBJECT_TYPE) {
|
| + a.Store(AccessBuilder::ForJSAsyncGeneratorObjectQueue(), undefined);
|
| + a.Store(AccessBuilder::ForJSAsyncGeneratorObjectAwaitInputOrDebugPos(),
|
| + undefined);
|
| + a.Store(AccessBuilder::ForJSAsyncGeneratorObjectAwaitedPromise(),
|
| + undefined);
|
| + }
|
| +
|
| + // Handle in-object properties, too.
|
| + for (int i = 0; i < initial_map->GetInObjectProperties(); ++i) {
|
| + a.Store(AccessBuilder::ForJSObjectInObjectProperty(initial_map, i),
|
| + undefined);
|
| + }
|
| + a.FinishAndChange(node);
|
| + return Changed(node);
|
| + }
|
| + return NoChange();
|
| +}
|
| +
|
| Reduction JSCreateLowering::ReduceNewArray(Node* node, Node* length,
|
| int capacity,
|
| Handle<AllocationSite> site) {
|
|
|