1 // Copyright 2016 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "src/interpreter/handler-table-builder.h" 6 7 #include "src/factory.h" 8 #include "src/interpreter/bytecode-register.h" 9 #include "src/isolate.h" 10 #include "src/objects-inl.h" 11 12 namespace v8 { 13 namespace internal { 14 namespace interpreter { 15 16 HandlerTableBuilder::HandlerTableBuilder(Zone* zone) : entries_(zone) {} 17 18 Handle<HandlerTable> HandlerTableBuilder::ToHandlerTable(Isolate* isolate) { 19 int handler_table_size = static_cast<int>(entries_.size()); 20 Handle<HandlerTable> table = 21 Handle<HandlerTable>::cast(isolate->factory()->NewFixedArray( 22 HandlerTable::LengthForRange(handler_table_size), TENURED)); 23 for (int i = 0; i < handler_table_size; ++i) { 24 Entry& entry = entries_[i]; 25 HandlerTable::CatchPrediction pred = entry.catch_prediction_; 26 table->SetRangeStart(i, static_cast<int>(entry.offset_start)); 27 table->SetRangeEnd(i, static_cast<int>(entry.offset_end)); 28 table->SetRangeHandler(i, static_cast<int>(entry.offset_target), pred); 29 table->SetRangeData(i, entry.context.index()); 30 } 31 return table; 32 } 33 34 35 int HandlerTableBuilder::NewHandlerEntry() { 36 int handler_id = static_cast<int>(entries_.size()); 37 Entry entry = {0, 0, 0, Register(), HandlerTable::UNCAUGHT}; 38 entries_.push_back(entry); 39 return handler_id; 40 } 41 42 43 void HandlerTableBuilder::SetTryRegionStart(int handler_id, size_t offset) { 44 DCHECK(Smi::IsValid(offset)); // Encoding of handler table requires this. 45 entries_[handler_id].offset_start = offset; 46 } 47 48 49 void HandlerTableBuilder::SetTryRegionEnd(int handler_id, size_t offset) { 50 DCHECK(Smi::IsValid(offset)); // Encoding of handler table requires this. 51 entries_[handler_id].offset_end = offset; 52 } 53 54 55 void HandlerTableBuilder::SetHandlerTarget(int handler_id, size_t offset) { 56 DCHECK(Smi::IsValid(offset)); // Encoding of handler table requires this. 57 entries_[handler_id].offset_target = offset; 58 } 59 60 void HandlerTableBuilder::SetPrediction( 61 int handler_id, HandlerTable::CatchPrediction prediction) { 62 entries_[handler_id].catch_prediction_ = prediction; 63 } 64 65 66 void HandlerTableBuilder::SetContextRegister(int handler_id, Register reg) { 67 entries_[handler_id].context = reg; 68 } 69 70 } // namespace interpreter 71 } // namespace internal 72 } // namespace v8 73