Function quickjs_runtime::quickjs_utils::compile::to_bytecode

source ·
pub unsafe fn to_bytecode(
    context: *mut JSContext,
    compiled_func: &QuickJsValueAdapter,
) -> Vec<u8> 
Expand description

write a function to bytecode

§Example

use quickjs_runtime::builder::QuickJsRuntimeBuilder;
use quickjs_runtime::jsutils::Script;
use quickjs_runtime::quickjs_utils::primitives;
use quickjs_runtime::quickjs_utils::compile::{compile, run_compiled_function, to_bytecode, from_bytecode};
let rt = QuickJsRuntimeBuilder::new().build();
rt.exe_rt_task_in_event_loop(|q_js_rt| {
    unsafe {
    let q_ctx = q_js_rt.get_main_realm();
    let func_res = compile(q_ctx.context, Script::new("test_func.es", "let a = 7; let b = 5; a * b;"));
    let func = func_res.ok().expect("func compile failed");
    let bytecode: Vec<u8> = to_bytecode(q_ctx.context, &func);
    drop(func);
    assert!(!bytecode.is_empty());
        let func2_res = from_bytecode(q_ctx.context, &bytecode);
        let func2 = func2_res.ok().expect("could not read bytecode");
        let run_res = run_compiled_function(q_ctx.context, &func2);
        let res = run_res.ok().expect("run_compiled_function failed");
        let i_res = primitives::to_i32(&res);
        let i = i_res.ok().expect("could not convert to i32");
        assert_eq!(i, 7*5);
    }
});

§Safety

When passing a context pointer please make sure the corresponding QuickJsContext is still valid