Skip to content

Commit 671c245

Browse files
committed
Fixed crash bug and moved initialization into init method.
1 parent 3e3407a commit 671c245

File tree

2 files changed

+9
-14
lines changed

2 files changed

+9
-14
lines changed

ruby/ext/google/protobuf_c/message.c

+9-12
Original file line numberDiff line numberDiff line change
@@ -62,26 +62,19 @@ VALUE Message_alloc(VALUE klass) {
6262
Descriptor* desc = ruby_to_Descriptor(descriptor);
6363
MessageHeader* msg;
6464
VALUE ret;
65+
size_t size;
6566

6667
if (desc->layout == NULL) {
6768
create_layout(desc);
6869
}
6970

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);
7972
msg->descriptor = desc;
80-
rb_ivar_set(ret, descriptor_instancevar_interned, descriptor);
81-
8273
msg->unknown_fields = NULL;
74+
memcpy(Message_data(msg), desc->layout->empty_template, desc->layout->size);
8375

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);
8578

8679
return ret;
8780
}
@@ -473,7 +466,11 @@ int Message_initialize_kwarg(VALUE key, VALUE val, VALUE _self) {
473466
* Message class are provided on each concrete message class.
474467
*/
475468
VALUE Message_initialize(int argc, VALUE* argv, VALUE _self) {
469+
MessageHeader* self;
476470
VALUE hash_args;
471+
TypedData_Get_Struct(_self, MessageHeader, &Message_type, self);
472+
473+
layout_init(self->descriptor->layout, Message_data(self));
477474

478475
if (argc == 0) {
479476
return Qnil;

ruby/ext/google/protobuf_c/storage.c

-2
Original file line numberDiff line numberDiff line change
@@ -947,8 +947,6 @@ void layout_init(MessageLayout* layout, void* storage) {
947947
VALUE* value = (VALUE*)CHARPTR_AT(storage, layout->value_offset);
948948
int i;
949949

950-
memcpy(storage, layout->empty_template, layout->size);
951-
952950
for (i = 0; i < layout->repeated_count; i++, value++) {
953951
*value = RepeatedField_new_this_type(*value);
954952
}

0 commit comments

Comments
 (0)