vyre-libs 0.6.3

vyre Category A library ecosystem - pure-IR compositions over vyre-ops hardware primitives
Documentation
use super::*;
use vyre_primitives::hash::fnv1a::fnv1a32;

inventory::submit! {
    crate::harness::OpEntry {
        id: "vyre-libs::parsing::c11_extract_functions",
        build: || c11_extract_functions(
            "tok_types", "paren_pairs", "brace_pairs", Expr::u32(6), "out_functions", "out_counts"
        ),
        test_inputs: Some(function_extract_inputs),
        expected_output: Some(function_extract_expected),
        category: Some("parsing"),
    }
}

inventory::submit! {
    crate::harness::OpEntry {
        id: "vyre-libs::parsing::c11_extract_calls",
        build: || c11_extract_calls(
            "tok_types", "paren_pairs", "functions", Expr::u32(9), Expr::u32(1), "out_calls", "out_counts"
        ),
        test_inputs: Some(call_extract_inputs),
        expected_output: Some(call_extract_expected),
        category: Some("parsing"),
    }
}

inventory::submit! {
    crate::harness::OpEntry {
        id: "vyre-libs::parsing::c11_build_call_graph",
        build: || c11_build_call_graph("calls", "fn_hashes", "tok_starts", "tok_lens", "haystack", Expr::u32(1), Expr::u32(1), Expr::u32(6), "out_edges", "out_counts"),
        test_inputs: Some(call_graph_inputs),
        expected_output: Some(call_graph_expected),
        category: Some("parsing"),
    }
}

use crate::scan::dispatch_io::pack_u32_slice as pack_u32;

fn function_extract_inputs() -> Vec<Vec<Vec<u8>>> {
    vec![vec![
        pack_u32(&[
            TOK_INT,
            TOK_IDENTIFIER,
            TOK_LPAREN,
            TOK_RPAREN,
            TOK_LBRACE,
            TOK_RBRACE,
        ]),
        pack_u32(&[u32::MAX, u32::MAX, 3, 2, u32::MAX, u32::MAX]),
        pack_u32(&[u32::MAX, u32::MAX, u32::MAX, u32::MAX, 5, 4]),
        vec![0u8; 6 * 3 * 4],
        pack_u32(&[0]),
    ]]
}

fn function_extract_expected() -> Vec<Vec<Vec<u8>>> {
    let mut functions = vec![0u32; 18];
    functions[3..6].copy_from_slice(&[1, 4, 5]);
    vec![vec![pack_u32(&functions), pack_u32(&[18])]]
}

fn call_extract_inputs() -> Vec<Vec<Vec<u8>>> {
    vec![vec![
        pack_u32(&[
            TOK_INT,
            TOK_IDENTIFIER,
            TOK_LPAREN,
            TOK_RPAREN,
            TOK_LBRACE,
            TOK_IDENTIFIER,
            TOK_LPAREN,
            TOK_RPAREN,
            TOK_SEMICOLON,
        ]),
        pack_u32(&[u32::MAX, u32::MAX, 3, 2, u32::MAX, u32::MAX, 7, 6, u32::MAX]),
        pack_u32(&[1, 4, 8]),
        vec![0u8; 9 * 4 * 4],
        pack_u32(&[0]),
    ]]
}

fn call_extract_expected() -> Vec<Vec<Vec<u8>>> {
    let mut calls = vec![0u32; 9 * 4];
    calls[21..24].copy_from_slice(&[5, 6, 7]);
    vec![vec![pack_u32(&calls), pack_u32(&[36])]]
}

fn call_graph_inputs() -> Vec<Vec<Vec<u8>>> {
    vec![vec![
        pack_u32(&[0, 5, 6, 7]),
        pack_u32(&[fnv1a32(b"foo")]),
        pack_u32(&[0, 0, 0, 0, 0, 0]),
        pack_u32(&[0, 0, 0, 0, 0, 3]),
        pack_u32(&[
            u32::from(b'f'),
            u32::from(b'o'),
            u32::from(b'o'),
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
        ]),
        vec![0u8; 4 * 4],
        pack_u32(&[0]),
    ]]
}

fn call_graph_expected() -> Vec<Vec<Vec<u8>>> {
    vec![vec![pack_u32(&[0, 0, 0, 0]), pack_u32(&[2])]]
}