| Index: src/compiler/ast-graph-builder.cc
|
| diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc
|
| index 3ae5aa4079d78dee54465565f1da2bd2fbf09c64..53c548e8c41f6b62fcbc78cd686ae203fec5b6d1 100644
|
| --- a/src/compiler/ast-graph-builder.cc
|
| +++ b/src/compiler/ast-graph-builder.cc
|
| @@ -172,9 +172,9 @@ AstGraphBuilder::Environment::Environment(AstGraphBuilder* builder,
|
| parameters_node_(NULL),
|
| locals_node_(NULL),
|
| stack_node_(NULL),
|
| - parameters_dirty_(false),
|
| - locals_dirty_(false),
|
| - stack_dirty_(false) {
|
| + parameters_dirty_(true),
|
| + locals_dirty_(true),
|
| + stack_dirty_(true) {
|
| DCHECK_EQ(scope->num_parameters() + 1, parameters_count());
|
|
|
| // Bind the receiver variable.
|
| @@ -210,22 +210,40 @@ AstGraphBuilder::Environment::Environment(const Environment& copy)
|
|
|
|
|
| Node* AstGraphBuilder::Environment::Checkpoint(BailoutId ast_id) {
|
| - UNIMPLEMENTED(); // TODO(mstarzinger): Implementation below is incomplete.
|
| if (parameters_dirty_) {
|
| - Node** parameters = &values()->front();
|
| - parameters_node_ = graph()->NewNode(NULL, parameters_count(), parameters);
|
| + Operator* op = common()->StateValues(parameters_count());
|
| + if (parameters_count() != 0) {
|
| + Node** parameters = &values()->front();
|
| + parameters_node_ = graph()->NewNode(op, parameters_count(), parameters);
|
| + } else {
|
| + parameters_node_ = graph()->NewNode(op);
|
| + }
|
| parameters_dirty_ = false;
|
| }
|
| if (locals_dirty_) {
|
| - Node** locals = &values()->at(parameters_count_);
|
| - locals_node_ = graph()->NewNode(NULL, locals_count(), locals);
|
| + Operator* op = common()->StateValues(locals_count());
|
| + if (locals_count() != 0) {
|
| + Node** locals = &values()->at(parameters_count_);
|
| + locals_node_ = graph()->NewNode(op, locals_count(), locals);
|
| + } else {
|
| + locals_node_ = graph()->NewNode(op);
|
| + }
|
| locals_dirty_ = false;
|
| }
|
| - FrameStateDescriptor descriptor(ast_id);
|
| - // TODO(jarin): add environment to the node.
|
| - Operator* op = common()->FrameState(descriptor);
|
| + if (stack_dirty_) {
|
| + Operator* op = common()->StateValues(stack_height());
|
| + if (stack_height() != 0) {
|
| + Node** stack = &values()->at(parameters_count_ + locals_count_);
|
| + stack_node_ = graph()->NewNode(op, stack_height(), stack);
|
| + } else {
|
| + stack_node_ = graph()->NewNode(op);
|
| + }
|
| + stack_dirty_ = false;
|
| + }
|
| +
|
| + Operator* op = common()->FrameState(ast_id);
|
|
|
| - return graph()->NewNode(op);
|
| + return graph()->NewNode(op, parameters_node_, locals_node_, stack_node_);
|
| }
|
|
|
|
|
| @@ -1963,8 +1981,7 @@ void AstGraphBuilder::BuildLazyBailout(Node* node, BailoutId ast_id) {
|
|
|
| NewNode(common()->LazyDeoptimization());
|
|
|
| - FrameStateDescriptor stateDescriptor(ast_id);
|
| - Node* state_node = NewNode(common()->FrameState(stateDescriptor));
|
| + Node* state_node = environment()->Checkpoint(ast_id);
|
|
|
| Node* deoptimize_node = NewNode(common()->Deoptimize(), state_node);
|
|
|
|
|