1 // Copyright 2015 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 #ifndef V8_INTERPRETER_BYTECODE_LABEL_H_ 6 #define V8_INTERPRETER_BYTECODE_LABEL_H_ 7 8 namespace v8 { 9 namespace internal { 10 namespace interpreter { 11 12 // A label representing a branch target in a bytecode array. When a 13 // label is bound, it represents a known position in the bytecode 14 // array. For labels that are forward references there can be at most 15 // one reference whilst it is unbound. 16 class BytecodeLabel final { 17 public: BytecodeLabel()18 BytecodeLabel() : bound_(false), offset_(kInvalidOffset) {} 19 is_bound()20 bool is_bound() const { return bound_; } offset()21 size_t offset() const { return offset_; } 22 23 private: 24 static const size_t kInvalidOffset = static_cast<size_t>(-1); 25 bind_to(size_t offset)26 void bind_to(size_t offset) { 27 DCHECK(!bound_ && offset != kInvalidOffset); 28 offset_ = offset; 29 bound_ = true; 30 } 31 set_referrer(size_t offset)32 void set_referrer(size_t offset) { 33 DCHECK(!bound_ && offset != kInvalidOffset && offset_ == kInvalidOffset); 34 offset_ = offset; 35 } 36 is_forward_target()37 bool is_forward_target() const { 38 return offset() != kInvalidOffset && !is_bound(); 39 } 40 41 // There are three states for a label: 42 // bound_ offset_ 43 // UNSET false kInvalidOffset 44 // FORWARD_TARGET false Offset of referring jump 45 // BACKWARD_TARGET true Offset of label in bytecode array when bound 46 bool bound_; 47 size_t offset_; 48 49 friend class BytecodeArrayWriter; 50 }; 51 52 } // namespace interpreter 53 } // namespace internal 54 } // namespace v8 55 56 #endif // V8_INTERPRETER_BYTECODE_LABEL_H_ 57