Updated upb to pick up several bugfixes (#7740)
* Updated upb to pick up several bugfixes. This fixes most conformance failures.
* Updated golden file, now that we are serializing as packed by default.
* Set "packed" properly: it is on by default for packable fields in proto3.
* Updated failure list for PHP now that we properly respect "packed".
* Temporarily disable encode_decode_test
Co-authored-by: Joshua Haberman <jhaberman@gmail.com>
diff --git a/php/ext/google/protobuf/php-upb.c b/php/ext/google/protobuf/php-upb.c
index f5ea2ef..7cdc042 100644
--- a/php/ext/google/protobuf/php-upb.c
+++ b/php/ext/google/protobuf/php-upb.c
@@ -174,6 +174,11 @@
#else
#define UPB_INFINITY (1.0 / 0.0)
#endif
+#ifdef NAN
+#define UPB_NAN NAN
+#else
+#define UPB_NAN (0.0 / 0.0)
+#endif
#include <setjmp.h>
#include <string.h>
@@ -235,11 +240,13 @@
(1 << UPB_DTYPE_SFIXED64);
/* Op: an action to be performed for a wire-type/field-type combination. */
-#define OP_SCALAR_LG2(n) (n)
-#define OP_FIXPCK_LG2(n) (n + 4)
-#define OP_VARPCK_LG2(n) (n + 8)
+#define OP_SCALAR_LG2(n) (n) /* n in [0, 2, 3] => op in [0, 2, 3] */
#define OP_STRING 4
-#define OP_SUBMSG 5
+#define OP_BYTES 5
+#define OP_SUBMSG 6
+/* Ops above are scalar-only. Repeated fields can use any op. */
+#define OP_FIXPCK_LG2(n) (n + 5) /* n in [2, 3] => op in [7, 8] */
+#define OP_VARPCK_LG2(n) (n + 9) /* n in [0, 2, 3] => op in [9, 11, 12] */
static const int8_t varint_ops[19] = {
-1, /* field not found */
@@ -277,7 +284,7 @@
OP_STRING, /* STRING */
-1, /* GROUP */
OP_SUBMSG, /* MESSAGE */
- OP_STRING, /* BYTES */
+ OP_BYTES, /* BYTES */
-1, /* UINT32 */
-1, /* ENUM */
-1, /* SFIXED32 */
@@ -296,7 +303,7 @@
OP_STRING, /* REPEATED STRING */
OP_SUBMSG, /* REPEATED GROUP */
OP_SUBMSG, /* REPEATED MESSAGE */
- OP_STRING, /* REPEATED BYTES */
+ OP_BYTES, /* REPEATED BYTES */
OP_VARPCK_LG2(2), /* REPEATED UINT32 */
OP_VARPCK_LG2(2), /* REPEATED ENUM */
OP_FIXPCK_LG2(2), /* REPEATED SFIXED32 */
@@ -328,6 +335,40 @@
UPB_NORETURN static void decode_err(upb_decstate *d) { longjmp(d->err, 1); }
+void decode_verifyutf8(upb_decstate *d, const char *buf, int len) {
+ static const uint8_t utf8_offset[] = {
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0,
+ };
+
+ int i, j;
+ uint8_t offset;
+
+ i = 0;
+ while (i < len) {
+ offset = utf8_offset[(uint8_t)buf[i]];
+ if (offset == 0 || i + offset > len) {
+ decode_err(d);
+ }
+ for (j = i + 1; j < i + offset; j++) {
+ if ((buf[j] & 0xc0) != 0x80) {
+ decode_err(d);
+ }
+ }
+ i += offset;
+ }
+ if (i != len) decode_err(d);
+}
+
static bool decode_reserve(upb_decstate *d, upb_array *arr, size_t elem) {
bool need_realloc = arr->size - arr->len < elem;
if (need_realloc && !_upb_array_realloc(arr, arr->len + elem, d->arena)) {
@@ -395,7 +436,7 @@
static const upb_msglayout_field *upb_find_field(const upb_msglayout *l,
uint32_t field_number) {
- static upb_msglayout_field none = {0};
+ static upb_msglayout_field none = {0, 0, 0, 0, 0, 0};
/* Lots of optimization opportunities here. */
int i;
@@ -473,7 +514,10 @@
memcpy(mem, &val, 1 << op);
return ptr;
case OP_STRING:
- /* Append string. */
+ decode_verifyutf8(d, val.str_val.data, val.str_val.size);
+ /* Fallthrough. */
+ case OP_BYTES:
+ /* Append bytes. */
mem =
UPB_PTR_AT(_upb_array_ptr(arr), arr->len * sizeof(upb_strview), void);
arr->len++;
@@ -607,6 +651,9 @@
break;
}
case OP_STRING:
+ decode_verifyutf8(d, val.str_val.data, val.str_val.size);
+ /* Fallthrough. */
+ case OP_BYTES:
memcpy(mem, &val, sizeof(upb_strview));
break;
case OP_SCALAR_LG2(3):
@@ -1892,17 +1939,6 @@
return success;
}
-bool upb_inttable_push2(upb_inttable *t, upb_value val, upb_alloc *a) {
- return upb_inttable_insert2(t, upb_inttable_count(t), val, a);
-}
-
-upb_value upb_inttable_pop(upb_inttable *t) {
- upb_value val;
- bool ok = upb_inttable_remove(t, upb_inttable_count(t) - 1, &val);
- UPB_ASSERT(ok);
- return val;
-}
-
bool upb_inttable_insertptr2(upb_inttable *t, const void *key, upb_value val,
upb_alloc *a) {
return upb_inttable_insert2(t, (uintptr_t)key, val, a);
@@ -2328,15 +2364,28 @@
static const size_t memblock_reserve = UPB_ALIGN_UP(sizeof(mem_block), 16);
+static upb_arena *arena_findroot(upb_arena *a) {
+ /* Path splitting keeps time complexity down, see:
+ * https://en.wikipedia.org/wiki/Disjoint-set_data_structure */
+ while (a->parent != a) {
+ upb_arena *next = a->parent;
+ a->parent = next->parent;
+ a = next;
+ }
+ return a;
+}
+
static void upb_arena_addblock(upb_arena *a, void *ptr, size_t size) {
mem_block *block = ptr;
+ upb_arena *root = arena_findroot(a);
- block->next = a->freelist;
+ /* The block is for arena |a|, but should appear in the freelist of |root|. */
+ block->next = root->freelist;
block->size = (uint32_t)size;
block->cleanups = 0;
- a->freelist = block;
+ root->freelist = block;
a->last_size = block->size;
- if (!a->freelist_tail) a->freelist_tail = block;
+ if (!root->freelist_tail) root->freelist_tail = block;
a->head.ptr = UPB_PTR_AT(block, memblock_reserve, char);
a->head.end = UPB_PTR_AT(block, size, char);
@@ -2371,17 +2420,6 @@
return upb_arena_realloc(a, ptr, oldsize, size);
}
-static upb_arena *arena_findroot(upb_arena *a) {
- /* Path splitting keeps time complexity down, see:
- * https://en.wikipedia.org/wiki/Disjoint-set_data_structure */
- while (a->parent != a) {
- upb_arena *next = a->parent;
- a->parent = next->parent;
- a = next;
- }
- return a;
-}
-
/* Public Arena API ***********************************************************/
upb_arena *arena_initslow(void *mem, size_t n, upb_alloc *alloc) {
@@ -2540,9 +2578,9 @@
};
static const upb_msglayout_field google_protobuf_FileDescriptorProto__fields[12] = {
- {1, UPB_SIZE(4, 8), 1, 0, 9, 1},
- {2, UPB_SIZE(12, 24), 2, 0, 9, 1},
- {3, UPB_SIZE(36, 72), 0, 0, 9, 3},
+ {1, UPB_SIZE(4, 8), 1, 0, 12, 1},
+ {2, UPB_SIZE(12, 24), 2, 0, 12, 1},
+ {3, UPB_SIZE(36, 72), 0, 0, 12, 3},
{4, UPB_SIZE(40, 80), 0, 0, 11, 3},
{5, UPB_SIZE(44, 88), 0, 1, 11, 3},
{6, UPB_SIZE(48, 96), 0, 4, 11, 3},
@@ -2551,7 +2589,7 @@
{9, UPB_SIZE(32, 64), 5, 5, 11, 1},
{10, UPB_SIZE(56, 112), 0, 0, 5, 3},
{11, UPB_SIZE(60, 120), 0, 0, 5, 3},
- {12, UPB_SIZE(20, 40), 3, 0, 9, 1},
+ {12, UPB_SIZE(20, 40), 3, 0, 12, 1},
};
const upb_msglayout google_protobuf_FileDescriptorProto_msginit = {
@@ -2571,7 +2609,7 @@
};
static const upb_msglayout_field google_protobuf_DescriptorProto__fields[10] = {
- {1, UPB_SIZE(4, 8), 1, 0, 9, 1},
+ {1, UPB_SIZE(4, 8), 1, 0, 12, 1},
{2, UPB_SIZE(16, 32), 0, 4, 11, 3},
{3, UPB_SIZE(20, 40), 0, 0, 11, 3},
{4, UPB_SIZE(24, 48), 0, 3, 11, 3},
@@ -2580,7 +2618,7 @@
{7, UPB_SIZE(12, 24), 2, 5, 11, 1},
{8, UPB_SIZE(36, 72), 0, 6, 11, 3},
{9, UPB_SIZE(40, 80), 0, 2, 11, 3},
- {10, UPB_SIZE(44, 88), 0, 0, 9, 3},
+ {10, UPB_SIZE(44, 88), 0, 0, 12, 3},
};
const upb_msglayout google_protobuf_DescriptorProto_msginit = {
@@ -2635,16 +2673,16 @@
};
static const upb_msglayout_field google_protobuf_FieldDescriptorProto__fields[11] = {
- {1, UPB_SIZE(36, 40), 6, 0, 9, 1},
- {2, UPB_SIZE(44, 56), 7, 0, 9, 1},
+ {1, UPB_SIZE(36, 40), 6, 0, 12, 1},
+ {2, UPB_SIZE(44, 56), 7, 0, 12, 1},
{3, UPB_SIZE(24, 24), 3, 0, 5, 1},
{4, UPB_SIZE(8, 8), 1, 0, 14, 1},
{5, UPB_SIZE(16, 16), 2, 0, 14, 1},
- {6, UPB_SIZE(52, 72), 8, 0, 9, 1},
- {7, UPB_SIZE(60, 88), 9, 0, 9, 1},
+ {6, UPB_SIZE(52, 72), 8, 0, 12, 1},
+ {7, UPB_SIZE(60, 88), 9, 0, 12, 1},
{8, UPB_SIZE(76, 120), 11, 0, 11, 1},
{9, UPB_SIZE(28, 28), 4, 0, 5, 1},
- {10, UPB_SIZE(68, 104), 10, 0, 9, 1},
+ {10, UPB_SIZE(68, 104), 10, 0, 12, 1},
{17, UPB_SIZE(32, 32), 5, 0, 8, 1},
};
@@ -2659,7 +2697,7 @@
};
static const upb_msglayout_field google_protobuf_OneofDescriptorProto__fields[2] = {
- {1, UPB_SIZE(4, 8), 1, 0, 9, 1},
+ {1, UPB_SIZE(4, 8), 1, 0, 12, 1},
{2, UPB_SIZE(12, 24), 2, 0, 11, 1},
};
@@ -2676,11 +2714,11 @@
};
static const upb_msglayout_field google_protobuf_EnumDescriptorProto__fields[5] = {
- {1, UPB_SIZE(4, 8), 1, 0, 9, 1},
+ {1, UPB_SIZE(4, 8), 1, 0, 12, 1},
{2, UPB_SIZE(16, 32), 0, 2, 11, 3},
{3, UPB_SIZE(12, 24), 2, 1, 11, 1},
{4, UPB_SIZE(20, 40), 0, 0, 11, 3},
- {5, UPB_SIZE(24, 48), 0, 0, 9, 3},
+ {5, UPB_SIZE(24, 48), 0, 0, 12, 3},
};
const upb_msglayout google_protobuf_EnumDescriptorProto_msginit = {
@@ -2705,7 +2743,7 @@
};
static const upb_msglayout_field google_protobuf_EnumValueDescriptorProto__fields[3] = {
- {1, UPB_SIZE(8, 8), 2, 0, 9, 1},
+ {1, UPB_SIZE(8, 8), 2, 0, 12, 1},
{2, UPB_SIZE(4, 4), 1, 0, 5, 1},
{3, UPB_SIZE(16, 24), 3, 0, 11, 1},
};
@@ -2722,7 +2760,7 @@
};
static const upb_msglayout_field google_protobuf_ServiceDescriptorProto__fields[3] = {
- {1, UPB_SIZE(4, 8), 1, 0, 9, 1},
+ {1, UPB_SIZE(4, 8), 1, 0, 12, 1},
{2, UPB_SIZE(16, 32), 0, 0, 11, 3},
{3, UPB_SIZE(12, 24), 2, 1, 11, 1},
};
@@ -2738,9 +2776,9 @@
};
static const upb_msglayout_field google_protobuf_MethodDescriptorProto__fields[6] = {
- {1, UPB_SIZE(4, 8), 3, 0, 9, 1},
- {2, UPB_SIZE(12, 24), 4, 0, 9, 1},
- {3, UPB_SIZE(20, 40), 5, 0, 9, 1},
+ {1, UPB_SIZE(4, 8), 3, 0, 12, 1},
+ {2, UPB_SIZE(12, 24), 4, 0, 12, 1},
+ {3, UPB_SIZE(20, 40), 5, 0, 12, 1},
{4, UPB_SIZE(28, 56), 6, 0, 11, 1},
{5, UPB_SIZE(1, 1), 1, 0, 8, 1},
{6, UPB_SIZE(2, 2), 2, 0, 8, 1},
@@ -2757,11 +2795,11 @@
};
static const upb_msglayout_field google_protobuf_FileOptions__fields[21] = {
- {1, UPB_SIZE(28, 32), 11, 0, 9, 1},
- {8, UPB_SIZE(36, 48), 12, 0, 9, 1},
+ {1, UPB_SIZE(28, 32), 11, 0, 12, 1},
+ {8, UPB_SIZE(36, 48), 12, 0, 12, 1},
{9, UPB_SIZE(8, 8), 1, 0, 14, 1},
{10, UPB_SIZE(16, 16), 2, 0, 8, 1},
- {11, UPB_SIZE(44, 64), 13, 0, 9, 1},
+ {11, UPB_SIZE(44, 64), 13, 0, 12, 1},
{16, UPB_SIZE(17, 17), 3, 0, 8, 1},
{17, UPB_SIZE(18, 18), 4, 0, 8, 1},
{18, UPB_SIZE(19, 19), 5, 0, 8, 1},
@@ -2769,14 +2807,14 @@
{23, UPB_SIZE(21, 21), 7, 0, 8, 1},
{27, UPB_SIZE(22, 22), 8, 0, 8, 1},
{31, UPB_SIZE(23, 23), 9, 0, 8, 1},
- {36, UPB_SIZE(52, 80), 14, 0, 9, 1},
- {37, UPB_SIZE(60, 96), 15, 0, 9, 1},
- {39, UPB_SIZE(68, 112), 16, 0, 9, 1},
- {40, UPB_SIZE(76, 128), 17, 0, 9, 1},
- {41, UPB_SIZE(84, 144), 18, 0, 9, 1},
+ {36, UPB_SIZE(52, 80), 14, 0, 12, 1},
+ {37, UPB_SIZE(60, 96), 15, 0, 12, 1},
+ {39, UPB_SIZE(68, 112), 16, 0, 12, 1},
+ {40, UPB_SIZE(76, 128), 17, 0, 12, 1},
+ {41, UPB_SIZE(84, 144), 18, 0, 12, 1},
{42, UPB_SIZE(24, 24), 10, 0, 8, 1},
- {44, UPB_SIZE(92, 160), 19, 0, 9, 1},
- {45, UPB_SIZE(100, 176), 20, 0, 9, 1},
+ {44, UPB_SIZE(92, 160), 19, 0, 12, 1},
+ {45, UPB_SIZE(100, 176), 20, 0, 12, 1},
{999, UPB_SIZE(108, 192), 0, 0, 11, 3},
};
@@ -2906,12 +2944,12 @@
static const upb_msglayout_field google_protobuf_UninterpretedOption__fields[7] = {
{2, UPB_SIZE(56, 80), 0, 0, 11, 3},
- {3, UPB_SIZE(32, 32), 4, 0, 9, 1},
+ {3, UPB_SIZE(32, 32), 4, 0, 12, 1},
{4, UPB_SIZE(8, 8), 1, 0, 4, 1},
{5, UPB_SIZE(16, 16), 2, 0, 3, 1},
{6, UPB_SIZE(24, 24), 3, 0, 1, 1},
{7, UPB_SIZE(40, 48), 5, 0, 12, 1},
- {8, UPB_SIZE(48, 64), 6, 0, 9, 1},
+ {8, UPB_SIZE(48, 64), 6, 0, 12, 1},
};
const upb_msglayout google_protobuf_UninterpretedOption_msginit = {
@@ -2921,7 +2959,7 @@
};
static const upb_msglayout_field google_protobuf_UninterpretedOption_NamePart__fields[2] = {
- {1, UPB_SIZE(4, 8), 2, 0, 9, 2},
+ {1, UPB_SIZE(4, 8), 2, 0, 12, 2},
{2, UPB_SIZE(1, 1), 1, 0, 8, 2},
};
@@ -2948,9 +2986,9 @@
static const upb_msglayout_field google_protobuf_SourceCodeInfo_Location__fields[5] = {
{1, UPB_SIZE(20, 40), 0, 0, 5, _UPB_LABEL_PACKED},
{2, UPB_SIZE(24, 48), 0, 0, 5, _UPB_LABEL_PACKED},
- {3, UPB_SIZE(4, 8), 1, 0, 9, 1},
- {4, UPB_SIZE(12, 24), 2, 0, 9, 1},
- {6, UPB_SIZE(28, 56), 0, 0, 9, 3},
+ {3, UPB_SIZE(4, 8), 1, 0, 12, 1},
+ {4, UPB_SIZE(12, 24), 2, 0, 12, 1},
+ {6, UPB_SIZE(28, 56), 0, 0, 12, 3},
};
const upb_msglayout google_protobuf_SourceCodeInfo_Location_msginit = {
@@ -2975,7 +3013,7 @@
static const upb_msglayout_field google_protobuf_GeneratedCodeInfo_Annotation__fields[4] = {
{1, UPB_SIZE(20, 32), 0, 0, 5, _UPB_LABEL_PACKED},
- {2, UPB_SIZE(12, 16), 3, 0, 9, 1},
+ {2, UPB_SIZE(12, 16), 3, 0, 12, 1},
{3, UPB_SIZE(4, 4), 1, 0, 5, 1},
{4, UPB_SIZE(8, 8), 2, 0, 5, 1},
};
@@ -4383,6 +4421,13 @@
field->descriptortype = upb_fielddef_descriptortype(f);
field->label = upb_fielddef_label(f);
+ if (field->descriptortype == UPB_DTYPE_STRING &&
+ f->file->syntax == UPB_SYNTAX_PROTO2) {
+ /* See TableDescriptorType() in upbc/generator.cc for details and
+ * rationale. */
+ field->descriptortype = UPB_DTYPE_BYTES;
+ }
+
if (upb_fielddef_ismap(f)) {
field->label = _UPB_LABEL_MAP;
} else if (upb_fielddef_packed(f)) {
@@ -4918,13 +4963,21 @@
f->oneof = NULL;
}
- if (google_protobuf_FieldDescriptorProto_has_options(field_proto)) {
- options = google_protobuf_FieldDescriptorProto_options(field_proto);
- f->lazy_ = google_protobuf_FieldOptions_lazy(options);
+ options = google_protobuf_FieldDescriptorProto_has_options(field_proto) ?
+ google_protobuf_FieldDescriptorProto_options(field_proto) : NULL;
+
+ if (options && google_protobuf_FieldOptions_has_packed(options)) {
f->packed_ = google_protobuf_FieldOptions_packed(options);
} else {
+ /* Repeated fields default to packed for proto3 only. */
+ f->packed_ = upb_fielddef_isprimitive(f) &&
+ f->label_ == UPB_LABEL_REPEATED && f->file->syntax == UPB_SYNTAX_PROTO3;
+ }
+
+ if (options) {
+ f->lazy_ = google_protobuf_FieldOptions_lazy(options);
+ } else {
f->lazy_ = false;
- f->packed_ = false;
}
return true;
@@ -5188,7 +5241,7 @@
const google_protobuf_FieldDescriptorProto *const *exts;
const upb_strview* strs;
size_t i, n;
- decl_counts counts = {0};
+ decl_counts counts = {0, 0, 0};
count_types_in_file(file_proto, &counts);
@@ -6341,6 +6394,7 @@
upb_strview ret;
ret.data = buf;
ret.size = end - buf;
+ *end = '\0'; /* Needed for possible strtod(). */
return ret;
}
case '\\':
@@ -6665,7 +6719,7 @@
case JD_STRING:
str = jsondec_string(d);
if (jsondec_streql(str, "NaN")) {
- val.double_val = 0.0 / 0.0;
+ val.double_val = UPB_NAN;
} else if (jsondec_streql(str, "Infinity")) {
val.double_val = UPB_INFINITY;
} else if (jsondec_streql(str, "-Infinity")) {
@@ -7655,7 +7709,7 @@
ret = upb_symtab_lookupmsg2(e->ext_pool, ptr, end - ptr);
if (!ret) {
- jsonenc_errf(e, "Couldn't find Any type: %.*s (full URL: " UPB_STRVIEW_FORMAT ")", (int)(end - ptr), ptr, UPB_STRVIEW_ARGS(type_url));
+ jsonenc_errf(e, "Couldn't find Any type: %.*s", (int)(end - ptr), ptr);
}
return ret;
@@ -8071,6 +8125,7 @@
#undef UPB_ASSERT_DEBUGVAR
#undef UPB_UNREACHABLE
#undef UPB_INFINITY
+#undef UPB_NAN
#undef UPB_MSVC_VSNPRINTF
#undef _upb_snprintf
#undef _upb_vsnprintf
diff --git a/php/ext/google/protobuf/php-upb.h b/php/ext/google/protobuf/php-upb.h
index a07885f..dfaaf7a 100644
--- a/php/ext/google/protobuf/php-upb.h
+++ b/php/ext/google/protobuf/php-upb.h
@@ -173,6 +173,11 @@
#else
#define UPB_INFINITY (1.0 / 0.0)
#endif
+#ifdef NAN
+#define UPB_NAN NAN
+#else
+#define UPB_NAN (0.0 / 0.0)
+#endif
/*
** upb_decode: parsing into a upb_msg using a upb_msglayout.
*/
@@ -799,15 +804,6 @@
* invalidate iterators. */
bool upb_inttable_replace(upb_inttable *t, uintptr_t key, upb_value val);
-/* Handy routines for treating an inttable like a stack. May not be mixed with
- * other insert/remove calls. */
-bool upb_inttable_push2(upb_inttable *t, upb_value val, upb_alloc *a);
-upb_value upb_inttable_pop(upb_inttable *t);
-
-UPB_INLINE bool upb_inttable_push(upb_inttable *t, upb_value val) {
- return upb_inttable_push2(t, val, &upb_alloc_global);
-}
-
/* Convenience routines for inttables with pointer keys. */
bool upb_inttable_insertptr2(upb_inttable *t, const void *key, upb_value val,
upb_alloc *a);
@@ -1072,7 +1068,7 @@
UPB_INLINE size_t _upb_oneofcase_ofs(const upb_msglayout_field *f) {
UPB_ASSERT(f->presence < 0);
- return ~(int64_t)f->presence;
+ return ~(ptrdiff_t)f->presence;
}
UPB_INLINE uint32_t *_upb_oneofcase_field(upb_msg *msg,
@@ -3879,6 +3875,7 @@
#undef UPB_ASSERT_DEBUGVAR
#undef UPB_UNREACHABLE
#undef UPB_INFINITY
+#undef UPB_NAN
#undef UPB_MSVC_VSNPRINTF
#undef _upb_snprintf
#undef _upb_vsnprintf
diff --git a/php/src/Google/Protobuf/Internal/FieldDescriptor.php b/php/src/Google/Protobuf/Internal/FieldDescriptor.php
index 98b516f..ce83f63 100644
--- a/php/src/Google/Protobuf/Internal/FieldDescriptor.php
+++ b/php/src/Google/Protobuf/Internal/FieldDescriptor.php
@@ -229,7 +229,17 @@
}
$oneof_index = $proto->hasOneofIndex() ? $proto->getOneofIndex() : -1;
- $packed = false;
+ // TODO: once proto2 is supported, this default should be false
+ // for proto2.
+ if ($proto->getLabel() === GPBLabel::REPEATED &&
+ $proto->getType() !== GPBType::MESSAGE &&
+ $proto->getType() !== GPBType::GROUP &&
+ $proto->getType() !== GPBType::STRING &&
+ $proto->getType() !== GPBType::BYTES) {
+ $packed = true;
+ } else {
+ $packed = false;
+ }
$options = $proto->getOptions();
if ($options !== null) {
$packed = $options->getPacked();
diff --git a/php/tests/compatibility_test.sh b/php/tests/compatibility_test.sh
index ddf05e8..d1417d9 100755
--- a/php/tests/compatibility_test.sh
+++ b/php/tests/compatibility_test.sh
@@ -100,11 +100,18 @@
composer install
# Remove implementation detail tests.
-tests=( array_test.php encode_decode_test.php generated_class_test.php map_field_test.php well_known_test.php )
+# TODO(teboring): Temporarily disable encode_decode_test.php. In 3.13.0-rc1,
+# repeated primitive field encoding is changed to packed, which is a bug fix.
+# However, this fails the compatibility test which hard coded old encoding.
+# Will reenable the test after making a release. After the version bump, the
+# compatibility test will use the updated test code.
+tests=( array_test.php generated_class_test.php map_field_test.php well_known_test.php )
sed -i.bak '/php_implementation_test.php/d' phpunit.xml
sed -i.bak '/generated_phpdoc_test.php/d' phpunit.xml
+sed -i.bak '/encode_decode_test.php/d' phpunit.xml
sed -i.bak 's/generated_phpdoc_test.php//g' tests/test.sh
sed -i.bak 's/generated_service_test.php//g' tests/test.sh
+sed -i.bak 's/encode_decode_test.php//g' tests/test.sh
sed -i.bak '/memory_leak_test.php/d' tests/test.sh
sed -i.bak '/^ public function testTimestamp()$/,/^ }$/d' tests/well_known_test.php
sed -i.bak 's/PHPUnit_Framework_TestCase/\\PHPUnit\\Framework\\TestCase/g' tests/array_test.php
diff --git a/php/tests/php_implementation_test.php b/php/tests/php_implementation_test.php
index db3c361..f9fc1fd 100644
--- a/php/tests/php_implementation_test.php
+++ b/php/tests/php_implementation_test.php
@@ -515,7 +515,7 @@
{
$m = new TestMessage();
TestUtil::setTestMessage($m);
- $this->assertSame(518, $m->byteSize());
+ $this->assertSame(504, $m->byteSize());
}
public function testPackedByteSize()
diff --git a/php/tests/test_util.php b/php/tests/test_util.php
index 2c5b595..c47bf58 100644
--- a/php/tests/test_util.php
+++ b/php/tests/test_util.php
@@ -338,38 +338,24 @@
"800101" .
"8A01020821" .
- "F801D6FFFFFFFFFFFFFFFF01" .
- "F801CCFFFFFFFFFFFFFFFF01" .
- "8002D5FFFFFFFFFFFFFFFF01" .
- "8002CBFFFFFFFFFFFFFFFF01" .
- "88022A" .
- "880234" .
- "90022B" .
- "900235" .
- "980257" .
- "98026B" .
- "A00259" .
- "A0026D" .
- "AD022E000000" .
- "AD0238000000" .
- "B1022F00000000000000" .
- "B1023900000000000000" .
- "BD02D2FFFFFF" .
- "BD02C8FFFFFF" .
- "C102D1FFFFFFFFFFFFFF" .
- "C102C7FFFFFFFFFFFFFF" .
- "CD020000C03F" .
- "CD0200002040" .
- "D1029A9999999999F93F" .
- "D102CDCCCCCCCCCC0440" .
- "D80201" .
- "D80200" .
+ "FA0114D6FFFFFFFFFFFFFFFF01CCFFFFFFFFFFFFFFFF01" .
+ "820214D5FFFFFFFFFFFFFFFF01CBFFFFFFFFFFFFFFFF01" .
+ "8A02022A34" .
+ "9202022B35" .
+ "9A0202576B" .
+ "A20202596D" .
+ "AA02082E00000038000000" .
+ "B202102F000000000000003900000000000000" .
+ "BA0208D2FFFFFFC8FFFFFF" .
+ "C20210D1FFFFFFFFFFFFFFC7FFFFFFFFFFFFFF" .
+ "CA02080000C03F00002040" .
+ "D202109A9999999999F93FCDCCCCCCCCCC0440" .
+ "DA02020100" .
"E2020161" .
"E2020163" .
"EA020462626262" .
"EA020464646464" .
- "F00200" .
- "F00201" .
+ "F202020001" .
"FA02020822" .
"FA02020823" .