@ -53,8 +53,6 @@ typedef struct {
static const char opt_default_buf [ _UPB_MAXOPT_SIZE + sizeof ( void * ) ] = { 0 } ;
static const char * opt_default = & opt_default_buf [ sizeof ( void * ) ] ;
static const char kOutOfMemory [ ] = " out of memory " ;
struct upb_FieldDef {
const google_protobuf_FieldOptions * opts ;
const upb_FileDef * file ;
@ -382,7 +380,7 @@ typedef struct {
jmp_buf err ; /* longjmp() on error. */
} upb_AddDefCtx ;
UPB_NORETURN UPB_NOINLINE UPB_PRINTF ( 2 , 3 ) static void symtab_e rrf(
UPB_NORETURN UPB_NOINLINE UPB_PRINTF ( 2 , 3 ) static void _upb_AddDefCtx_E rrf(
upb_AddDefCtx * ctx , const char * fmt , . . . ) {
va_list argp ;
va_start ( argp , fmt ) ;
@ -391,15 +389,16 @@ UPB_NORETURN UPB_NOINLINE UPB_PRINTF(2, 3) static void symtab_errf(
UPB_LONGJMP ( ctx - > err , 1 ) ;
}
UPB_NORETURN UPB_NOINLINE static void symtab_oomerr ( upb_AddDefCtx * ctx ) {
upb_Status_SetErrorMessage ( ctx - > status , kOutOfMemory ) ;
UPB_NORETURN UPB_NOINLINE static void _upb_AddDefCtx_OomErr (
upb_AddDefCtx * ctx ) {
upb_Status_SetErrorMessage ( ctx - > status , " out of memory " ) ;
UPB_LONGJMP ( ctx - > err , 1 ) ;
}
void * symtab_a lloc( upb_AddDefCtx * ctx , size_t bytes ) {
void * _upb_AddDefCtx_A lloc( upb_AddDefCtx * ctx , size_t bytes ) {
if ( bytes = = 0 ) return NULL ;
void * ret = upb_Arena_Malloc ( ctx - > arena , bytes ) ;
if ( ! ret ) symtab_oome rr( ctx ) ;
if ( ! ret ) _upb_AddDefCtx_OomE rr( ctx ) ;
return ret ;
}
@ -525,7 +524,7 @@ int32_t upb_ExtensionRange_End(const upb_ExtensionRange* e) { return e->end; }
// Allocate sufficient storage to contain an array of |n| extension ranges.
static upb_ExtensionRange * _upb_ExtensionRange_Alloc ( upb_AddDefCtx * ctx ,
int n ) {
return symtab_a lloc( ctx , sizeof ( upb_ExtensionRange ) * n ) ;
return _upb_AddDefCtx_A lloc( ctx , sizeof ( upb_ExtensionRange ) * n ) ;
}
/* upb_FieldDef ***************************************************************/
@ -745,7 +744,7 @@ bool upb_FieldDef_checkdescriptortype(int32_t type) {
// Allocate sufficient storage to contain an array of |n| field defs.
static upb_FieldDef * _upb_FieldDef_Alloc ( upb_AddDefCtx * ctx , int n ) {
return symtab_a lloc( ctx , sizeof ( upb_FieldDef ) * n ) ;
return _upb_AddDefCtx_A lloc( ctx , sizeof ( upb_FieldDef ) * n ) ;
}
/* upb_MessageDef *************************************************************/
@ -1303,9 +1302,9 @@ const upb_FileDef* upb_DefPool_FindFileContainingSymbol(const upb_DefPool* s,
* this code is used to directly build defs from Ruby ( for example ) we do need
* to validate important constraints like uniqueness of names and numbers . */
# define CHK_OOM(x) \
if ( ! ( x ) ) { \
symtab_oome rr( ctx ) ; \
# define CHK_OOM(x) \
if ( ! ( x ) ) { \
_upb_AddDefCtx_OomE rr( ctx ) ; \
}
// We want to copy the options verbatim into the destination options proto.
@ -1322,7 +1321,8 @@ const upb_FileDef* upb_DefPool_FindFileContainingSymbol(const upb_DefPool* s,
target = ( const google_protobuf_ # # options_type * ) opt_default ; \
}
static void check_ident ( upb_AddDefCtx * ctx , upb_StringView name , bool full ) {
static void _upb_AddDefCtx_CheckIdent ( upb_AddDefCtx * ctx , upb_StringView name ,
bool full ) {
const char * str = name . data ;
size_t len = name . size ;
bool start = true ;
@ -1331,12 +1331,13 @@ static void check_ident(upb_AddDefCtx* ctx, upb_StringView name, bool full) {
char c = str [ i ] ;
if ( c = = ' . ' ) {
if ( start | | ! full ) {
symtab_errf ( ctx , " invalid name: unexpected '.' (%.*s) " , ( int ) len , str ) ;
_upb_AddDefCtx_Errf ( ctx , " invalid name: unexpected '.' (%.*s) " ,
( int ) len , str ) ;
}
start = true ;
} else if ( start ) {
if ( ! upb_isletter ( c ) ) {
symtab_e rrf(
_upb_AddDefCtx_E rrf(
ctx ,
" invalid name: path components must start with a letter (%.*s) " ,
( int ) len , str ) ;
@ -1344,13 +1345,14 @@ static void check_ident(upb_AddDefCtx* ctx, upb_StringView name, bool full) {
start = false ;
} else {
if ( ! upb_isalphanum ( c ) ) {
symtab_errf ( ctx , " invalid name: non-alphanumeric character (%.*s) " ,
( int ) len , str ) ;
_upb_AddDefCtx_Errf ( ctx ,
" invalid name: non-alphanumeric character (%.*s) " ,
( int ) len , str ) ;
}
}
}
if ( start ) {
symtab_e rrf( ctx , " invalid name: empty part (%.*s) " , ( int ) len , str ) ;
_upb_AddDefCtx_E rrf( ctx , " invalid name: empty part (%.*s) " , ( int ) len , str ) ;
}
}
@ -1396,8 +1398,9 @@ static uint32_t upb_MiniTable_place(upb_AddDefCtx* ctx, upb_MiniTable* l,
size_t next = ofs + size ;
if ( next > UINT16_MAX ) {
symtab_errf ( ctx , " size of message %s exceeded max size of %zu bytes " ,
upb_MessageDef_FullName ( m ) , ( size_t ) UINT16_MAX ) ;
_upb_AddDefCtx_Errf ( ctx ,
" size of message %s exceeded max size of %zu bytes " ,
upb_MessageDef_FullName ( m ) , ( size_t ) UINT16_MAX ) ;
}
l - > size = next ;
@ -1522,8 +1525,8 @@ static void make_layout(upb_AddDefCtx* ctx, const upb_MessageDef* m) {
}
}
fields = symtab_a lloc( ctx , field_count * sizeof ( * fields ) ) ;
subs = symtab_a lloc( ctx , sublayout_count * sizeof ( * subs ) ) ;
fields = _upb_AddDefCtx_A lloc( ctx , field_count * sizeof ( * fields ) ) ;
subs = _upb_AddDefCtx_A lloc( ctx , sublayout_count * sizeof ( * subs ) ) ;
l - > field_count = upb_MessageDef_numfields ( m ) ;
l - > fields = fields ;
@ -1598,8 +1601,8 @@ static void make_layout(upb_AddDefCtx* ctx, const upb_MessageDef* m) {
if ( upb_FieldDef_Label ( f ) = = kUpb_Label_Required ) {
field - > presence = + + hasbit ;
if ( hasbit > = 63 ) {
symtab_e rrf( ctx , " Message with >=63 required fields: %s " ,
upb_MessageDef_FullName ( m ) ) ;
_upb_AddDefCtx_E rrf( ctx , " Message with >=63 required fields: %s " ,
upb_MessageDef_FullName ( m ) ) ;
}
l - > required_count + + ;
}
@ -1664,7 +1667,8 @@ static void make_layout(upb_AddDefCtx* ctx, const upb_MessageDef* m) {
if ( upb_OneofDef_IsSynthetic ( o ) ) continue ;
if ( o - > field_count = = 0 ) {
symtab_errf ( ctx , " Oneof must have at least one field (%s) " , o - > full_name ) ;
_upb_AddDefCtx_Errf ( ctx , " Oneof must have at least one field (%s) " ,
o - > full_name ) ;
}
/* Calculate field size: the max of all field sizes. */
@ -1710,12 +1714,13 @@ static bool streql_view(upb_StringView view, const char* b) {
return streql2 ( view . data , view . size , b ) ;
}
static const char * makefullname ( upb_AddDefCtx * ctx , const char * prefix ,
upb_StringView name ) {
static const char * _upb_AddDefCtx_MakeFullName ( upb_AddDefCtx * ctx ,
const char * prefix ,
upb_StringView name ) {
if ( prefix ) {
/* ret = prefix + '.' + name; */
size_t n = strlen ( prefix ) ;
char * ret = symtab_a lloc( ctx , n + name . size + 2 ) ;
char * ret = _upb_AddDefCtx_A lloc( ctx , n + name . size + 2 ) ;
strcpy ( ret , prefix ) ;
ret [ n ] = ' . ' ;
memcpy ( & ret [ n + 1 ] , name . data , name . size ) ;
@ -1735,18 +1740,21 @@ static void finalize_oneofs(upb_AddDefCtx* ctx, upb_MessageDef* m) {
upb_OneofDef * o = & mutable_oneofs [ i ] ;
if ( o - > synthetic & & o - > field_count ! = 1 ) {
symtab_errf ( ctx , " Synthetic oneofs must have one field, not %d: %s " ,
o - > field_count , upb_OneofDef_Name ( o ) ) ;
_upb_AddDefCtx_Errf ( ctx ,
" Synthetic oneofs must have one field, not %d: %s " ,
o - > field_count , upb_OneofDef_Name ( o ) ) ;
}
if ( o - > synthetic ) {
synthetic_count + + ;
} else if ( synthetic_count ! = 0 ) {
symtab_errf ( ctx , " Synthetic oneofs must be after all other oneofs: %s " ,
upb_OneofDef_Name ( o ) ) ;
_upb_AddDefCtx_Errf ( ctx ,
" Synthetic oneofs must be after all other oneofs: %s " ,
upb_OneofDef_Name ( o ) ) ;
}
o - > fields = symtab_alloc ( ctx , sizeof ( upb_FieldDef * ) * o - > field_count ) ;
o - > fields =
_upb_AddDefCtx_Alloc ( ctx , sizeof ( upb_FieldDef * ) * o - > field_count ) ;
o - > field_count = 0 ;
}
@ -1803,19 +1811,20 @@ size_t getjsonname(const char* name, char* buf, size_t len) {
static char * makejsonname ( upb_AddDefCtx * ctx , const char * name ) {
size_t size = getjsonname ( name , NULL , 0 ) ;
char * json_name = symtab_a lloc( ctx , size ) ;
char * json_name = _upb_AddDefCtx_A lloc( ctx , size ) ;
getjsonname ( name , json_name , size ) ;
return json_name ;
}
/* Adds a symbol |v| to the symtab, which must be a def pointer previously
* packed with pack_def ( ) . The def ' s pointer to upb_FileDef * must be set before
* packed with pack_def ( ) . The def ' s pointer to upb_FileDef * must be set before
* adding , so we know which entries to remove if building this file fails . */
static void symtab_add ( upb_AddDefCtx * ctx , const char * name , upb_value v ) {
static void _upb_AddDefCtx_Add ( upb_AddDefCtx * ctx , const char * name ,
upb_value v ) {
// TODO: table should support an operation "tryinsert" to avoid the double
// lookup.
if ( upb_strtable_lookup ( & ctx - > symtab - > syms , name , NULL ) ) {
symtab_e rrf( ctx , " duplicate symbol '%s' " , name ) ;
_upb_AddDefCtx_E rrf( ctx , " duplicate symbol '%s' " , name ) ;
}
size_t len = strlen ( name ) ;
CHK_OOM ( upb_strtable_insert ( & ctx - > symtab - > syms , name , len , v ,
@ -1879,8 +1888,8 @@ static const void* symtab_resolveany(upb_AddDefCtx* ctx,
return unpack_def ( v , * type ) ;
notfound :
symtab_e rrf( ctx , " couldn't resolve name ' " UPB_STRINGVIEW_FORMAT " ' " ,
UPB_STRINGVIEW_ARGS ( sym ) ) ;
_upb_AddDefCtx_E rrf( ctx , " couldn't resolve name ' " UPB_STRINGVIEW_FORMAT " ' " ,
UPB_STRINGVIEW_ARGS ( sym ) ) ;
}
static const void * symtab_resolve ( upb_AddDefCtx * ctx , const char * from_name_dbg ,
@ -1890,10 +1899,10 @@ static const void* symtab_resolve(upb_AddDefCtx* ctx, const char* from_name_dbg,
const void * ret =
symtab_resolveany ( ctx , from_name_dbg , base , sym , & found_type ) ;
if ( ret & & found_type ! = type ) {
symtab_e rrf( ctx ,
" type mismatch when resolving %s: couldn't find "
" name " UPB_STRINGVIEW_FORMAT " with type=%d " ,
from_name_dbg , UPB_STRINGVIEW_ARGS ( sym ) , ( int ) type ) ;
_upb_AddDefCtx_E rrf( ctx ,
" type mismatch when resolving %s: couldn't find "
" name " UPB_STRINGVIEW_FORMAT " with type=%d " ,
from_name_dbg , UPB_STRINGVIEW_ARGS ( sym ) , ( int ) type ) ;
}
return ret ;
}
@ -1906,7 +1915,7 @@ static void create_oneofdef(upb_AddDefCtx* ctx, upb_MessageDef* m,
upb_value v ;
o - > parent = m ;
o - > full_name = makefulln ame( ctx , m - > full_name , name ) ;
o - > full_name = _upb_AddDefCtx_MakeFullN ame( ctx , m - > full_name , name ) ;
o - > field_count = 0 ;
o - > synthetic = false ;
@ -1914,7 +1923,7 @@ static void create_oneofdef(upb_AddDefCtx* ctx, upb_MessageDef* m,
upb_value existing_v ;
if ( upb_strtable_lookup2 ( & m - > ntof , name . data , name . size , & existing_v ) ) {
symtab_e rrf( ctx , " duplicate oneof name (%s) " , o - > full_name ) ;
_upb_AddDefCtx_E rrf( ctx , " duplicate oneof name (%s) " , o - > full_name ) ;
}
v = pack_def ( o , UPB_DEFTYPE_ONEOF ) ;
@ -1928,7 +1937,7 @@ static void create_oneofdef(upb_AddDefCtx* ctx, upb_MessageDef* m,
static upb_OneofDef * _upb_OneofDefs_New (
upb_AddDefCtx * ctx , int n , const google_protobuf_OneofDescriptorProto * const * protos ,
upb_MessageDef * m ) {
upb_OneofDef * o = symtab_a lloc( ctx , sizeof ( upb_OneofDef ) * n ) ;
upb_OneofDef * o = _upb_AddDefCtx_A lloc( ctx , sizeof ( upb_OneofDef ) * n ) ;
for ( int i = 0 ; i < n ; i + + ) {
create_oneofdef ( ctx , m , protos [ i ] , & o [ i ] ) ;
}
@ -1936,7 +1945,7 @@ static upb_OneofDef* _upb_OneofDefs_New(
}
static str_t * newstr ( upb_AddDefCtx * ctx , const char * data , size_t len ) {
str_t * ret = symtab_a lloc( ctx , sizeof ( * ret ) + len ) ;
str_t * ret = _upb_AddDefCtx_A lloc( ctx , sizeof ( * ret ) + len ) ;
CHK_OOM ( ret ) ;
ret - > len = len ;
if ( len ) memcpy ( ret - > str , data , len ) ;
@ -1973,9 +1982,9 @@ static char upb_DefPool_ParseHexEscape(upb_AddDefCtx* ctx,
const char * end ) {
char hex_digit = upb_DefPool_TryGetHexDigit ( ctx , f , src , end ) ;
if ( hex_digit < 0 ) {
symtab_errf ( ctx ,
" \\ x cannot be followed by non-hex digit in field '%s' default " ,
upb_FieldDef_FullName ( f ) ) ;
_upb_AddDefCtx_Errf (
ctx , " \\ x cannot be followed by non-hex digit in field '%s' default " ,
upb_FieldDef_FullName ( f ) ) ;
return 0 ;
}
unsigned int ret = hex_digit ;
@ -1983,8 +1992,8 @@ static char upb_DefPool_ParseHexEscape(upb_AddDefCtx* ctx,
ret = ( ret < < 4 ) | hex_digit ;
}
if ( ret > 0xff ) {
symtab_e rrf( ctx , " Value of hex escape in field %s exceeds 8 bits " ,
upb_FieldDef_FullName ( f ) ) ;
_upb_AddDefCtx_E rrf( ctx , " Value of hex escape in field %s exceeds 8 bits " ,
upb_FieldDef_FullName ( f ) ) ;
return 0 ;
}
return ret ;
@ -2017,8 +2026,8 @@ static char upb_DefPool_ParseEscape(upb_AddDefCtx* ctx, const upb_FieldDef* f,
const char * * src , const char * end ) {
char ch ;
if ( ! upb_DefPool_TryGetChar ( src , end , & ch ) ) {
symtab_e rrf( ctx , " unterminated escape sequence in field %s " ,
upb_FieldDef_FullName ( f ) ) ;
_upb_AddDefCtx_E rrf( ctx , " unterminated escape sequence in field %s " ,
upb_FieldDef_FullName ( f ) ) ;
return 0 ;
}
switch ( ch ) {
@ -2058,13 +2067,13 @@ static char upb_DefPool_ParseEscape(upb_AddDefCtx* ctx, const upb_FieldDef* f,
* src - = 1 ;
return upb_DefPool_ParseOctalEscape ( ctx , f , src , end ) ;
}
symtab_e rrf( ctx , " Unknown escape sequence: \\ %c " , ch ) ;
_upb_AddDefCtx_E rrf( ctx , " Unknown escape sequence: \\ %c " , ch ) ;
}
static str_t * unescape ( upb_AddDefCtx * ctx , const upb_FieldDef * f ,
const char * data , size_t len ) {
// Size here is an upper bound; escape sequences could ultimately shrink it.
str_t * ret = symtab_a lloc( ctx , sizeof ( * ret ) + len ) ;
str_t * ret = _upb_AddDefCtx_A lloc( ctx , sizeof ( * ret ) + len ) ;
char * dst = & ret - > str [ 0 ] ;
const char * src = data ;
const char * end = data + len ;
@ -2097,7 +2106,7 @@ static void parse_default(upb_AddDefCtx* ctx, const char* str, size_t len,
case kUpb_CType_Float :
/* Standard C number parsing functions expect null-terminated strings. */
if ( len > = sizeof ( nullz ) - 1 ) {
symtab_e rrf( ctx , " Default too long: %.*s " , ( int ) len , str ) ;
_upb_AddDefCtx_E rrf( ctx , " Default too long: %.*s " , ( int ) len , str ) ;
}
memcpy ( nullz , str , len ) ;
nullz [ len ] = ' \0 ' ;
@ -2184,15 +2193,16 @@ static void parse_default(upb_AddDefCtx* ctx, const char* str, size_t len,
break ;
case kUpb_CType_Message :
/* Should not have a default value. */
symtab_e rrf( ctx , " Message should not have a default (%s) " ,
upb_FieldDef_FullName ( f ) ) ;
_upb_AddDefCtx_E rrf( ctx , " Message should not have a default (%s) " ,
upb_FieldDef_FullName ( f ) ) ;
}
return ;
invalid :
symtab_errf ( ctx , " Invalid default '%.*s' for field %s of type %d " , ( int ) len ,
str , upb_FieldDef_FullName ( f ) , ( int ) upb_FieldDef_Type ( f ) ) ;
_upb_AddDefCtx_Errf ( ctx , " Invalid default '%.*s' for field %s of type %d " ,
( int ) len , str , upb_FieldDef_FullName ( f ) ,
( int ) upb_FieldDef_Type ( f ) ) ;
}
static void set_default_default ( upb_AddDefCtx * ctx , upb_FieldDef * f ) {
@ -2236,15 +2246,15 @@ static void create_fielddef(upb_AddDefCtx* ctx, const char* prefix,
const char * shortname ;
int32_t field_number ;
f - > file = ctx - > file ; // Must happen prior to symtab_a dd()
f - > file = ctx - > file ; // Must happen prior to _upb_AddDefCtx_A dd()
if ( ! google_protobuf_FieldDescriptorProto_has_name ( field_proto ) ) {
symtab_e rrf( ctx , " field has no name " ) ;
_upb_AddDefCtx_E rrf( ctx , " field has no name " ) ;
}
name = google_protobuf_FieldDescriptorProto_name ( field_proto ) ;
check_i dent( ctx , name , false ) ;
full_name = makefulln ame( ctx , prefix , name ) ;
_upb_AddDefCtx_CheckI dent( ctx , name , false ) ;
full_name = _upb_AddDefCtx_MakeFullN ame( ctx , prefix , name ) ;
shortname = shortdefname ( full_name ) ;
if ( google_protobuf_FieldDescriptorProto_has_json_name ( field_proto ) ) {
@ -2278,14 +2288,15 @@ static void create_fielddef(upb_AddDefCtx* ctx, const char* prefix,
case kUpb_FieldType_Group :
case kUpb_FieldType_Enum :
if ( ! has_type_name ) {
symtab_e rrf( ctx , " field of type %d requires type name (%s) " ,
( int ) f - > type_ , full_name ) ;
_upb_AddDefCtx_E rrf( ctx , " field of type %d requires type name (%s) " ,
( int ) f - > type_ , full_name ) ;
}
break ;
default :
if ( has_type_name ) {
symtab_errf ( ctx , " invalid type for field with type_name set (%s, %d) " ,
full_name , ( int ) f - > type_ ) ;
_upb_AddDefCtx_Errf (
ctx , " invalid type for field with type_name set (%s, %d) " ,
full_name , ( int ) f - > type_ ) ;
}
}
} else if ( has_type_name ) {
@ -2299,7 +2310,7 @@ static void create_fielddef(upb_AddDefCtx* ctx, const char* prefix,
size_t json_size ;
if ( field_number < = 0 | | field_number > kUpb_MaxFieldNumber ) {
symtab_e rrf( ctx , " invalid field number (%u) " , field_number ) ;
_upb_AddDefCtx_E rrf( ctx , " invalid field number (%u) " , field_number ) ;
}
f - > index_ = f - m - > fields ;
@ -2312,7 +2323,7 @@ static void create_fielddef(upb_AddDefCtx* ctx, const char* prefix,
json_size = strlen ( json_name ) ;
if ( upb_strtable_lookup ( & m - > ntof , shortname , & existing_v ) ) {
symtab_e rrf( ctx , " duplicate field name (%s) " , shortname ) ;
_upb_AddDefCtx_E rrf( ctx , " duplicate field name (%s) " , shortname ) ;
}
CHK_OOM ( upb_strtable_insert ( & m - > ntof , name . data , name . size , field_v ,
@ -2320,7 +2331,7 @@ static void create_fielddef(upb_AddDefCtx* ctx, const char* prefix,
if ( strcmp ( shortname , json_name ) ! = 0 ) {
if ( upb_strtable_lookup ( & m - > ntof , json_name , & v ) ) {
symtab_e rrf( ctx , " duplicate json_name (%s) " , json_name ) ;
_upb_AddDefCtx_E rrf( ctx , " duplicate json_name (%s) " , json_name ) ;
} else {
CHK_OOM ( upb_strtable_insert ( & m - > ntof , json_name , json_size , json_v ,
ctx - > arena ) ) ;
@ -2328,7 +2339,7 @@ static void create_fielddef(upb_AddDefCtx* ctx, const char* prefix,
}
if ( upb_inttable_lookup ( & m - > itof , field_number , NULL ) ) {
symtab_e rrf( ctx , " duplicate field number (%u) " , field_number ) ;
_upb_AddDefCtx_E rrf( ctx , " duplicate field number (%u) " , field_number ) ;
}
CHK_OOM ( upb_inttable_insert ( & m - > itof , field_number , v , ctx - > arena ) ) ;
@ -2351,7 +2362,7 @@ static void create_fielddef(upb_AddDefCtx* ctx, const char* prefix,
/* extension field. */
f - > is_extension_ = true ;
f - > scope . extension_scope = m ;
symtab_a dd( ctx , full_name , pack_def ( f , UPB_DEFTYPE_EXT ) ) ;
_upb_AddDefCtx_A dd( ctx , full_name , pack_def ( f , UPB_DEFTYPE_EXT ) ) ;
f - > layout_index = ctx - > ext_count + + ;
if ( ctx - > layout ) {
UPB_ASSERT ( _upb_FieldDef_ExtensionMiniTable ( f ) - > field . number = =
@ -2360,12 +2371,13 @@ static void create_fielddef(upb_AddDefCtx* ctx, const char* prefix,
}
if ( f - > type_ < kUpb_FieldType_Double | | f - > type_ > kUpb_FieldType_SInt64 ) {
symtab_errf ( ctx , " invalid type for field %s (%d) " , f - > full_name , f - > type_ ) ;
_upb_AddDefCtx_Errf ( ctx , " invalid type for field %s (%d) " , f - > full_name ,
f - > type_ ) ;
}
if ( f - > label_ < kUpb_Label_Optional | | f - > label_ > kUpb_Label_Repeated ) {
symtab_e rrf( ctx , " invalid label for field %s (%d) " , f - > full_name ,
f - > label_ ) ;
_upb_AddDefCtx_E rrf( ctx , " invalid label for field %s (%d) " , f - > full_name ,
f - > label_ ) ;
}
/* We can't resolve the subdef or (in the case of extensions) the containing
@ -2375,7 +2387,8 @@ static void create_fielddef(upb_AddDefCtx* ctx, const char* prefix,
if ( f - > label_ = = kUpb_Label_Required & &
f - > file - > syntax = = kUpb_Syntax_Proto3 ) {
symtab_errf ( ctx , " proto3 fields cannot be required (%s) " , f - > full_name ) ;
_upb_AddDefCtx_Errf ( ctx , " proto3 fields cannot be required (%s) " ,
f - > full_name ) ;
}
if ( google_protobuf_FieldDescriptorProto_has_oneof_index ( field_proto ) ) {
@ -2384,17 +2397,17 @@ static void create_fielddef(upb_AddDefCtx* ctx, const char* prefix,
upb_value v = upb_value_constptr ( f ) ;
if ( upb_FieldDef_Label ( f ) ! = kUpb_Label_Optional ) {
symtab_e rrf( ctx , " fields in oneof must have OPTIONAL label (%s) " ,
f - > full_name ) ;
_upb_AddDefCtx_E rrf( ctx , " fields in oneof must have OPTIONAL label (%s) " ,
f - > full_name ) ;
}
if ( ! m ) {
symtab_e rrf( ctx , " oneof_index provided for extension field (%s) " ,
f - > full_name ) ;
_upb_AddDefCtx_E rrf( ctx , " oneof_index provided for extension field (%s) " ,
f - > full_name ) ;
}
if ( oneof_index > = m - > oneof_count ) {
symtab_e rrf( ctx , " oneof_index out of range (%s) " , f - > full_name ) ;
_upb_AddDefCtx_E rrf( ctx , " oneof_index out of range (%s) " , f - > full_name ) ;
}
oneof = ( upb_OneofDef * ) & m - > oneofs [ oneof_index ] ;
@ -2409,8 +2422,9 @@ static void create_fielddef(upb_AddDefCtx* ctx, const char* prefix,
upb_strtable_insert ( & oneof - > ntof , name . data , name . size , v , ctx - > arena ) ) ;
} else {
if ( f - > proto3_optional_ ) {
symtab_errf ( ctx , " field with proto3_optional was not in a oneof (%s) " ,
f - > full_name ) ;
_upb_AddDefCtx_Errf ( ctx ,
" field with proto3_optional was not in a oneof (%s) " ,
f - > full_name ) ;
}
}
@ -2432,7 +2446,7 @@ static void create_method(upb_AddDefCtx* ctx,
upb_StringView name = google_protobuf_MethodDescriptorProto_name ( method_proto ) ;
m - > service = s ;
m - > full_name = makefulln ame( ctx , s - > full_name , name ) ;
m - > full_name = _upb_AddDefCtx_MakeFullN ame( ctx , s - > full_name , name ) ;
m - > client_streaming =
google_protobuf_MethodDescriptorProto_client_streaming ( method_proto ) ;
m - > server_streaming =
@ -2451,7 +2465,7 @@ static void create_method(upb_AddDefCtx* ctx,
static upb_MethodDef * _upb_MethodDefs_New (
upb_AddDefCtx * ctx , int n ,
const google_protobuf_MethodDescriptorProto * const * protos , upb_ServiceDef * s ) {
upb_MethodDef * m = symtab_a lloc( ctx , sizeof ( upb_MethodDef ) * n ) ;
upb_MethodDef * m = _upb_AddDefCtx_A lloc( ctx , sizeof ( upb_MethodDef ) * n ) ;
for ( int i = 0 ; i < n ; i + + ) {
create_method ( ctx , protos [ i ] , s , & m [ i ] ) ;
m [ i ] . index = i ;
@ -2465,12 +2479,12 @@ static void create_service(upb_AddDefCtx* ctx,
upb_StringView name ;
size_t n ;
s - > file = ctx - > file ; // Must happen prior to symtab_a dd()
s - > file = ctx - > file ; // Must happen prior to _upb_AddDefCtx_A dd()
name = google_protobuf_ServiceDescriptorProto_name ( svc_proto ) ;
check_i dent( ctx , name , false ) ;
s - > full_name = makefulln ame( ctx , ctx - > file - > package , name ) ;
symtab_a dd( ctx , s - > full_name , pack_def ( s , UPB_DEFTYPE_SERVICE ) ) ;
_upb_AddDefCtx_CheckI dent( ctx , name , false ) ;
s - > full_name = _upb_AddDefCtx_MakeFullN ame( ctx , ctx - > file - > package , name ) ;
_upb_AddDefCtx_A dd( ctx , s - > full_name , pack_def ( s , UPB_DEFTYPE_SERVICE ) ) ;
const google_protobuf_MethodDescriptorProto * const * methods =
google_protobuf_ServiceDescriptorProto_method ( svc_proto , & n ) ;
@ -2484,7 +2498,7 @@ static void create_service(upb_AddDefCtx* ctx,
static upb_ServiceDef * _upb_ServiceDefs_New (
upb_AddDefCtx * ctx , int n ,
const google_protobuf_ServiceDescriptorProto * const * protos ) {
upb_ServiceDef * s = symtab_a lloc( ctx , sizeof ( upb_ServiceDef ) * n ) ;
upb_ServiceDef * s = _upb_AddDefCtx_A lloc( ctx , sizeof ( upb_ServiceDef ) * n ) ;
for ( int i = 0 ; i < n ; i + + ) {
create_service ( ctx , protos [ i ] , & s [ i ] ) ;
s [ i ] . index = i ;
@ -2511,13 +2525,13 @@ static int compare_int32(const void* a_ptr, const void* b_ptr) {
static upb_MiniTable_Enum * create_enumlayout ( upb_AddDefCtx * ctx ,
const upb_EnumDef * e ) {
const char * desc = _upb_EnumDef_MiniDescriptor ( e , ctx - > tmp_arena ) ;
if ( ! desc ) symtab_e rrf( ctx , " OOM while building enum MiniDescriptor " ) ;
if ( ! desc ) _upb_AddDefCtx_E rrf( ctx , " OOM while building enum MiniDescriptor " ) ;
upb_Status status ;
upb_MiniTable_Enum * layout =
upb_MiniTable_BuildEnum ( desc , strlen ( desc ) , ctx - > arena , & status ) ;
if ( ! layout )
symtab_e rrf( ctx , " Error building enum MiniTable: %s " , status . msg ) ;
_upb_AddDefCtx_E rrf( ctx , " Error building enum MiniTable: %s " , status . msg ) ;
return layout ;
}
@ -2527,10 +2541,10 @@ static void create_enumvaldef(upb_AddDefCtx* ctx, const char* prefix,
upb_StringView name = google_protobuf_EnumValueDescriptorProto_name ( val_proto ) ;
upb_value val = upb_value_constptr ( v ) ;
v - > parent = e ; // Must happen prior to symtab_a dd()
v - > full_name = makefulln ame( ctx , prefix , name ) ;
v - > parent = e ; // Must happen prior to _upb_AddDefCtx_A dd()
v - > full_name = _upb_AddDefCtx_MakeFullN ame( ctx , prefix , name ) ;
v - > number = google_protobuf_EnumValueDescriptorProto_number ( val_proto ) ;
symtab_a dd( ctx , v - > full_name , pack_def ( v , UPB_DEFTYPE_ENUMVAL ) ) ;
_upb_AddDefCtx_A dd( ctx , v - > full_name , pack_def ( v , UPB_DEFTYPE_ENUMVAL ) ) ;
SET_OPTIONS ( v - > opts , EnumValueDescriptorProto , EnumValueOptions , val_proto ) ;
@ -2547,7 +2561,7 @@ static void create_enumvaldef(upb_AddDefCtx* ctx, const char* prefix,
static upb_EnumValueDef * _upb_EnumValueDefs_New (
upb_AddDefCtx * ctx , const char * prefix , int n ,
const google_protobuf_EnumValueDescriptorProto * const * protos , upb_EnumDef * e ) {
upb_EnumValueDef * v = symtab_a lloc( ctx , sizeof ( upb_EnumValueDef ) * n ) ;
upb_EnumValueDef * v = _upb_AddDefCtx_A lloc( ctx , sizeof ( upb_EnumValueDef ) * n ) ;
bool is_sorted = true ;
uint32_t previous = 0 ;
@ -2562,8 +2576,9 @@ static upb_EnumValueDef* _upb_EnumValueDefs_New(
if ( upb_FileDef_Syntax ( ctx - > file ) = = kUpb_Syntax_Proto3 & & n > 0 & &
v [ 0 ] . number ! = 0 ) {
symtab_errf ( ctx , " for proto3, the first enum value must be zero (%s) " ,
e - > full_name ) ;
_upb_AddDefCtx_Errf ( ctx ,
" for proto3, the first enum value must be zero (%s) " ,
e - > full_name ) ;
}
return v ;
@ -2576,13 +2591,13 @@ static void create_enumdef(upb_AddDefCtx* ctx, const char* prefix,
upb_StringView name ;
size_t n ;
e - > file = ctx - > file ; // Must happen prior to symtab_a dd()
e - > file = ctx - > file ; // Must happen prior to _upb_AddDefCtx_A dd()
name = google_protobuf_EnumDescriptorProto_name ( enum_proto ) ;
check_i dent( ctx , name , false ) ;
_upb_AddDefCtx_CheckI dent( ctx , name , false ) ;
e - > full_name = makefulln ame( ctx , prefix , name ) ;
symtab_a dd( ctx , e - > full_name , pack_def ( e , UPB_DEFTYPE_ENUM ) ) ;
e - > full_name = _upb_AddDefCtx_MakeFullN ame( ctx , prefix , name ) ;
_upb_AddDefCtx_A dd( ctx , e - > full_name , pack_def ( e , UPB_DEFTYPE_ENUM ) ) ;
values = google_protobuf_EnumDescriptorProto_value ( enum_proto , & n ) ;
CHK_OOM ( upb_strtable_init ( & e - > ntoi , n , ctx - > arena ) ) ;
@ -2593,8 +2608,8 @@ static void create_enumdef(upb_AddDefCtx* ctx, const char* prefix,
e - > values = _upb_EnumValueDefs_New ( ctx , prefix , n , values , e ) ;
if ( n = = 0 ) {
symtab_e rrf( ctx , " enums must contain at least one value (%s) " ,
e - > full_name ) ;
_upb_AddDefCtx_E rrf( ctx , " enums must contain at least one value (%s) " ,
e - > full_name ) ;
}
SET_OPTIONS ( e - > opts , EnumDescriptorProto , EnumOptions , enum_proto ) ;
@ -2625,7 +2640,7 @@ static upb_EnumDef* _upb_EnumDefs_New(
const char * name =
containing_type ? containing_type - > full_name : ctx - > file - > package ;
upb_EnumDef * e = symtab_a lloc( ctx , sizeof ( upb_EnumDef ) * n ) ;
upb_EnumDef * e = _upb_AddDefCtx_A lloc( ctx , sizeof ( upb_EnumDef ) * n ) ;
for ( size_t i = 0 ; i < n ; i + + ) {
create_enumdef ( ctx , name , protos [ i ] , & e [ i ] ) ;
e [ i ] . containing_type = containing_type ;
@ -2648,14 +2663,14 @@ static void create_msgdef(upb_AddDefCtx* ctx, const char* prefix,
size_t i , n_oneof , n_field , n_ext_range ;
upb_StringView name ;
m - > file = ctx - > file ; // Must happen prior to symtab_a dd()
m - > file = ctx - > file ; // Must happen prior to _upb_AddDefCtx_A dd()
m - > containing_type = containing_type ;
name = google_protobuf_DescriptorProto_name ( msg_proto ) ;
check_i dent( ctx , name , false ) ;
_upb_AddDefCtx_CheckI dent( ctx , name , false ) ;
m - > full_name = makefulln ame( ctx , prefix , name ) ;
symtab_a dd( ctx , m - > full_name , pack_def ( m , UPB_DEFTYPE_MSG ) ) ;
m - > full_name = _upb_AddDefCtx_MakeFullN ame( ctx , prefix , name ) ;
_upb_AddDefCtx_A dd( ctx , m - > full_name , pack_def ( m , UPB_DEFTYPE_MSG ) ) ;
oneofs = google_protobuf_DescriptorProto_oneof_decl ( msg_proto , & n_oneof ) ;
fields = google_protobuf_DescriptorProto_field ( msg_proto , & n_field ) ;
@ -2672,8 +2687,8 @@ static void create_msgdef(upb_AddDefCtx* ctx, const char* prefix,
UPB_ASSERT ( n_field = = m - > layout - > field_count ) ;
} else {
/* Allocate now (to allow cross-linking), populate later. */
m - > layout =
symtab_alloc ( ctx , sizeof ( * m - > layout ) + sizeof ( _upb_FastTable_Entry ) ) ;
m - > layout = _upb_AddDefCtx_Alloc (
ctx , sizeof ( * m - > layout ) + sizeof ( _upb_FastTable_Entry ) ) ;
}
SET_OPTIONS ( m - > opts , DescriptorProto , MessageOptions , msg_proto ) ;
@ -2704,8 +2719,9 @@ static void create_msgdef(upb_AddDefCtx* ctx, const char* prefix,
// none of the fields overlap with the extension ranges, but we are just
// sanity checking here.
if ( start < 1 | | end < = start | | end > max ) {
symtab_errf ( ctx , " Extension range (%d, %d) is invalid, message=%s \n " ,
( int ) start , ( int ) end , m - > full_name ) ;
_upb_AddDefCtx_Errf ( ctx ,
" Extension range (%d, %d) is invalid, message=%s \n " ,
( int ) start , ( int ) end , m - > full_name ) ;
}
r_def - > start = start ;
@ -2726,7 +2742,7 @@ static upb_MessageDef* _upb_MessageDefs_New(
const upb_MessageDef * containing_type ) {
const char * name =
containing_type ? containing_type - > full_name : ctx - > file - > package ;
upb_MessageDef * m = symtab_a lloc( ctx , sizeof ( upb_MessageDef ) * n ) ;
upb_MessageDef * m = _upb_AddDefCtx_A lloc( ctx , sizeof ( upb_MessageDef ) * n ) ;
for ( int i = 0 ; i < n ; i + + ) {
create_msgdef ( ctx , name , protos [ i ] , containing_type , & m [ i ] ) ;
}
@ -2784,8 +2800,8 @@ static void resolve_subdef(upb_AddDefCtx* ctx, const char* prefix,
// this being a group.
break ;
default :
symtab_e rrf( ctx , " Couldn't resolve type name for field %s " ,
f - > full_name ) ;
_upb_AddDefCtx_E rrf( ctx , " Couldn't resolve type name for field %s " ,
f - > full_name ) ;
}
}
case kUpb_FieldType_Message :
@ -2809,7 +2825,8 @@ static void resolve_extension(upb_AddDefCtx* ctx, const char* prefix,
upb_FieldDef * f ,
const google_protobuf_FieldDescriptorProto * field_proto ) {
if ( ! google_protobuf_FieldDescriptorProto_has_extendee ( field_proto ) ) {
symtab_errf ( ctx , " extension for field '%s' had no extendee " , f - > full_name ) ;
_upb_AddDefCtx_Errf ( ctx , " extension for field '%s' had no extendee " ,
f - > full_name ) ;
}
upb_StringView name = google_protobuf_FieldDescriptorProto_extendee ( field_proto ) ;
@ -2828,10 +2845,11 @@ static void resolve_extension(upb_AddDefCtx* ctx, const char* prefix,
}
if ( ! found ) {
symtab_errf ( ctx ,
" field number %u in extension %s has no extension range in "
" message %s " ,
( unsigned ) f - > number_ , f - > full_name , f - > msgdef - > full_name ) ;
_upb_AddDefCtx_Errf (
ctx ,
" field number %u in extension %s has no extension range in "
" message %s " ,
( unsigned ) f - > number_ , f - > full_name , f - > msgdef - > full_name ) ;
}
const upb_MiniTable_Extension * ext = _upb_FieldDef_ExtensionMiniTable ( f ) ;
@ -2860,13 +2878,15 @@ static void resolve_default(upb_AddDefCtx* ctx, upb_FieldDef* f,
google_protobuf_FieldDescriptorProto_default_value ( field_proto ) ;
if ( upb_FileDef_Syntax ( f - > file ) = = kUpb_Syntax_Proto3 ) {
symtab_errf ( ctx , " proto3 fields cannot have explicit defaults (%s) " ,
f - > full_name ) ;
_upb_AddDefCtx_Errf ( ctx ,
" proto3 fields cannot have explicit defaults (%s) " ,
f - > full_name ) ;
}
if ( upb_FieldDef_IsSubMessage ( f ) ) {
symtab_errf ( ctx , " message fields cannot have explicit defaults (%s) " ,
f - > full_name ) ;
_upb_AddDefCtx_Errf ( ctx ,
" message fields cannot have explicit defaults (%s) " ,
f - > full_name ) ;
}
parse_default ( ctx , defaultval . data , defaultval . size , f ) ;
@ -2931,7 +2951,7 @@ static int count_exts_in_msg(const google_protobuf_DescriptorProto* msg_proto) {
// Allocate and initialize one file def, and add it to the context object.
static void _upb_FileDef_Create ( upb_AddDefCtx * ctx ,
const google_protobuf_FileDescriptorProto * file_proto ) {
upb_FileDef * file = symtab_a lloc( ctx , sizeof ( upb_FileDef ) ) ;
upb_FileDef * file = _upb_AddDefCtx_A lloc( ctx , sizeof ( upb_FileDef ) ) ;
ctx - > file = file ;
const google_protobuf_DescriptorProto * const * msgs ;
@ -2958,29 +2978,30 @@ static void _upb_FileDef_Create(upb_AddDefCtx* ctx,
/* We are using the ext layouts that were passed in. */
file - > ext_layouts = ctx - > layout - > exts ;
if ( ctx - > layout - > ext_count ! = file - > ext_count ) {
symtab_errf ( ctx , " Extension count did not match layout (%d vs %d) " ,
ctx - > layout - > ext_count , file - > ext_count ) ;
_upb_AddDefCtx_Errf ( ctx ,
" Extension count did not match layout (%d vs %d) " ,
ctx - > layout - > ext_count , file - > ext_count ) ;
}
} else {
/* We are building ext layouts from scratch. */
file - > ext_layouts =
symtab_a lloc( ctx , sizeof ( * file - > ext_layouts ) * file - > ext_count ) ;
_upb_AddDefCtx_A lloc( ctx , sizeof ( * file - > ext_layouts ) * file - > ext_count ) ;
upb_MiniTable_Extension * ext =
symtab_a lloc( ctx , sizeof ( * ext ) * file - > ext_count ) ;
_upb_AddDefCtx_A lloc( ctx , sizeof ( * ext ) * file - > ext_count ) ;
for ( int i = 0 ; i < file - > ext_count ; i + + ) {
file - > ext_layouts [ i ] = & ext [ i ] ;
}
}
if ( ! google_protobuf_FileDescriptorProto_has_name ( file_proto ) ) {
symtab_e rrf( ctx , " File has no name " ) ;
_upb_AddDefCtx_E rrf( ctx , " File has no name " ) ;
}
file - > name = strviewdup ( ctx , google_protobuf_FileDescriptorProto_name ( file_proto ) ) ;
upb_StringView package = google_protobuf_FileDescriptorProto_package ( file_proto ) ;
if ( package . size ) {
check_i dent( ctx , package , true ) ;
_upb_AddDefCtx_CheckI dent( ctx , package , true ) ;
file - > package = strviewdup ( ctx , package ) ;
} else {
file - > package = NULL ;
@ -2994,8 +3015,8 @@ static void _upb_FileDef_Create(upb_AddDefCtx* ctx,
} else if ( streql_view ( syntax , " proto3 " ) ) {
file - > syntax = kUpb_Syntax_Proto3 ;
} else {
symtab_e rrf( ctx , " Invalid syntax ' " UPB_STRINGVIEW_FORMAT " ' " ,
UPB_STRINGVIEW_ARGS ( syntax ) ) ;
_upb_AddDefCtx_E rrf( ctx , " Invalid syntax ' " UPB_STRINGVIEW_FORMAT " ' " ,
UPB_STRINGVIEW_ARGS ( syntax ) ) ;
}
} else {
file - > syntax = kUpb_Syntax_Proto2 ;
@ -3007,38 +3028,40 @@ static void _upb_FileDef_Create(upb_AddDefCtx* ctx,
/* Verify dependencies. */
strs = google_protobuf_FileDescriptorProto_dependency ( file_proto , & n ) ;
file - > dep_count = n ;
file - > deps = symtab_a lloc( ctx , sizeof ( * file - > deps ) * n ) ;
file - > deps = _upb_AddDefCtx_A lloc( ctx , sizeof ( * file - > deps ) * n ) ;
for ( i = 0 ; i < n ; i + + ) {
upb_StringView str = strs [ i ] ;
file - > deps [ i ] =
upb_DefPool_FindFileByNameWithSize ( ctx - > symtab , str . data , str . size ) ;
if ( ! file - > deps [ i ] ) {
symtab_e rrf( ctx ,
" Depends on file ' " UPB_STRINGVIEW_FORMAT
" ', but it has not been loaded " ,
UPB_STRINGVIEW_ARGS ( str ) ) ;
_upb_AddDefCtx_E rrf( ctx ,
" Depends on file ' " UPB_STRINGVIEW_FORMAT
" ', but it has not been loaded " ,
UPB_STRINGVIEW_ARGS ( str ) ) ;
}
}
public_deps = google_protobuf_FileDescriptorProto_public_dependency ( file_proto , & n ) ;
file - > public_dep_count = n ;
file - > public_deps = symtab_a lloc( ctx , sizeof ( * file - > public_deps ) * n ) ;
file - > public_deps = _upb_AddDefCtx_A lloc( ctx , sizeof ( * file - > public_deps ) * n ) ;
int32_t * mutable_public_deps = ( int32_t * ) file - > public_deps ;
for ( i = 0 ; i < n ; i + + ) {
if ( public_deps [ i ] > = file - > dep_count ) {
symtab_errf ( ctx , " public_dep %d is out of range " , ( int ) public_deps [ i ] ) ;
_upb_AddDefCtx_Errf ( ctx , " public_dep %d is out of range " ,
( int ) public_deps [ i ] ) ;
}
mutable_public_deps [ i ] = public_deps [ i ] ;
}
weak_deps = google_protobuf_FileDescriptorProto_weak_dependency ( file_proto , & n ) ;
file - > weak_dep_count = n ;
file - > weak_deps = symtab_a lloc( ctx , sizeof ( * file - > weak_deps ) * n ) ;
file - > weak_deps = _upb_AddDefCtx_A lloc( ctx , sizeof ( * file - > weak_deps ) * n ) ;
int32_t * mutable_weak_deps = ( int32_t * ) file - > weak_deps ;
for ( i = 0 ; i < n ; i + + ) {
if ( weak_deps [ i ] > = file - > dep_count ) {
symtab_errf ( ctx , " weak_dep %d is out of range " , ( int ) weak_deps [ i ] ) ;
_upb_AddDefCtx_Errf ( ctx , " weak_dep %d is out of range " ,
( int ) weak_deps [ i ] ) ;
}
mutable_weak_deps [ i ] = weak_deps [ i ] ;
}
@ -3141,14 +3164,14 @@ static const upb_FileDef* _upb_DefPool_AddFile(
. tmp_arena = upb_Arena_New ( ) ,
} ;
if ( ! ctx . arena | | ! ctx . tmp_arena ) {
upb_Status_SetErrorMessage ( status , kOutOfMemory ) ;
} else if ( UPB_SETJMP ( ctx . err ) ) {
if ( UPB_SETJMP ( ctx . err ) ) {
UPB_ASSERT ( ! upb_Status_IsOk ( status ) ) ;
if ( ctx . file ) {
remove_filedef ( s , ctx . file ) ;
ctx . file = NULL ;
}
} else if ( ! ctx . arena | | ! ctx . tmp_arena ) {
_upb_AddDefCtx_OomErr ( & ctx ) ;
} else {
_upb_FileDef_Create ( & ctx , file_proto ) ;
upb_strtable_insert ( & s - > files , name . data , name . size ,