@@ -766,58 +766,34 @@ static VALUE Message_CreateHash(const upb_Message* msg,
766766 if (!msg ) return Qnil ;
767767
768768 VALUE hash = rb_hash_new ();
769- int n = upb_MessageDef_FieldCount (m );
770- bool is_proto2 ;
771-
772- // We currently have a few behaviors that are specific to proto2.
773- // This is unfortunate, we should key behaviors off field attributes (like
774- // whether a field has presence), not proto2 vs. proto3. We should see if we
775- // can change this without breaking users.
776- is_proto2 = upb_MessageDef_Syntax (m ) == kUpb_Syntax_Proto2 ;
777-
778- for (int i = 0 ; i < n ; i ++ ) {
779- const upb_FieldDef * field = upb_MessageDef_Field (m , i );
780- TypeInfo type_info = TypeInfo_get (field );
781- upb_MessageValue msgval ;
782- VALUE msg_value ;
783- VALUE msg_key ;
784-
785- if (!is_proto2 && upb_FieldDef_IsSubMessage (field ) &&
786- !upb_FieldDef_IsRepeated (field ) &&
787- !upb_Message_HasFieldByDef (msg , field )) {
788- // TODO: Legacy behavior, remove when we fix the is_proto2 differences.
789- msg_key = ID2SYM (rb_intern (upb_FieldDef_Name (field )));
790- rb_hash_aset (hash , msg_key , Qnil );
791- continue ;
792- }
769+ size_t iter = kUpb_Message_Begin ;
770+ const upb_DefPool * pool = upb_FileDef_Pool (upb_MessageDef_File (m ));
771+ const upb_FieldDef * field ;
772+ upb_MessageValue val ;
793773
794- // Do not include fields that are not present (oneof or optional fields).
795- if (is_proto2 && upb_FieldDef_HasPresence (field ) &&
796- !upb_Message_HasFieldByDef (msg , field )) {
774+ while (upb_Message_Next (msg , m , pool , & field , & val , & iter )) {
775+ if (upb_FieldDef_IsExtension (field )) {
776+ // TODO: allow extensions once we have decided what naming scheme the
777+ // symbol should use. eg. :"[pkg.ext]"
797778 continue ;
798779 }
799780
800- msg_key = ID2SYM (rb_intern (upb_FieldDef_Name (field )));
801- msgval = upb_Message_GetFieldByDef (msg , field );
802-
803- // Proto2 omits empty map/repeated filds also.
781+ TypeInfo type_info = TypeInfo_get (field );
782+ VALUE msg_value ;
804783
805784 if (upb_FieldDef_IsMap (field )) {
806785 const upb_MessageDef * entry_m = upb_FieldDef_MessageSubDef (field );
807786 const upb_FieldDef * key_f = upb_MessageDef_FindFieldByNumber (entry_m , 1 );
808787 const upb_FieldDef * val_f = upb_MessageDef_FindFieldByNumber (entry_m , 2 );
809788 upb_CType key_type = upb_FieldDef_CType (key_f );
810- msg_value = Map_CreateHash (msgval .map_val , key_type , TypeInfo_get (val_f ));
789+ msg_value = Map_CreateHash (val .map_val , key_type , TypeInfo_get (val_f ));
811790 } else if (upb_FieldDef_IsRepeated (field )) {
812- if (is_proto2 &&
813- (!msgval .array_val || upb_Array_Size (msgval .array_val ) == 0 )) {
814- continue ;
815- }
816- msg_value = RepeatedField_CreateArray (msgval .array_val , type_info );
791+ msg_value = RepeatedField_CreateArray (val .array_val , type_info );
817792 } else {
818- msg_value = Scalar_CreateHash (msgval , type_info );
793+ msg_value = Scalar_CreateHash (val , type_info );
819794 }
820795
796+ VALUE msg_key = ID2SYM (rb_intern (upb_FieldDef_Name (field )));
821797 rb_hash_aset (hash , msg_key , msg_value );
822798 }
823799
0 commit comments