Skip to content
Snippets Groups Projects
Commit 1f13e8cd authored by Petteri Aimonen's avatar Petteri Aimonen
Browse files

Fix bugs in extension support when multiple extension fields are present.

parent 64947cb3
No related branches found
No related tags found
No related merge requests found
......@@ -313,16 +313,19 @@ class ExtensionField(Field):
raise NotImplementedError("Only 'optional' is supported for extension fields. "
+ "(%s.rules == %s)" % (self.fullname, self.rules))
self.rules = 'OPTEXT'
def extension_decl(self):
'''Declaration of the extension type in the .pb.h file'''
return 'extern const pb_extension_type_t %s;' % self.fullname
return 'extern const pb_extension_type_t %s;\n' % self.fullname
def extension_def(self):
'''Definition of the extension type in the .pb.c file'''
result = 'typedef struct {\n'
result += str(self)
result += '} %s;\n' % self.struct_name
result += ('static const pb_field_t %s_field = %s;\n' %
result += '\n} %s;\n\n' % self.struct_name
result += ('static const pb_field_t %s_field = \n %s;\n\n' %
(self.fullname, self.pb_field_t(None)))
result += 'const pb_extension_type_t %s = {\n' % self.fullname
result += ' NULL,\n'
......
......@@ -364,6 +364,17 @@ struct _pb_extension_t {
{tag, PB_ATYPE_CALLBACK | PB_HTYPE_REPEATED | ltype, \
pb_delta_end(st, m, pm), 0, pb_membersize(st, m), 0, ptr}
/* Optional extensions don't have the has_ field, as that would be redundant. */
#define PB_OPTEXT_STATIC(tag, st, m, pm, ltype, ptr) \
{tag, PB_ATYPE_STATIC | PB_HTYPE_OPTIONAL | ltype, \
0, \
0, \
pb_membersize(st, m), 0, ptr}
#define PB_OPTEXT_CALLBACK(tag, st, m, pm, ltype, ptr) \
{tag, PB_ATYPE_CALLBACK | PB_HTYPE_OPTIONAL | ltype, \
0, 0, pb_membersize(st, m), 0, ptr}
/* The mapping from protobuf types to LTYPEs is done using these macros. */
#define PB_LTYPE_MAP_BOOL PB_LTYPE_VARINT
#define PB_LTYPE_MAP_BYTES PB_LTYPE_BYTES
......
......@@ -161,9 +161,14 @@ static bool checkreturn encode_static_field(pb_ostream_t *stream,
{
pb_encoder_t func;
const void *pSize;
bool dummy = true;
func = PB_ENCODERS[PB_LTYPE(field->type)];
pSize = (const char*)pData + field->size_offset;
if (field->size_offset)
pSize = (const char*)pData + field->size_offset;
else
pSize = &dummy;
switch (PB_HTYPE(field->type))
{
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment