text: // 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.
  
  #include "src/interpreter/bytecode-array-random-iterator.h"
  #include "src/objects/code-inl.h"
  #include "src/objects/objects-inl.h"
  
  namespace v8 {
  namespace internal {
  namespace interpreter {
  
  BytecodeArrayRandomIterator::BytecodeArrayRandomIterator(
      std::unique_ptr<AbstractBytecodeArray> bytecode_array, Zone* zone)
      : BytecodeArrayAccessor(std::move(bytecode_array), 0), offsets_(zone) {
    Initialize();
  }
  
  BytecodeArrayRandomIterator::BytecodeArrayRandomIterator(
      Handle<BytecodeArray> bytecode_array, Zone* zone)
      : BytecodeArrayAccessor(bytecode_array, 0), offsets_(zone) {
    Initialize();
  }
  
  void BytecodeArrayRandomIterator::Initialize() {
    // Run forwards through the bytecode array to determine the offset of each
    // bytecode.
    while (current_offset() < bytecode_array()->length()) {
      offsets_.push_back(current_offset());
      SetOffset(current_offset() + current_bytecode_size());
    }
    GoToStart();
  }
  
  bool BytecodeArrayRandomIterator::IsValid() const {
    return current_index_ >= 0 &&
           static_cast<size_t>(current_index_) < offsets_.size();
  }
  
  void BytecodeArrayRandomIterator::UpdateOffsetFromIndex() {
    if (IsValid()) {
      SetOffset(offsets_[current_index_]);
    }
  }
  
  }  // namespace interpreter
  }  // namespace internal
  }  // namespace v8
  