Compared to the python version, this also does type checking and error handling, so it's slightly longer, however, it's still comfortably under 500 lines.
65 lines
1.9 KiB
C++
65 lines
1.9 KiB
C++
//===-- FormatterBytecode.h -------------------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/DataFormatters/TypeSummary.h"
|
|
#include "lldb/Symbol/CompilerType.h"
|
|
|
|
namespace lldb_private {
|
|
|
|
namespace FormatterBytecode {
|
|
|
|
enum DataType : uint8_t { Any, String, Int, UInt, Object, Type, Selector };
|
|
|
|
enum OpCodes : uint8_t {
|
|
#define DEFINE_OPCODE(OP, MNEMONIC, NAME) op_##NAME = OP,
|
|
#include "FormatterBytecode.def"
|
|
#undef DEFINE_OPCODE
|
|
};
|
|
|
|
enum Selectors : uint8_t {
|
|
#define DEFINE_SELECTOR(ID, NAME) sel_##NAME = ID,
|
|
#include "FormatterBytecode.def"
|
|
#undef DEFINE_SELECTOR
|
|
};
|
|
|
|
enum Signatures : uint8_t {
|
|
#define DEFINE_SIGNATURE(ID, NAME) sig_##NAME = ID,
|
|
#include "FormatterBytecode.def"
|
|
#undef DEFINE_SIGNATURE
|
|
};
|
|
|
|
using ControlStackElement = llvm::StringRef;
|
|
using DataStackElement =
|
|
std::variant<std::string, uint64_t, int64_t, lldb::ValueObjectSP,
|
|
CompilerType, Selectors>;
|
|
struct DataStack : public std::vector<DataStackElement> {
|
|
DataStack() = default;
|
|
DataStack(lldb::ValueObjectSP initial_value)
|
|
: std::vector<DataStackElement>({initial_value}) {}
|
|
void Push(DataStackElement el) { push_back(el); }
|
|
template <typename T> T Pop() {
|
|
T el = std::get<T>(back());
|
|
pop_back();
|
|
return el;
|
|
}
|
|
DataStackElement PopAny() {
|
|
DataStackElement el = back();
|
|
pop_back();
|
|
return el;
|
|
}
|
|
};
|
|
llvm::Error Interpret(std::vector<ControlStackElement> &control,
|
|
DataStack &data, Selectors sel);
|
|
} // namespace FormatterBytecode
|
|
|
|
std::string toString(FormatterBytecode::OpCodes op);
|
|
std::string toString(FormatterBytecode::Selectors sel);
|
|
std::string toString(FormatterBytecode::Signatures sig);
|
|
|
|
} // namespace lldb_private
|