Skip to content

Commit

Permalink
Implement environment push and pop coloring
Browse files Browse the repository at this point in the history
  • Loading branch information
HalidOdat committed Nov 8, 2022
1 parent 8772ee2 commit 8182cc6
Showing 1 changed file with 40 additions and 18 deletions.
58 changes: 40 additions & 18 deletions boa_engine/src/vm/code_block.rs
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,13 @@ impl CodeBlock {
}
}

const COLORS: [&str; 4] = [
"Cyan",
"Purple",
"Blue",
"Pink",
];

impl CodeBlock {
fn to_dot_string(&self, result_final: &mut String, interner: &Interner) {
let mut name = interner.resolve_expect(self.name).to_string();
Expand All @@ -412,7 +419,7 @@ impl CodeBlock {


let mut pc = 0;
let mut count = 0;
let mut color_index = 0;
while pc < self.code.len() {
let opcode: Opcode = self.code[pc].try_into().expect("invalid opcode");
let opcode_str = opcode.as_str();
Expand All @@ -423,46 +430,46 @@ impl CodeBlock {
Opcode::RotateLeft | Opcode::RotateRight => {
let operands = self.read::<u8>(pc).to_string();
pc += size_of::<u8>();
result += &format!("{name}_i_{previous_pc} [style=record, label=\"{opcode_str} {operands}\"];\n");
result += &format!("{name}_i_{previous_pc} [style=record, label=\"{previous_pc:04}: {opcode_str} {operands}\"];\n");
result += &format!("{name}_i_{previous_pc} -> {name}_i_{pc} [len=f];\n");
}
Opcode::PushInt8 => {
let operands = self.read::<i8>(pc).to_string();
pc += size_of::<i8>();
result += &format!("{name}_i_{previous_pc} [style=record, label=\"{opcode_str} {operands}\"];\n");
result += &format!("{name}_i_{previous_pc} [style=record, label=\"{previous_pc:04}: {opcode_str} {operands}\"];\n");
result += &format!("{name}_i_{previous_pc} -> {name}_i_{pc} [len=f];\n");
}
Opcode::PushInt16 => {
let operands = self.read::<i16>(pc).to_string();
pc += size_of::<i16>();
result += &format!("{name}_i_{previous_pc} [style=record, label=\"{opcode_str} {operands}\"];\n");
result += &format!("{name}_i_{previous_pc} [style=record, label=\"{previous_pc:04}: {opcode_str} {operands}\"];\n");
result += &format!("{name}_i_{previous_pc} -> {name}_i_{pc} [len=f];\n");
}
Opcode::PushInt32 => {
let operands = self.read::<i32>(pc).to_string();
pc += size_of::<i32>();
result += &format!("{name}_i_{previous_pc} [style=record, label=\"{opcode_str} {operands}\"];\n");
result += &format!("{name}_i_{previous_pc} [style=record, label=\"{previous_pc:04}: {opcode_str} {operands}\"];\n");
result += &format!("{name}_i_{previous_pc} -> {name}_i_{pc} [len=f];\n");
}
Opcode::PushRational => {
let operand = self.read::<f64>(pc);
pc += size_of::<f64>();
let operands = ryu_js::Buffer::new().format(operand).to_string();
result += &format!("{name}_i_{previous_pc} [style=record, label=\"{opcode_str} {operands}\"];\n");
result += &format!("{name}_i_{previous_pc} [style=record, label=\"{previous_pc:04}: {opcode_str} {operands}\"];\n");
result += &format!("{name}_i_{previous_pc} -> {name}_i_{pc} [len=f];\n");
}
Opcode::PushLiteral => {
let operand = self.read::<u32>(pc);
pc += size_of::<u32>();
let operand_str = self.literals[operand as usize].display().to_string();
let operand_str = operand_str.escape_debug().to_string();
result += &format!("{name}_i_{previous_pc} [style=record, label=\"{opcode_str} {operand_str}\"];\n");
result += &format!("{name}_i_{previous_pc} [style=record, label=\"{previous_pc:04}: {opcode_str} {operand_str}\"];\n");
result += &format!("{name}_i_{previous_pc} -> {name}_i_{pc} [len=f];\n");
}
Opcode::Jump => {
let operand = self.read::<u32>(pc);
pc += size_of::<u32>();
result += &format!("{name}_i_{previous_pc} [shape=diamond, label=\"{opcode_str}\"];\n");
result += &format!("{name}_i_{previous_pc} [shape=diamond, label=\"{previous_pc:04}: {opcode_str}\"];\n");
result += &format!("{name}_i_{previous_pc} -> {name}_i_{operand} [color=green, len=f];\n");
}
Opcode::JumpIfFalse
Expand All @@ -471,7 +478,7 @@ impl CodeBlock {
=> {
let operand = self.read::<u32>(pc);
pc += size_of::<u32>();
result += &format!("{name}_i_{previous_pc} [shape=diamond, label=\"{opcode_str}\"];\n");
result += &format!("{name}_i_{previous_pc} [shape=diamond, label=\"{previous_pc:04}: {opcode_str}\"];\n");
result += &format!("{name}_i_{previous_pc} -> {name}_i_{operand} [color=green, label=\"true\", len=f];\n");
result += &format!("{name}_i_{previous_pc} -> {name}_i_{pc} [color=red, label=\"false\", len=f];\n");
}
Expand All @@ -493,19 +500,35 @@ impl CodeBlock {
| Opcode::GeneratorNextDelegate => {
let operands = self.read::<u32>(pc).to_string();
pc += size_of::<u32>();
result += &format!("{name}_i_{previous_pc} [style=record, label=\"{opcode_str} {operands}\"];\n");
result += &format!("{name}_i_{previous_pc} [style=record, label=\"{previous_pc:04}: {opcode_str} {operands}\"];\n");
result += &format!("{name}_i_{previous_pc} -> {name}_i_{pc} [len=f];\n");
}
Opcode::TryStart
| Opcode::PushDeclarativeEnvironment
| Opcode::PushFunctionEnvironment
| Opcode::CopyDataProperties => {
| Opcode::PushFunctionEnvironment => {
let operand1 = self.read::<u32>(pc);
pc += size_of::<u32>();
let operand2 = self.read::<u32>(pc);
pc += size_of::<u32>();
let operands = format!("{operand1}, {operand2}");
result += &format!("{name}_i_{previous_pc} [style=filled, label=\"{previous_pc:04}: {opcode_str} {operands}\", color=\"{}\"];\n", COLORS[color_index]);
result += &format!("{name}_i_{previous_pc} -> {name}_i_{pc} [len=f];\n");

color_index+=1;
}
Opcode::PopEnvironment => {
color_index-=1;
result +=
&format!("{name}_i_{previous_pc} [style=filled, label=\"{previous_pc:04}: {opcode_str}\", color=\"{}\"];\n", COLORS[color_index]);
result += &format!("{name}_i_{previous_pc} -> {name}_i_{pc} [len=f];\n");
},
Opcode::CopyDataProperties => {
let operand1 = self.read::<u32>(pc);
pc += size_of::<u32>();
let operand2 = self.read::<u32>(pc);
pc += size_of::<u32>();
let operands = format!("{operand1}, {operand2}");
result += &format!("{name}_i_{previous_pc} [style=record, label=\"{opcode_str} {operands}\"];\n");
result += &format!("{name}_i_{previous_pc} [style=record, label=\"{previous_pc:04}: {opcode_str} {operands}\"];\n");
result += &format!("{name}_i_{previous_pc} -> {name}_i_{pc} [len=f];\n");
}
Opcode::GetArrowFunction
Expand All @@ -522,7 +545,7 @@ impl CodeBlock {
self.functions[operand as usize].length
);
result +=
&format!("{name}_i_{previous_pc} [style=record, label=\"{opcode_str} {operands}\"];\n");
&format!("{name}_i_{previous_pc} [style=record, label=\"{previous_pc:04}: {opcode_str} {operands}\"];\n");
result += &format!("{name}_i_{previous_pc} -> {name}_i_{pc} [len=f];\n");
result += &format!("{name}_i_{previous_pc} -> start_{fn_name} [len=f];\n");
}
Expand All @@ -543,7 +566,7 @@ impl CodeBlock {
interner.resolve_expect(self.bindings[operand as usize].name().sym()),
);
result +=
&format!("{name}_i_{previous_pc} [style=record, label=\"{opcode_str} {operands}\"];\n");
&format!("{name}_i_{previous_pc} [style=record, label=\"{previous_pc:04}: {opcode_str} {operands}\"];\n");
result += &format!("{name}_i_{previous_pc} -> {name}_i_{pc} [len=f];\n");
}
Opcode::GetPropertyByName
Expand Down Expand Up @@ -572,7 +595,7 @@ impl CodeBlock {
interner.resolve_expect(self.names[operand as usize].sym()),
);
result +=
&format!("{name}_i_{previous_pc} [style=record, label=\"{opcode_str} {operands}\"];\n");
&format!("{name}_i_{previous_pc} [style=record, label=\"{previous_pc:04}: {opcode_str} {operands}\"];\n");
result += &format!("{name}_i_{previous_pc} -> {name}_i_{pc} [len=f];\n");
}
Opcode::Pop
Expand Down Expand Up @@ -679,11 +702,10 @@ impl CodeBlock {
| Opcode::ForAwaitOfLoopIterate
| Opcode::Nop => {
result +=
&format!("{name}_i_{previous_pc} [style=record, label=\"{opcode_str}\"];\n");
&format!("{name}_i_{previous_pc} [style=record, label=\"{previous_pc:04}: {opcode_str}\"];\n");
result += &format!("{name}_i_{previous_pc} -> {name}_i_{pc} [len=f];\n");
},
}
count += 1;
}


Expand Down

0 comments on commit 8182cc6

Please sign in to comment.