|
|
|
@ -62,26 +62,19 @@ VALUE Message_alloc(VALUE klass) { |
|
|
|
|
Descriptor* desc = ruby_to_Descriptor(descriptor); |
|
|
|
|
MessageHeader* msg; |
|
|
|
|
VALUE ret; |
|
|
|
|
size_t size; |
|
|
|
|
|
|
|
|
|
if (desc->layout == NULL) { |
|
|
|
|
create_layout(desc); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
msg = (MessageHeader*)ALLOC_N(uint8_t, |
|
|
|
|
sizeof(MessageHeader) + desc->layout->size); |
|
|
|
|
|
|
|
|
|
// Required in case a GC happens before layout_init().
|
|
|
|
|
memset(msg, 0, desc->layout->size); |
|
|
|
|
|
|
|
|
|
// We wrap first so that everything in the message object is GC-rooted in case
|
|
|
|
|
// a collection happens during object creation in layout_init().
|
|
|
|
|
ret = TypedData_Wrap_Struct(klass, &Message_type, msg); |
|
|
|
|
msg = ALLOC_N(uint8_t, sizeof(MessageHeader) + desc->layout->size); |
|
|
|
|
msg->descriptor = desc; |
|
|
|
|
rb_ivar_set(ret, descriptor_instancevar_interned, descriptor); |
|
|
|
|
|
|
|
|
|
msg->unknown_fields = NULL; |
|
|
|
|
memcpy(Message_data(msg), desc->layout->empty_template, desc->layout->size); |
|
|
|
|
|
|
|
|
|
layout_init(desc->layout, Message_data(msg)); |
|
|
|
|
ret = TypedData_Wrap_Struct(klass, &Message_type, msg); |
|
|
|
|
rb_ivar_set(ret, descriptor_instancevar_interned, descriptor); |
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
@ -473,7 +466,11 @@ int Message_initialize_kwarg(VALUE key, VALUE val, VALUE _self) { |
|
|
|
|
* Message class are provided on each concrete message class. |
|
|
|
|
*/ |
|
|
|
|
VALUE Message_initialize(int argc, VALUE* argv, VALUE _self) { |
|
|
|
|
MessageHeader* self; |
|
|
|
|
VALUE hash_args; |
|
|
|
|
TypedData_Get_Struct(_self, MessageHeader, &Message_type, self); |
|
|
|
|
|
|
|
|
|
layout_init(self->descriptor->layout, Message_data(self)); |
|
|
|
|
|
|
|
|
|
if (argc == 0) { |
|
|
|
|
return Qnil; |
|
|
|
|