diff --git a/crates/oxc_ast_macros/src/generated/structs.rs b/crates/oxc_ast_macros/src/generated/structs.rs index 85b5a0fd7a814..cfcf2ffcfb247 100644 --- a/crates/oxc_ast_macros/src/generated/structs.rs +++ b/crates/oxc_ast_macros/src/generated/structs.rs @@ -96,7 +96,7 @@ pub static STRUCTS: phf::Map<&'static str, StructDetails> = ::phf::Map { ("DebuggerStatement", StructDetails { field_order: None }), ("CommentNodeId", StructDetails { field_order: None }), ("Character", StructDetails { field_order: Some(&[0, 2, 1]) }), - ("RawTransferMetadata2", StructDetails { field_order: Some(&[1, 2, 0]) }), + ("RawTransferMetadata2", StructDetails { field_order: Some(&[0, 3, 1, 2]) }), ("StringLiteral", StructDetails { field_order: None }), ("TSInferType", StructDetails { field_order: None }), ("TSThisType", StructDetails { field_order: None }), @@ -243,7 +243,7 @@ pub static STRUCTS: phf::Map<&'static str, StructDetails> = ::phf::Map { ("SpreadElement", StructDetails { field_order: None }), ("MetaProperty", StructDetails { field_order: None }), ("TSIntersectionType", StructDetails { field_order: None }), - ("RawTransferMetadata", StructDetails { field_order: Some(&[1, 2, 0]) }), + ("RawTransferMetadata", StructDetails { field_order: Some(&[0, 3, 1, 2]) }), ("ConditionalExpression", StructDetails { field_order: None }), ("PrivateInExpression", StructDetails { field_order: None }), ("TSStringKeyword", StructDetails { field_order: None }), diff --git a/crates/oxc_linter/src/generated/assert_layouts.rs b/crates/oxc_linter/src/generated/assert_layouts.rs index aad5d6477412f..24c939614d1c1 100644 --- a/crates/oxc_linter/src/generated/assert_layouts.rs +++ b/crates/oxc_linter/src/generated/assert_layouts.rs @@ -11,20 +11,22 @@ use crate::*; const _: () = { // Padding: 3 bytes assert!(size_of::() == 16); - assert!(align_of::() == 8); - assert!(offset_of!(RawTransferMetadata2, data_offset) == 8); + assert!(align_of::() == 4); + assert!(offset_of!(RawTransferMetadata2, data_offset) == 0); assert!(offset_of!(RawTransferMetadata2, is_ts) == 12); - assert!(offset_of!(RawTransferMetadata2, _padding) == 0); + assert!(offset_of!(RawTransferMetadata2, source_len) == 4); + assert!(offset_of!(RawTransferMetadata2, _padding) == 8); }; #[cfg(target_pointer_width = "32")] const _: () = { // Padding: 3 bytes assert!(size_of::() == 16); - assert!(align_of::() == 8); - assert!(offset_of!(RawTransferMetadata2, data_offset) == 8); + assert!(align_of::() == 4); + assert!(offset_of!(RawTransferMetadata2, data_offset) == 0); assert!(offset_of!(RawTransferMetadata2, is_ts) == 12); - assert!(offset_of!(RawTransferMetadata2, _padding) == 0); + assert!(offset_of!(RawTransferMetadata2, source_len) == 4); + assert!(offset_of!(RawTransferMetadata2, _padding) == 8); }; #[cfg(not(any(target_pointer_width = "64", target_pointer_width = "32")))] diff --git a/crates/oxc_linter/src/lib.rs b/crates/oxc_linter/src/lib.rs index 2c6e451992838..603c8e15b84f8 100644 --- a/crates/oxc_linter/src/lib.rs +++ b/crates/oxc_linter/src/lib.rs @@ -294,8 +294,10 @@ struct RawTransferMetadata2 { pub data_offset: u32, /// `true` if AST is TypeScript. pub is_ts: bool, + /// Offset of `u32` containing source text length within buffer. + pub(crate) source_len: u32, /// Padding to pad struct to size 16. - pub(crate) _padding: u64, + pub(crate) _padding: u32, } #[cfg(all(feature = "oxlint2", not(feature = "disable_oxlint2")))] @@ -305,7 +307,7 @@ use RawTransferMetadata2 as RawTransferMetadata; #[expect(dead_code)] impl RawTransferMetadata { pub fn new(data_offset: u32, is_ts: bool) -> Self { - Self { data_offset, is_ts, _padding: 0 } + Self { data_offset, is_ts, source_len: 0, _padding: 0 } } } diff --git a/napi/parser/generated/constants.js b/napi/parser/generated/constants.js index ca0ac441bd625..3e3821fed92ee 100644 --- a/napi/parser/generated/constants.js +++ b/napi/parser/generated/constants.js @@ -3,8 +3,9 @@ const BUFFER_SIZE = 2147483616, BUFFER_ALIGN = 4294967296, - DATA_POINTER_POS_32 = 536870902, + DATA_POINTER_POS_32 = 536870900, IS_TS_FLAG_POS = 2147483612, + SOURCE_LEN_POS_32 = 536870901, PROGRAM_OFFSET = 0; module.exports = { @@ -12,5 +13,6 @@ module.exports = { BUFFER_ALIGN, DATA_POINTER_POS_32, IS_TS_FLAG_POS, + SOURCE_LEN_POS_32, PROGRAM_OFFSET, }; diff --git a/napi/parser/generated/deserialize/js.js b/napi/parser/generated/deserialize/js.js index f5b9ed3fec96e..b2241635db25c 100644 --- a/napi/parser/generated/deserialize/js.js +++ b/napi/parser/generated/deserialize/js.js @@ -20,7 +20,7 @@ function deserialize(buffer, sourceTextInput, sourceByteLenInput) { sourceByteLen = sourceByteLenInput; sourceIsAscii = sourceText.length === sourceByteLen; - const data = deserializeRawTransferData(uint32[536870902]); + const data = deserializeRawTransferData(uint32[536870900]); uint8 = uint32 = @@ -5238,16 +5238,16 @@ function deserializeBoxTSExternalModuleReference(pos) { return deserializeTSExternalModuleReference(uint32[pos >> 2]); } -function deserializeU64(pos) { - const pos32 = pos >> 2; - return uint32[pos32] + uint32[pos32 + 1] * 4294967296; -} - function deserializeOptionNameSpan(pos) { if (uint32[(pos + 8) >> 2] === 0 && uint32[(pos + 12) >> 2] === 0) return null; return deserializeNameSpan(pos); } +function deserializeU64(pos) { + const pos32 = pos >> 2; + return uint32[pos32] + uint32[pos32 + 1] * 4294967296; +} + function deserializeOptionU64(pos) { if (uint8[pos] === 0) return null; return deserializeU64(pos + 8); diff --git a/napi/parser/generated/deserialize/ts.js b/napi/parser/generated/deserialize/ts.js index 63081411a7019..92d782c1b4e9c 100644 --- a/napi/parser/generated/deserialize/ts.js +++ b/napi/parser/generated/deserialize/ts.js @@ -20,7 +20,7 @@ function deserialize(buffer, sourceTextInput, sourceByteLenInput) { sourceByteLen = sourceByteLenInput; sourceIsAscii = sourceText.length === sourceByteLen; - const data = deserializeRawTransferData(uint32[536870902]); + const data = deserializeRawTransferData(uint32[536870900]); uint8 = uint32 = @@ -5369,16 +5369,16 @@ function deserializeBoxTSExternalModuleReference(pos) { return deserializeTSExternalModuleReference(uint32[pos >> 2]); } -function deserializeU64(pos) { - const pos32 = pos >> 2; - return uint32[pos32] + uint32[pos32 + 1] * 4294967296; -} - function deserializeOptionNameSpan(pos) { if (uint32[(pos + 8) >> 2] === 0 && uint32[(pos + 12) >> 2] === 0) return null; return deserializeNameSpan(pos); } +function deserializeU64(pos) { + const pos32 = pos >> 2; + return uint32[pos32] + uint32[pos32 + 1] * 4294967296; +} + function deserializeOptionU64(pos) { if (uint8[pos] === 0) return null; return deserializeU64(pos + 8); diff --git a/napi/parser/generated/lazy/constructors.js b/napi/parser/generated/lazy/constructors.js index 193dc87dc223b..b21fab8d4709a 100644 --- a/napi/parser/generated/lazy/constructors.js +++ b/napi/parser/generated/lazy/constructors.js @@ -13752,17 +13752,17 @@ function constructBoxTSExternalModuleReference(pos, ast) { return new TSExternalModuleReference(ast.buffer.uint32[pos >> 2], ast); } +function constructOptionNameSpan(pos, ast) { + if (ast.buffer.uint32[(pos + 8) >> 2] === 0 && ast.buffer.uint32[(pos + 12) >> 2] === 0) return null; + return new NameSpan(pos, ast); +} + function constructU64(pos, ast) { const { uint32 } = ast.buffer, pos32 = pos >> 2; return uint32[pos32] + uint32[pos32 + 1] * 4294967296; } -function constructOptionNameSpan(pos, ast) { - if (ast.buffer.uint32[(pos + 8) >> 2] === 0 && ast.buffer.uint32[(pos + 12) >> 2] === 0) return null; - return new NameSpan(pos, ast); -} - function constructOptionU64(pos, ast) { if (ast.buffer[pos] === 0) return null; return constructU64(pos + 8, ast); diff --git a/napi/parser/src/generated/assert_layouts.rs b/napi/parser/src/generated/assert_layouts.rs index 5a11c6433f120..2e52785aa294c 100644 --- a/napi/parser/src/generated/assert_layouts.rs +++ b/napi/parser/src/generated/assert_layouts.rs @@ -19,10 +19,11 @@ const _: () = { // Padding: 3 bytes assert!(size_of::() == 16); - assert!(align_of::() == 8); - assert!(offset_of!(RawTransferMetadata, data_offset) == 8); + assert!(align_of::() == 4); + assert!(offset_of!(RawTransferMetadata, data_offset) == 0); assert!(offset_of!(RawTransferMetadata, is_ts) == 12); - assert!(offset_of!(RawTransferMetadata, _padding) == 0); + assert!(offset_of!(RawTransferMetadata, source_len) == 4); + assert!(offset_of!(RawTransferMetadata, _padding) == 8); // Padding: 7 bytes assert!(size_of::() == 80); @@ -77,10 +78,11 @@ const _: () = { // Padding: 3 bytes assert!(size_of::() == 16); - assert!(align_of::() == 8); - assert!(offset_of!(RawTransferMetadata, data_offset) == 8); + assert!(align_of::() == 4); + assert!(offset_of!(RawTransferMetadata, data_offset) == 0); assert!(offset_of!(RawTransferMetadata, is_ts) == 12); - assert!(offset_of!(RawTransferMetadata, _padding) == 0); + assert!(offset_of!(RawTransferMetadata, source_len) == 4); + assert!(offset_of!(RawTransferMetadata, _padding) == 8); // Padding: 3 bytes assert!(size_of::() == 44); diff --git a/napi/parser/src/raw_transfer_types.rs b/napi/parser/src/raw_transfer_types.rs index c724211cb1bee..3ed35bd8e254a 100644 --- a/napi/parser/src/raw_transfer_types.rs +++ b/napi/parser/src/raw_transfer_types.rs @@ -36,13 +36,16 @@ pub struct RawTransferMetadata { pub data_offset: u32, /// `true` if AST is TypeScript. pub is_ts: bool, + /// Offset of `u32` containing source text length within buffer. + /// Not used in this implementation. Used by `napi/oxlint2`. + pub(crate) source_len: u32, /// Padding to pad struct to size 16. - pub(crate) _padding: u64, + pub(crate) _padding: u32, } impl RawTransferMetadata { pub fn new(data_offset: u32, is_ts: bool) -> Self { - Self { data_offset, is_ts, _padding: 0 } + Self { data_offset, is_ts, source_len: 0, _padding: 0 } } } diff --git a/tasks/ast_tools/src/generators/raw_transfer.rs b/tasks/ast_tools/src/generators/raw_transfer.rs index c0306bf267164..fce17b9c232d1 100644 --- a/tasks/ast_tools/src/generators/raw_transfer.rs +++ b/tasks/ast_tools/src/generators/raw_transfer.rs @@ -1007,6 +1007,8 @@ struct Constants { data_pointer_pos: u32, /// Offset within buffer of `bool` indicating if AST is TS or JS is_ts_pos: u32, + /// Offset within buffer of `u32` containing position of `u32` containing source text length + source_len_pos: u32, /// Offset of `Program` in buffer, relative to position of `RawTransferData` program_offset: u32, /// Size of `RawTransferData` in bytes @@ -1015,10 +1017,17 @@ struct Constants { /// Generate constants file. fn generate_constants(consts: Constants) -> (String, TokenStream) { - let Constants { buffer_size, data_pointer_pos, is_ts_pos, program_offset, raw_metadata_size } = - consts; + let Constants { + buffer_size, + data_pointer_pos, + is_ts_pos, + source_len_pos, + program_offset, + raw_metadata_size, + } = consts; let data_pointer_pos_32 = data_pointer_pos / 4; + let source_len_pos_32 = source_len_pos / 4; #[rustfmt::skip] let js_output = format!(" @@ -1026,6 +1035,7 @@ fn generate_constants(consts: Constants) -> (String, TokenStream) { BUFFER_ALIGN = {BLOCK_ALIGN}, DATA_POINTER_POS_32 = {data_pointer_pos_32}, IS_TS_FLAG_POS = {is_ts_pos}, + SOURCE_LEN_POS_32 = {source_len_pos_32}, PROGRAM_OFFSET = {program_offset}; module.exports = {{ @@ -1033,7 +1043,8 @@ fn generate_constants(consts: Constants) -> (String, TokenStream) { BUFFER_ALIGN, DATA_POINTER_POS_32, IS_TS_FLAG_POS, - PROGRAM_OFFSET + SOURCE_LEN_POS_32, + PROGRAM_OFFSET, }}; "); @@ -1066,6 +1077,7 @@ fn get_constants(schema: &Schema) -> Constants { let mut data_offset_field = None; let mut is_ts_field = None; + let mut source_len_field = None; for (field1, field2) in raw_metadata_struct.fields.iter().zip(&raw_metadata2_struct.fields) { assert_eq!(field1.name(), field2.name()); assert_eq!(field1.type_id, field2.type_id); @@ -1073,11 +1085,13 @@ fn get_constants(schema: &Schema) -> Constants { match field1.name() { "data_offset" => data_offset_field = Some(field1), "is_ts" => is_ts_field = Some(field1), + "source_len" => source_len_field = Some(field1), _ => {} } } let data_offset_field = data_offset_field.unwrap(); let is_ts_field = is_ts_field.unwrap(); + let source_len_field = source_len_field.unwrap(); let raw_metadata_size = raw_metadata_struct.layout_64().size; @@ -1093,6 +1107,7 @@ fn get_constants(schema: &Schema) -> Constants { let raw_metadata_pos = buffer_size - raw_metadata_size; let data_pointer_pos = raw_metadata_pos + data_offset_field.offset_64(); let is_ts_pos = raw_metadata_pos + is_ts_field.offset_64(); + let source_len_pos = raw_metadata_pos + source_len_field.offset_64(); let program_offset = schema .type_by_name("RawTransferData") @@ -1101,5 +1116,12 @@ fn get_constants(schema: &Schema) -> Constants { .field_by_name("program") .offset_64(); - Constants { buffer_size, data_pointer_pos, is_ts_pos, program_offset, raw_metadata_size } + Constants { + buffer_size, + data_pointer_pos, + is_ts_pos, + source_len_pos, + program_offset, + raw_metadata_size, + } }