ruka_codegen_wasm/codegen/wasm/
literals.rs

1use std::collections::BTreeMap;
2
3use ruka_mir::{MirInstr, MirProgram};
4
5/// Collect string literals in deterministic first-seen order.
6pub(crate) fn collect_string_literals(
7    program: &MirProgram,
8) -> (Vec<String>, BTreeMap<String, u32>) {
9    let mut literals = Vec::<String>::new();
10    let mut handles = BTreeMap::<String, u32>::new();
11    for (_, function) in program.functions.iter() {
12        for block in function.blocks.values() {
13            for instr in &block.instrs {
14                if let MirInstr::ConstString { value, .. } = instr
15                    && !handles.contains_key(value)
16                {
17                    let handle = literals.len() as u32;
18                    literals.push(value.clone());
19                    handles.insert(value.clone(), handle);
20                }
21            }
22        }
23    }
24    (literals, handles)
25}