diff --git a/upb/def.c b/upb/def.c index 1a83687788..c3c9d104fc 100644 --- a/upb/def.c +++ b/upb/def.c @@ -1331,7 +1331,7 @@ static bool create_fielddef( break; } } - assert(found); + UPB_ASSERT(found); } } else { /* extension field. */ diff --git a/upb/json/parser.rl b/upb/json/parser.rl index 1180ce137f..eefdadf577 100644 --- a/upb/json/parser.rl +++ b/upb/json/parser.rl @@ -389,7 +389,7 @@ static upb_selector_t getsel_for_handlertype(upb_json_parser *p, upb_handlertype_t type) { upb_selector_t sel; bool ok = upb_handlers_getselector(p->top->f, type, &sel); - UPB_ASSERT(ok); + UPB_ASSUME(ok); return sel; } @@ -414,7 +414,7 @@ static void set_name_table(upb_json_parser *p, upb_jsonparser_frame *frame) { const upb_json_parsermethod *method; ok = upb_inttable_lookupptr(&cache->methods, frame->m, &v); - UPB_ASSERT(ok); + UPB_ASSUME(ok); method = upb_value_getconstptr(v); frame->name_table = &method->name_table; @@ -2019,7 +2019,7 @@ static void end_member(upb_json_parser *p) { /* send ENDSUBMSG in repeated-field-of-mapentries frame. */ p->top--; ok = upb_handlers_getselector(mapfield, UPB_HANDLER_ENDSUBMSG, &sel); - UPB_ASSERT(ok); + UPB_ASSUME(ok); upb_sink_endsubmsg(p->top->sink, (p->top + 1)->sink, sel); } diff --git a/upb/pb/compile_decoder.c b/upb/pb/compile_decoder.c index f5c7d65646..44b310fe3f 100644 --- a/upb/pb/compile_decoder.c +++ b/upb/pb/compile_decoder.c @@ -910,10 +910,10 @@ const upb_pbdecodermethod *upb_pbcodecache_get(upb_pbcodecache *c, } else { g = mgroup_new(h, c->lazy); ok = upb_inttable_insertptr(&c->groups, md, upb_value_constptr(g)); - UPB_ASSERT(ok); + UPB_ASSUME(ok); } ok = upb_inttable_lookupptr(&g->methods, h, &v); - UPB_ASSERT(ok); + UPB_ASSUME(ok); return upb_value_getptr(v); } diff --git a/upb/port_def.inc b/upb/port_def.inc index 992148e736..51f8eac96f 100644 --- a/upb/port_def.inc +++ b/upb/port_def.inc @@ -128,6 +128,18 @@ int msvc_vsnprintf(char* s, size_t n, const char* format, va_list arg); #define UPB_UNUSED(var) (void)var +/* UPB_ASSUME(): in release mode, we tell the compiler to assume this is true. + */ +#ifdef NDEBUG +#ifdef __GNUC__ +#define UPB_ASSUME(expr) if (!(expr)) __builtin_unreachable() +#else +#define UPB_ASSUME(expr) do {} if (false && (expr)) +#endif +#else +#define UPB_ASSUME(expr) assert(expr) +#endif + /* UPB_ASSERT(): in release mode, we use the expression without letting it be * evaluated. This prevents "unused variable" warnings. */ #ifdef NDEBUG diff --git a/upb/port_undef.inc b/upb/port_undef.inc index 6a4daa5076..e91e9644bb 100644 --- a/upb/port_undef.inc +++ b/upb/port_undef.inc @@ -12,6 +12,7 @@ #undef UPB_MAX #undef UPB_MIN #undef UPB_UNUSED +#undef UPB_ASSUME #undef UPB_ASSERT #undef UPB_ASSERT_DEBUGVAR #undef UPB_UNREACHABLE