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 12namespace v8 { 13namespace internal { 14namespace interpreter { 15 16HandlerTableBuilder::HandlerTableBuilder(Zone* zone) : entries_(zone) {} 17 18Handle<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 35int 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 43void 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 49void 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 55void 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 60void HandlerTableBuilder::SetPrediction( 61 int handler_id, HandlerTable::CatchPrediction prediction) { 62 entries_[handler_id].catch_prediction_ = prediction; 63} 64 65 66void 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