@@ -62,26 +62,19 @@ VALUE Message_alloc(VALUE klass) {
62
62
Descriptor * desc = ruby_to_Descriptor (descriptor );
63
63
MessageHeader * msg ;
64
64
VALUE ret ;
65
+ size_t size ;
65
66
66
67
if (desc -> layout == NULL ) {
67
68
create_layout (desc );
68
69
}
69
70
70
- msg = (MessageHeader * )ALLOC_N (uint8_t ,
71
- sizeof (MessageHeader ) + desc -> layout -> size );
72
-
73
- // Required in case a GC happens before layout_init().
74
- memset (msg , 0 , desc -> layout -> size );
75
-
76
- // We wrap first so that everything in the message object is GC-rooted in case
77
- // a collection happens during object creation in layout_init().
78
- ret = TypedData_Wrap_Struct (klass , & Message_type , msg );
71
+ msg = ALLOC_N (uint8_t , sizeof (MessageHeader ) + desc -> layout -> size );
79
72
msg -> descriptor = desc ;
80
- rb_ivar_set (ret , descriptor_instancevar_interned , descriptor );
81
-
82
73
msg -> unknown_fields = NULL ;
74
+ memcpy (Message_data (msg ), desc -> layout -> empty_template , desc -> layout -> size );
83
75
84
- layout_init (desc -> layout , Message_data (msg ));
76
+ ret = TypedData_Wrap_Struct (klass , & Message_type , msg );
77
+ rb_ivar_set (ret , descriptor_instancevar_interned , descriptor );
85
78
86
79
return ret ;
87
80
}
@@ -473,7 +466,11 @@ int Message_initialize_kwarg(VALUE key, VALUE val, VALUE _self) {
473
466
* Message class are provided on each concrete message class.
474
467
*/
475
468
VALUE Message_initialize (int argc , VALUE * argv , VALUE _self ) {
469
+ MessageHeader * self ;
476
470
VALUE hash_args ;
471
+ TypedData_Get_Struct (_self , MessageHeader , & Message_type , self );
472
+
473
+ layout_init (self -> descriptor -> layout , Message_data (self ));
477
474
478
475
if (argc == 0 ) {
479
476
return Qnil ;
0 commit comments