static bool upb_trypullbuf(upb_decoder *d) { assert(upb_decoder_bufleft(d) == 0); upb_decoder_skiptonewbuf(d, upb_decoder_offset(d)); if (upb_byteregion_available(d->input, d->bufstart_ofs) == 0) { switch (upb_byteregion_fetch(d->input)) { case UPB_BYTE_OK: assert(upb_byteregion_available(d->input, d->bufstart_ofs) > 0); break; case UPB_BYTE_EOF: return false; case UPB_BYTE_ERROR: upb_decoder_abortjmp(d, "I/O error in input"); // Decoder resuming is not yet supported. case UPB_BYTE_WOULDBLOCK: upb_decoder_abortjmp(d, "Input returned WOULDBLOCK"); } } size_t len; d->buf = upb_byteregion_getptr(d->input, d->bufstart_ofs, &len); assert(len > 0); d->ptr = d->buf; d->end = d->buf + len; upb_decoder_setmsgend(d); #ifdef UPB_USE_JIT_X64 // If we start parsing a value, we can parse up to 20 bytes without // having to bounds-check anything (2 10-byte varints). Since the // JIT bounds-checks only *between* values (and for strings), the // JIT bails if there are not 20 bytes available. d->jit_end = d->end - 20; #endif assert(upb_decoder_bufleft(d) > 0); return true; }
bool upb_fielddef_setdefaultstr(upb_fielddef *f, const void *str, size_t len) { assert(upb_fielddef_isstring(f) || f->type_ == UPB_TYPE(ENUM)); if (f->type_ == UPB_TYPE(ENUM) && !upb_isident(str, len, false)) return false; if (f->default_is_string) { upb_byteregion *bytes = upb_value_getbyteregion(f->defaultval); assert(bytes); upb_byteregion_free(bytes); } else { assert(f->type_ == UPB_TYPE(ENUM)); } upb_byteregion *r = upb_byteregion_newl(str, len); upb_value_setbyteregion(&f->defaultval, r); upb_bytesuccess_t ret = upb_byteregion_fetch(r); UPB_ASSERT_VAR(ret, ret == (len == 0 ? UPB_BYTE_EOF : UPB_BYTE_OK)); assert(upb_byteregion_available(r, 0) == upb_byteregion_len(r)); f->default_is_string = true; return true; }