use core::mem::size_of;
use core::ptr;
use crate::Ordinal; use bun_collections::VecExt as _;
use bun_core::MutableString;
use crate::vlq::decode as vlq_decode;
use crate::{LineColumnOffset, Mapping, SourceMapState, append_mapping_to_buffer};
pub const SYNC_INTERVAL: usize = 64;
pub const HEADER_SIZE: usize = 32;
const STREAM_TAIL_PAD: usize = 1;
#[derive(Copy, Clone)]
pub struct InternalSourceMap {
pub data: *const u8,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct SyncEntry {
pub generated_line: i32,
pub generated_column: i32,
pub byte_offset: u32,
pub original_line: i32,
pub original_column: i32,
pub source_index: i32,
}
const _: () = assert!(size_of::<SyncEntry>() == 24);
impl SyncEntry {
#[inline]
fn less_or_equal(self, line: i32, col: i32) -> bool {
self.generated_line < line || (self.generated_line == line && self.generated_column <= col)
}
#[inline]
fn to_state(self) -> State {
State {
generated_line: self.generated_line,
generated_column: self.generated_column,
source_index: self.source_index,
original_line: self.original_line,
original_column: self.original_column,
}
}
}
impl InternalSourceMap {
#[inline]
pub fn total_len(self) -> usize {
unsafe { u64::from_ne_bytes(*self.data.cast::<[u8; 8]>()) as usize }
}
#[inline]
pub fn mapping_count(self) -> usize {
unsafe { u64::from_ne_bytes(*self.data.add(8).cast::<[u8; 8]>()) as usize }
}
#[inline]
pub fn input_line_count(self) -> usize {
unsafe { u64::from_ne_bytes(*self.data.add(16).cast::<[u8; 8]>()) as usize }
}
#[inline]
pub fn sync_count(self) -> u32 {
unsafe { u32::from_ne_bytes(*self.data.add(24).cast::<[u8; 4]>()) }
}
#[inline]
pub fn stream_offset(self) -> u32 {
unsafe { u32::from_ne_bytes(*self.data.add(28).cast::<[u8; 4]>()) }
}
pub fn sync_entry(self, index: usize) -> SyncEntry {
let off = HEADER_SIZE + index * size_of::<SyncEntry>();
unsafe { ptr::read_unaligned(self.data.add(off).cast::<SyncEntry>()) }
}
#[inline]
pub fn stream(self) -> &'static [u8] {
unsafe {
core::slice::from_raw_parts(
self.data.add(self.stream_offset() as usize),
self.total_len() - self.stream_offset() as usize,
)
}
}
pub fn free_owned(self) {
unsafe {
drop(Box::<[u8]>::from_raw(std::ptr::slice_from_raw_parts_mut(
self.data.cast_mut(),
self.total_len(),
)));
}
}
pub fn memory_cost(self) -> usize {
self.total_len()
}
#[inline]
pub fn is_valid_blob(blob: &[u8]) -> bool {
is_valid_blob(blob)
}
#[inline]
pub fn from_vlq(vlq: &[u8], input_line_count_hint: u32) -> Result<Box<[u8]>, FromVlqError> {
from_vlq(vlq, input_line_count_hint)
}
}
pub fn is_valid_blob(blob: &[u8]) -> bool {
if blob.len() < HEADER_SIZE {
return false;
}
let this = InternalSourceMap {
data: blob.as_ptr(),
};
let total = this.total_len();
if total != blob.len() {
return false;
}
let sync_n = this.sync_count();
let stream_off = this.stream_offset() as usize;
let sync_end = HEADER_SIZE + (sync_n as usize) * size_of::<SyncEntry>();
if stream_off < sync_end {
return false;
}
if stream_off > total {
return false;
}
if total < stream_off + STREAM_TAIL_PAD {
return false;
}
true
}
#[derive(Copy, Clone, Default)]
struct State {
generated_line: i32,
generated_column: i32,
source_index: i32,
original_line: i32,
original_column: i32,
}
impl State {
#[inline]
fn less_or_equal(self, line: i32, col: i32) -> bool {
self.generated_line < line || (self.generated_line == line && self.generated_column <= col)
}
fn to_mapping(self) -> Mapping {
Mapping {
generated: LineColumnOffset {
lines: Ordinal::from_zero_based(self.generated_line),
columns: Ordinal::from_zero_based(self.generated_column),
},
original: LineColumnOffset {
lines: Ordinal::from_zero_based(self.original_line),
columns: Ordinal::from_zero_based(self.original_column),
},
source_index: self.source_index,
name_index: -1,
}
}
}
#[inline]
fn zigzag_encode(value: i32) -> u32 {
((value << 1) ^ (value >> 31)) as u32
}
#[inline]
fn zigzag_decode(value: u32) -> i32 {
(value >> 1) as i32 ^ (-((value & 1) as i32))
}
const MAX_VARINT_LEN: usize = 5;
#[inline(always)]
fn write_varint(buf: *mut u8, signed: i32) -> usize {
let mut v = zigzag_encode(signed);
let mut i: usize = 0;
loop {
let mut byte: u8 = (v & 0x7f) as u8;
v >>= 7;
if v != 0 {
byte |= 0x80;
}
unsafe { *buf.add(i) = byte };
i += 1;
if v == 0 {
return i;
}
}
}
fn read_varint(bytes: &[u8], pos: &mut usize) -> i32 {
let mut i = *pos;
let first = bytes[i];
i += 1;
if first < 0x80 {
*pos = i;
return zigzag_decode(first as u32);
}
let mut result: u32 = (first & 0x7f) as u32;
let mut shift: u32 = 7;
loop {
if i >= bytes.len() || shift > 28 {
break;
}
let byte = bytes[i];
i += 1;
result |= ((byte & 0x7f) as u32) << shift;
if byte & 0x80 == 0 {
break;
}
shift += 7;
}
*pos = i;
zigzag_decode(result)
}
#[inline]
fn test_bit(base: *const u8, idx: usize) -> bool {
unsafe { (*base.add(idx >> 3) >> (idx & 7)) & 1 != 0 }
}
const FLAG_HAS_GEN_LINE_EXCEPTIONS: u8 = 1 << 2;
const FLAG_HAS_SRC_IDX: u8 = 1 << 3;
mod win_hdr {
pub(super) const COUNT_OFF: usize = 0;
pub(super) const FLAGS_OFF: usize = 1;
pub(super) const GEN_COL_LEN_OFF: usize = 2;
pub(super) const ORIG_LINE_LEN_OFF: usize = 4;
pub(super) const ORIG_COL_LEN_OFF: usize = 6;
pub(super) const GEN_LINE_MASK_OFF: usize = 8;
pub(super) const ORIG_LINE_EQ_MASK_OFF: usize = 16;
pub(super) const ORIG_COL_EQ_MASK_OFF: usize = 24;
pub(super) const GEN_COL_LANE_OFF: usize = 32;
}
#[derive(Copy, Clone)]
struct WindowReader {
bytes: *const [u8],
base: *const u8,
gen_col_pos: usize,
orig_line_exc_pos: usize,
orig_col_exc_pos: usize,
gen_line_exc_pos: usize,
src_idx_mask: *const u8,
src_idx_exc_pos: usize,
count: u8,
flags: u8,
gen_line_exc_next_idx: u8,
delta_idx: u8,
}
impl WindowReader {
const DANGLING: WindowReader = WindowReader {
bytes: ptr::slice_from_raw_parts(ptr::null(), 0),
base: ptr::null(),
gen_col_pos: 0,
orig_line_exc_pos: 0,
orig_col_exc_pos: 0,
gen_line_exc_pos: 0,
src_idx_mask: ptr::null(),
src_idx_exc_pos: 0,
count: 0,
flags: 0,
gen_line_exc_next_idx: 0,
delta_idx: 0,
};
#[inline]
fn bytes<'a>(&self) -> &'a [u8] {
unsafe { &*self.bytes }
}
fn parse(&mut self, bytes: &[u8], start: usize) {
let b = unsafe { bytes.as_ptr().add(start) };
self.bytes = std::ptr::from_ref::<[u8]>(bytes);
self.base = b;
self.count = unsafe { *b.add(win_hdr::COUNT_OFF) }.min(SYNC_INTERVAL as u8);
let flags = unsafe { *b.add(win_hdr::FLAGS_OFF) };
self.flags = flags;
self.delta_idx = 0;
let gen_col_len: usize =
unsafe { u16::from_ne_bytes(*b.add(win_hdr::GEN_COL_LEN_OFF).cast::<[u8; 2]>()) }
as usize;
let orig_line_len: usize =
unsafe { u16::from_ne_bytes(*b.add(win_hdr::ORIG_LINE_LEN_OFF).cast::<[u8; 2]>()) }
as usize;
let orig_col_len: usize =
unsafe { u16::from_ne_bytes(*b.add(win_hdr::ORIG_COL_LEN_OFF).cast::<[u8; 2]>()) }
as usize;
self.gen_col_pos = start + win_hdr::GEN_COL_LANE_OFF;
self.orig_line_exc_pos = self.gen_col_pos + gen_col_len;
self.orig_col_exc_pos = self.orig_line_exc_pos + orig_line_len;
let mut pos = self.orig_col_exc_pos + orig_col_len;
self.gen_line_exc_next_idx = 0xFF;
if flags != 0 {
if flags & FLAG_HAS_GEN_LINE_EXCEPTIONS != 0 && pos < bytes.len() {
self.gen_line_exc_pos = pos;
self.gen_line_exc_next_idx = bytes[pos];
while pos < bytes.len() && bytes[pos] != 0xFF {
pos += 1;
let _ = read_varint(bytes, &mut pos);
}
pos += 1;
}
if flags & FLAG_HAS_SRC_IDX != 0 {
self.src_idx_mask = unsafe { bytes.as_ptr().add(pos) };
pos += 8;
self.src_idx_exc_pos = pos;
}
}
}
#[inline]
fn done(&self) -> bool {
self.delta_idx + 1 >= self.count
}
fn next(&mut self, state: &mut State) {
let delta_idx = self.delta_idx;
self.delta_idx = delta_idx + 1;
let b = self.base;
let bytes = self.bytes();
let mut d_gen_line: i32 = if test_bit(
unsafe { b.add(win_hdr::GEN_LINE_MASK_OFF) },
delta_idx as usize,
) {
1
} else {
0
};
let d_gen_col = read_varint(bytes, &mut self.gen_col_pos);
let mut d_orig_line: i32 = if test_bit(
unsafe { b.add(win_hdr::ORIG_LINE_EQ_MASK_OFF) },
delta_idx as usize,
) {
d_gen_line
} else {
read_varint(bytes, &mut self.orig_line_exc_pos)
};
let d_orig_col: i32 = if test_bit(
unsafe { b.add(win_hdr::ORIG_COL_EQ_MASK_OFF) },
delta_idx as usize,
) {
d_gen_col
} else {
read_varint(bytes, &mut self.orig_col_exc_pos)
};
if self.flags != 0 {
self.next_rare(delta_idx, &mut d_gen_line, &mut d_orig_line, state);
}
if d_gen_line != 0 {
state.generated_line += d_gen_line;
state.generated_column = d_gen_col;
} else {
state.generated_column += d_gen_col;
}
state.original_line += d_orig_line;
state.original_column += d_orig_col;
}
#[cold]
fn next_rare(
&mut self,
delta_idx: u8,
d_gen_line: &mut i32,
d_orig_line: &mut i32,
state: &mut State,
) {
let bytes = self.bytes();
if self.gen_line_exc_next_idx == delta_idx {
let mut p = self.gen_line_exc_pos + 1;
*d_gen_line = read_varint(bytes, &mut p);
if test_bit(
unsafe { self.base.add(win_hdr::ORIG_LINE_EQ_MASK_OFF) },
delta_idx as usize,
) {
*d_orig_line = *d_gen_line;
}
self.gen_line_exc_pos = p;
self.gen_line_exc_next_idx = bytes[p];
}
if self.flags & FLAG_HAS_SRC_IDX != 0 && !test_bit(self.src_idx_mask, delta_idx as usize) {
state.source_index += read_varint(bytes, &mut self.src_idx_exc_pos);
}
}
}
pub(crate) struct FindCacheSlot {
data: *const u8,
sync_idx: u32,
decoded_count: u8,
reader: WindowReader,
decoded: [State; SYNC_INTERVAL],
}
impl Default for FindCacheSlot {
fn default() -> Self {
FindCacheSlot {
data: ptr::null(),
sync_idx: 0,
decoded_count: 0,
reader: WindowReader::DANGLING,
decoded: [State::default(); SYNC_INTERVAL],
}
}
}
#[derive(Copy, Clone)]
struct FindCacheKey {
data: *const u8,
sync_idx: u32,
}
impl Default for FindCacheKey {
fn default() -> Self {
FindCacheKey {
data: ptr::null(),
sync_idx: 0,
}
}
}
pub struct FindCache {
keys: [FindCacheKey; FindCache::SLOT_COUNT],
slots: [FindCacheSlot; FindCache::SLOT_COUNT],
next_victim: u8,
}
impl FindCache {
pub const SLOT_COUNT: usize = 16;
pub fn invalidate(&mut self, data: *const u8) {
for (k, s) in self.keys.iter_mut().zip(self.slots.iter_mut()) {
if k.data == data {
k.data = ptr::null();
s.data = ptr::null();
}
}
}
pub fn invalidate_all(&mut self) {
for (k, s) in self.keys.iter_mut().zip(self.slots.iter_mut()) {
k.data = ptr::null();
s.data = ptr::null();
}
}
#[inline]
fn slot_for(&mut self, data: *const u8, sync_idx: u32) -> &mut FindCacheSlot {
for (i, k) in self.keys.iter().enumerate() {
if k.data == data && k.sync_idx == sync_idx {
return &mut self.slots[i];
}
}
for (i, k) in self.keys.iter().enumerate() {
if k.data.is_null() {
self.keys[i] = FindCacheKey { data, sync_idx };
return &mut self.slots[i];
}
}
let v = self.next_victim as usize;
self.next_victim = ((v + 1) & (Self::SLOT_COUNT - 1)) as u8;
self.keys[v] = FindCacheKey { data, sync_idx };
&mut self.slots[v]
}
}
impl Default for FindCache {
fn default() -> Self {
FindCache {
keys: [FindCacheKey::default(); FindCache::SLOT_COUNT],
slots: core::array::from_fn(|_| FindCacheSlot::default()),
next_victim: 0,
}
}
}
impl InternalSourceMap {
fn locate_window(self, target_line: i32, target_col: i32) -> Option<u32> {
let n_sync = self.sync_count();
if n_sync == 0 {
return None;
}
let mut lo: usize = 0;
let mut hi: usize = n_sync as usize;
while lo < hi {
let mid = lo + (hi - lo) / 2;
if self.sync_entry(mid).less_or_equal(target_line, target_col) {
lo = mid + 1;
} else {
hi = mid;
}
}
if lo == 0 {
return None;
}
Some(u32::try_from(lo - 1).expect("int cast"))
}
fn seed_window(self, sync_idx: u32, state: &mut State, reader: &mut WindowReader) {
let se = self.sync_entry(sync_idx as usize);
*state = se.to_state();
reader.parse(self.stream(), se.byte_offset as usize);
}
pub fn find_with_cache(
self,
line: Ordinal,
column: Ordinal,
set: &mut FindCache,
) -> Option<Mapping> {
let target_line = line.zero_based();
let target_col = column.zero_based();
let sync_idx = self.locate_window(target_line, target_col)?;
let cache = set.slot_for(self.data, sync_idx);
if cache.data != self.data || cache.sync_idx != sync_idx || cache.decoded_count == 0 {
self.seed_window(sync_idx, &mut cache.decoded[0], &mut cache.reader);
cache.data = self.data;
cache.sync_idx = sync_idx;
cache.decoded_count = 1;
}
{
let mut decoded_count = cache.decoded_count;
let mut state = cache.decoded[(decoded_count - 1) as usize];
while !cache.reader.done() && state.less_or_equal(target_line, target_col) {
cache.reader.next(&mut state);
cache.decoded[decoded_count as usize] = state;
decoded_count += 1;
}
cache.decoded_count = decoded_count;
}
let decoded = &cache.decoded[0..cache.decoded_count as usize];
let mut lo: usize = 0;
let mut hi: usize = decoded.len();
while lo < hi {
let mid = lo + (hi - lo) / 2;
if decoded[mid].less_or_equal(target_line, target_col) {
lo = mid + 1;
} else {
hi = mid;
}
}
if lo == 0 {
return None;
}
let best = decoded[lo - 1];
if best.generated_line != target_line {
return None;
}
Some(best.to_mapping())
}
pub fn find(self, line: Ordinal, column: Ordinal) -> Option<Mapping> {
let target_line = line.zero_based();
let target_col = column.zero_based();
let sync_idx = self.locate_window(target_line, target_col)?;
let mut state = State::default();
let mut reader = WindowReader::DANGLING;
self.seed_window(sync_idx, &mut state, &mut reader);
let mut best = state;
while !reader.done() {
let mut nxt = state;
reader.next(&mut nxt);
if !nxt.less_or_equal(target_line, target_col) {
break;
}
best = nxt;
state = nxt;
}
if best.generated_line != target_line {
return None;
}
Some(best.to_mapping())
}
}
pub struct Cursor {
map: InternalSourceMap,
state: State,
peek: Option<State>,
reader: WindowReader,
sync_idx: u32,
has_state: bool,
}
impl Cursor {
pub fn init(map: InternalSourceMap) -> Cursor {
Cursor {
map,
state: State::default(),
peek: None,
reader: WindowReader::DANGLING,
sync_idx: 0,
has_state: false,
}
}
pub fn move_to(&mut self, line: Ordinal, column: Ordinal) -> Option<Mapping> {
let target_line = line.zero_based();
let target_col = column.zero_based();
if !self.has_state || !self.state.less_or_equal(target_line, target_col) {
if !self.reseek(target_line, target_col) {
return None;
}
}
loop {
if let Some(p) = self.peek {
if !p.less_or_equal(target_line, target_col) {
break;
}
self.state = p;
self.peek = None;
}
let Some(nxt) = self.advance_one() else { break };
if nxt.less_or_equal(target_line, target_col) {
self.state = nxt;
} else {
self.peek = Some(nxt);
break;
}
}
if self.state.generated_line != target_line {
return None;
}
Some(self.state.to_mapping())
}
fn advance_one(&mut self) -> Option<State> {
if self.reader.done() {
let n_sync = self.map.sync_count();
if self.sync_idx + 1 >= n_sync {
return None;
}
self.sync_idx += 1;
let mut seed = State::default();
self.map
.seed_window(self.sync_idx, &mut seed, &mut self.reader);
return Some(seed);
}
let mut nxt = self.peek.unwrap_or(self.state);
self.reader.next(&mut nxt);
Some(nxt)
}
fn reseek(&mut self, target_line: i32, target_col: i32) -> bool {
let Some(idx) = self.map.locate_window(target_line, target_col) else {
self.has_state = false;
return false;
};
self.sync_idx = idx;
self.map.seed_window(idx, &mut self.state, &mut self.reader);
self.peek = None;
self.has_state = true;
true
}
}
impl InternalSourceMap {
pub fn cursor(self) -> Cursor {
Cursor::init(self)
}
pub fn append_vlq_to(self, out: &mut MutableString) {
let n_sync = self.sync_count();
let mut prev = SourceMapState::default();
let mut generated_line: i32 = 0;
let mut idx: u32 = 0;
while idx < n_sync {
let mut state = State::default();
let mut reader = WindowReader::DANGLING;
self.seed_window(idx, &mut state, &mut reader);
emit_vlq(&state, &mut prev, &mut generated_line, out);
while !reader.done() {
reader.next(&mut state);
emit_vlq(&state, &mut prev, &mut generated_line, out);
}
idx += 1;
}
}
}
fn emit_vlq(
state: &State,
prev: &mut SourceMapState,
generated_line: &mut i32,
out: &mut MutableString,
) {
while *generated_line < state.generated_line {
out.list.push(b';');
prev.generated_column = 0;
*generated_line += 1;
}
let current = SourceMapState {
generated_line: state.generated_line,
generated_column: state.generated_column,
source_index: state.source_index,
original_line: state.original_line,
original_column: state.original_column,
};
let last_byte: u8 = out.list.last().copied().unwrap_or(0);
append_mapping_to_buffer(out, last_byte, *prev, current);
*prev = current;
}
#[repr(C)]
pub struct Builder {
generated_line: i32,
pending_generated_line_delta: i32,
count: u32,
pending_n: u8,
sync_entries: Vec<SyncEntry>,
win_stream: Vec<u8>,
pending_generated_line: [i32; SYNC_INTERVAL],
pending_generated_column: [i32; SYNC_INTERVAL],
pending_source_index: [i32; SYNC_INTERVAL],
pending_original_line: [i32; SYNC_INTERVAL],
pending_original_column: [i32; SYNC_INTERVAL],
finalized: Option<MutableString>,
}
impl Default for Builder {
fn default() -> Self {
Builder {
generated_line: 0,
pending_generated_line_delta: 0,
count: 0,
pending_n: 0,
sync_entries: Vec::new(),
win_stream: Vec::new(),
pending_generated_line: [0; SYNC_INTERVAL],
pending_generated_column: [0; SYNC_INTERVAL],
pending_source_index: [0; SYNC_INTERVAL],
pending_original_line: [0; SYNC_INTERVAL],
pending_original_column: [0; SYNC_INTERVAL],
finalized: None,
}
}
}
impl Builder {
pub fn init() -> Builder {
Builder::default()
}
#[inline(always)]
pub fn append_line_separator(&mut self) {
self.pending_generated_line_delta += 1;
}
#[inline(always)]
pub fn append_mapping(&mut self, current: &SourceMapState) {
let generated_line = self.generated_line + self.pending_generated_line_delta;
self.generated_line = generated_line;
self.pending_generated_line_delta = 0;
let i = self.pending_n as usize;
debug_assert!(i < SYNC_INTERVAL);
unsafe {
*self.pending_generated_line.get_unchecked_mut(i) = generated_line;
*self.pending_generated_column.get_unchecked_mut(i) = current.generated_column;
*self.pending_source_index.get_unchecked_mut(i) = current.source_index;
*self.pending_original_line.get_unchecked_mut(i) = current.original_line;
*self.pending_original_column.get_unchecked_mut(i) = current.original_column;
}
self.pending_n += 1;
self.count += 1;
if self.pending_n as usize == SYNC_INTERVAL {
self.flush_window();
}
}
fn flush_window(&mut self) {
let n = self.pending_n;
if n == 0 {
return;
}
let nn = n as usize;
let gen_line = &self.pending_generated_line[..nn];
let gen_col = &self.pending_generated_column[..nn];
let src_idx = &self.pending_source_index[..nn];
let orig_line = &self.pending_original_line[..nn];
let orig_col = &self.pending_original_column[..nn];
debug_assert!(self.win_stream.len() <= u32::MAX as usize);
let start_off: u32 = self.win_stream.len() as u32;
self.sync_entries.push(SyncEntry {
generated_line: gen_line[0],
generated_column: gen_col[0],
byte_offset: start_off,
original_line: orig_line[0],
original_column: orig_col[0],
source_index: src_idx[0],
});
let n_deltas: usize = n as usize - 1;
let gen_col_base = win_hdr::GEN_COL_LANE_OFF;
let orig_line_base = gen_col_base + n_deltas * MAX_VARINT_LEN;
let orig_col_base = orig_line_base + n_deltas * MAX_VARINT_LEN;
let gen_line_base = orig_col_base + n_deltas * MAX_VARINT_LEN;
let src_idx_base = gen_line_base + n_deltas * (1 + MAX_VARINT_LEN) + 1;
let cap: usize = src_idx_base + 8 + n_deltas * MAX_VARINT_LEN;
let buf_ptr: *mut u8 = self.win_stream.reserve_spare(cap).as_mut_ptr().cast();
unsafe { buf_ptr.write_bytes(0, win_hdr::GEN_COL_LANE_OFF) };
unsafe { *buf_ptr.add(win_hdr::COUNT_OFF) = n };
unsafe { buf_ptr.add(src_idx_base).write_bytes(0, 8) };
let mut flags: u8 = 0;
let mut w_gen_col = gen_col_base;
let mut w_orig_line = orig_line_base;
let mut w_orig_col = orig_col_base;
let mut w_gen_line = gen_line_base;
let mut w_src_idx = src_idx_base + 8;
for k in 0..n_deltas {
let d_gen_line = gen_line[k + 1] - gen_line[k];
let d_gen_col = if d_gen_line != 0 {
gen_col[k + 1]
} else {
gen_col[k + 1] - gen_col[k]
};
let d_orig_line = orig_line[k + 1] - orig_line[k];
let d_orig_col = orig_col[k + 1] - orig_col[k];
let d_src_idx = src_idx[k + 1] - src_idx[k];
let bit = 1u8 << (k & 7);
if d_gen_line >= 1 {
unsafe { *buf_ptr.add(win_hdr::GEN_LINE_MASK_OFF + (k >> 3)) |= bit };
}
w_gen_col += write_varint(unsafe { buf_ptr.add(w_gen_col) }, d_gen_col);
if d_orig_line == d_gen_line {
unsafe { *buf_ptr.add(win_hdr::ORIG_LINE_EQ_MASK_OFF + (k >> 3)) |= bit };
} else {
w_orig_line += write_varint(unsafe { buf_ptr.add(w_orig_line) }, d_orig_line);
}
if d_orig_col == d_gen_col {
unsafe { *buf_ptr.add(win_hdr::ORIG_COL_EQ_MASK_OFF + (k >> 3)) |= bit };
} else {
w_orig_col += write_varint(unsafe { buf_ptr.add(w_orig_col) }, d_orig_col);
}
if d_gen_line > 1 || d_gen_line < 0 {
flags |= FLAG_HAS_GEN_LINE_EXCEPTIONS;
unsafe { *buf_ptr.add(w_gen_line) = k as u8 };
w_gen_line += 1;
w_gen_line += write_varint(unsafe { buf_ptr.add(w_gen_line) }, d_gen_line);
}
if d_src_idx == 0 {
unsafe { *buf_ptr.add(src_idx_base + (k >> 3)) |= bit };
} else {
flags |= FLAG_HAS_SRC_IDX;
w_src_idx += write_varint(unsafe { buf_ptr.add(w_src_idx) }, d_src_idx);
}
}
if flags & FLAG_HAS_GEN_LINE_EXCEPTIONS != 0 {
unsafe { *buf_ptr.add(w_gen_line) = 0xFF };
w_gen_line += 1;
}
unsafe { *buf_ptr.add(win_hdr::FLAGS_OFF) = flags };
let gen_col_len = w_gen_col - gen_col_base;
let orig_line_len = w_orig_line - orig_line_base;
let orig_col_len = w_orig_col - orig_col_base;
let gen_line_len = w_gen_line - gen_line_base;
let src_idx_len = if flags & FLAG_HAS_SRC_IDX != 0 {
w_src_idx - src_idx_base } else {
0
};
debug_assert!(gen_col_len <= u16::MAX as usize);
debug_assert!(orig_line_len <= u16::MAX as usize);
debug_assert!(orig_col_len <= u16::MAX as usize);
unsafe {
buf_ptr
.add(win_hdr::GEN_COL_LEN_OFF)
.cast::<[u8; 2]>()
.write_unaligned((gen_col_len as u16).to_ne_bytes());
buf_ptr
.add(win_hdr::ORIG_LINE_LEN_OFF)
.cast::<[u8; 2]>()
.write_unaligned((orig_line_len as u16).to_ne_bytes());
buf_ptr
.add(win_hdr::ORIG_COL_LEN_OFF)
.cast::<[u8; 2]>()
.write_unaligned((orig_col_len as u16).to_ne_bytes());
}
let mut w = gen_col_base + gen_col_len;
unsafe {
ptr::copy(buf_ptr.add(orig_line_base), buf_ptr.add(w), orig_line_len);
w += orig_line_len;
ptr::copy(buf_ptr.add(orig_col_base), buf_ptr.add(w), orig_col_len);
w += orig_col_len;
ptr::copy(buf_ptr.add(gen_line_base), buf_ptr.add(w), gen_line_len);
w += gen_line_len;
ptr::copy(buf_ptr.add(src_idx_base), buf_ptr.add(w), src_idx_len);
w += src_idx_len;
}
debug_assert!(w <= cap);
unsafe { bun_core::vec::commit_spare(&mut self.win_stream, w) };
self.pending_n = 0;
}
pub fn finalize(&mut self) -> &mut MutableString {
if self.finalized.is_none() {
self.flush_window();
let sync_bytes = self.sync_entries.len() * size_of::<SyncEntry>();
let stream_offset: u32 = u32::try_from(HEADER_SIZE + sync_bytes).expect("int cast");
let total: usize = stream_offset as usize + self.win_stream.len() + STREAM_TAIL_PAD;
let mut out = MutableString::init_empty();
let blob = unsafe { out.list.writable_slice_exact(total) };
blob[0..24].fill(0);
blob[24..28].copy_from_slice(
&u32::try_from(self.sync_entries.len())
.expect("int cast")
.to_ne_bytes(),
);
blob[28..32].copy_from_slice(&stream_offset.to_ne_bytes());
if sync_bytes > 0 {
let src = unsafe {
core::slice::from_raw_parts(self.sync_entries.as_ptr().cast::<u8>(), sync_bytes)
};
blob[HEADER_SIZE..HEADER_SIZE + sync_bytes].copy_from_slice(src);
}
blob[stream_offset as usize..stream_offset as usize + self.win_stream.len()]
.copy_from_slice(&self.win_stream);
blob[total - STREAM_TAIL_PAD..total].fill(0);
self.win_stream = Vec::new();
self.sync_entries = Vec::new();
self.finalized = Some(out);
}
self.finalized.as_mut().unwrap()
}
pub fn finalize_take(&mut self) -> MutableString {
let _ = self.finalize();
self.finalized.take().unwrap()
}
}
#[derive(Debug, Copy, Clone)]
pub enum FromVlqError {
InvalidSourceMap,
}
impl From<FromVlqError> for bun_core::Error {
fn from(_e: FromVlqError) -> Self {
bun_core::err!("InvalidSourceMap")
}
}
pub fn from_vlq(vlq: &[u8], input_line_count_hint: u32) -> Result<Box<[u8]>, FromVlqError> {
let mut builder = Builder::init();
let mut generated_column: i32 = 0;
let mut source_index: i32 = 0;
let mut original_line: i32 = 0;
let mut original_column: i32 = 0;
let mut max_original_line: i32 = 0;
let mut remain = vlq;
while !remain.is_empty() {
if remain[0] == b';' {
generated_column = 0;
while !remain.is_empty() && remain[0] == b';' {
builder.append_line_separator();
remain = &remain[1..];
}
if remain.is_empty() {
break;
}
}
let gc = vlq_decode(remain, 0);
if gc.start == 0 {
return Err(FromVlqError::InvalidSourceMap);
}
generated_column += gc.value;
remain = &remain[gc.start as usize..];
if remain.is_empty() || remain[0] == b',' || remain[0] == b';' {
if !remain.is_empty() && remain[0] == b',' {
remain = &remain[1..];
}
continue;
}
let si = vlq_decode(remain, 0);
if si.start == 0 {
return Err(FromVlqError::InvalidSourceMap);
}
source_index += si.value;
remain = &remain[si.start as usize..];
let ol = vlq_decode(remain, 0);
if ol.start == 0 {
return Err(FromVlqError::InvalidSourceMap);
}
original_line += ol.value;
remain = &remain[ol.start as usize..];
let oc = vlq_decode(remain, 0);
if oc.start == 0 {
return Err(FromVlqError::InvalidSourceMap);
}
original_column += oc.value;
remain = &remain[oc.start as usize..];
if !remain.is_empty() && remain[0] != b',' && remain[0] != b';' {
let ni = vlq_decode(remain, 0);
if ni.start == 0 {
return Err(FromVlqError::InvalidSourceMap);
}
remain = &remain[ni.start as usize..];
}
if !remain.is_empty() && remain[0] == b',' {
remain = &remain[1..];
}
max_original_line = max_original_line.max(original_line);
builder.append_mapping(&SourceMapState {
generated_column,
source_index,
original_line,
original_column,
..SourceMapState::default()
});
}
let mapping_count: u64 = builder.count as u64;
let out = builder.finalize();
let blob = out.list.as_mut_slice();
let total_len: u64 = blob.len() as u64;
let input_lines: u64 =
(input_line_count_hint as u64).max(u64::try_from(max_original_line).expect("int cast") + 1);
blob[0..8].copy_from_slice(&total_len.to_ne_bytes());
blob[8..16].copy_from_slice(&mapping_count.to_ne_bytes());
blob[16..24].copy_from_slice(&input_lines.to_ne_bytes());
let owned = core::mem::take(&mut out.list).into_boxed_slice();
builder.finalized = None;
Ok(owned)
}