| Index: src/compiler/bytecode-graph-builder.cc
|
| diff --git a/src/compiler/bytecode-graph-builder.cc b/src/compiler/bytecode-graph-builder.cc
|
| index 03789b343904a2e9d72c708e3e767dc34e1a79f2..d53a9953dd46774faf1f78bf9111b731af93e98e 100644
|
| --- a/src/compiler/bytecode-graph-builder.cc
|
| +++ b/src/compiler/bytecode-graph-builder.cc
|
| @@ -7,6 +7,7 @@
|
| #include "src/compiler/linkage.h"
|
| #include "src/compiler/operator-properties.h"
|
| #include "src/interpreter/bytecode-array-iterator.h"
|
| +#include "src/interpreter/bytecodes.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
| @@ -73,8 +74,16 @@ void BytecodeGraphBuilder::Environment::BindRegister(
|
|
|
| Node* BytecodeGraphBuilder::Environment::LookupRegister(
|
| interpreter::Register the_register) const {
|
| - int values_index = RegisterToValuesIndex(the_register);
|
| - return values()->at(values_index);
|
| + if (the_register.is_function_context()) {
|
| + return builder()->GetFunctionContext();
|
| + } else if (the_register.is_function_closure()) {
|
| + return builder()->GetFunctionClosure();
|
| + } else if (the_register.is_new_target()) {
|
| + return builder()->GetNewTarget();
|
| + } else {
|
| + int values_index = RegisterToValuesIndex(the_register);
|
| + return values()->at(values_index);
|
| + }
|
| }
|
|
|
|
|
| @@ -111,6 +120,18 @@ BytecodeGraphBuilder::BytecodeGraphBuilder(Zone* local_zone,
|
| }
|
|
|
|
|
| +Node* BytecodeGraphBuilder::GetNewTarget() {
|
| + if (!new_target_.is_set()) {
|
| + int params = bytecode_array()->parameter_count();
|
| + int index = Linkage::GetJSCallNewTargetParamIndex(params);
|
| + const Operator* op = common()->Parameter(index, "%new.target");
|
| + Node* node = NewNode(op, graph()->start());
|
| + new_target_.set(node);
|
| + }
|
| + return new_target_.get();
|
| +}
|
| +
|
| +
|
| Node* BytecodeGraphBuilder::GetFunctionContext() {
|
| if (!function_context_.is_set()) {
|
| int params = bytecode_array()->parameter_count();
|
| @@ -204,13 +225,7 @@ bool BytecodeGraphBuilder::CreateGraph(bool stack_check) {
|
| GetFunctionContext());
|
| set_environment(&env);
|
|
|
| - // Build function context only if there are context allocated variables.
|
| - if (info()->num_heap_slots() > 0) {
|
| - UNIMPLEMENTED(); // TODO(oth): Write ast-graph-builder equivalent.
|
| - } else {
|
| - // Simply use the outer function context in building the graph.
|
| - CreateGraphBody(stack_check);
|
| - }
|
| + CreateGraphBody(stack_check);
|
|
|
| // Finish the basic structure of the graph.
|
| DCHECK_NE(0u, exit_controls_.size());
|
| @@ -443,13 +458,32 @@ void BytecodeGraphBuilder::VisitStaGlobalStrictWide(
|
|
|
| void BytecodeGraphBuilder::VisitLdaContextSlot(
|
| const interpreter::BytecodeArrayIterator& iterator) {
|
| - UNIMPLEMENTED();
|
| + // TODO(mythria): LoadContextSlots are unrolled by the required depth when
|
| + // generating bytecode. Hence the value of depth is always 0. Update this
|
| + // code, when the implementation changes.
|
| + // TODO(mythria): immutable flag is also set to false. This information is not
|
| + // available in bytecode array. update this code when the implementation
|
| + // changes.
|
| + const Operator* op =
|
| + javascript()->LoadContext(0, iterator.GetIndexOperand(1), false);
|
| + Node* context = environment()->LookupRegister(iterator.GetRegisterOperand(0));
|
| + Node* node = NewNode(op, context);
|
| + environment()->BindAccumulator(node);
|
| }
|
|
|
|
|
| void BytecodeGraphBuilder::VisitStaContextSlot(
|
| const interpreter::BytecodeArrayIterator& iterator) {
|
| - UNIMPLEMENTED();
|
| + // TODO(mythria): LoadContextSlots are unrolled by the required depth when
|
| + // generating bytecode. Hence the value of depth is always 0. Update this
|
| + // code, when the implementation changes.
|
| + const Operator* op =
|
| + javascript()->StoreContext(0, iterator.GetIndexOperand(1));
|
| + Node* context = environment()->LookupRegister(iterator.GetRegisterOperand(0));
|
| + Node* value = environment()->LookupAccumulator();
|
| + Node* node = NewNode(op, context, value);
|
| + CHECK(node != nullptr);
|
| + environment()->BindAccumulator(value);
|
| }
|
|
|
|
|
| @@ -624,13 +658,16 @@ void BytecodeGraphBuilder::VisitKeyedStoreICStrictWide(
|
|
|
| void BytecodeGraphBuilder::VisitPushContext(
|
| const interpreter::BytecodeArrayIterator& iterator) {
|
| - UNIMPLEMENTED();
|
| + Node* context = environment()->LookupAccumulator();
|
| + environment()->BindRegister(iterator.GetRegisterOperand(0), context);
|
| + environment()->SetContext(context);
|
| }
|
|
|
|
|
| void BytecodeGraphBuilder::VisitPopContext(
|
| const interpreter::BytecodeArrayIterator& iterator) {
|
| - UNIMPLEMENTED();
|
| + Node* context = environment()->LookupRegister(iterator.GetRegisterOperand(0));
|
| + environment()->SetContext(context);
|
| }
|
|
|
|
|
|
|