Index: src/interpreter/bytecode-label.h |
diff --git a/src/interpreter/bytecode-label.h b/src/interpreter/bytecode-label.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2f89c4806d96c60c2aa455ebab2525bd80a21a9e |
--- /dev/null |
+++ b/src/interpreter/bytecode-label.h |
@@ -0,0 +1,56 @@ |
+// Copyright 2015 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_LABEL_H_ |
+#define V8_INTERPRETER_BYTECODE_LABEL_H_ |
+ |
+namespace v8 { |
+namespace internal { |
+namespace interpreter { |
+ |
+// A label representing a branch target in a bytecode array. When a |
+// label is bound, it represents a known position in the bytecode |
+// array. For labels that are forward references there can be at most |
+// one reference whilst it is unbound. |
+class BytecodeLabel final { |
+ public: |
+ BytecodeLabel() : bound_(false), offset_(kInvalidOffset) {} |
+ |
+ bool is_bound() const { return bound_; } |
+ size_t offset() const { return offset_; } |
+ |
+ private: |
+ static const size_t kInvalidOffset = static_cast<size_t>(-1); |
+ |
+ void bind_to(size_t offset) { |
+ DCHECK(!bound_ && offset != kInvalidOffset); |
+ offset_ = offset; |
+ bound_ = true; |
+ } |
+ |
+ void set_referrer(size_t offset) { |
+ DCHECK(!bound_ && offset != kInvalidOffset && offset_ == kInvalidOffset); |
+ offset_ = offset; |
+ } |
+ |
+ bool is_forward_target() const { |
+ return offset() != kInvalidOffset && !is_bound(); |
+ } |
+ |
+ // There are three states for a label: |
+ // bound_ offset_ |
+ // UNSET false kInvalidOffset |
+ // FORWARD_TARGET false Offset of referring jump |
+ // BACKWARD_TARGET true Offset of label in bytecode array when bound |
+ bool bound_; |
+ size_t offset_; |
+ |
+ friend class BytecodeArrayWriter; |
+}; |
+ |
+} // namespace interpreter |
+} // namespace internal |
+} // namespace v8 |
+ |
+#endif // V8_INTERPRETER_BYTECODE_LABEL_H_ |