blob: 2b84aee06bdc09cde2419619990dd84343c88985 [file] [log] [blame]
// 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