Chromium Code Reviews| Index: src/interpreter/interpreter.cc |
| diff --git a/src/interpreter/interpreter.cc b/src/interpreter/interpreter.cc |
| index 3d37874075575fcda79404b63d0a4f1c01713791..764d201d98dd0bccc6fee1029db53d21200cf6d3 100644 |
| --- a/src/interpreter/interpreter.cc |
| +++ b/src/interpreter/interpreter.cc |
| @@ -18,36 +18,55 @@ using compiler::Node; |
| #define __ assembler-> |
| -Interpreter::Interpreter(Isolate* isolate) : isolate_(isolate) {} |
| +Interpreter::Interpreter(Isolate* isolate) |
| + : isolate_(isolate) {} |
| + |
| + |
| +// static |
| +Handle<FixedArray> Interpreter::CreateUninitializedInterpreterTable( |
| + Isolate* isolate) { |
| + Handle<FixedArray> handler_table = isolate->factory()->NewFixedArray( |
| + static_cast<int>(Bytecode::kLast) + 1, TENURED); |
| + // We rely on the interpreter handler table being immovable, so check that |
| + // it was allocated on the first page (which is always immovable). |
| + DCHECK(isolate->heap()->old_space()->FirstPage()->Contains( |
| + handler_table->address())); |
| + for (int i = 0; i < static_cast<int>(Bytecode::kLast); i++) { |
| + handler_table->set(i, isolate->builtins()->builtin(Builtins::kIllegal)); |
| + } |
| + return handler_table; |
| +} |
| void Interpreter::Initialize(bool create_heap_objects) { |
|
Hannes Payer (out of office)
2015/08/10 16:50:00
Why would you call this function with create_heap_
rmcilroy
2015/08/10 16:54:36
It is called with create_heap_objects=false in Iso
Hannes Payer (out of office)
2015/08/10 16:59:25
Sure, but the semantics right now is strange. It i
rmcilroy
2015/08/10 17:08:43
Ok, done.
|
| DCHECK(FLAG_ignition); |
| - if (create_heap_objects) { |
| + Handle<FixedArray> handler_table = isolate_->factory()->interpreter_table(); |
| + if (create_heap_objects || !IsInterpreterTableInitialized(handler_table)) { |
| Zone zone; |
| HandleScope scope(isolate_); |
| - Handle<FixedArray> handler_table = isolate_->factory()->NewFixedArray( |
| - static_cast<int>(Bytecode::kLast) + 1, TENURED); |
| - // We rely on the interpreter handler table being immovable, so check that |
| - // it was allocated on the first page (which is always immovable). |
| - DCHECK(isolate_->heap()->old_space()->FirstPage()->Contains( |
| - handler_table->address())); |
| - isolate_->heap()->public_set_interpreter_table(*handler_table); |
| - |
| -#define GENERATE_CODE(Name, ...) \ |
| - { \ |
| - compiler::InterpreterAssembler assembler(isolate_, &zone, \ |
| - Bytecode::k##Name); \ |
| - Do##Name(&assembler); \ |
| - Handle<Code> code = assembler.GenerateCode(); \ |
| - handler_table->set(static_cast<int>(Bytecode::k##Name), *code); \ |
| - } |
| + |
| +#define GENERATE_CODE(Name, ...) \ |
| + { \ |
| + compiler::InterpreterAssembler assembler(isolate_, &zone, \ |
| + Bytecode::k##Name); \ |
| + Do##Name(&assembler); \ |
| + Handle<Code> code = assembler.GenerateCode(); \ |
| + handler_table->set(static_cast<int>(Bytecode::k##Name), *code); \ |
| + } |
| BYTECODE_LIST(GENERATE_CODE) |
| #undef GENERATE_CODE |
| } |
| } |
| +bool Interpreter::IsInterpreterTableInitialized( |
| + Handle<FixedArray> handler_table) { |
| + DCHECK(handler_table->length() == static_cast<int>(Bytecode::kLast) + 1); |
| + return handler_table->get(0) == |
| + isolate_->builtins()->builtin(Builtins::kIllegal); |
| +} |
| + |
| + |
| // LdaZero |
| // |
| // Load literal '0' into the accumulator. |