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