vyre-libs 0.6.1

vyre Category A library ecosystem - pure-IR compositions over vyre-ops hardware primitives
Documentation
use super::flush::flush_active_macro_segment_inner;
use super::*;

pub(crate) fn flush_macro_segment_ranges(
    dispatcher: &dyn GpuDispatcher,
    file_path: &std::path::Path,
    include_stack: &[std::path::PathBuf],
    parent_classified: &ClassifiedTokens,
    segment_start: usize,
    macros: &[MacroDef],
    macro_events: &[MacroEvent],
    macro_expansion_cache: &mut MacroExpansionCache,
    segment: &mut Vec<u8>,
    output: &mut Vec<u8>,
    macro_expansion_events: &mut Vec<MacroExpansionEvent>,
    token_provenance_events: &mut Vec<TokenProvenanceEvent>,
    ranges: Vec<(usize, usize)>,
) -> Result<(), String> {
    let mut original = std::mem::take(segment);
    if ranges.len() == 1 {
        let (chunk_start, chunk_end) = ranges[0];
        if chunk_start == 0 && chunk_end == original.len() {
            return flush_active_macro_segment_inner(
                dispatcher,
                file_path,
                include_stack,
                parent_classified,
                segment_start,
                macros,
                macro_events,
                macro_expansion_cache,
                &mut original,
                output,
                macro_expansion_events,
                token_provenance_events,
                0,
            );
        }
    }

    let max_chunk_len = ranges
        .iter()
        .map(|(chunk_start, chunk_end)| chunk_end.saturating_sub(*chunk_start))
        .max()
        .unwrap_or(0);
    let mut chunk = macro_expansion_cache.take_range_chunk_scratch();
    if chunk.capacity() < max_chunk_len {
        let additional = max_chunk_len - chunk.capacity();
        chunk.try_reserve_exact(additional).map_err(|error| {
            format!(
                "vyre-libs::gpu_pipeline: could not reserve {additional} macro segment shard bytes: {error:?}. Fix: shard macro segment ranges before GPU macro expansion."
            )
        })?;
    }
    let result = (|| {
        for (chunk_start, chunk_end) in ranges {
            let chunk_bytes = original
                    .get(chunk_start..chunk_end)
                    .ok_or_else(|| {
                        "vyre-libs::gpu_pipeline: macro segment shard range outside source. Fix: repair shard range generation.".to_string()
                    })?;
            chunk.clear();
            chunk.extend_from_slice(chunk_bytes);
            flush_active_macro_segment_inner(
                dispatcher,
                file_path,
                include_stack,
                parent_classified,
                segment_start + chunk_start,
                macros,
                macro_events,
                macro_expansion_cache,
                &mut chunk,
                output,
                macro_expansion_events,
                token_provenance_events,
                0,
            )?;
        }
        Ok(())
    })();
    macro_expansion_cache.store_range_chunk_scratch(chunk);
    result
}