tursodatabase/turso

Cleanup opcode definitions

Open

#393 aperta il 16 nov 2024

Vedi su GitHub
 (4 commenti) (0 reazioni) (0 assegnatari)Rust (1001 fork)github user discovery
enhancementgood first issuehelp wanted

Metriche repository

Star
 (19.103 star)
Metriche merge PR
 (Metriche PR in attesa)

Descrizione

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,
    },
}

Guida contributor