| // Copyright 2022 The Fuchsia 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/developer/debug/zxdb/expr/vm_stream.h" |
| |
| namespace zxdb { |
| |
| std::string VmStreamToString(const VmStream& stream) { |
| std::ostringstream out; |
| for (size_t i = 0; i < stream.size(); i++) { |
| out << i << ": " << stream[i] << "\n"; |
| } |
| return out.str(); |
| } |
| |
| VmBytecodeForwardJumper::VmBytecodeForwardJumper(VmStream* stream, VmOpType op) { |
| SetSourceAndOp(stream, op); |
| } |
| |
| VmBytecodeForwardJumper::~VmBytecodeForwardJumper() { |
| // If this hits, you forgot to call JumpToHere(). |
| FX_DCHECK(jump_source_index_ == VmOp::kBadJumpDest); |
| } |
| |
| void VmBytecodeForwardJumper::JumpToHere() { |
| if (!stream_) |
| return; // Stream never set, this jump was never initialized. |
| |
| // If this hits you called JumpToHere() twice on the same object. |
| FX_DCHECK(jump_source_index_ != VmOp::kBadJumpDest); |
| |
| (*stream_)[jump_source_index_].SetJumpDest(stream_->size()); |
| |
| // Help catch usage errors later. |
| jump_source_index_ = VmOp::kBadJumpDest; |
| } |
| |
| void VmBytecodeForwardJumper::SetSourceAndOp(VmStream* stream, VmOpType op) { |
| FX_DCHECK(!stream_); // Will hit if called on an already-initialized jumper. |
| stream_ = stream; |
| jump_source_index_ = stream_->size(); |
| |
| stream_->push_back(VmOp{.op = op, .info = VmOp::JumpInfo{.dest = VmOp::kBadJumpDest}}); |
| } |
| |
| } // namespace zxdb |