@@ -545,41 +545,30 @@ impl ParentState<'_> {
545
545
metadata_builder,
546
546
fields,
547
547
field_name,
548
+ object_start_offset,
548
549
..
549
550
} => {
550
551
let field_id = metadata_builder. upsert_field_name ( field_name) ;
551
- fields. insert ( field_id, starting_offset) ;
552
+ let shifted_start_offset = starting_offset - * object_start_offset;
553
+ fields. insert ( field_id, shifted_start_offset) ;
552
554
}
553
555
}
554
556
}
555
557
556
- // returns the beginning offset of buffer for the parent if it is object builder, else 0.
557
- // for object builder will reuse the buffer from the parent, this is needed for `finish`
558
- // which needs the relative offset from the current variant.
559
- fn object_start_offset ( & self ) -> usize {
560
- match self {
561
- ParentState :: Object {
562
- object_start_offset,
563
- ..
564
- } => * object_start_offset,
565
- _ => 0 ,
566
- }
567
- }
568
-
569
558
/// Return mutable references to the buffer and metadata builder that this
570
559
/// parent state is using.
571
560
fn buffer_and_metadata_builder ( & mut self ) -> ( & mut ValueBuffer , & mut MetadataBuilder ) {
572
561
match self {
573
562
ParentState :: Variant {
574
563
buffer,
575
564
metadata_builder,
576
- } => ( buffer , metadata_builder ) ,
577
- ParentState :: List {
565
+ }
566
+ | ParentState :: List {
578
567
buffer,
579
568
metadata_builder,
580
569
..
581
- } => ( buffer , metadata_builder ) ,
582
- ParentState :: Object {
570
+ }
571
+ | ParentState :: Object {
583
572
buffer,
584
573
metadata_builder,
585
574
..
@@ -590,9 +579,9 @@ impl ParentState<'_> {
590
579
// return the offset of the underlying buffer at the time of calling this method.
591
580
fn buffer_current_offset ( & self ) -> usize {
592
581
match self {
593
- ParentState :: Variant { buffer, .. } => buffer . offset ( ) ,
594
- ParentState :: Object { buffer, .. } => buffer . offset ( ) ,
595
- ParentState :: List { buffer, .. } => buffer. offset ( ) ,
582
+ ParentState :: Variant { buffer, .. }
583
+ | ParentState :: Object { buffer, .. }
584
+ | ParentState :: List { buffer, .. } => buffer. offset ( ) ,
596
585
}
597
586
}
598
587
}
@@ -1043,11 +1032,10 @@ impl<'a> ListBuilder<'a> {
1043
1032
let offset_size = int_size ( data_size) ;
1044
1033
1045
1034
// Get parent's buffer
1046
- let offset_shift = self . parent_state . object_start_offset ( ) ;
1047
1035
let parent_buffer = self . parent_state . buffer ( ) ;
1048
1036
// as object builder has been reused the parent buffer,
1049
1037
// we need to shift the offset by the starting offset of the parent object
1050
- let starting_offset = parent_buffer. offset ( ) - offset_shift ;
1038
+ let starting_offset = parent_buffer. offset ( ) ;
1051
1039
1052
1040
// Write header
1053
1041
let header = array_header ( is_large, offset_size) ;
@@ -1217,7 +1205,10 @@ impl<'a> ObjectBuilder<'a> {
1217
1205
1218
1206
// Shift existing data to make room for the header
1219
1207
let buffer = parent_buffer. inner_mut ( ) ;
1220
- buffer. splice ( starting_offset..starting_offset, vec ! [ 0u8 ; header_size] ) ;
1208
+ buffer. splice (
1209
+ starting_offset..starting_offset,
1210
+ std:: iter:: repeat_n ( 0u8 , header_size) ,
1211
+ ) ;
1221
1212
1222
1213
// Write header at the original start position
1223
1214
let mut header_pos = starting_offset;
@@ -1237,15 +1228,15 @@ impl<'a> ObjectBuilder<'a> {
1237
1228
}
1238
1229
1239
1230
// Write field IDs
1240
- for ( & field_id, _ ) in & self . fields {
1241
- let id_bytes = ( field_id as usize ) . to_le_bytes ( ) ;
1231
+ for field_id in self . fields . keys ( ) {
1232
+ let id_bytes = field_id. to_le_bytes ( ) ;
1242
1233
buffer[ header_pos..header_pos + id_size as usize ]
1243
1234
. copy_from_slice ( & id_bytes[ ..id_size as usize ] ) ;
1244
1235
header_pos += id_size as usize ;
1245
1236
}
1246
1237
1247
1238
// Write field offsets (adjusted for header)
1248
- for ( _ , & relative_offset) in & self . fields {
1239
+ for relative_offset in self . fields . values ( ) {
1249
1240
let offset_bytes = relative_offset. to_le_bytes ( ) ;
1250
1241
buffer[ header_pos..header_pos + offset_size as usize ]
1251
1242
. copy_from_slice ( & offset_bytes[ ..offset_size as usize ] ) ;
@@ -1257,9 +1248,7 @@ impl<'a> ObjectBuilder<'a> {
1257
1248
buffer[ header_pos..header_pos + offset_size as usize ]
1258
1249
. copy_from_slice ( & data_size_bytes[ ..offset_size as usize ] ) ;
1259
1250
1260
- let start_offset_shift = self . parent_state . object_start_offset ( ) ;
1261
- self . parent_state
1262
- . finish ( starting_offset - start_offset_shift) ;
1251
+ self . parent_state . finish ( starting_offset) ;
1263
1252
1264
1253
// mark that this object has been finished
1265
1254
self . has_been_finished = true ;
0 commit comments