Fix bugs in extension support when multiple extension fields are present.
This commit is contained in:
@@ -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'
|
||||
|
||||
11
pb.h
11
pb.h
@@ -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)];
|
||||
|
||||
if (field->size_offset)
|
||||
pSize = (const char*)pData + field->size_offset;
|
||||
else
|
||||
pSize = &dummy;
|
||||
|
||||
switch (PB_HTYPE(field->type))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user