tursodatabase/turso

Cleanup opcode definitions

Open

#393 opened on 2024年11月16日

GitHub で見る
 (4 comments) (0 reactions) (0 assignees)Rust (1,001 forks)github user discovery
enhancementgood first issuehelp wanted

Repository metrics

Stars
 (19,103 stars)
PR merge metrics
 (PR metrics pending)

説明

We currently have SQLite VDBE opcodes defined in multiple places.

For example, for the If opcode, we have this in core/vdbe/mod.rs:

pub enum Insn {
    /// Jump to target_pc if r\[reg\] != 0 or (r\[reg\] == NULL && r\[null_reg\] != 0)
    If {
        reg: usize,              // P1
        target_pc: BranchOffset, // P2
        /// P3. If r\[reg\] is null, jump iff r\[null_reg\] != 0
        null_reg: usize,
    },
}

The following in core/vdbe/explain.rs:

Insn::Goto { target_pc } => (
    "Goto",
    0,
    *target_pc as i32,
    0,
    OwnedValue::Text(Rc::new("".to_string())),
    0,
    "".to_string(),
),

and the following in cli/opcodes_dictionary.rs:

Let's implement some macro magic where we can do something like:

pub enum Insn {
    /// Jump to target_pc if r\[reg\] != 0 or (r\[reg\] == NULL && r\[null_reg\] != 0)
    #[description = "Jump to P2 if the value in register P1 is true. The value is considered true if it is numeric and non-zero. If the value in P1 is NULL then take the jump if and only if P3 is non-zero."]
    If {
        #[p1] reg: usize,
        #[p2] target_pc: BranchOffset,
        /// If r\[reg\] is null, jump iff r\[null_reg\] != 0
        #[p3] null_reg: usize,
    },
}

コントリビューターガイド