implement dynamic key; implement __curPos; other small changes
This commit is contained in:
@@ -1,9 +1,10 @@
|
||||
use std::fmt::Write;
|
||||
|
||||
use colored::Colorize;
|
||||
use fix_builtins::BuiltinId;
|
||||
use num_enum::TryFromPrimitive;
|
||||
|
||||
use crate::{AttrKeyType, InstructionPtr, Op, OperandType};
|
||||
use crate::{InstructionPtr, Op, OperandType};
|
||||
|
||||
pub trait DisassemblerContext {
|
||||
fn resolve_string(&self, id: u32) -> &str;
|
||||
@@ -292,31 +293,30 @@ impl<'a, Ctx: DisassemblerContext> Disassembler<'a, Ctx> {
|
||||
("Call", "arg=?".into())
|
||||
},
|
||||
Op::DispatchPrimOp => {
|
||||
todo!();
|
||||
let id = BuiltinId::try_from_primitive(self.read_u8()).expect("invalid builtin id");
|
||||
("DispatchPrimOp", format!("id={id:?}"))
|
||||
}
|
||||
|
||||
Op::MakeAttrs => {
|
||||
let count = self.read_u32();
|
||||
let mut args = format!("size={}", count);
|
||||
for _ in 0..count {
|
||||
let key_tag = self.read_u8();
|
||||
let key_ty =
|
||||
AttrKeyType::try_from_primitive(key_tag).expect("invalid attr key type");
|
||||
match key_ty {
|
||||
AttrKeyType::Static => {
|
||||
let key_id = self.read_u32();
|
||||
let _ =
|
||||
write!(args, " [{}={}", self.ctx.resolve_string(key_id), key_id);
|
||||
}
|
||||
AttrKeyType::Dynamic => {
|
||||
let _ = write!(args, " [dyn");
|
||||
self.read_operand_data();
|
||||
}
|
||||
}
|
||||
let static_count = self.read_u32();
|
||||
let dynamic_count = self.read_u32();
|
||||
let mut args = format!("static={} dynamic={}", static_count, dynamic_count);
|
||||
|
||||
for _ in 0..static_count {
|
||||
let key_id = self.read_u32();
|
||||
let _ = write!(args, " [{}={}", self.ctx.resolve_string(key_id), key_id);
|
||||
self.read_operand_data();
|
||||
let _span_id = self.read_u32();
|
||||
args.push(']');
|
||||
}
|
||||
|
||||
for _ in 0..dynamic_count {
|
||||
let _ = write!(args, " [dyn");
|
||||
self.read_operand_data();
|
||||
let _span_id = self.read_u32();
|
||||
args.push(']');
|
||||
}
|
||||
|
||||
("MakeAttrs", args)
|
||||
}
|
||||
Op::MakeEmptyAttrs => ("MakeEmptyAttrs", String::new()),
|
||||
@@ -442,10 +442,6 @@ impl<'a, Ctx: DisassemblerContext> Disassembler<'a, Ctx> {
|
||||
let id = self.read_u8();
|
||||
("LoadBuiltin", format!("id={}", id))
|
||||
}
|
||||
Op::MkPos => {
|
||||
let span_id = self.read_u32();
|
||||
("MkPos", format!("id={}", span_id))
|
||||
}
|
||||
Op::LoadReplBinding => {
|
||||
let idx = self.read_u32();
|
||||
let name = self.ctx.resolve_string(idx);
|
||||
|
||||
Reference in New Issue
Block a user