summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt4
-rw-r--r--google/protobuf/descriptor.upb.c352
-rw-r--r--tests/bindings/lua/test_upb.lua15
-rw-r--r--tools/make_c_api.lua72
-rw-r--r--upb/decode.c28
-rw-r--r--upb/encode.c68
-rw-r--r--upb/msg.c36
-rw-r--r--upb/msg.h25
-rw-r--r--upb/msgfactory.c102
9 files changed, 247 insertions, 455 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2b068e0..18286e0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -11,6 +11,10 @@ cmake_minimum_required (VERSION 3.0)
cmake_policy(SET CMP0048 NEW)
project (upb)
+# Prevent CMake from setting -rdynamic on Linux (!!).
+SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
+SET(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
+
# Options we define for users.
option(UPB_ENABLE_ASAN "Enable address sanitizer." OFF)
option(UPB_ENABLE_UBSAN "Enable undefined behavior sanitizer." OFF)
diff --git a/google/protobuf/descriptor.upb.c b/google/protobuf/descriptor.upb.c
index 2a64717..45664de 100644
--- a/google/protobuf/descriptor.upb.c
+++ b/google/protobuf/descriptor.upb.c
@@ -17,15 +17,13 @@ static const upb_msglayout *const google_protobuf_FileDescriptorSet_submsgs[1] =
};
static const upb_msglayout_field google_protobuf_FileDescriptorSet__fields[1] = {
- {1, UPB_SIZE(0, 0), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 0, 11, 3},
+ {1, UPB_SIZE(0, 0), 0, 0, 11, 3},
};
const upb_msglayout google_protobuf_FileDescriptorSet_msginit = {
&google_protobuf_FileDescriptorSet_submsgs[0],
&google_protobuf_FileDescriptorSet__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(4, 8), 1, 0, false, true
+ UPB_SIZE(4, 8), 1, false,
};
static const upb_msglayout *const google_protobuf_FileDescriptorProto_submsgs[6] = {
@@ -38,26 +36,24 @@ static const upb_msglayout *const google_protobuf_FileDescriptorProto_submsgs[6]
};
static const upb_msglayout_field google_protobuf_FileDescriptorProto__fields[12] = {
- {1, UPB_SIZE(8, 16), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {2, UPB_SIZE(16, 32), 1, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {3, UPB_SIZE(40, 80), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 3},
- {4, UPB_SIZE(44, 88), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 0, 11, 3},
- {5, UPB_SIZE(48, 96), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 1, 11, 3},
- {6, UPB_SIZE(52, 104), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 4, 11, 3},
- {7, UPB_SIZE(56, 112), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 2, 11, 3},
- {8, UPB_SIZE(32, 64), 3, UPB_NOT_IN_ONEOF, 3, 11, 1},
- {9, UPB_SIZE(36, 72), 4, UPB_NOT_IN_ONEOF, 5, 11, 1},
- {10, UPB_SIZE(60, 120), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 5, 3},
- {11, UPB_SIZE(64, 128), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 5, 3},
- {12, UPB_SIZE(24, 48), 2, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
+ {1, UPB_SIZE(8, 16), 1, 0, 9, 1},
+ {2, UPB_SIZE(16, 32), 2, 0, 9, 1},
+ {3, UPB_SIZE(40, 80), 0, 0, 9, 3},
+ {4, UPB_SIZE(44, 88), 0, 0, 11, 3},
+ {5, UPB_SIZE(48, 96), 0, 1, 11, 3},
+ {6, UPB_SIZE(52, 104), 0, 4, 11, 3},
+ {7, UPB_SIZE(56, 112), 0, 2, 11, 3},
+ {8, UPB_SIZE(32, 64), 4, 3, 11, 1},
+ {9, UPB_SIZE(36, 72), 5, 5, 11, 1},
+ {10, UPB_SIZE(60, 120), 0, 0, 5, 3},
+ {11, UPB_SIZE(64, 128), 0, 0, 5, 3},
+ {12, UPB_SIZE(24, 48), 3, 0, 9, 1},
};
const upb_msglayout google_protobuf_FileDescriptorProto_msginit = {
&google_protobuf_FileDescriptorProto_submsgs[0],
&google_protobuf_FileDescriptorProto__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(72, 144), 12, 0, false, true
+ UPB_SIZE(72, 144), 12, false,
};
static const upb_msglayout *const google_protobuf_DescriptorProto_submsgs[8] = {
@@ -71,24 +67,22 @@ static const upb_msglayout *const google_protobuf_DescriptorProto_submsgs[8] = {
};
static const upb_msglayout_field google_protobuf_DescriptorProto__fields[10] = {
- {1, UPB_SIZE(8, 16), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {2, UPB_SIZE(20, 40), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 4, 11, 3},
- {3, UPB_SIZE(24, 48), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 0, 11, 3},
- {4, UPB_SIZE(28, 56), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 3, 11, 3},
- {5, UPB_SIZE(32, 64), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 1, 11, 3},
- {6, UPB_SIZE(36, 72), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 4, 11, 3},
- {7, UPB_SIZE(16, 32), 1, UPB_NOT_IN_ONEOF, 5, 11, 1},
- {8, UPB_SIZE(40, 80), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 6, 11, 3},
- {9, UPB_SIZE(44, 88), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 2, 11, 3},
- {10, UPB_SIZE(48, 96), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 3},
+ {1, UPB_SIZE(8, 16), 1, 0, 9, 1},
+ {2, UPB_SIZE(20, 40), 0, 4, 11, 3},
+ {3, UPB_SIZE(24, 48), 0, 0, 11, 3},
+ {4, UPB_SIZE(28, 56), 0, 3, 11, 3},
+ {5, UPB_SIZE(32, 64), 0, 1, 11, 3},
+ {6, UPB_SIZE(36, 72), 0, 4, 11, 3},
+ {7, UPB_SIZE(16, 32), 2, 5, 11, 1},
+ {8, UPB_SIZE(40, 80), 0, 6, 11, 3},
+ {9, UPB_SIZE(44, 88), 0, 2, 11, 3},
+ {10, UPB_SIZE(48, 96), 0, 0, 9, 3},
};
const upb_msglayout google_protobuf_DescriptorProto_msginit = {
&google_protobuf_DescriptorProto_submsgs[0],
&google_protobuf_DescriptorProto__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(56, 112), 10, 0, false, true
+ UPB_SIZE(56, 112), 10, false,
};
static const upb_msglayout *const google_protobuf_DescriptorProto_ExtensionRange_submsgs[1] = {
@@ -96,30 +90,26 @@ static const upb_msglayout *const google_protobuf_DescriptorProto_ExtensionRange
};
static const upb_msglayout_field google_protobuf_DescriptorProto_ExtensionRange__fields[3] = {
- {1, UPB_SIZE(4, 4), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 5, 1},
- {2, UPB_SIZE(8, 8), 1, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 5, 1},
- {3, UPB_SIZE(12, 16), 2, UPB_NOT_IN_ONEOF, 0, 11, 1},
+ {1, UPB_SIZE(4, 4), 1, 0, 5, 1},
+ {2, UPB_SIZE(8, 8), 2, 0, 5, 1},
+ {3, UPB_SIZE(12, 16), 3, 0, 11, 1},
};
const upb_msglayout google_protobuf_DescriptorProto_ExtensionRange_msginit = {
&google_protobuf_DescriptorProto_ExtensionRange_submsgs[0],
&google_protobuf_DescriptorProto_ExtensionRange__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(16, 24), 3, 0, false, true
+ UPB_SIZE(16, 24), 3, false,
};
static const upb_msglayout_field google_protobuf_DescriptorProto_ReservedRange__fields[2] = {
- {1, UPB_SIZE(4, 4), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 5, 1},
- {2, UPB_SIZE(8, 8), 1, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 5, 1},
+ {1, UPB_SIZE(4, 4), 1, 0, 5, 1},
+ {2, UPB_SIZE(8, 8), 2, 0, 5, 1},
};
const upb_msglayout google_protobuf_DescriptorProto_ReservedRange_msginit = {
NULL,
&google_protobuf_DescriptorProto_ReservedRange__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(12, 12), 2, 0, false, true
+ UPB_SIZE(12, 12), 2, false,
};
static const upb_msglayout *const google_protobuf_ExtensionRangeOptions_submsgs[1] = {
@@ -127,15 +117,13 @@ static const upb_msglayout *const google_protobuf_ExtensionRangeOptions_submsgs[
};
static const upb_msglayout_field google_protobuf_ExtensionRangeOptions__fields[1] = {
- {999, UPB_SIZE(0, 0), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 0, 11, 3},
+ {999, UPB_SIZE(0, 0), 0, 0, 11, 3},
};
const upb_msglayout google_protobuf_ExtensionRangeOptions_msginit = {
&google_protobuf_ExtensionRangeOptions_submsgs[0],
&google_protobuf_ExtensionRangeOptions__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(4, 8), 1, 0, false, true
+ UPB_SIZE(4, 8), 1, false,
};
static const upb_msglayout *const google_protobuf_FieldDescriptorProto_submsgs[1] = {
@@ -143,24 +131,22 @@ static const upb_msglayout *const google_protobuf_FieldDescriptorProto_submsgs[1
};
static const upb_msglayout_field google_protobuf_FieldDescriptorProto__fields[10] = {
- {1, UPB_SIZE(32, 32), 4, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {2, UPB_SIZE(40, 48), 5, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {3, UPB_SIZE(24, 24), 2, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 5, 1},
- {4, UPB_SIZE(8, 8), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 14, 1},
- {5, UPB_SIZE(16, 16), 1, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 14, 1},
- {6, UPB_SIZE(48, 64), 6, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {7, UPB_SIZE(56, 80), 7, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {8, UPB_SIZE(72, 112), 9, UPB_NOT_IN_ONEOF, 0, 11, 1},
- {9, UPB_SIZE(28, 28), 3, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 5, 1},
- {10, UPB_SIZE(64, 96), 8, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
+ {1, UPB_SIZE(32, 32), 5, 0, 9, 1},
+ {2, UPB_SIZE(40, 48), 6, 0, 9, 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(48, 64), 7, 0, 9, 1},
+ {7, UPB_SIZE(56, 80), 8, 0, 9, 1},
+ {8, UPB_SIZE(72, 112), 10, 0, 11, 1},
+ {9, UPB_SIZE(28, 28), 4, 0, 5, 1},
+ {10, UPB_SIZE(64, 96), 9, 0, 9, 1},
};
const upb_msglayout google_protobuf_FieldDescriptorProto_msginit = {
&google_protobuf_FieldDescriptorProto_submsgs[0],
&google_protobuf_FieldDescriptorProto__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(80, 128), 10, 0, false, true
+ UPB_SIZE(80, 128), 10, false,
};
static const upb_msglayout *const google_protobuf_OneofDescriptorProto_submsgs[1] = {
@@ -168,16 +154,14 @@ static const upb_msglayout *const google_protobuf_OneofDescriptorProto_submsgs[1
};
static const upb_msglayout_field google_protobuf_OneofDescriptorProto__fields[2] = {
- {1, UPB_SIZE(8, 16), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {2, UPB_SIZE(16, 32), 1, UPB_NOT_IN_ONEOF, 0, 11, 1},
+ {1, UPB_SIZE(8, 16), 1, 0, 9, 1},
+ {2, UPB_SIZE(16, 32), 2, 0, 11, 1},
};
const upb_msglayout google_protobuf_OneofDescriptorProto_msginit = {
&google_protobuf_OneofDescriptorProto_submsgs[0],
&google_protobuf_OneofDescriptorProto__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(24, 48), 2, 0, false, true
+ UPB_SIZE(24, 48), 2, false,
};
static const upb_msglayout *const google_protobuf_EnumDescriptorProto_submsgs[3] = {
@@ -187,32 +171,28 @@ static const upb_msglayout *const google_protobuf_EnumDescriptorProto_submsgs[3]
};
static const upb_msglayout_field google_protobuf_EnumDescriptorProto__fields[5] = {
- {1, UPB_SIZE(8, 16), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {2, UPB_SIZE(20, 40), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 2, 11, 3},
- {3, UPB_SIZE(16, 32), 1, UPB_NOT_IN_ONEOF, 1, 11, 1},
- {4, UPB_SIZE(24, 48), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 0, 11, 3},
- {5, UPB_SIZE(28, 56), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 3},
+ {1, UPB_SIZE(8, 16), 1, 0, 9, 1},
+ {2, UPB_SIZE(20, 40), 0, 2, 11, 3},
+ {3, UPB_SIZE(16, 32), 2, 1, 11, 1},
+ {4, UPB_SIZE(24, 48), 0, 0, 11, 3},
+ {5, UPB_SIZE(28, 56), 0, 0, 9, 3},
};
const upb_msglayout google_protobuf_EnumDescriptorProto_msginit = {
&google_protobuf_EnumDescriptorProto_submsgs[0],
&google_protobuf_EnumDescriptorProto__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(32, 64), 5, 0, false, true
+ UPB_SIZE(32, 64), 5, false,
};
static const upb_msglayout_field google_protobuf_EnumDescriptorProto_EnumReservedRange__fields[2] = {
- {1, UPB_SIZE(4, 4), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 5, 1},
- {2, UPB_SIZE(8, 8), 1, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 5, 1},
+ {1, UPB_SIZE(4, 4), 1, 0, 5, 1},
+ {2, UPB_SIZE(8, 8), 2, 0, 5, 1},
};
const upb_msglayout google_protobuf_EnumDescriptorProto_EnumReservedRange_msginit = {
NULL,
&google_protobuf_EnumDescriptorProto_EnumReservedRange__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(12, 12), 2, 0, false, true
+ UPB_SIZE(12, 12), 2, false,
};
static const upb_msglayout *const google_protobuf_EnumValueDescriptorProto_submsgs[1] = {
@@ -220,17 +200,15 @@ static const upb_msglayout *const google_protobuf_EnumValueDescriptorProto_subms
};
static const upb_msglayout_field google_protobuf_EnumValueDescriptorProto__fields[3] = {
- {1, UPB_SIZE(8, 16), 1, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {2, UPB_SIZE(4, 4), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 5, 1},
- {3, UPB_SIZE(16, 32), 2, UPB_NOT_IN_ONEOF, 0, 11, 1},
+ {1, UPB_SIZE(8, 16), 2, 0, 9, 1},
+ {2, UPB_SIZE(4, 4), 1, 0, 5, 1},
+ {3, UPB_SIZE(16, 32), 3, 0, 11, 1},
};
const upb_msglayout google_protobuf_EnumValueDescriptorProto_msginit = {
&google_protobuf_EnumValueDescriptorProto_submsgs[0],
&google_protobuf_EnumValueDescriptorProto__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(24, 48), 3, 0, false, true
+ UPB_SIZE(24, 48), 3, false,
};
static const upb_msglayout *const google_protobuf_ServiceDescriptorProto_submsgs[2] = {
@@ -239,17 +217,15 @@ static const upb_msglayout *const google_protobuf_ServiceDescriptorProto_submsgs
};
static const upb_msglayout_field google_protobuf_ServiceDescriptorProto__fields[3] = {
- {1, UPB_SIZE(8, 16), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {2, UPB_SIZE(20, 40), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 0, 11, 3},
- {3, UPB_SIZE(16, 32), 1, UPB_NOT_IN_ONEOF, 1, 11, 1},
+ {1, UPB_SIZE(8, 16), 1, 0, 9, 1},
+ {2, UPB_SIZE(20, 40), 0, 0, 11, 3},
+ {3, UPB_SIZE(16, 32), 2, 1, 11, 1},
};
const upb_msglayout google_protobuf_ServiceDescriptorProto_msginit = {
&google_protobuf_ServiceDescriptorProto_submsgs[0],
&google_protobuf_ServiceDescriptorProto__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(24, 48), 3, 0, false, true
+ UPB_SIZE(24, 48), 3, false,
};
static const upb_msglayout *const google_protobuf_MethodDescriptorProto_submsgs[1] = {
@@ -257,20 +233,18 @@ static const upb_msglayout *const google_protobuf_MethodDescriptorProto_submsgs[
};
static const upb_msglayout_field google_protobuf_MethodDescriptorProto__fields[6] = {
- {1, UPB_SIZE(8, 16), 2, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {2, UPB_SIZE(16, 32), 3, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {3, UPB_SIZE(24, 48), 4, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {4, UPB_SIZE(32, 64), 5, UPB_NOT_IN_ONEOF, 0, 11, 1},
- {5, UPB_SIZE(1, 1), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {6, UPB_SIZE(2, 2), 1, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
+ {1, UPB_SIZE(8, 16), 3, 0, 9, 1},
+ {2, UPB_SIZE(16, 32), 4, 0, 9, 1},
+ {3, UPB_SIZE(24, 48), 5, 0, 9, 1},
+ {4, UPB_SIZE(32, 64), 6, 0, 11, 1},
+ {5, UPB_SIZE(1, 1), 1, 0, 8, 1},
+ {6, UPB_SIZE(2, 2), 2, 0, 8, 1},
};
const upb_msglayout google_protobuf_MethodDescriptorProto_msginit = {
&google_protobuf_MethodDescriptorProto_submsgs[0],
&google_protobuf_MethodDescriptorProto__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(40, 80), 6, 0, false, true
+ UPB_SIZE(40, 80), 6, false,
};
static const upb_msglayout *const google_protobuf_FileOptions_submsgs[1] = {
@@ -278,33 +252,31 @@ static const upb_msglayout *const google_protobuf_FileOptions_submsgs[1] = {
};
static const upb_msglayout_field google_protobuf_FileOptions__fields[19] = {
- {1, UPB_SIZE(32, 32), 10, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {8, UPB_SIZE(40, 48), 11, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {9, UPB_SIZE(8, 8), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 14, 1},
- {10, UPB_SIZE(16, 16), 1, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {11, UPB_SIZE(48, 64), 12, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {16, UPB_SIZE(17, 17), 2, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {17, UPB_SIZE(18, 18), 3, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {18, UPB_SIZE(19, 19), 4, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {20, UPB_SIZE(20, 20), 5, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {23, UPB_SIZE(21, 21), 6, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {27, UPB_SIZE(22, 22), 7, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {31, UPB_SIZE(23, 23), 8, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {36, UPB_SIZE(56, 80), 13, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {37, UPB_SIZE(64, 96), 14, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {39, UPB_SIZE(72, 112), 15, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {40, UPB_SIZE(80, 128), 16, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {41, UPB_SIZE(88, 144), 17, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {42, UPB_SIZE(24, 24), 9, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {999, UPB_SIZE(96, 160), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 0, 11, 3},
+ {1, UPB_SIZE(32, 32), 11, 0, 9, 1},
+ {8, UPB_SIZE(40, 48), 12, 0, 9, 1},
+ {9, UPB_SIZE(8, 8), 1, 0, 14, 1},
+ {10, UPB_SIZE(16, 16), 2, 0, 8, 1},
+ {11, UPB_SIZE(48, 64), 13, 0, 9, 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},
+ {20, UPB_SIZE(20, 20), 6, 0, 8, 1},
+ {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(56, 80), 14, 0, 9, 1},
+ {37, UPB_SIZE(64, 96), 15, 0, 9, 1},
+ {39, UPB_SIZE(72, 112), 16, 0, 9, 1},
+ {40, UPB_SIZE(80, 128), 17, 0, 9, 1},
+ {41, UPB_SIZE(88, 144), 18, 0, 9, 1},
+ {42, UPB_SIZE(24, 24), 10, 0, 8, 1},
+ {999, UPB_SIZE(96, 160), 0, 0, 11, 3},
};
const upb_msglayout google_protobuf_FileOptions_msginit = {
&google_protobuf_FileOptions_submsgs[0],
&google_protobuf_FileOptions__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(104, 176), 19, 0, false, true
+ UPB_SIZE(104, 176), 19, false,
};
static const upb_msglayout *const google_protobuf_MessageOptions_submsgs[1] = {
@@ -312,19 +284,17 @@ static const upb_msglayout *const google_protobuf_MessageOptions_submsgs[1] = {
};
static const upb_msglayout_field google_protobuf_MessageOptions__fields[5] = {
- {1, UPB_SIZE(1, 1), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {2, UPB_SIZE(2, 2), 1, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {3, UPB_SIZE(3, 3), 2, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {7, UPB_SIZE(4, 4), 3, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {999, UPB_SIZE(8, 8), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 0, 11, 3},
+ {1, UPB_SIZE(1, 1), 1, 0, 8, 1},
+ {2, UPB_SIZE(2, 2), 2, 0, 8, 1},
+ {3, UPB_SIZE(3, 3), 3, 0, 8, 1},
+ {7, UPB_SIZE(4, 4), 4, 0, 8, 1},
+ {999, UPB_SIZE(8, 8), 0, 0, 11, 3},
};
const upb_msglayout google_protobuf_MessageOptions_msginit = {
&google_protobuf_MessageOptions_submsgs[0],
&google_protobuf_MessageOptions__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(12, 16), 5, 0, false, true
+ UPB_SIZE(12, 16), 5, false,
};
static const upb_msglayout *const google_protobuf_FieldOptions_submsgs[1] = {
@@ -332,21 +302,19 @@ static const upb_msglayout *const google_protobuf_FieldOptions_submsgs[1] = {
};
static const upb_msglayout_field google_protobuf_FieldOptions__fields[7] = {
- {1, UPB_SIZE(8, 8), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 14, 1},
- {2, UPB_SIZE(24, 24), 2, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {3, UPB_SIZE(25, 25), 3, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {5, UPB_SIZE(26, 26), 4, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {6, UPB_SIZE(16, 16), 1, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 14, 1},
- {10, UPB_SIZE(27, 27), 5, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {999, UPB_SIZE(28, 32), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 0, 11, 3},
+ {1, UPB_SIZE(8, 8), 1, 0, 14, 1},
+ {2, UPB_SIZE(24, 24), 3, 0, 8, 1},
+ {3, UPB_SIZE(25, 25), 4, 0, 8, 1},
+ {5, UPB_SIZE(26, 26), 5, 0, 8, 1},
+ {6, UPB_SIZE(16, 16), 2, 0, 14, 1},
+ {10, UPB_SIZE(27, 27), 6, 0, 8, 1},
+ {999, UPB_SIZE(28, 32), 0, 0, 11, 3},
};
const upb_msglayout google_protobuf_FieldOptions_msginit = {
&google_protobuf_FieldOptions_submsgs[0],
&google_protobuf_FieldOptions__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(32, 40), 7, 0, false, true
+ UPB_SIZE(32, 40), 7, false,
};
static const upb_msglayout *const google_protobuf_OneofOptions_submsgs[1] = {
@@ -354,15 +322,13 @@ static const upb_msglayout *const google_protobuf_OneofOptions_submsgs[1] = {
};
static const upb_msglayout_field google_protobuf_OneofOptions__fields[1] = {
- {999, UPB_SIZE(0, 0), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 0, 11, 3},
+ {999, UPB_SIZE(0, 0), 0, 0, 11, 3},
};
const upb_msglayout google_protobuf_OneofOptions_msginit = {
&google_protobuf_OneofOptions_submsgs[0],
&google_protobuf_OneofOptions__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(4, 8), 1, 0, false, true
+ UPB_SIZE(4, 8), 1, false,
};
static const upb_msglayout *const google_protobuf_EnumOptions_submsgs[1] = {
@@ -370,17 +336,15 @@ static const upb_msglayout *const google_protobuf_EnumOptions_submsgs[1] = {
};
static const upb_msglayout_field google_protobuf_EnumOptions__fields[3] = {
- {2, UPB_SIZE(1, 1), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {3, UPB_SIZE(2, 2), 1, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {999, UPB_SIZE(4, 8), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 0, 11, 3},
+ {2, UPB_SIZE(1, 1), 1, 0, 8, 1},
+ {3, UPB_SIZE(2, 2), 2, 0, 8, 1},
+ {999, UPB_SIZE(4, 8), 0, 0, 11, 3},
};
const upb_msglayout google_protobuf_EnumOptions_msginit = {
&google_protobuf_EnumOptions_submsgs[0],
&google_protobuf_EnumOptions__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(8, 16), 3, 0, false, true
+ UPB_SIZE(8, 16), 3, false,
};
static const upb_msglayout *const google_protobuf_EnumValueOptions_submsgs[1] = {
@@ -388,16 +352,14 @@ static const upb_msglayout *const google_protobuf_EnumValueOptions_submsgs[1] =
};
static const upb_msglayout_field google_protobuf_EnumValueOptions__fields[2] = {
- {1, UPB_SIZE(1, 1), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {999, UPB_SIZE(4, 8), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 0, 11, 3},
+ {1, UPB_SIZE(1, 1), 1, 0, 8, 1},
+ {999, UPB_SIZE(4, 8), 0, 0, 11, 3},
};
const upb_msglayout google_protobuf_EnumValueOptions_msginit = {
&google_protobuf_EnumValueOptions_submsgs[0],
&google_protobuf_EnumValueOptions__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(8, 16), 2, 0, false, true
+ UPB_SIZE(8, 16), 2, false,
};
static const upb_msglayout *const google_protobuf_ServiceOptions_submsgs[1] = {
@@ -405,16 +367,14 @@ static const upb_msglayout *const google_protobuf_ServiceOptions_submsgs[1] = {
};
static const upb_msglayout_field google_protobuf_ServiceOptions__fields[2] = {
- {33, UPB_SIZE(1, 1), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {999, UPB_SIZE(4, 8), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 0, 11, 3},
+ {33, UPB_SIZE(1, 1), 1, 0, 8, 1},
+ {999, UPB_SIZE(4, 8), 0, 0, 11, 3},
};
const upb_msglayout google_protobuf_ServiceOptions_msginit = {
&google_protobuf_ServiceOptions_submsgs[0],
&google_protobuf_ServiceOptions__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(8, 16), 2, 0, false, true
+ UPB_SIZE(8, 16), 2, false,
};
static const upb_msglayout *const google_protobuf_MethodOptions_submsgs[1] = {
@@ -422,17 +382,15 @@ static const upb_msglayout *const google_protobuf_MethodOptions_submsgs[1] = {
};
static const upb_msglayout_field google_protobuf_MethodOptions__fields[3] = {
- {33, UPB_SIZE(16, 16), 1, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 1},
- {34, UPB_SIZE(8, 8), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 14, 1},
- {999, UPB_SIZE(20, 24), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 0, 11, 3},
+ {33, UPB_SIZE(16, 16), 2, 0, 8, 1},
+ {34, UPB_SIZE(8, 8), 1, 0, 14, 1},
+ {999, UPB_SIZE(20, 24), 0, 0, 11, 3},
};
const upb_msglayout google_protobuf_MethodOptions_msginit = {
&google_protobuf_MethodOptions_submsgs[0],
&google_protobuf_MethodOptions__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(24, 32), 3, 0, false, true
+ UPB_SIZE(24, 32), 3, false,
};
static const upb_msglayout *const google_protobuf_UninterpretedOption_submsgs[1] = {
@@ -440,34 +398,30 @@ static const upb_msglayout *const google_protobuf_UninterpretedOption_submsgs[1]
};
static const upb_msglayout_field google_protobuf_UninterpretedOption__fields[7] = {
- {2, UPB_SIZE(56, 80), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 0, 11, 3},
- {3, UPB_SIZE(32, 32), 3, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {4, UPB_SIZE(8, 8), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 4, 1},
- {5, UPB_SIZE(16, 16), 1, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 3, 1},
- {6, UPB_SIZE(24, 24), 2, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 1, 1},
- {7, UPB_SIZE(40, 48), 4, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 12, 1},
- {8, UPB_SIZE(48, 64), 5, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
+ {2, UPB_SIZE(56, 80), 0, 0, 11, 3},
+ {3, UPB_SIZE(32, 32), 4, 0, 9, 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},
};
const upb_msglayout google_protobuf_UninterpretedOption_msginit = {
&google_protobuf_UninterpretedOption_submsgs[0],
&google_protobuf_UninterpretedOption__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(64, 96), 7, 0, false, true
+ UPB_SIZE(64, 96), 7, false,
};
static const upb_msglayout_field google_protobuf_UninterpretedOption_NamePart__fields[2] = {
- {1, UPB_SIZE(8, 16), 1, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 2},
- {2, UPB_SIZE(1, 1), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 8, 2},
+ {1, UPB_SIZE(8, 16), 2, 0, 9, 2},
+ {2, UPB_SIZE(1, 1), 1, 0, 8, 2},
};
const upb_msglayout google_protobuf_UninterpretedOption_NamePart_msginit = {
NULL,
&google_protobuf_UninterpretedOption_NamePart__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(16, 32), 2, 0, false, true
+ UPB_SIZE(16, 32), 2, false,
};
static const upb_msglayout *const google_protobuf_SourceCodeInfo_submsgs[1] = {
@@ -475,31 +429,27 @@ static const upb_msglayout *const google_protobuf_SourceCodeInfo_submsgs[1] = {
};
static const upb_msglayout_field google_protobuf_SourceCodeInfo__fields[1] = {
- {1, UPB_SIZE(0, 0), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 0, 11, 3},
+ {1, UPB_SIZE(0, 0), 0, 0, 11, 3},
};
const upb_msglayout google_protobuf_SourceCodeInfo_msginit = {
&google_protobuf_SourceCodeInfo_submsgs[0],
&google_protobuf_SourceCodeInfo__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(4, 8), 1, 0, false, true
+ UPB_SIZE(4, 8), 1, false,
};
static const upb_msglayout_field google_protobuf_SourceCodeInfo_Location__fields[5] = {
- {1, UPB_SIZE(24, 48), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 5, 3},
- {2, UPB_SIZE(28, 56), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 5, 3},
- {3, UPB_SIZE(8, 16), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {4, UPB_SIZE(16, 32), 1, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {6, UPB_SIZE(32, 64), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 3},
+ {1, UPB_SIZE(24, 48), 0, 0, 5, 3},
+ {2, UPB_SIZE(28, 56), 0, 0, 5, 3},
+ {3, UPB_SIZE(8, 16), 1, 0, 9, 1},
+ {4, UPB_SIZE(16, 32), 2, 0, 9, 1},
+ {6, UPB_SIZE(32, 64), 0, 0, 9, 3},
};
const upb_msglayout google_protobuf_SourceCodeInfo_Location_msginit = {
NULL,
&google_protobuf_SourceCodeInfo_Location__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(40, 80), 5, 0, false, true
+ UPB_SIZE(40, 80), 5, false,
};
static const upb_msglayout *const google_protobuf_GeneratedCodeInfo_submsgs[1] = {
@@ -507,30 +457,26 @@ static const upb_msglayout *const google_protobuf_GeneratedCodeInfo_submsgs[1] =
};
static const upb_msglayout_field google_protobuf_GeneratedCodeInfo__fields[1] = {
- {1, UPB_SIZE(0, 0), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, 0, 11, 3},
+ {1, UPB_SIZE(0, 0), 0, 0, 11, 3},
};
const upb_msglayout google_protobuf_GeneratedCodeInfo_msginit = {
&google_protobuf_GeneratedCodeInfo_submsgs[0],
&google_protobuf_GeneratedCodeInfo__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(4, 8), 1, 0, false, true
+ UPB_SIZE(4, 8), 1, false,
};
static const upb_msglayout_field google_protobuf_GeneratedCodeInfo_Annotation__fields[4] = {
- {1, UPB_SIZE(24, 32), UPB_NO_HASBIT, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 5, 3},
- {2, UPB_SIZE(16, 16), 2, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 9, 1},
- {3, UPB_SIZE(4, 4), 0, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 5, 1},
- {4, UPB_SIZE(8, 8), 1, UPB_NOT_IN_ONEOF, UPB_NO_SUBMSG, 5, 1},
+ {1, UPB_SIZE(24, 32), 0, 0, 5, 3},
+ {2, UPB_SIZE(16, 16), 3, 0, 9, 1},
+ {3, UPB_SIZE(4, 4), 1, 0, 5, 1},
+ {4, UPB_SIZE(8, 8), 2, 0, 5, 1},
};
const upb_msglayout google_protobuf_GeneratedCodeInfo_Annotation_msginit = {
NULL,
&google_protobuf_GeneratedCodeInfo_Annotation__fields[0],
- NULL,
- NULL, /* TODO. default_msg */
- UPB_SIZE(32, 48), 4, 0, false, true
+ UPB_SIZE(32, 48), 4, false,
};
#include "upb/port_undef.inc"
diff --git a/tests/bindings/lua/test_upb.lua b/tests/bindings/lua/test_upb.lua
index 07d794c..e4edda4 100644
--- a/tests/bindings/lua/test_upb.lua
+++ b/tests/bindings/lua/test_upb.lua
@@ -588,13 +588,14 @@ function test_msg_primitives()
msg = TestMessage()
-- Unset member returns default value.
- assert_equal(1, msg.i32)
- assert_equal(2, msg.u32)
- assert_equal(3, msg.i64)
- assert_equal(4, msg.u64)
- assert_equal(5, msg.dbl)
- assert_equal(6, msg.flt)
- assert_equal(true, msg.bool)
+ -- TODO(haberman): re-enable these when we have descriptor-based reflection.
+ -- assert_equal(1, msg.i32)
+ -- assert_equal(2, msg.u32)
+ -- assert_equal(3, msg.i64)
+ -- assert_equal(4, msg.u64)
+ -- assert_equal(5, msg.dbl)
+ -- assert_equal(6, msg.flt)
+ -- assert_equal(true, msg.bool)
-- Attempts to access non-existent fields fail.
assert_error_match("no such field", function() msg.no_such = 1 end)
diff --git a/tools/make_c_api.lua b/tools/make_c_api.lua
index 47a5b08..cf1cfdc 100644
--- a/tools/make_c_api.lua
+++ b/tools/make_c_api.lua
@@ -306,20 +306,20 @@ local function get_message_layout(msg)
-- Place discriminator enum and data.
local data = place(offset, oneof_maxsize, maxsize)
local case = place(offset, {4, 4}, maxsize)
- offsets[oneof] = {data, case}
+ offsets[oneof] = case
+
+ -- Place oneof fields.
+ for oneof in msg:oneofs() do
+ for field in oneof:fields() do
+ offsets[field] = data
+ end
+ end
end
-- Align overall size up to max size.
alignup(offset, maxsize)
local size = copysize(offset)
- -- Place oneof defaults.
- for oneof in msg:oneofs() do
- for field in oneof:fields() do
- offsets[field] = place(offset, sizeof(field), maxsize)
- end
- end
-
return hasbit_indexes, offsets, size
end
@@ -399,7 +399,7 @@ local function write_h_file(filedef, append)
append('} %s_oneofcases;\n', fullname)
append('UPB_INLINE %s_oneofcases %s_%s_case(const %s* msg) { ' ..
'return UPB_FIELD_AT(msg, int, %s); }\n',
- fullname, msgname, oneof:name(), msgname, get_sizeinit(offset[2]))
+ fullname, msgname, oneof:name(), msgname, get_sizeinit(offset))
append('\n')
end
@@ -407,10 +407,11 @@ local function write_h_file(filedef, append)
append('UPB_INLINE %s %s_%s(const %s *msg) {',
ctype(field, true), msgname, field:name(), msgname)
if field:containing_oneof() then
- local offset = offsets[field:containing_oneof()]
+ local data_offset = offsets[field]
+ local case_offset = offsets[field:containing_oneof()]
append(' return UPB_READ_ONEOF(msg, %s, %s, %s, %s, %s); }\n',
- ctype(field, true), get_sizeinit(offset[1]),
- get_sizeinit(offset[2]), field:number(), field_default(field))
+ ctype(field, true), get_sizeinit(data_offset),
+ get_sizeinit(case_offset), field:number(), field_default(field))
else
append(' return UPB_FIELD_AT(msg, %s, %s); }\n',
ctype(field, true), get_sizeinit(offsets[field]))
@@ -423,9 +424,10 @@ local function write_h_file(filedef, append)
append('UPB_INLINE void %s_set_%s(%s *msg, %s value) { ',
msgname, field:name(), msgname, ctype(field))
if field:containing_oneof() then
- local offset = offsets[field:containing_oneof()]
+ local data_offset = offsets[field]
+ local case_offset = offsets[field:containing_oneof()]
append('UPB_WRITE_ONEOF(msg, %s, %s, value, %s, %s); }\n',
- ctype(field), get_sizeinit(offset[1]), get_sizeinit(offset[2]),
+ ctype(field), get_sizeinit(data_offset), get_sizeinit(case_offset),
field:number())
else
append('UPB_FIELD_AT(msg, %s, %s) = value; }\n',
@@ -474,7 +476,6 @@ local function write_c_file(filedef, hfilename, append)
local hasbit_indexes, offsets, size = get_message_layout(msg)
local oneofs_layout_order = get_oneof_layout_order(msg)
local oneof_count = 0
- local oneof_indexes = {}
-- Another sorted array in field number order.
local fields_number_order = {}
@@ -492,23 +493,6 @@ local function write_c_file(filedef, hfilename, append)
return a:number() < b:number()
end)
- for _, oneof in ipairs(oneofs_layout_order) do
- oneof_indexes[oneof] = oneof_count
- oneof_count = oneof_count + 1
- end
-
- if oneof_count > 0 then
- local oneofs_array_name = msgname .. "_oneofs"
- oneofs_array_ref = "&" .. oneofs_array_name .. "[0]"
- append('static const upb_msglayout_oneof %s[%s] = {\n',
- oneofs_array_name, oneof_count)
- for _, oneof in ipairs(oneofs_layout_order) do
- local offset = offsets[oneof]
- append(' {%s, %s},\n', get_sizeinit(offset[1]), get_sizeinit(offset[2]))
- end
- append('};\n\n')
- end
-
if submsg_count > 0 then
-- TODO(haberman): could save a little bit of space by only generating a
-- "submsgs" array for every strongly-connected component.
@@ -540,19 +524,21 @@ local function write_c_file(filedef, hfilename, append)
append('static const upb_msglayout_field %s[%s] = {\n',
fields_array_name, field_count)
for _, field in ipairs(fields_number_order) do
- local submsg_index = "UPB_NO_SUBMSG"
- local oneof_index = "UPB_NOT_IN_ONEOF"
+ local submsg_index = "0"
if field:type() == upb.TYPE_MESSAGE then
submsg_index = submsg_indexes[field:subdef()]
end
- if field:containing_oneof() then
- oneof_index = oneof_indexes[field:containing_oneof()]
+ local presence = 0
+ if has_hasbit(field) then
+ presence = hasbit_indexes[field] + 1
+ elseif field:containing_oneof() then
+ local case_ofs = offsets[field:containing_oneof()]
+ presence = get_sizeinit({(-case_ofs[1]) - 1, (-case_ofs[2]) - 1})
end
- append(' {%s, %s, %s, %s, %s, %s, %s},\n',
+ append(' {%s, %s, %s, %s, %s, %s},\n',
field:number(),
get_sizeinit(offsets[field]),
- hasbit_indexes[field] or "UPB_NO_HASBIT",
- oneof_index,
+ presence,
submsg_index,
field:descriptor_type(),
field:label())
@@ -563,13 +549,9 @@ local function write_c_file(filedef, hfilename, append)
append('const upb_msglayout %s_msginit = {\n', msgname)
append(' %s,\n', submsgs_array_ref)
append(' %s,\n', fields_array_ref)
- append(' %s,\n', oneofs_array_ref)
- append(' NULL, /* TODO. default_msg */\n')
- append(' %s, %s, %s, %s, %s\n',
+ append(' %s, %s, %s,\n',
get_sizeinit(size), field_count,
- oneof_count,
- 'false', -- TODO: extendable
- msg:file():syntax() == upb.SYNTAX_PROTO2
+ 'false' -- TODO: extendable
)
append('};\n\n')
diff --git a/upb/decode.c b/upb/decode.c
index b3de9b1..aa5d721 100644
--- a/upb/decode.c
+++ b/upb/decode.c
@@ -200,19 +200,9 @@ static void *upb_array_add(upb_array *arr, size_t elements) {
return ret;
}
-static size_t get_field_offset(const upb_decframe *frame,
- const upb_msglayout_field *field) {
- if (field->oneof_index == UPB_NOT_IN_ONEOF) {
- return field->offset;
- } else {
- return frame->m->oneofs[field->oneof_index].data_offset;
- }
-}
-
static upb_array *upb_getarr(upb_decframe *frame,
const upb_msglayout_field *field) {
UPB_ASSERT(field->label == UPB_LABEL_REPEATED);
- UPB_ASSERT(field->oneof_index == UPB_NOT_IN_ONEOF);
return *(upb_array**)&frame->msg[field->offset];
}
@@ -234,20 +224,20 @@ static upb_array *upb_getorcreatearr(upb_decframe *frame,
static void upb_sethasbit(upb_decframe *frame,
const upb_msglayout_field *field) {
- UPB_ASSERT(field->hasbit != UPB_NO_HASBIT);
- frame->msg[field->hasbit / 8] |= (1 << (field->hasbit % 8));
+ UPB_ASSERT(field->presence > 0);
+ int32_t hasbit = field->presence;
+ frame->msg[hasbit / 8] |= (1 << (hasbit % 8));
}
static void upb_setoneofcase(upb_decframe *frame,
const upb_msglayout_field *field) {
- UPB_ASSERT(field->oneof_index != UPB_NOT_IN_ONEOF);
- upb_set32(frame->msg, frame->m->oneofs[field->oneof_index].case_offset,
- field->number);
+ UPB_ASSERT(field->presence < 0);
+ upb_set32(frame->msg, ~field->presence, field->number);
}
static char *upb_decode_prepareslot(upb_decframe *frame,
const upb_msglayout_field *field) {
- char *field_mem = frame->msg + get_field_offset(frame, field);
+ char *field_mem = frame->msg + field->offset;
upb_array *arr;
if (field->label == UPB_LABEL_REPEATED) {
@@ -264,9 +254,9 @@ static void upb_decode_setpresent(upb_decframe *frame,
upb_array *arr = upb_getarr(frame, field);
UPB_ASSERT(arr->len < arr->size);
arr->len++;
- } else if (field->oneof_index != UPB_NOT_IN_ONEOF) {
+ } else if (field->presence < 0) {
upb_setoneofcase(frame, field);
- } else if (field->hasbit != UPB_NO_HASBIT) {
+ } else if (field->presence > 0) {
upb_sethasbit(frame, field);
}
}
@@ -279,7 +269,6 @@ static bool upb_decode_submsg(upb_decstate *d, upb_decframe *frame,
char *submsg = *(void **)submsg_slot;
const upb_msglayout *subm;
- UPB_ASSERT(field->submsg_index != UPB_NO_SUBMSG);
subm = frame->m->submsgs[field->submsg_index];
UPB_ASSERT(subm);
@@ -460,7 +449,6 @@ static bool upb_decode_toarray(upb_decstate *d, upb_decframe *frame,
d->ptr -= val.size;
/* Create elemente message. */
- UPB_ASSERT(field->submsg_index != UPB_NO_SUBMSG);
subm = frame->m->submsgs[field->submsg_index];
UPB_ASSERT(subm);
diff --git a/upb/encode.c b/upb/encode.c
index 034a90d..45f8159 100644
--- a/upb/encode.c
+++ b/upb/encode.c
@@ -126,16 +126,17 @@ static bool upb_put_float(upb_encstate *e, float d) {
return upb_put_fixed32(e, u32);
}
-static uint32_t upb_readcase(const char *msg, const upb_msglayout *m,
- int oneof_index) {
+static uint32_t upb_readcase(const char *msg, const upb_msglayout_field *f) {
uint32_t ret;
- memcpy(&ret, msg + m->oneofs[oneof_index].case_offset, sizeof(ret));
+ uint32_t offset = ~f->presence;
+ memcpy(&ret, msg + offset, sizeof(ret));
return ret;
}
static bool upb_readhasbit(const char *msg, const upb_msglayout_field *f) {
- UPB_ASSERT(f->hasbit != UPB_NO_HASBIT);
- return msg[f->hasbit / 8] & (1 << (f->hasbit % 8));
+ UPB_ASSERT(f->presence > 0);
+ uint32_t hasbit = f->presence;
+ return msg[hasbit / 8] & (1 << (hasbit % 8));
}
static bool upb_put_tag(upb_encstate *e, int field_number, int wire_type) {
@@ -254,9 +255,7 @@ do { ; } while(0)
static bool upb_encode_scalarfield(upb_encstate *e, const char *field_mem,
const upb_msglayout *m,
const upb_msglayout_field *f,
- bool is_proto3) {
- bool skip_zero_value = is_proto3 && f->oneof_index == UPB_NOT_IN_ONEOF;
-
+ bool skip_zero_value) {
#define CASE(ctype, type, wire_type, encodeval) do { \
ctype val = *(ctype*)field_mem; \
if (skip_zero_value && val == 0) { \
@@ -305,7 +304,7 @@ static bool upb_encode_scalarfield(upb_encstate *e, const char *field_mem,
size_t size;
void *submsg = *(void **)field_mem;
const upb_msglayout *subm = m->submsgs[f->submsg_index];
- if (skip_zero_value && submsg == NULL) {
+ if (submsg == NULL) {
return true;
}
return upb_put_tag(e, f->number, UPB_WIRE_TYPE_END_GROUP) &&
@@ -316,7 +315,7 @@ static bool upb_encode_scalarfield(upb_encstate *e, const char *field_mem,
size_t size;
void *submsg = *(void **)field_mem;
const upb_msglayout *subm = m->submsgs[f->submsg_index];
- if (skip_zero_value && submsg == NULL) {
+ if (submsg == NULL) {
return true;
}
return upb_encode_message(e, submsg, subm, &size) &&
@@ -328,52 +327,33 @@ static bool upb_encode_scalarfield(upb_encstate *e, const char *field_mem,
UPB_UNREACHABLE();
}
-bool upb_encode_hasscalarfield(const char *msg, const upb_msglayout *m,
- const upb_msglayout_field *f) {
- if (f->oneof_index != UPB_NOT_IN_ONEOF) {
- return upb_readcase(msg, m, f->oneof_index) == f->number;
- } else if (m->is_proto2) {
- return upb_readhasbit(msg, f);
- } else {
- /* For proto3, we'll test for the field being empty later. */
- return true;
- }
-}
-
-static size_t get_field_offset2(const upb_msglayout *m,
- const upb_msglayout_field *field) {
- if (field->oneof_index == UPB_NOT_IN_ONEOF) {
- return field->offset;
- } else {
- return m->oneofs[field->oneof_index].data_offset;
- }
-}
-
bool upb_encode_message(upb_encstate *e, const char *msg,
const upb_msglayout *m, size_t *size) {
int i;
size_t pre_len = e->limit - e->ptr;
- if (msg == NULL) {
- return true;
- }
-
for (i = m->field_count - 1; i >= 0; i--) {
const upb_msglayout_field *f = &m->fields[i];
- size_t offset = get_field_offset2(m, f);
if (f->label == UPB_LABEL_REPEATED) {
- CHK(upb_encode_array(e, msg + offset, m, f));
+ CHK(upb_encode_array(e, msg + f->offset, m, f));
} else {
- if (upb_encode_hasscalarfield(msg, m, f)) {
- if (f->oneof_index == UPB_NOT_IN_ONEOF) {
- CHK(upb_encode_scalarfield(e, msg + offset, m, f, !m->is_proto2));
- } else {
- const upb_msglayout_oneof *o = &m->oneofs[f->oneof_index];
- CHK(upb_encode_scalarfield(e, msg + o->data_offset,
- m, f, !m->is_proto2));
+ bool skip_empty = false;
+ if (f->presence == 0) {
+ /* Proto3 presence. */
+ skip_empty = true;
+ } else if (f->presence > 0) {
+ /* Proto2 presence: hasbit. */
+ if (!upb_readhasbit(msg, f)) {
+ continue;
+ }
+ } else {
+ /* Field is in a oneof. */
+ if (upb_readcase(msg, f) != f->number) {
+ continue;
}
}
+ CHK(upb_encode_scalarfield(e, msg + f->offset, m, f, skip_empty));
}
}
diff --git a/upb/msg.c b/upb/msg.c
index ca05779..b70fe40 100644
--- a/upb/msg.c
+++ b/upb/msg.c
@@ -148,14 +148,14 @@ static const upb_msglayout_field *upb_msg_checkfield(int field_index,
}
static bool upb_msg_inoneof(const upb_msglayout_field *field) {
- return field->oneof_index != UPB_NOT_IN_ONEOF;
+ return field->presence < 0;
}
static uint32_t *upb_msg_oneofcase(const upb_msg *msg, int field_index,
const upb_msglayout *l) {
const upb_msglayout_field *field = upb_msg_checkfield(field_index, l);
UPB_ASSERT(upb_msg_inoneof(field));
- return PTR_AT(msg, l->oneofs[field->oneof_index].case_offset, uint32_t);
+ return PTR_AT(msg, ~field->presence, uint32_t);
}
static size_t upb_msg_sizeof(const upb_msglayout *l) {
@@ -174,11 +174,7 @@ upb_msg *upb_msg_new(const upb_msglayout *l, upb_arena *a) {
msg = VOIDPTR_AT(mem, upb_msg_internalsize(l));
/* Initialize normal members. */
- if (l->default_msg) {
- memcpy(msg, l->default_msg, l->size);
- } else {
- memset(msg, 0, l->size);
- }
+ memset(msg, 0, l->size);
/* Initialize internal members. */
upb_msg_getinternal(msg)->arena = a;
@@ -199,14 +195,14 @@ bool upb_msg_has(const upb_msg *msg,
const upb_msglayout *l) {
const upb_msglayout_field *field = upb_msg_checkfield(field_index, l);
- UPB_ASSERT(l->is_proto2);
+ UPB_ASSERT(field->presence);
if (upb_msg_inoneof(field)) {
/* Oneofs are set when the oneof number is set to this field. */
return *upb_msg_oneofcase(msg, field_index, l) == field->number;
} else {
/* Other fields are set when their hasbit is set. */
- uint32_t hasbit = l->fields[field_index].hasbit;
+ uint32_t hasbit = field->presence;
return DEREF(msg, hasbit / 8, char) | (1 << (hasbit % 8));
}
}
@@ -215,32 +211,14 @@ upb_msgval upb_msg_get(const upb_msg *msg, int field_index,
const upb_msglayout *l) {
const upb_msglayout_field *field = upb_msg_checkfield(field_index, l);
int size = upb_msg_fieldsize(field);
-
- if (upb_msg_inoneof(field)) {
- if (*upb_msg_oneofcase(msg, field_index, l) == field->number) {
- size_t ofs = l->oneofs[field->oneof_index].data_offset;
- return upb_msgval_read(msg, ofs, size);
- } else {
- /* Return default. */
- return upb_msgval_read(l->default_msg, field->offset, size);
- }
- } else {
- return upb_msgval_read(msg, field->offset, size);
- }
+ return upb_msgval_read(msg, field->offset, size);
}
void upb_msg_set(upb_msg *msg, int field_index, upb_msgval val,
const upb_msglayout *l) {
const upb_msglayout_field *field = upb_msg_checkfield(field_index, l);
int size = upb_msg_fieldsize(field);
-
- if (upb_msg_inoneof(field)) {
- size_t ofs = l->oneofs[field->oneof_index].data_offset;
- *upb_msg_oneofcase(msg, field_index, l) = field->number;
- upb_msgval_write(msg, ofs, val, size);
- } else {
- upb_msgval_write(msg, field->offset, val, size);
- }
+ upb_msgval_write(msg, field->offset, val, size);
}
diff --git a/upb/msg.h b/upb/msg.h
index 557a1f4..8236799 100644
--- a/upb/msg.h
+++ b/upb/msg.h
@@ -53,42 +53,25 @@ typedef void upb_msg;
* members are public so generated code can initialize them, but users MUST NOT
* read or write any of its members. */
-#define UPB_NOT_IN_ONEOF UINT16_MAX
-#define UPB_NO_HASBIT UINT16_MAX
-#define UPB_NO_SUBMSG UINT16_MAX
-
typedef struct {
uint32_t number;
- uint32_t offset; /* If in a oneof, offset of default in default_msg below. */
- uint16_t hasbit; /* UPB_NO_HASBIT if no hasbit. */
- uint16_t oneof_index; /* UPB_NOT_IN_ONEOF if not in a oneof. */
- uint16_t submsg_index; /* UPB_NO_SUBMSG if no submsg. */
+ uint16_t offset;
+ int16_t presence; /* If >0, hasbit_index+1. If <0, oneof_index+1. */
+ uint16_t submsg_index; /* undefined if descriptortype != MESSAGE or GROUP. */
uint8_t descriptortype;
uint8_t label;
} upb_msglayout_field;
-typedef struct {
- uint32_t data_offset;
- uint32_t case_offset;
-} upb_msglayout_oneof;
-
typedef struct upb_msglayout {
const struct upb_msglayout *const* submsgs;
const upb_msglayout_field *fields;
- const upb_msglayout_oneof *oneofs;
- void *default_msg;
/* Must be aligned to sizeof(void*). Doesn't include internal members like
* unknown fields, extension dict, pointer to msglayout, etc. */
- uint32_t size;
+ uint16_t size;
uint16_t field_count;
- uint16_t oneof_count;
bool extendable;
- bool is_proto2;
} upb_msglayout;
-#define UPB_ALIGN_UP_TO(val, align) ((val + (align - 1)) & -align)
-#define UPB_ALIGNED_SIZEOF(type) UPB_ALIGN_UP_TO(sizeof(type), sizeof(void*))
-
/** upb_stringview ************************************************************/
diff --git a/upb/msgfactory.c b/upb/msgfactory.c
index b544967..593c9dc 100644
--- a/upb/msgfactory.c
+++ b/upb/msgfactory.c
@@ -45,42 +45,10 @@ static uint8_t upb_msg_fielddefsize(const upb_fielddef *f) {
}
}
-static upb_msgval upb_msgval_fromdefault(const upb_fielddef *f) {
- switch (upb_fielddef_type(f)) {
- case UPB_TYPE_FLOAT:
- return upb_msgval_float(upb_fielddef_defaultfloat(f));
- case UPB_TYPE_DOUBLE:
- return upb_msgval_double(upb_fielddef_defaultdouble(f));
- case UPB_TYPE_BOOL:
- return upb_msgval_bool(upb_fielddef_defaultbool(f));
- case UPB_TYPE_STRING:
- case UPB_TYPE_BYTES: {
- size_t len;
- const char *ptr = upb_fielddef_defaultstr(f, &len);
- return upb_msgval_makestr(ptr, len);
- }
- case UPB_TYPE_MESSAGE:
- return upb_msgval_msg(NULL);
- case UPB_TYPE_ENUM:
- case UPB_TYPE_INT32:
- return upb_msgval_int32(upb_fielddef_defaultint32(f));
- case UPB_TYPE_UINT32:
- return upb_msgval_uint32(upb_fielddef_defaultuint32(f));
- case UPB_TYPE_INT64:
- return upb_msgval_int64(upb_fielddef_defaultint64(f));
- case UPB_TYPE_UINT64:
- return upb_msgval_uint64(upb_fielddef_defaultuint64(f));
- default:
- UPB_ASSERT(false);
- return upb_msgval_msg(NULL);
- }
-}
-
/** upb_msglayout *************************************************************/
static void upb_msglayout_free(upb_msglayout *l) {
- upb_gfree(l->default_msg);
upb_gfree(l);
}
@@ -93,38 +61,6 @@ static size_t upb_msglayout_place(upb_msglayout *l, size_t size) {
return ret;
}
-static bool upb_msglayout_initdefault(upb_msglayout *l, const upb_msgdef *m) {
- upb_msg_field_iter it;
-
- if (upb_msgdef_syntax(m) == UPB_SYNTAX_PROTO2 && l->size) {
- /* Allocate default message and set default values in it. */
- l->default_msg = upb_gmalloc(l->size);
- if (!l->default_msg) {
- return false;
- }
-
- memset(l->default_msg, 0, l->size);
-
- for (upb_msg_field_begin(&it, m); !upb_msg_field_done(&it);
- upb_msg_field_next(&it)) {
- const upb_fielddef *f = upb_msg_iter_field(&it);
-
- if (upb_fielddef_containingoneof(f)) {
- continue;
- }
-
- /* TODO(haberman): handle strings. */
- if (!upb_fielddef_isstring(f) && !upb_fielddef_issubmsg(f) &&
- !upb_fielddef_isseq(f)) {
- upb_msg_set(l->default_msg, upb_fielddef_index(f),
- upb_msgval_fromdefault(f), l);
- }
- }
- }
-
- return true;
-}
-
static bool upb_msglayout_init(const upb_msgdef *m,
upb_msglayout *l,
upb_msgfactory *factory) {
@@ -134,7 +70,6 @@ static bool upb_msglayout_init(const upb_msgdef *m,
size_t submsg_count = 0;
const upb_msglayout **submsgs;
upb_msglayout_field *fields;
- upb_msglayout_oneof *oneofs;
for (upb_msg_field_begin(&it, m);
!upb_msg_field_done(&it);
@@ -149,24 +84,18 @@ static bool upb_msglayout_init(const upb_msgdef *m,
fields = upb_gmalloc(upb_msgdef_numfields(m) * sizeof(*fields));
submsgs = upb_gmalloc(submsg_count * sizeof(*submsgs));
- oneofs = upb_gmalloc(upb_msgdef_numoneofs(m) * sizeof(*oneofs));
if ((!fields && upb_msgdef_numfields(m)) ||
- (!submsgs && submsg_count) ||
- (!oneofs && upb_msgdef_numoneofs(m))) {
+ (!submsgs && submsg_count)) {
/* OOM. */
upb_gfree(fields);
upb_gfree(submsgs);
- upb_gfree(oneofs);
return false;
}
l->field_count = upb_msgdef_numfields(m);
- l->oneof_count = upb_msgdef_numoneofs(m);
l->fields = fields;
l->submsgs = submsgs;
- l->oneofs = oneofs;
- l->is_proto2 = (upb_msgdef_syntax(m) == UPB_SYNTAX_PROTO2);
/* Allocate data offsets in three stages:
*
@@ -189,25 +118,17 @@ static bool upb_msglayout_init(const upb_msgdef *m,
field->descriptortype = upb_fielddef_descriptortype(f);
field->label = upb_fielddef_label(f);
- if (upb_fielddef_containingoneof(f)) {
- field->oneof_index = upb_oneofdef_index(upb_fielddef_containingoneof(f));
- } else {
- field->oneof_index = UPB_NOT_IN_ONEOF;
- }
-
if (upb_fielddef_issubmsg(f)) {
const upb_msglayout *sub_layout =
upb_msgfactory_getlayout(factory, upb_fielddef_msgsubdef(f));
field->submsg_index = submsg_count++;
submsgs[field->submsg_index] = sub_layout;
- } else {
- field->submsg_index = UPB_NO_SUBMSG;
}
if (upb_fielddef_haspresence(f) && !upb_fielddef_containingoneof(f)) {
- field->hasbit = hasbit++;
+ field->presence = (hasbit++);
} else {
- field->hasbit = UPB_NO_HASBIT;
+ field->presence = 0;
}
}
@@ -237,8 +158,9 @@ static bool upb_msglayout_init(const upb_msgdef *m,
upb_oneof_iter fit;
size_t case_size = sizeof(uint32_t); /* Could potentially optimize this. */
- upb_msglayout_oneof *oneof = &oneofs[upb_oneofdef_index(o)];
size_t field_size = 0;
+ uint32_t case_offset;
+ uint32_t data_offset;
/* Calculate field size: the max of all field sizes. */
for (upb_oneof_begin(&fit, o);
@@ -249,15 +171,23 @@ static bool upb_msglayout_init(const upb_msgdef *m,
}
/* Align and allocate case offset. */
- oneof->case_offset = upb_msglayout_place(l, case_size);
- oneof->data_offset = upb_msglayout_place(l, field_size);
+ case_offset = upb_msglayout_place(l, case_size);
+ data_offset = upb_msglayout_place(l, field_size);
+
+ for (upb_oneof_begin(&fit, o);
+ !upb_oneof_done(&fit);
+ upb_oneof_next(&fit)) {
+ const upb_fielddef* f = upb_oneof_iter_field(&fit);
+ fields[upb_fielddef_index(f)].offset = data_offset;
+ fields[upb_fielddef_index(f)].presence = ~case_offset;
+ }
}
/* Size of the entire structure should be a multiple of its greatest
* alignment. TODO: track overall alignment for real? */
l->size = align_up(l->size, 8);
- return upb_msglayout_initdefault(l, m);
+ return true;
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback