| // 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_op.h" | |
| #include <lib/syslog/cpp/macros.h> | |
| #include <iostream> | |
| #include <sstream> | |
| namespace zxdb { | |
| void VmOp::SetJumpDest(uint32_t dest) { | |
| FX_DCHECK(op == VmOpType::kJump || op == VmOpType::kJumpIfFalse || op == VmOpType::kPushBreak); | |
| std::get<JumpInfo>(info).dest = dest; | |
| } | |
| std::ostream& operator<<(std::ostream& out, const VmOp& op) { | |
| out << op.op << "("; | |
| switch (op.op) { | |
| case VmOpType::kError: | |
| break; | |
| case VmOpType::kUnary: | |
| case VmOpType::kBinary: | |
| out << op.token.value(); | |
| break; | |
| case VmOpType::kExpandRef: | |
| case VmOpType::kDrop: | |
| case VmOpType::kDup: | |
| break; | |
| case VmOpType::kLiteral: | |
| out << std::get<VmOp::LiteralInfo>(op.info).value; | |
| break; | |
| case VmOpType::kJump: | |
| case VmOpType::kJumpIfFalse: | |
| case VmOpType::kPushBreak: | |
| out << std::get<VmOp::JumpInfo>(op.info).dest; | |
| break; | |
| case VmOpType::kGetLocal: | |
| case VmOpType::kSetLocal: | |
| case VmOpType::kPopLocals: | |
| out << std::get<VmOp::LocalInfo>(op.info).slot; | |
| break; | |
| case VmOpType::kPopBreak: | |
| case VmOpType::kBreak: | |
| case VmOpType::kCallback0: | |
| case VmOpType::kCallback1: | |
| case VmOpType::kCallback2: | |
| case VmOpType::kCallbackN: | |
| case VmOpType::kAsyncCallback0: | |
| case VmOpType::kAsyncCallback1: | |
| case VmOpType::kAsyncCallback2: | |
| case VmOpType::kAsyncCallbackN: | |
| case VmOpType::kLast: | |
| break; | |
| } | |
| out << ")"; | |
| return out; | |
| } | |
| } // namespace zxdb |