@@ -478,7 +478,7 @@ bool is_value_field(const upb_fielddef* f) {
478
478
upb_fielddef_isstring (f );
479
479
}
480
480
481
- MessageLayout * create_layout (const Descriptor * desc ) {
481
+ void create_layout (Descriptor * desc ) {
482
482
const upb_msgdef * msgdef = desc -> msgdef ;
483
483
MessageLayout * layout = ALLOC (MessageLayout );
484
484
int nfields = upb_msgdef_numfields (msgdef );
@@ -488,7 +488,10 @@ MessageLayout* create_layout(const Descriptor* desc) {
488
488
size_t off = 0 ;
489
489
size_t hasbit = 0 ;
490
490
491
+ layout -> empty_template = NULL ;
491
492
layout -> desc = desc ;
493
+ desc -> layout = layout ;
494
+
492
495
layout -> fields = ALLOC_N (MessageField , nfields );
493
496
layout -> oneofs = NULL ;
494
497
@@ -514,14 +517,49 @@ MessageLayout* create_layout(const Descriptor* desc) {
514
517
515
518
off = align_up_to (off , sizeof (VALUE ));
516
519
layout -> value_offset = off ;
520
+ layout -> repeated_count = 0 ;
521
+ layout -> map_count = 0 ;
517
522
layout -> value_count = 0 ;
518
523
519
- // Place all (non-oneof) VALUE fields first.
524
+ // Place all VALUE fields for repeated fields.
525
+ for (upb_msg_field_begin (& it , msgdef );
526
+ !upb_msg_field_done (& it );
527
+ upb_msg_field_next (& it )) {
528
+ const upb_fielddef * field = upb_msg_iter_field (& it );
529
+ if (upb_fielddef_containingoneof (field ) || !upb_fielddef_isseq (field ) ||
530
+ upb_fielddef_ismap (field )) {
531
+ continue ;
532
+ }
533
+
534
+ layout -> fields [upb_fielddef_index (field )].offset = off ;
535
+ off += sizeof (VALUE );
536
+ layout -> repeated_count ++ ;
537
+ }
538
+
539
+ // Place all VALUE fields for map fields.
540
+ for (upb_msg_field_begin (& it , msgdef );
541
+ !upb_msg_field_done (& it );
542
+ upb_msg_field_next (& it )) {
543
+ const upb_fielddef * field = upb_msg_iter_field (& it );
544
+ if (upb_fielddef_containingoneof (field ) || !upb_fielddef_isseq (field ) ||
545
+ !upb_fielddef_ismap (field )) {
546
+ continue ;
547
+ }
548
+
549
+ layout -> fields [upb_fielddef_index (field )].offset = off ;
550
+ off += sizeof (VALUE );
551
+ layout -> map_count ++ ;
552
+ }
553
+
554
+ layout -> value_count = layout -> repeated_count + layout -> map_count ;
555
+
556
+ // Next place all other (non-oneof) VALUE fields.
520
557
for (upb_msg_field_begin (& it , msgdef );
521
558
!upb_msg_field_done (& it );
522
559
upb_msg_field_next (& it )) {
523
560
const upb_fielddef * field = upb_msg_iter_field (& it );
524
- if (upb_fielddef_containingoneof (field ) || !is_value_field (field )) {
561
+ if (upb_fielddef_containingoneof (field ) || !is_value_field (field ) ||
562
+ upb_fielddef_isseq (field )) {
525
563
continue ;
526
564
}
527
565
@@ -600,10 +638,19 @@ MessageLayout* create_layout(const Descriptor* desc) {
600
638
layout -> size = off ;
601
639
layout -> msgdef = msgdef ;
602
640
603
- return layout ;
641
+ // Create the empty message template.
642
+ layout -> empty_template = ALLOC_N (char , layout -> size );
643
+ memset (layout -> empty_template , 0 , layout -> size );
644
+
645
+ for (upb_msg_field_begin (& it , layout -> msgdef );
646
+ !upb_msg_field_done (& it );
647
+ upb_msg_field_next (& it )) {
648
+ layout_clear (layout , layout -> empty_template , upb_msg_iter_field (& it ));
649
+ }
604
650
}
605
651
606
652
void free_layout (MessageLayout * layout ) {
653
+ xfree (layout -> empty_template );
607
654
xfree (layout -> fields );
608
655
xfree (layout -> oneofs );
609
656
xfree (layout );
@@ -896,14 +943,16 @@ void layout_set(MessageLayout* layout,
896
943
}
897
944
}
898
945
899
- void layout_init (MessageLayout * layout ,
900
- void * storage ) {
946
+ void layout_init (MessageLayout * layout , void * storage ) {
947
+ VALUE * value = (VALUE * )CHARPTR_AT (storage , layout -> value_offset );
948
+ int i ;
901
949
902
- upb_msg_field_iter it ;
903
- for (upb_msg_field_begin (& it , layout -> msgdef );
904
- !upb_msg_field_done (& it );
905
- upb_msg_field_next (& it )) {
906
- layout_clear (layout , storage , upb_msg_iter_field (& it ));
950
+ for (i = 0 ; i < layout -> repeated_count ; i ++ , value ++ ) {
951
+ * value = RepeatedField_new_this_type (* value );
952
+ }
953
+
954
+ for (i = 0 ; i < layout -> map_count ; i ++ , value ++ ) {
955
+ * value = Map_new_this_type (* value );
907
956
}
908
957
}
909
958
0 commit comments