summaryrefslogtreecommitdiff
path: root/deps/v8/src/interpreter/bytecode-jump-table.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/interpreter/bytecode-jump-table.h')
-rw-r--r--deps/v8/src/interpreter/bytecode-jump-table.h88
1 files changed, 88 insertions, 0 deletions
diff --git a/deps/v8/src/interpreter/bytecode-jump-table.h b/deps/v8/src/interpreter/bytecode-jump-table.h
new file mode 100644
index 0000000000..b0a36cadbb
--- /dev/null
+++ b/deps/v8/src/interpreter/bytecode-jump-table.h
@@ -0,0 +1,88 @@
+// Copyright 2017 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_INTERPRETER_BYTECODE_JUMP_TABLE_H_
+#define V8_INTERPRETER_BYTECODE_JUMP_TABLE_H_
+
+#include "src/bit-vector.h"
+#include "src/zone/zone.h"
+
+namespace v8 {
+namespace internal {
+namespace interpreter {
+
+class ConstantArrayBuilder;
+
+// A jump table for a set of targets in a bytecode array. When an entry in the
+// table is bound, it represents a known position in the bytecode array. If no
+// entries match, the switch falls through.
+class V8_EXPORT_PRIVATE BytecodeJumpTable final : public ZoneObject {
+ public:
+ // Constructs a new BytecodeJumpTable starting at |constant_pool_index|, with
+ // the given |size|, where the case values of the table start at
+ // |case_value_base|.
+ BytecodeJumpTable(size_t constant_pool_index, int size, int case_value_base,
+ Zone* zone)
+ :
+#ifdef DEBUG
+ bound_(size, zone),
+#endif
+ constant_pool_index_(constant_pool_index),
+ switch_bytecode_offset_(kInvalidOffset),
+ size_(size),
+ case_value_base_(case_value_base) {
+ }
+
+ size_t constant_pool_index() const { return constant_pool_index_; }
+ size_t switch_bytecode_offset() const { return switch_bytecode_offset_; }
+ int case_value_base() const { return case_value_base_; }
+ int size() const { return size_; }
+#ifdef DEBUG
+ bool is_bound(int case_value) const {
+ DCHECK_GE(case_value, case_value_base_);
+ DCHECK_LT(case_value, case_value_base_ + size());
+ return bound_.Contains(case_value - case_value_base_);
+ }
+#endif
+
+ size_t ConstantPoolEntryFor(int case_value) {
+ DCHECK_GE(case_value, case_value_base_);
+ return constant_pool_index_ + case_value - case_value_base_;
+ }
+
+ private:
+ static const size_t kInvalidIndex = static_cast<size_t>(-1);
+ static const size_t kInvalidOffset = static_cast<size_t>(-1);
+
+ void mark_bound(int case_value) {
+#ifdef DEBUG
+ DCHECK_GE(case_value, case_value_base_);
+ DCHECK_LT(case_value, case_value_base_ + size());
+ bound_.Add(case_value - case_value_base_);
+#endif
+ }
+
+ void set_switch_bytecode_offset(size_t offset) {
+ DCHECK_EQ(switch_bytecode_offset_, kInvalidOffset);
+ switch_bytecode_offset_ = offset;
+ }
+
+#ifdef DEBUG
+ // This bit vector is only used for DCHECKS, so only store the field in debug
+ // builds.
+ BitVector bound_;
+#endif
+ size_t constant_pool_index_;
+ size_t switch_bytecode_offset_;
+ int size_;
+ int case_value_base_;
+
+ friend class BytecodeArrayWriter;
+};
+
+} // namespace interpreter
+} // namespace internal
+} // namespace v8
+
+#endif // V8_INTERPRETER_BYTECODE_JUMP_TABLE_H_