fix disassembler
This commit is contained in:
@@ -3,7 +3,7 @@ use std::fmt::Write;
|
|||||||
use colored::Colorize;
|
use colored::Colorize;
|
||||||
use num_enum::TryFromPrimitive;
|
use num_enum::TryFromPrimitive;
|
||||||
|
|
||||||
use crate::{InstructionPtr, Op};
|
use crate::{AttrKeyType, InstructionPtr, OperandType, Op};
|
||||||
|
|
||||||
pub trait DisassemblerContext {
|
pub trait DisassemblerContext {
|
||||||
fn resolve_string(&self, id: u32) -> &str;
|
fn resolve_string(&self, id: u32) -> &str;
|
||||||
@@ -71,6 +71,24 @@ impl<'a, Ctx: DisassemblerContext> Disassembler<'a, Ctx> {
|
|||||||
f64::from_le_bytes(bytes)
|
f64::from_le_bytes(bytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn read_operand_data(&mut self) {
|
||||||
|
let tag = self.read_u8();
|
||||||
|
let ty = OperandType::try_from_primitive(tag).expect("invalid operand type");
|
||||||
|
match ty {
|
||||||
|
OperandType::Const => {
|
||||||
|
self.read_u32();
|
||||||
|
}
|
||||||
|
OperandType::Local => {
|
||||||
|
self.read_u8();
|
||||||
|
self.read_u32();
|
||||||
|
}
|
||||||
|
OperandType::Builtins => {}
|
||||||
|
OperandType::BigInt => {
|
||||||
|
self.read_i64();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn disassemble(&mut self) -> String {
|
pub fn disassemble(&mut self) -> String {
|
||||||
self.disassemble_impl(false)
|
self.disassemble_impl(false)
|
||||||
}
|
}
|
||||||
@@ -259,7 +277,26 @@ impl<'a, Ctx: DisassemblerContext> Disassembler<'a, Ctx> {
|
|||||||
|
|
||||||
Op::MakeAttrs => {
|
Op::MakeAttrs => {
|
||||||
let count = self.read_u32();
|
let count = self.read_u32();
|
||||||
("MakeAttrs", format!("size={}", count))
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.read_operand_data();
|
||||||
|
let _span_id = self.read_u32();
|
||||||
|
args.push(']');
|
||||||
|
}
|
||||||
|
("MakeAttrs", args)
|
||||||
}
|
}
|
||||||
Op::MakeEmptyAttrs => ("MakeEmptyAttrs", String::new()),
|
Op::MakeEmptyAttrs => ("MakeEmptyAttrs", String::new()),
|
||||||
|
|
||||||
@@ -290,6 +327,9 @@ impl<'a, Ctx: DisassemblerContext> Disassembler<'a, Ctx> {
|
|||||||
|
|
||||||
Op::MakeList => {
|
Op::MakeList => {
|
||||||
let count = self.read_u32();
|
let count = self.read_u32();
|
||||||
|
for _ in 0..count {
|
||||||
|
self.read_operand_data();
|
||||||
|
}
|
||||||
("MakeList", format!("size={}", count))
|
("MakeList", format!("size={}", count))
|
||||||
}
|
}
|
||||||
Op::MakeEmptyList => ("MakeEmptyList", String::new()),
|
Op::MakeEmptyList => ("MakeEmptyList", String::new()),
|
||||||
|
|||||||
+1
-1
@@ -87,7 +87,7 @@ fn run_repl(eval: &mut Evaluator) -> Result<()> {
|
|||||||
let mut scope = HashSet::new();
|
let mut scope = HashSet::new();
|
||||||
const RE: ere::Regex<3> = ere::compile_regex!("^[ \t]*([a-zA-Z_][a-zA-Z0-9_'-]*)[ \t]*(.*)$");
|
const RE: ere::Regex<3> = ere::compile_regex!("^[ \t]*([a-zA-Z_][a-zA-Z0-9_'-]*)[ \t]*(.*)$");
|
||||||
loop {
|
loop {
|
||||||
let readline = rl.readline("nix-js-repl> ");
|
let readline = rl.readline("fix-repl> ");
|
||||||
match readline {
|
match readline {
|
||||||
Ok(line) => {
|
Ok(line) => {
|
||||||
if line.trim().is_empty() {
|
if line.trim().is_empty() {
|
||||||
|
|||||||
Reference in New Issue
Block a user