Skip to content

Commit

Permalink
chore: build op effects map at compile time
Browse files Browse the repository at this point in the history
  • Loading branch information
DaniPopes committed Dec 1, 2023
1 parent 1529edd commit 967a8ce
Show file tree
Hide file tree
Showing 2 changed files with 110 additions and 95 deletions.
2 changes: 1 addition & 1 deletion crates/debugger/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -806,7 +806,7 @@ Line::from(Span::styled("[t]: stack labels | [m]: memory decoding | [shift + j/k
if let Instruction::OpCode(op) = debug_steps[current_step].instruction {
stack_indices_affected(op)
} else {
vec![]
&[]
};

let text: Vec<Line> = stack
Expand Down
203 changes: 109 additions & 94 deletions crates/debugger/src/op_effects.rs
Original file line number Diff line number Diff line change
@@ -1,97 +1,112 @@
/// Maps an opcode and returns a vector of named affected indices
pub fn stack_indices_affected(op: u8) -> Vec<(usize, &'static str)> {
/// Maps an opcode to a list of named affected indices.
#[inline]
pub fn stack_indices_affected(op: u8) -> &'static [(usize, &'static str)] {
OP_TO_EFFECT[op as usize]
}

static OP_TO_EFFECT: [&[(usize, &str)]; 256] = {
let mut table = [[].as_slice(); 256];
let mut i = 0;
while i < 256 {
table[i] = op_to_effect(i as u8);
i += 1;
}
table
};

const fn op_to_effect(op: u8) -> &'static [(usize, &'static str)] {
match op {
0x01 => vec![(0, "a"), (1, "b")],
0x02 => vec![(0, "a"), (1, "b")],
0x03 => vec![(0, "a"), (1, "b")],
0x04 => vec![(0, "a"), (1, "b")],
0x05 => vec![(0, "a"), (1, "b")],
0x06 => vec![(0, "a"), (1, "b")],
0x07 => vec![(0, "a"), (1, "b")],
0x08 => vec![(0, "a"), (1, "b"), (2, "N")],
0x09 => vec![(0, "a"), (1, "b"), (2, "N")],
0x0a => vec![(0, "a"), (1, "exponent")],
0x0b => vec![(0, "b"), (1, "x")],
0x10 => vec![(0, "a"), (1, "b")],
0x11 => vec![(0, "a"), (1, "b")],
0x12 => vec![(0, "a"), (1, "b")],
0x13 => vec![(0, "a"), (1, "b")],
0x14 => vec![(0, "a"), (1, "b")],
0x15 => vec![(0, "a")],
0x16 => vec![(0, "a"), (1, "b")],
0x17 => vec![(0, "a"), (1, "b")],
0x18 => vec![(0, "a"), (1, "b")],
0x19 => vec![(0, "a")],
0x1a => vec![(0, "i"), (1, "x")],
0x1b => vec![(0, "shift"), (1, "value")],
0x1c => vec![(0, "shift"), (1, "value")],
0x1d => vec![(0, "shift"), (1, "value")],
0x20 => vec![(0, "offset"), (1, "size")],
0x31 => vec![(0, "address")],
0x35 => vec![(0, "offset")],
0x37 => vec![(0, "destOffset"), (1, "offset"), (2, "size")],
0x39 => vec![(0, "destOffset"), (1, "offset"), (2, "size")],
0x3b => vec![(0, "address")],
0x3c => vec![(0, "address"), (1, "destOffset"), (2, "offset"), (3, "size")],
0x3e => vec![(0, "destOffset"), (1, "offset"), (2, "size")],
0x3f => vec![(0, "address")],
0x40 => vec![(0, "blockNumber")],
0x50 => vec![(0, "y")],
0x51 => vec![(0, "offset")],
0x52 => vec![(0, "offset"), (1, "value")],
0x53 => vec![(0, "offset"), (1, "value")],
0x54 => vec![(0, "key")],
0x55 => vec![(0, "key"), (1, "value")],
0x56 => vec![(0, "jump_to")],
0x57 => vec![(0, "jump_to"), (1, "if")],
0x5c => vec![(0, "key")],
0x5d => vec![(0, "key"), (1, "value")],
0x80 => vec![(0, "dup_value")],
0x81 => vec![(1, "dup_value")],
0x82 => vec![(2, "dup_value")],
0x83 => vec![(3, "dup_value")],
0x84 => vec![(4, "dup_value")],
0x85 => vec![(5, "dup_value")],
0x86 => vec![(6, "dup_value")],
0x87 => vec![(7, "dup_value")],
0x88 => vec![(8, "dup_value")],
0x89 => vec![(9, "dup_value")],
0x8a => vec![(10, "dup_value")],
0x8b => vec![(11, "dup_value")],
0x8c => vec![(12, "dup_value")],
0x8d => vec![(13, "dup_value")],
0x8e => vec![(14, "dup_value")],
0x8f => vec![(15, "dup_value")],
0x90 => vec![(0, "a"), (1, "swap_value")],
0x91 => vec![(0, "a"), (2, "swap_value")],
0x92 => vec![(0, "a"), (3, "swap_value")],
0x93 => vec![(0, "a"), (4, "swap_value")],
0x94 => vec![(0, "a"), (5, "swap_value")],
0x95 => vec![(0, "a"), (6, "swap_value")],
0x96 => vec![(0, "a"), (7, "swap_value")],
0x97 => vec![(0, "a"), (8, "swap_value")],
0x98 => vec![(0, "a"), (9, "swap_value")],
0x99 => vec![(0, "a"), (10, "swap_value")],
0x9a => vec![(0, "a"), (11, "swap_value")],
0x9b => vec![(0, "a"), (12, "swap_value")],
0x9c => vec![(0, "a"), (13, "swap_value")],
0x9d => vec![(0, "a"), (14, "swap_value")],
0x9e => vec![(0, "a"), (15, "swap_value")],
0x9f => vec![(0, "a"), (16, "swap_value")],
0xa0 => vec![(0, "offset"), (1, "size")],
0xa1 => vec![(0, "offset"), (1, "size"), (2, "topic")],
0xa2 => vec![(0, "offset"), (1, "size"), (2, "topic1"), (3, "topic2")],
0xa3 => vec![(0, "offset"), (1, "size"), (2, "topic1"), (3, "topic2"), (4, "topic3")],
0xa4 => vec![
0x01 => &[(0, "a"), (1, "b")],
0x02 => &[(0, "a"), (1, "b")],
0x03 => &[(0, "a"), (1, "b")],
0x04 => &[(0, "a"), (1, "b")],
0x05 => &[(0, "a"), (1, "b")],
0x06 => &[(0, "a"), (1, "b")],
0x07 => &[(0, "a"), (1, "b")],
0x08 => &[(0, "a"), (1, "b"), (2, "N")],
0x09 => &[(0, "a"), (1, "b"), (2, "N")],
0x0a => &[(0, "a"), (1, "exponent")],
0x0b => &[(0, "b"), (1, "x")],
0x10 => &[(0, "a"), (1, "b")],
0x11 => &[(0, "a"), (1, "b")],
0x12 => &[(0, "a"), (1, "b")],
0x13 => &[(0, "a"), (1, "b")],
0x14 => &[(0, "a"), (1, "b")],
0x15 => &[(0, "a")],
0x16 => &[(0, "a"), (1, "b")],
0x17 => &[(0, "a"), (1, "b")],
0x18 => &[(0, "a"), (1, "b")],
0x19 => &[(0, "a")],
0x1a => &[(0, "i"), (1, "x")],
0x1b => &[(0, "shift"), (1, "value")],
0x1c => &[(0, "shift"), (1, "value")],
0x1d => &[(0, "shift"), (1, "value")],
0x20 => &[(0, "offset"), (1, "size")],
0x31 => &[(0, "address")],
0x35 => &[(0, "offset")],
0x37 => &[(0, "destOffset"), (1, "offset"), (2, "size")],
0x39 => &[(0, "destOffset"), (1, "offset"), (2, "size")],
0x3b => &[(0, "address")],
0x3c => &[(0, "address"), (1, "destOffset"), (2, "offset"), (3, "size")],
0x3e => &[(0, "destOffset"), (1, "offset"), (2, "size")],
0x3f => &[(0, "address")],
0x40 => &[(0, "blockNumber")],
0x50 => &[(0, "y")],
0x51 => &[(0, "offset")],
0x52 => &[(0, "offset"), (1, "value")],
0x53 => &[(0, "offset"), (1, "value")],
0x54 => &[(0, "key")],
0x55 => &[(0, "key"), (1, "value")],
0x56 => &[(0, "jump_to")],
0x57 => &[(0, "jump_to"), (1, "if")],
0x5c => &[(0, "key")],
0x5d => &[(0, "key"), (1, "value")],
0x80 => &[(0, "dup_value")],
0x81 => &[(1, "dup_value")],
0x82 => &[(2, "dup_value")],
0x83 => &[(3, "dup_value")],
0x84 => &[(4, "dup_value")],
0x85 => &[(5, "dup_value")],
0x86 => &[(6, "dup_value")],
0x87 => &[(7, "dup_value")],
0x88 => &[(8, "dup_value")],
0x89 => &[(9, "dup_value")],
0x8a => &[(10, "dup_value")],
0x8b => &[(11, "dup_value")],
0x8c => &[(12, "dup_value")],
0x8d => &[(13, "dup_value")],
0x8e => &[(14, "dup_value")],
0x8f => &[(15, "dup_value")],
0x90 => &[(0, "a"), (1, "swap_value")],
0x91 => &[(0, "a"), (2, "swap_value")],
0x92 => &[(0, "a"), (3, "swap_value")],
0x93 => &[(0, "a"), (4, "swap_value")],
0x94 => &[(0, "a"), (5, "swap_value")],
0x95 => &[(0, "a"), (6, "swap_value")],
0x96 => &[(0, "a"), (7, "swap_value")],
0x97 => &[(0, "a"), (8, "swap_value")],
0x98 => &[(0, "a"), (9, "swap_value")],
0x99 => &[(0, "a"), (10, "swap_value")],
0x9a => &[(0, "a"), (11, "swap_value")],
0x9b => &[(0, "a"), (12, "swap_value")],
0x9c => &[(0, "a"), (13, "swap_value")],
0x9d => &[(0, "a"), (14, "swap_value")],
0x9e => &[(0, "a"), (15, "swap_value")],
0x9f => &[(0, "a"), (16, "swap_value")],
0xa0 => &[(0, "offset"), (1, "size")],
0xa1 => &[(0, "offset"), (1, "size"), (2, "topic")],
0xa2 => &[(0, "offset"), (1, "size"), (2, "topic1"), (3, "topic2")],
0xa3 => &[(0, "offset"), (1, "size"), (2, "topic1"), (3, "topic2"), (4, "topic3")],
0xa4 => &[
(0, "offset"),
(1, "size"),
(2, "topic1"),
(3, "topic2"),
(4, "topic3"),
(5, "topic4"),
],
0xf0 => vec![(0, "value"), (1, "offset"), (2, "size")],
0xf1 => vec![
0xf0 => &[(0, "value"), (1, "offset"), (2, "size")],
0xf1 => &[
(0, "gas"),
(1, "address"),
(2, "value"),
Expand All @@ -100,7 +115,7 @@ pub fn stack_indices_affected(op: u8) -> Vec<(usize, &'static str)> {
(5, "retOffset"),
(6, "retSize"),
],
0xf2 => vec![
0xf2 => &[
(0, "gas"),
(1, "address"),
(2, "value"),
Expand All @@ -109,26 +124,26 @@ pub fn stack_indices_affected(op: u8) -> Vec<(usize, &'static str)> {
(5, "retOffset"),
(6, "retSize"),
],
0xf3 => vec![(0, "offset"), (1, "size")],
0xf4 => vec![
0xf3 => &[(0, "offset"), (1, "size")],
0xf4 => &[
(0, "gas"),
(1, "address"),
(2, "argsOffset"),
(3, "argsSize"),
(4, "retOffset"),
(5, "retSize"),
],
0xf5 => vec![(0, "value"), (1, "offset"), (2, "size"), (3, "salt")],
0xfa => vec![
0xf5 => &[(0, "value"), (1, "offset"), (2, "size"), (3, "salt")],
0xfa => &[
(0, "gas"),
(1, "address"),
(2, "argsOffset"),
(3, "argsSize"),
(4, "retOffset"),
(5, "retSize"),
],
0xfd => vec![(0, "offset"), (1, "size")],
0xff => vec![(0, "address")],
_ => vec![],
0xfd => &[(0, "offset"), (1, "size")],
0xff => &[(0, "address")],
_ => &[],
}
}

0 comments on commit 967a8ce

Please sign in to comment.