luau-bytecode 0.732.0

Luau bytecode model, builder, serializer, and dumper
Documentation
use luau_bytecode::builder::{BytecodeBuilder, BytecodeDumpFlags};
use luau_common::{BString, flags};
use luau_compiler::{CompileHost, CompileOptions, Compiler, EmptyCompileHost};
use luau_syntax::{
    allocator::AstArena, ast_names::AstNameTable, parser::ParseOptions, parser::parse,
};

pub fn compile_dumped_function_with_options(
    source: &str,
    id: usize,
    options: CompileOptions,
    host: &dyn CompileHost,
    dump_flags: BytecodeDumpFlags,
    dump_source: Option<&[u8]>,
) -> BString {
    let _string_interp = flags::LuauCompileStringInterpTargetTop.scoped(true);
    let arena = AstArena::new();
    let mut names = AstNameTable::new(&arena);
    let result =
        parse(source, &arena, &mut names, ParseOptions::default()).expect("source should parse");

    let mut builder = BytecodeBuilder::new();
    builder.set_dump_flags(dump_flags);
    if let Some(source) = dump_source {
        builder.set_dump_source(source);
    }

    Compiler::with_host(options, host)
        .compile_into(&result, &mut names, &mut builder)
        .expect("source should compile");

    builder.dump_function(id)
}

pub fn compile_function0_constants(source: &str) -> BString {
    let mut dump_flags = BytecodeDumpFlags::default();
    dump_flags.set_code(true);
    dump_flags.set_constants(true);
    compile_dumped_function_with_options(
        source,
        0,
        CompileOptions::default(),
        &EmptyCompileHost,
        dump_flags,
        None,
    )
}

pub fn compile_function0_source(source: &str) -> BString {
    let mut dump_flags = BytecodeDumpFlags::default();
    dump_flags.set_code(true);
    dump_flags.set_source(true);
    compile_dumped_function_with_options(
        source,
        0,
        CompileOptions::default(),
        &EmptyCompileHost,
        dump_flags,
        Some(source.as_bytes()),
    )
}