google-protobuf 3.4.1.1-x64-mingw32 → 3.5.0-x64-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of google-protobuf might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/ext/google/protobuf_c/defs.c +14 -3
- data/ext/google/protobuf_c/encode_decode.c +72 -59
- data/ext/google/protobuf_c/message.c +42 -7
- data/ext/google/protobuf_c/protobuf.c +1 -1
- data/ext/google/protobuf_c/protobuf.h +14 -5
- data/ext/google/protobuf_c/storage.c +12 -1
- data/ext/google/protobuf_c/upb.c +1413 -411
- data/ext/google/protobuf_c/upb.h +508 -411
- data/lib/google/2.0/protobuf_c.so +0 -0
- data/lib/google/2.1/protobuf_c.so +0 -0
- data/lib/google/2.2/protobuf_c.so +0 -0
- data/lib/google/2.3/protobuf_c.so +0 -0
- data/lib/google/2.4/protobuf_c.so +0 -0
- data/tests/basic.rb +50 -3
- metadata +2 -2
data/ext/google/protobuf_c/upb.h
CHANGED
@@ -1,70 +1,5 @@
|
|
1
1
|
// Amalgamated source file
|
2
2
|
/*
|
3
|
-
** Defs are upb's internal representation of the constructs that can appear
|
4
|
-
** in a .proto file:
|
5
|
-
**
|
6
|
-
** - upb::MessageDef (upb_msgdef): describes a "message" construct.
|
7
|
-
** - upb::FieldDef (upb_fielddef): describes a message field.
|
8
|
-
** - upb::FileDef (upb_filedef): describes a .proto file and its defs.
|
9
|
-
** - upb::EnumDef (upb_enumdef): describes an enum.
|
10
|
-
** - upb::OneofDef (upb_oneofdef): describes a oneof.
|
11
|
-
** - upb::Def (upb_def): base class of all the others.
|
12
|
-
**
|
13
|
-
** TODO: definitions of services.
|
14
|
-
**
|
15
|
-
** Like upb_refcounted objects, defs are mutable only until frozen, and are
|
16
|
-
** only thread-safe once frozen.
|
17
|
-
**
|
18
|
-
** This is a mixed C/C++ interface that offers a full API to both languages.
|
19
|
-
** See the top-level README for more information.
|
20
|
-
*/
|
21
|
-
|
22
|
-
#ifndef UPB_DEF_H_
|
23
|
-
#define UPB_DEF_H_
|
24
|
-
|
25
|
-
/*
|
26
|
-
** upb::RefCounted (upb_refcounted)
|
27
|
-
**
|
28
|
-
** A refcounting scheme that supports circular refs. It accomplishes this by
|
29
|
-
** partitioning the set of objects into groups such that no cycle spans groups;
|
30
|
-
** we can then reference-count the group as a whole and ignore refs within the
|
31
|
-
** group. When objects are mutable, these groups are computed very
|
32
|
-
** conservatively; we group any objects that have ever had a link between them.
|
33
|
-
** When objects are frozen, we compute strongly-connected components which
|
34
|
-
** allows us to be precise and only group objects that are actually cyclic.
|
35
|
-
**
|
36
|
-
** This is a mixed C/C++ interface that offers a full API to both languages.
|
37
|
-
** See the top-level README for more information.
|
38
|
-
*/
|
39
|
-
|
40
|
-
#ifndef UPB_REFCOUNTED_H_
|
41
|
-
#define UPB_REFCOUNTED_H_
|
42
|
-
|
43
|
-
/*
|
44
|
-
** upb_table
|
45
|
-
**
|
46
|
-
** This header is INTERNAL-ONLY! Its interfaces are not public or stable!
|
47
|
-
** This file defines very fast int->upb_value (inttable) and string->upb_value
|
48
|
-
** (strtable) hash tables.
|
49
|
-
**
|
50
|
-
** The table uses chained scatter with Brent's variation (inspired by the Lua
|
51
|
-
** implementation of hash tables). The hash function for strings is Austin
|
52
|
-
** Appleby's "MurmurHash."
|
53
|
-
**
|
54
|
-
** The inttable uses uintptr_t as its key, which guarantees it can be used to
|
55
|
-
** store pointers or integers of at least 32 bits (upb isn't really useful on
|
56
|
-
** systems where sizeof(void*) < 4).
|
57
|
-
**
|
58
|
-
** The table must be homogenous (all values of the same type). In debug
|
59
|
-
** mode, we check this on insert and lookup.
|
60
|
-
*/
|
61
|
-
|
62
|
-
#ifndef UPB_TABLE_H_
|
63
|
-
#define UPB_TABLE_H_
|
64
|
-
|
65
|
-
#include <stdint.h>
|
66
|
-
#include <string.h>
|
67
|
-
/*
|
68
3
|
** This file contains shared definitions that are widely used across upb.
|
69
4
|
**
|
70
5
|
** This is a mixed C/C++ interface that offers a full API to both languages.
|
@@ -100,6 +35,9 @@ template <int N> class InlinedEnvironment;
|
|
100
35
|
#define UPB_INLINE static
|
101
36
|
#endif
|
102
37
|
|
38
|
+
/* Hints to the compiler about likely/unlikely branches. */
|
39
|
+
#define UPB_LIKELY(x) __builtin_expect((x),1)
|
40
|
+
|
103
41
|
/* Define UPB_BIG_ENDIAN manually if you're on big endian and your compiler
|
104
42
|
* doesn't provide these preprocessor symbols. */
|
105
43
|
#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
|
@@ -361,6 +299,16 @@ class PointerBase2 : public PointerBase<T, Base> {
|
|
361
299
|
|
362
300
|
#endif
|
363
301
|
|
302
|
+
/* A list of types as they are encoded on-the-wire. */
|
303
|
+
typedef enum {
|
304
|
+
UPB_WIRE_TYPE_VARINT = 0,
|
305
|
+
UPB_WIRE_TYPE_64BIT = 1,
|
306
|
+
UPB_WIRE_TYPE_DELIMITED = 2,
|
307
|
+
UPB_WIRE_TYPE_START_GROUP = 3,
|
308
|
+
UPB_WIRE_TYPE_END_GROUP = 4,
|
309
|
+
UPB_WIRE_TYPE_32BIT = 5
|
310
|
+
} upb_wiretype_t;
|
311
|
+
|
364
312
|
|
365
313
|
/* upb::ErrorSpace ************************************************************/
|
366
314
|
|
@@ -689,7 +637,7 @@ void upb_env_uninit(upb_env *e);
|
|
689
637
|
|
690
638
|
void upb_env_initonly(upb_env *e);
|
691
639
|
|
692
|
-
upb_arena *upb_env_arena(upb_env *e);
|
640
|
+
UPB_INLINE upb_arena *upb_env_arena(upb_env *e) { return (upb_arena*)e; }
|
693
641
|
bool upb_env_ok(const upb_env *e);
|
694
642
|
void upb_env_seterrorfunc(upb_env *e, upb_error_func *func, void *ud);
|
695
643
|
|
@@ -789,6 +737,106 @@ template <int N> class upb::InlinedEnvironment : public upb::Environment {
|
|
789
737
|
|
790
738
|
|
791
739
|
#endif /* UPB_H_ */
|
740
|
+
/*
|
741
|
+
** upb_decode: parsing into a upb_msg using a upb_msglayout.
|
742
|
+
*/
|
743
|
+
|
744
|
+
#ifndef UPB_DECODE_H_
|
745
|
+
#define UPB_DECODE_H_
|
746
|
+
|
747
|
+
/*
|
748
|
+
** upb::Message is a representation for protobuf messages.
|
749
|
+
**
|
750
|
+
** However it differs from other common representations like
|
751
|
+
** google::protobuf::Message in one key way: it does not prescribe any
|
752
|
+
** ownership between messages and submessages, and it relies on the
|
753
|
+
** client to delete each message/submessage/array/map at the appropriate
|
754
|
+
** time.
|
755
|
+
**
|
756
|
+
** A client can access a upb::Message without knowing anything about
|
757
|
+
** ownership semantics, but to create or mutate a message a user needs
|
758
|
+
** to implement the memory management themselves.
|
759
|
+
**
|
760
|
+
** Currently all messages, arrays, and maps store a upb_alloc* internally.
|
761
|
+
** Mutating operations use this when they require dynamically-allocated
|
762
|
+
** memory. We could potentially eliminate this size overhead later by
|
763
|
+
** letting the user flip a bit on the factory that prevents this from
|
764
|
+
** being stored. The user would then need to use separate functions where
|
765
|
+
** the upb_alloc* is passed explicitly. However for handlers to populate
|
766
|
+
** such structures, they would need a place to store this upb_alloc* during
|
767
|
+
** parsing; upb_handlers don't currently have a good way to accommodate this.
|
768
|
+
**
|
769
|
+
** TODO: UTF-8 checking?
|
770
|
+
**/
|
771
|
+
|
772
|
+
#ifndef UPB_MSG_H_
|
773
|
+
#define UPB_MSG_H_
|
774
|
+
|
775
|
+
/*
|
776
|
+
** Defs are upb's internal representation of the constructs that can appear
|
777
|
+
** in a .proto file:
|
778
|
+
**
|
779
|
+
** - upb::MessageDef (upb_msgdef): describes a "message" construct.
|
780
|
+
** - upb::FieldDef (upb_fielddef): describes a message field.
|
781
|
+
** - upb::FileDef (upb_filedef): describes a .proto file and its defs.
|
782
|
+
** - upb::EnumDef (upb_enumdef): describes an enum.
|
783
|
+
** - upb::OneofDef (upb_oneofdef): describes a oneof.
|
784
|
+
** - upb::Def (upb_def): base class of all the others.
|
785
|
+
**
|
786
|
+
** TODO: definitions of services.
|
787
|
+
**
|
788
|
+
** Like upb_refcounted objects, defs are mutable only until frozen, and are
|
789
|
+
** only thread-safe once frozen.
|
790
|
+
**
|
791
|
+
** This is a mixed C/C++ interface that offers a full API to both languages.
|
792
|
+
** See the top-level README for more information.
|
793
|
+
*/
|
794
|
+
|
795
|
+
#ifndef UPB_DEF_H_
|
796
|
+
#define UPB_DEF_H_
|
797
|
+
|
798
|
+
/*
|
799
|
+
** upb::RefCounted (upb_refcounted)
|
800
|
+
**
|
801
|
+
** A refcounting scheme that supports circular refs. It accomplishes this by
|
802
|
+
** partitioning the set of objects into groups such that no cycle spans groups;
|
803
|
+
** we can then reference-count the group as a whole and ignore refs within the
|
804
|
+
** group. When objects are mutable, these groups are computed very
|
805
|
+
** conservatively; we group any objects that have ever had a link between them.
|
806
|
+
** When objects are frozen, we compute strongly-connected components which
|
807
|
+
** allows us to be precise and only group objects that are actually cyclic.
|
808
|
+
**
|
809
|
+
** This is a mixed C/C++ interface that offers a full API to both languages.
|
810
|
+
** See the top-level README for more information.
|
811
|
+
*/
|
812
|
+
|
813
|
+
#ifndef UPB_REFCOUNTED_H_
|
814
|
+
#define UPB_REFCOUNTED_H_
|
815
|
+
|
816
|
+
/*
|
817
|
+
** upb_table
|
818
|
+
**
|
819
|
+
** This header is INTERNAL-ONLY! Its interfaces are not public or stable!
|
820
|
+
** This file defines very fast int->upb_value (inttable) and string->upb_value
|
821
|
+
** (strtable) hash tables.
|
822
|
+
**
|
823
|
+
** The table uses chained scatter with Brent's variation (inspired by the Lua
|
824
|
+
** implementation of hash tables). The hash function for strings is Austin
|
825
|
+
** Appleby's "MurmurHash."
|
826
|
+
**
|
827
|
+
** The inttable uses uintptr_t as its key, which guarantees it can be used to
|
828
|
+
** store pointers or integers of at least 32 bits (upb isn't really useful on
|
829
|
+
** systems where sizeof(void*) < 4).
|
830
|
+
**
|
831
|
+
** The table must be homogenous (all values of the same type). In debug
|
832
|
+
** mode, we check this on insert and lookup.
|
833
|
+
*/
|
834
|
+
|
835
|
+
#ifndef UPB_TABLE_H_
|
836
|
+
#define UPB_TABLE_H_
|
837
|
+
|
838
|
+
#include <stdint.h>
|
839
|
+
#include <string.h>
|
792
840
|
|
793
841
|
#ifdef __cplusplus
|
794
842
|
extern "C" {
|
@@ -3851,265 +3899,75 @@ inline bool FileDef::AddDependency(const FileDef* file) {
|
|
3851
3899
|
|
3852
3900
|
#endif /* UPB_DEF_H_ */
|
3853
3901
|
/*
|
3854
|
-
**
|
3855
|
-
** and NOT stable across versions of upb.
|
3902
|
+
** upb::Handlers (upb_handlers)
|
3856
3903
|
**
|
3857
|
-
**
|
3858
|
-
**
|
3859
|
-
** of
|
3904
|
+
** A upb_handlers is like a virtual table for a upb_msgdef. Each field of the
|
3905
|
+
** message can have associated functions that will be called when we are
|
3906
|
+
** parsing or visiting a stream of data. This is similar to how handlers work
|
3907
|
+
** in SAX (the Simple API for XML).
|
3860
3908
|
**
|
3861
|
-
**
|
3862
|
-
**
|
3863
|
-
**
|
3909
|
+
** The handlers have no idea where the data is coming from, so a single set of
|
3910
|
+
** handlers could be used with two completely different data sources (for
|
3911
|
+
** example, a parser and a visitor over in-memory objects). This decoupling is
|
3912
|
+
** the most important feature of upb, because it allows parsers and serializers
|
3913
|
+
** to be highly reusable.
|
3864
3914
|
**
|
3865
|
-
**
|
3866
|
-
**
|
3915
|
+
** This is a mixed C/C++ interface that offers a full API to both languages.
|
3916
|
+
** See the top-level README for more information.
|
3867
3917
|
*/
|
3868
3918
|
|
3919
|
+
#ifndef UPB_HANDLERS_H
|
3920
|
+
#define UPB_HANDLERS_H
|
3869
3921
|
|
3870
|
-
#ifndef UPB_STATICINIT_H_
|
3871
|
-
#define UPB_STATICINIT_H_
|
3872
3922
|
|
3873
3923
|
#ifdef __cplusplus
|
3874
|
-
|
3875
|
-
|
3924
|
+
namespace upb {
|
3925
|
+
class BufferHandle;
|
3926
|
+
class BytesHandler;
|
3927
|
+
class HandlerAttributes;
|
3928
|
+
class Handlers;
|
3929
|
+
template <class T> class Handler;
|
3930
|
+
template <class T> struct CanonicalType;
|
3931
|
+
} /* namespace upb */
|
3876
3932
|
#endif
|
3877
3933
|
|
3878
|
-
|
3879
|
-
|
3934
|
+
UPB_DECLARE_TYPE(upb::BufferHandle, upb_bufhandle)
|
3935
|
+
UPB_DECLARE_TYPE(upb::BytesHandler, upb_byteshandler)
|
3936
|
+
UPB_DECLARE_TYPE(upb::HandlerAttributes, upb_handlerattr)
|
3937
|
+
UPB_DECLARE_DERIVED_TYPE(upb::Handlers, upb::RefCounted,
|
3938
|
+
upb_handlers, upb_refcounted)
|
3880
3939
|
|
3881
|
-
/*
|
3940
|
+
/* The maximum depth that the handler graph can have. This is a resource limit
|
3941
|
+
* for the C stack since we sometimes need to recursively traverse the graph.
|
3942
|
+
* Cycles are ok; the traversal will stop when it detects a cycle, but we must
|
3943
|
+
* hit the cycle before the maximum depth is reached.
|
3944
|
+
*
|
3945
|
+
* If having a single static limit is too inflexible, we can add another variant
|
3946
|
+
* of Handlers::Freeze that allows specifying this as a parameter. */
|
3947
|
+
#define UPB_MAX_HANDLER_DEPTH 64
|
3882
3948
|
|
3883
|
-
|
3884
|
-
|
3949
|
+
/* All the different types of handlers that can be registered.
|
3950
|
+
* Only needed for the advanced functions in upb::Handlers. */
|
3951
|
+
typedef enum {
|
3952
|
+
UPB_HANDLER_INT32,
|
3953
|
+
UPB_HANDLER_INT64,
|
3954
|
+
UPB_HANDLER_UINT32,
|
3955
|
+
UPB_HANDLER_UINT64,
|
3956
|
+
UPB_HANDLER_FLOAT,
|
3957
|
+
UPB_HANDLER_DOUBLE,
|
3958
|
+
UPB_HANDLER_BOOL,
|
3959
|
+
UPB_HANDLER_STARTSTR,
|
3960
|
+
UPB_HANDLER_STRING,
|
3961
|
+
UPB_HANDLER_ENDSTR,
|
3962
|
+
UPB_HANDLER_STARTSUBMSG,
|
3963
|
+
UPB_HANDLER_ENDSUBMSG,
|
3964
|
+
UPB_HANDLER_STARTSEQ,
|
3965
|
+
UPB_HANDLER_ENDSEQ
|
3966
|
+
} upb_handlertype_t;
|
3885
3967
|
|
3886
|
-
|
3887
|
-
const upb_filedef* file;
|
3888
|
-
char type; /* A upb_deftype_t (char to save space) */
|
3968
|
+
#define UPB_HANDLER_MAX (UPB_HANDLER_ENDSEQ+1)
|
3889
3969
|
|
3890
|
-
|
3891
|
-
* it is currently being used by a function on the stack. This allows
|
3892
|
-
* us to easily determine which defs were passed into the function's
|
3893
|
-
* current invocation. */
|
3894
|
-
bool came_from_user;
|
3895
|
-
};
|
3896
|
-
|
3897
|
-
#define UPB_DEF_INIT(name, type, vtbl, refs, ref2s) \
|
3898
|
-
{ UPB_REFCOUNT_INIT(vtbl, refs, ref2s), name, NULL, type, false }
|
3899
|
-
|
3900
|
-
|
3901
|
-
/* upb_fielddef ***************************************************************/
|
3902
|
-
|
3903
|
-
struct upb_fielddef {
|
3904
|
-
upb_def base;
|
3905
|
-
|
3906
|
-
union {
|
3907
|
-
int64_t sint;
|
3908
|
-
uint64_t uint;
|
3909
|
-
double dbl;
|
3910
|
-
float flt;
|
3911
|
-
void *bytes;
|
3912
|
-
} defaultval;
|
3913
|
-
union {
|
3914
|
-
const upb_msgdef *def; /* If !msg_is_symbolic. */
|
3915
|
-
char *name; /* If msg_is_symbolic. */
|
3916
|
-
} msg;
|
3917
|
-
union {
|
3918
|
-
const upb_def *def; /* If !subdef_is_symbolic. */
|
3919
|
-
char *name; /* If subdef_is_symbolic. */
|
3920
|
-
} sub; /* The msgdef or enumdef for this field, if upb_hassubdef(f). */
|
3921
|
-
bool subdef_is_symbolic;
|
3922
|
-
bool msg_is_symbolic;
|
3923
|
-
const upb_oneofdef *oneof;
|
3924
|
-
bool default_is_string;
|
3925
|
-
bool type_is_set_; /* False until type is explicitly set. */
|
3926
|
-
bool is_extension_;
|
3927
|
-
bool lazy_;
|
3928
|
-
bool packed_;
|
3929
|
-
upb_intfmt_t intfmt;
|
3930
|
-
bool tagdelim;
|
3931
|
-
upb_fieldtype_t type_;
|
3932
|
-
upb_label_t label_;
|
3933
|
-
uint32_t number_;
|
3934
|
-
uint32_t selector_base; /* Used to index into a upb::Handlers table. */
|
3935
|
-
uint32_t index_;
|
3936
|
-
};
|
3937
|
-
|
3938
|
-
extern const struct upb_refcounted_vtbl upb_fielddef_vtbl;
|
3939
|
-
|
3940
|
-
#define UPB_FIELDDEF_INIT(label, type, intfmt, tagdelim, is_extension, lazy, \
|
3941
|
-
packed, name, num, msgdef, subdef, selector_base, \
|
3942
|
-
index, defaultval, refs, ref2s) \
|
3943
|
-
{ \
|
3944
|
-
UPB_DEF_INIT(name, UPB_DEF_FIELD, &upb_fielddef_vtbl, refs, ref2s), \
|
3945
|
-
defaultval, {msgdef}, {subdef}, NULL, false, false, \
|
3946
|
-
type == UPB_TYPE_STRING || type == UPB_TYPE_BYTES, true, is_extension, \
|
3947
|
-
lazy, packed, intfmt, tagdelim, type, label, num, selector_base, index \
|
3948
|
-
}
|
3949
|
-
|
3950
|
-
|
3951
|
-
/* upb_msgdef *****************************************************************/
|
3952
|
-
|
3953
|
-
struct upb_msgdef {
|
3954
|
-
upb_def base;
|
3955
|
-
|
3956
|
-
size_t selector_count;
|
3957
|
-
uint32_t submsg_field_count;
|
3958
|
-
|
3959
|
-
/* Tables for looking up fields by number and name. */
|
3960
|
-
upb_inttable itof; /* int to field */
|
3961
|
-
upb_strtable ntof; /* name to field/oneof */
|
3962
|
-
|
3963
|
-
/* Is this a map-entry message? */
|
3964
|
-
bool map_entry;
|
3965
|
-
|
3966
|
-
/* Whether this message has proto2 or proto3 semantics. */
|
3967
|
-
upb_syntax_t syntax;
|
3968
|
-
|
3969
|
-
/* TODO(haberman): proper extension ranges (there can be multiple). */
|
3970
|
-
};
|
3971
|
-
|
3972
|
-
extern const struct upb_refcounted_vtbl upb_msgdef_vtbl;
|
3973
|
-
|
3974
|
-
/* TODO: also support static initialization of the oneofs table. This will be
|
3975
|
-
* needed if we compile in descriptors that contain oneofs. */
|
3976
|
-
#define UPB_MSGDEF_INIT(name, selector_count, submsg_field_count, itof, ntof, \
|
3977
|
-
map_entry, syntax, refs, ref2s) \
|
3978
|
-
{ \
|
3979
|
-
UPB_DEF_INIT(name, UPB_DEF_MSG, &upb_fielddef_vtbl, refs, ref2s), \
|
3980
|
-
selector_count, submsg_field_count, itof, ntof, map_entry, syntax \
|
3981
|
-
}
|
3982
|
-
|
3983
|
-
|
3984
|
-
/* upb_enumdef ****************************************************************/
|
3985
|
-
|
3986
|
-
struct upb_enumdef {
|
3987
|
-
upb_def base;
|
3988
|
-
|
3989
|
-
upb_strtable ntoi;
|
3990
|
-
upb_inttable iton;
|
3991
|
-
int32_t defaultval;
|
3992
|
-
};
|
3993
|
-
|
3994
|
-
extern const struct upb_refcounted_vtbl upb_enumdef_vtbl;
|
3995
|
-
|
3996
|
-
#define UPB_ENUMDEF_INIT(name, ntoi, iton, defaultval, refs, ref2s) \
|
3997
|
-
{ UPB_DEF_INIT(name, UPB_DEF_ENUM, &upb_enumdef_vtbl, refs, ref2s), ntoi, \
|
3998
|
-
iton, defaultval }
|
3999
|
-
|
4000
|
-
|
4001
|
-
/* upb_oneofdef ***************************************************************/
|
4002
|
-
|
4003
|
-
struct upb_oneofdef {
|
4004
|
-
upb_refcounted base;
|
4005
|
-
|
4006
|
-
uint32_t index; /* Index within oneofs. */
|
4007
|
-
const char *name;
|
4008
|
-
upb_strtable ntof;
|
4009
|
-
upb_inttable itof;
|
4010
|
-
const upb_msgdef *parent;
|
4011
|
-
};
|
4012
|
-
|
4013
|
-
extern const struct upb_refcounted_vtbl upb_oneofdef_vtbl;
|
4014
|
-
|
4015
|
-
#define UPB_ONEOFDEF_INIT(name, ntof, itof, refs, ref2s) \
|
4016
|
-
{ UPB_REFCOUNT_INIT(&upb_oneofdef_vtbl, refs, ref2s), 0, name, ntof, itof }
|
4017
|
-
|
4018
|
-
|
4019
|
-
/* upb_symtab *****************************************************************/
|
4020
|
-
|
4021
|
-
struct upb_symtab {
|
4022
|
-
upb_refcounted base;
|
4023
|
-
|
4024
|
-
upb_strtable symtab;
|
4025
|
-
};
|
4026
|
-
|
4027
|
-
struct upb_filedef {
|
4028
|
-
upb_refcounted base;
|
4029
|
-
|
4030
|
-
const char *name;
|
4031
|
-
const char *package;
|
4032
|
-
const char *phpprefix;
|
4033
|
-
const char *phpnamespace;
|
4034
|
-
upb_syntax_t syntax;
|
4035
|
-
|
4036
|
-
upb_inttable defs;
|
4037
|
-
upb_inttable deps;
|
4038
|
-
};
|
4039
|
-
|
4040
|
-
extern const struct upb_refcounted_vtbl upb_filedef_vtbl;
|
4041
|
-
|
4042
|
-
#endif /* UPB_STATICINIT_H_ */
|
4043
|
-
/*
|
4044
|
-
** upb::Handlers (upb_handlers)
|
4045
|
-
**
|
4046
|
-
** A upb_handlers is like a virtual table for a upb_msgdef. Each field of the
|
4047
|
-
** message can have associated functions that will be called when we are
|
4048
|
-
** parsing or visiting a stream of data. This is similar to how handlers work
|
4049
|
-
** in SAX (the Simple API for XML).
|
4050
|
-
**
|
4051
|
-
** The handlers have no idea where the data is coming from, so a single set of
|
4052
|
-
** handlers could be used with two completely different data sources (for
|
4053
|
-
** example, a parser and a visitor over in-memory objects). This decoupling is
|
4054
|
-
** the most important feature of upb, because it allows parsers and serializers
|
4055
|
-
** to be highly reusable.
|
4056
|
-
**
|
4057
|
-
** This is a mixed C/C++ interface that offers a full API to both languages.
|
4058
|
-
** See the top-level README for more information.
|
4059
|
-
*/
|
4060
|
-
|
4061
|
-
#ifndef UPB_HANDLERS_H
|
4062
|
-
#define UPB_HANDLERS_H
|
4063
|
-
|
4064
|
-
|
4065
|
-
#ifdef __cplusplus
|
4066
|
-
namespace upb {
|
4067
|
-
class BufferHandle;
|
4068
|
-
class BytesHandler;
|
4069
|
-
class HandlerAttributes;
|
4070
|
-
class Handlers;
|
4071
|
-
template <class T> class Handler;
|
4072
|
-
template <class T> struct CanonicalType;
|
4073
|
-
} /* namespace upb */
|
4074
|
-
#endif
|
4075
|
-
|
4076
|
-
UPB_DECLARE_TYPE(upb::BufferHandle, upb_bufhandle)
|
4077
|
-
UPB_DECLARE_TYPE(upb::BytesHandler, upb_byteshandler)
|
4078
|
-
UPB_DECLARE_TYPE(upb::HandlerAttributes, upb_handlerattr)
|
4079
|
-
UPB_DECLARE_DERIVED_TYPE(upb::Handlers, upb::RefCounted,
|
4080
|
-
upb_handlers, upb_refcounted)
|
4081
|
-
|
4082
|
-
/* The maximum depth that the handler graph can have. This is a resource limit
|
4083
|
-
* for the C stack since we sometimes need to recursively traverse the graph.
|
4084
|
-
* Cycles are ok; the traversal will stop when it detects a cycle, but we must
|
4085
|
-
* hit the cycle before the maximum depth is reached.
|
4086
|
-
*
|
4087
|
-
* If having a single static limit is too inflexible, we can add another variant
|
4088
|
-
* of Handlers::Freeze that allows specifying this as a parameter. */
|
4089
|
-
#define UPB_MAX_HANDLER_DEPTH 64
|
4090
|
-
|
4091
|
-
/* All the different types of handlers that can be registered.
|
4092
|
-
* Only needed for the advanced functions in upb::Handlers. */
|
4093
|
-
typedef enum {
|
4094
|
-
UPB_HANDLER_INT32,
|
4095
|
-
UPB_HANDLER_INT64,
|
4096
|
-
UPB_HANDLER_UINT32,
|
4097
|
-
UPB_HANDLER_UINT64,
|
4098
|
-
UPB_HANDLER_FLOAT,
|
4099
|
-
UPB_HANDLER_DOUBLE,
|
4100
|
-
UPB_HANDLER_BOOL,
|
4101
|
-
UPB_HANDLER_STARTSTR,
|
4102
|
-
UPB_HANDLER_STRING,
|
4103
|
-
UPB_HANDLER_ENDSTR,
|
4104
|
-
UPB_HANDLER_STARTSUBMSG,
|
4105
|
-
UPB_HANDLER_ENDSUBMSG,
|
4106
|
-
UPB_HANDLER_STARTSEQ,
|
4107
|
-
UPB_HANDLER_ENDSEQ
|
4108
|
-
} upb_handlertype_t;
|
4109
|
-
|
4110
|
-
#define UPB_HANDLER_MAX (UPB_HANDLER_ENDSEQ+1)
|
4111
|
-
|
4112
|
-
#define UPB_BREAK NULL
|
3970
|
+
#define UPB_BREAK NULL
|
4113
3971
|
|
4114
3972
|
/* A convenient definition for when no closure is needed. */
|
4115
3973
|
extern char _upb_noclosure;
|
@@ -4144,7 +4002,8 @@ UPB_END_EXTERN_C
|
|
4144
4002
|
/* Static selectors for upb::Handlers. */
|
4145
4003
|
#define UPB_STARTMSG_SELECTOR 0
|
4146
4004
|
#define UPB_ENDMSG_SELECTOR 1
|
4147
|
-
#define
|
4005
|
+
#define UPB_UNKNOWN_SELECTOR 2
|
4006
|
+
#define UPB_STATIC_SELECTOR_COUNT 3
|
4148
4007
|
|
4149
4008
|
/* Static selectors for upb::BytesHandler. */
|
4150
4009
|
#define UPB_STARTSTR_SELECTOR 0
|
@@ -4673,6 +4532,8 @@ UPB_BEGIN_EXTERN_C
|
|
4673
4532
|
/* Native C API. */
|
4674
4533
|
|
4675
4534
|
/* Handler function typedefs. */
|
4535
|
+
typedef bool upb_unknown_handlerfunc(void *c, const void *hd, const char *buf,
|
4536
|
+
size_t n);
|
4676
4537
|
typedef bool upb_startmsg_handlerfunc(void *c, const void*);
|
4677
4538
|
typedef bool upb_endmsg_handlerfunc(void *c, const void *, upb_status *status);
|
4678
4539
|
typedef void* upb_startfield_handlerfunc(void *c, const void *hd);
|
@@ -4726,6 +4587,8 @@ const upb_status *upb_handlers_status(upb_handlers *h);
|
|
4726
4587
|
void upb_handlers_clearerr(upb_handlers *h);
|
4727
4588
|
const upb_msgdef *upb_handlers_msgdef(const upb_handlers *h);
|
4728
4589
|
bool upb_handlers_addcleanup(upb_handlers *h, void *p, upb_handlerfree *hfree);
|
4590
|
+
bool upb_handlers_setunknown(upb_handlers *h, upb_unknown_handlerfunc *func,
|
4591
|
+
upb_handlerattr *attr);
|
4729
4592
|
|
4730
4593
|
bool upb_handlers_setstartmsg(upb_handlers *h, upb_startmsg_handlerfunc *func,
|
4731
4594
|
upb_handlerattr *attr);
|
@@ -6295,6 +6158,18 @@ UPB_INLINE size_t upb_sink_putstring(upb_sink *s, upb_selector_t sel,
|
|
6295
6158
|
return handler(s->closure, hd, buf, n, handle);
|
6296
6159
|
}
|
6297
6160
|
|
6161
|
+
UPB_INLINE bool upb_sink_putunknown(upb_sink *s, const char *buf, size_t n) {
|
6162
|
+
typedef upb_unknown_handlerfunc func;
|
6163
|
+
func *handler;
|
6164
|
+
const void *hd;
|
6165
|
+
if (!s->handlers) return true;
|
6166
|
+
handler = (func *)upb_handlers_gethandler(s->handlers, UPB_UNKNOWN_SELECTOR);
|
6167
|
+
|
6168
|
+
if (!handler) return n;
|
6169
|
+
hd = upb_handlers_gethandlerdata(s->handlers, UPB_UNKNOWN_SELECTOR);
|
6170
|
+
return handler(s->closure, hd, buf, n);
|
6171
|
+
}
|
6172
|
+
|
6298
6173
|
UPB_INLINE bool upb_sink_startmsg(upb_sink *s) {
|
6299
6174
|
typedef upb_startmsg_handlerfunc func;
|
6300
6175
|
func *startmsg;
|
@@ -6499,34 +6374,6 @@ inline bool BufferSource::PutBuffer(const char *buf, size_t len,
|
|
6499
6374
|
#endif
|
6500
6375
|
|
6501
6376
|
#endif
|
6502
|
-
/*
|
6503
|
-
** upb::Message is a representation for protobuf messages.
|
6504
|
-
**
|
6505
|
-
** However it differs from other common representations like
|
6506
|
-
** google::protobuf::Message in one key way: it does not prescribe any
|
6507
|
-
** ownership between messages and submessages, and it relies on the
|
6508
|
-
** client to delete each message/submessage/array/map at the appropriate
|
6509
|
-
** time.
|
6510
|
-
**
|
6511
|
-
** A client can access a upb::Message without knowing anything about
|
6512
|
-
** ownership semantics, but to create or mutate a message a user needs
|
6513
|
-
** to implement the memory management themselves.
|
6514
|
-
**
|
6515
|
-
** Currently all messages, arrays, and maps store a upb_alloc* internally.
|
6516
|
-
** Mutating operations use this when they require dynamically-allocated
|
6517
|
-
** memory. We could potentially eliminate this size overhead later by
|
6518
|
-
** letting the user flip a bit on the factory that prevents this from
|
6519
|
-
** being stored. The user would then need to use separate functions where
|
6520
|
-
** the upb_alloc* is passed explicitly. However for handlers to populate
|
6521
|
-
** such structures, they would need a place to store this upb_alloc* during
|
6522
|
-
** parsing; upb_handlers don't currently have a good way to accommodate this.
|
6523
|
-
**
|
6524
|
-
** TODO: UTF-8 checking?
|
6525
|
-
**/
|
6526
|
-
|
6527
|
-
#ifndef UPB_MSG_H_
|
6528
|
-
#define UPB_MSG_H_
|
6529
|
-
|
6530
6377
|
|
6531
6378
|
#ifdef __cplusplus
|
6532
6379
|
|
@@ -6563,21 +6410,6 @@ typedef void upb_msg;
|
|
6563
6410
|
* instances of this from a upb_msgfactory, and the factory always owns the
|
6564
6411
|
* msglayout. */
|
6565
6412
|
|
6566
|
-
/* Gets the factory for this layout */
|
6567
|
-
upb_msgfactory *upb_msglayout_factory(const upb_msglayout *l);
|
6568
|
-
|
6569
|
-
/* Get the msglayout for a submessage. This requires that this field is a
|
6570
|
-
* submessage, ie. upb_fielddef_issubmsg(upb_msglayout_msgdef(l)) == true.
|
6571
|
-
*
|
6572
|
-
* Since map entry messages don't have layouts, if upb_fielddef_ismap(f) == true
|
6573
|
-
* then this function will return the layout for the map's value. It requires
|
6574
|
-
* that the value type of the map field is a submessage. */
|
6575
|
-
const upb_msglayout *upb_msglayout_sublayout(const upb_msglayout *l,
|
6576
|
-
const upb_fielddef *f);
|
6577
|
-
|
6578
|
-
/* Returns the msgdef for this msglayout. */
|
6579
|
-
const upb_msgdef *upb_msglayout_msgdef(const upb_msglayout *l);
|
6580
|
-
|
6581
6413
|
|
6582
6414
|
/** upb_visitor ***************************************************************/
|
6583
6415
|
|
@@ -6623,6 +6455,23 @@ const upb_visitorplan *upb_msgfactory_getvisitorplan(upb_msgfactory *f,
|
|
6623
6455
|
const upb_handlers *h);
|
6624
6456
|
|
6625
6457
|
|
6458
|
+
/** upb_stringview ************************************************************/
|
6459
|
+
|
6460
|
+
typedef struct {
|
6461
|
+
const char *data;
|
6462
|
+
size_t size;
|
6463
|
+
} upb_stringview;
|
6464
|
+
|
6465
|
+
UPB_INLINE upb_stringview upb_stringview_make(const char *data, size_t size) {
|
6466
|
+
upb_stringview ret;
|
6467
|
+
ret.data = data;
|
6468
|
+
ret.size = size;
|
6469
|
+
return ret;
|
6470
|
+
}
|
6471
|
+
|
6472
|
+
#define UPB_STRINGVIEW_INIT(ptr, len) {ptr, len}
|
6473
|
+
|
6474
|
+
|
6626
6475
|
/** upb_msgval ****************************************************************/
|
6627
6476
|
|
6628
6477
|
/* A union representing all possible protobuf values. Used for generic get/set
|
@@ -6640,10 +6489,7 @@ typedef union {
|
|
6640
6489
|
const upb_msg* msg;
|
6641
6490
|
const upb_array* arr;
|
6642
6491
|
const void* ptr;
|
6643
|
-
|
6644
|
-
const char *ptr;
|
6645
|
-
size_t len;
|
6646
|
-
} str;
|
6492
|
+
upb_stringview str;
|
6647
6493
|
} upb_msgval;
|
6648
6494
|
|
6649
6495
|
#define ACCESSORS(name, membername, ctype) \
|
@@ -6670,22 +6516,12 @@ ACCESSORS(map, map, const upb_map*)
|
|
6670
6516
|
ACCESSORS(msg, msg, const upb_msg*)
|
6671
6517
|
ACCESSORS(ptr, ptr, const void*)
|
6672
6518
|
ACCESSORS(arr, arr, const upb_array*)
|
6519
|
+
ACCESSORS(str, str, upb_stringview)
|
6673
6520
|
|
6674
6521
|
#undef ACCESSORS
|
6675
6522
|
|
6676
|
-
UPB_INLINE upb_msgval
|
6677
|
-
|
6678
|
-
ret.str.ptr = ptr;
|
6679
|
-
ret.str.len = len;
|
6680
|
-
return ret;
|
6681
|
-
}
|
6682
|
-
|
6683
|
-
UPB_INLINE const char* upb_msgval_getstr(upb_msgval val) {
|
6684
|
-
return val.str.ptr;
|
6685
|
-
}
|
6686
|
-
|
6687
|
-
UPB_INLINE size_t upb_msgval_getstrlen(upb_msgval val) {
|
6688
|
-
return val.str.len;
|
6523
|
+
UPB_INLINE upb_msgval upb_msgval_makestr(const char *data, size_t size) {
|
6524
|
+
return upb_msgval_str(upb_stringview_make(data, size));
|
6689
6525
|
}
|
6690
6526
|
|
6691
6527
|
|
@@ -6710,19 +6546,29 @@ size_t upb_msg_sizeof(const upb_msglayout *l);
|
|
6710
6546
|
* upb_msg_uninit() must be called to release internally-allocated memory
|
6711
6547
|
* unless the allocator is an arena that does not require freeing.
|
6712
6548
|
*
|
6549
|
+
* Please note that upb_msg_init() may return a value that is different than
|
6550
|
+
* |msg|, so you must assign the return value and not cast your memory block
|
6551
|
+
* to upb_msg* directly!
|
6552
|
+
*
|
6713
6553
|
* Please note that upb_msg_uninit() does *not* free any submessages, maps,
|
6714
6554
|
* or arrays referred to by this message's fields. You must free them manually
|
6715
|
-
* yourself.
|
6716
|
-
|
6717
|
-
|
6555
|
+
* yourself.
|
6556
|
+
*
|
6557
|
+
* upb_msg_uninit returns the original memory block, which may be useful if
|
6558
|
+
* you dynamically allocated it (though upb_msg_new() would normally be more
|
6559
|
+
* appropriate in this case). */
|
6560
|
+
upb_msg *upb_msg_init(void *msg, const upb_msglayout *l, upb_alloc *a);
|
6561
|
+
void *upb_msg_uninit(upb_msg *msg, const upb_msglayout *l);
|
6718
6562
|
|
6719
6563
|
/* Like upb_msg_init() / upb_msg_uninit(), except the message's memory is
|
6720
6564
|
* allocated / freed from the given upb_alloc. */
|
6721
6565
|
upb_msg *upb_msg_new(const upb_msglayout *l, upb_alloc *a);
|
6722
6566
|
void upb_msg_free(upb_msg *msg, const upb_msglayout *l);
|
6723
6567
|
|
6724
|
-
/* Returns the upb_alloc for the given message.
|
6725
|
-
|
6568
|
+
/* Returns the upb_alloc for the given message.
|
6569
|
+
* TODO(haberman): get rid of this? Not sure we want to be storing this
|
6570
|
+
* for every message. */
|
6571
|
+
upb_alloc *upb_msg_alloc(const upb_msg *msg);
|
6726
6572
|
|
6727
6573
|
/* Packs the tree of messages rooted at "msg" into a single hunk of memory,
|
6728
6574
|
* allocated from the given allocator. */
|
@@ -6742,25 +6588,14 @@ void *upb_msg_pack(const upb_msg *msg, const upb_msglayout *l,
|
|
6742
6588
|
* arenas).
|
6743
6589
|
*/
|
6744
6590
|
upb_msgval upb_msg_get(const upb_msg *msg,
|
6745
|
-
|
6591
|
+
int field_index,
|
6746
6592
|
const upb_msglayout *l);
|
6747
6593
|
|
6748
6594
|
/* May only be called for fields where upb_fielddef_haspresence(f) == true. */
|
6749
6595
|
bool upb_msg_has(const upb_msg *msg,
|
6750
|
-
|
6596
|
+
int field_index,
|
6751
6597
|
const upb_msglayout *l);
|
6752
6598
|
|
6753
|
-
/* Returns NULL if no field in the oneof is set. */
|
6754
|
-
const upb_fielddef *upb_msg_getoneofcase(const upb_msg *msg,
|
6755
|
-
const upb_oneofdef *o,
|
6756
|
-
const upb_msglayout *l);
|
6757
|
-
|
6758
|
-
/* Returns true if any field in the oneof is set. */
|
6759
|
-
bool upb_msg_hasoneof(const upb_msg *msg,
|
6760
|
-
const upb_oneofdef *o,
|
6761
|
-
const upb_msglayout *l);
|
6762
|
-
|
6763
|
-
|
6764
6599
|
/* Mutable message API. May only be called by the owner of the message who
|
6765
6600
|
* knows its ownership scheme and how to keep it consistent. */
|
6766
6601
|
|
@@ -6768,8 +6603,8 @@ bool upb_msg_hasoneof(const upb_msg *msg,
|
|
6768
6603
|
* management: if you overwrite a pointer to a msg/array/map/string without
|
6769
6604
|
* cleaning it up (or using an arena) it will leak.
|
6770
6605
|
*/
|
6771
|
-
|
6772
|
-
|
6606
|
+
void upb_msg_set(upb_msg *msg,
|
6607
|
+
int field_index,
|
6773
6608
|
upb_msgval val,
|
6774
6609
|
const upb_msglayout *l);
|
6775
6610
|
|
@@ -6780,12 +6615,7 @@ bool upb_msg_set(upb_msg *msg,
|
|
6780
6615
|
* arrays/maps/strings/msgs that this field may have pointed to.
|
6781
6616
|
*/
|
6782
6617
|
bool upb_msg_clearfield(upb_msg *msg,
|
6783
|
-
|
6784
|
-
const upb_msglayout *l);
|
6785
|
-
|
6786
|
-
/* Clears all fields in the oneof such that none of them are set. */
|
6787
|
-
bool upb_msg_clearoneof(upb_msg *msg,
|
6788
|
-
const upb_oneofdef *o,
|
6618
|
+
int field_index,
|
6789
6619
|
const upb_msglayout *l);
|
6790
6620
|
|
6791
6621
|
/* TODO(haberman): copyfrom()/mergefrom()? */
|
@@ -6898,9 +6728,288 @@ bool upb_msg_getscalarhandlerdata(const upb_handlers *h,
|
|
6898
6728
|
size_t *offset,
|
6899
6729
|
int32_t *hasbit);
|
6900
6730
|
|
6731
|
+
|
6732
|
+
/** Interfaces for generated code *********************************************/
|
6733
|
+
|
6734
|
+
#define UPB_NOT_IN_ONEOF UINT16_MAX
|
6735
|
+
#define UPB_NO_HASBIT UINT16_MAX
|
6736
|
+
#define UPB_NO_SUBMSG UINT16_MAX
|
6737
|
+
|
6738
|
+
typedef struct {
|
6739
|
+
uint32_t number;
|
6740
|
+
uint32_t offset; /* If in a oneof, offset of default in default_msg below. */
|
6741
|
+
uint16_t hasbit; /* UPB_NO_HASBIT if no hasbit. */
|
6742
|
+
uint16_t oneof_index; /* UPB_NOT_IN_ONEOF if not in a oneof. */
|
6743
|
+
uint16_t submsg_index; /* UPB_NO_SUBMSG if no submsg. */
|
6744
|
+
uint8_t type;
|
6745
|
+
uint8_t label;
|
6746
|
+
} upb_msglayout_fieldinit_v1;
|
6747
|
+
|
6748
|
+
typedef struct {
|
6749
|
+
uint32_t data_offset;
|
6750
|
+
uint32_t case_offset;
|
6751
|
+
} upb_msglayout_oneofinit_v1;
|
6752
|
+
|
6753
|
+
typedef struct upb_msglayout_msginit_v1 {
|
6754
|
+
const struct upb_msglayout_msginit_v1 *const* submsgs;
|
6755
|
+
const upb_msglayout_fieldinit_v1 *fields;
|
6756
|
+
const upb_msglayout_oneofinit_v1 *oneofs;
|
6757
|
+
void *default_msg;
|
6758
|
+
/* Must be aligned to sizeof(void*). Doesn't include internal members like
|
6759
|
+
* unknown fields, extension dict, pointer to msglayout, etc. */
|
6760
|
+
uint32_t size;
|
6761
|
+
uint16_t field_count;
|
6762
|
+
uint16_t oneof_count;
|
6763
|
+
bool extendable;
|
6764
|
+
bool is_proto2;
|
6765
|
+
} upb_msglayout_msginit_v1;
|
6766
|
+
|
6767
|
+
#define UPB_ALIGN_UP_TO(val, align) ((val + (align - 1)) & -align)
|
6768
|
+
#define UPB_ALIGNED_SIZEOF(type) UPB_ALIGN_UP_TO(sizeof(type), sizeof(void*))
|
6769
|
+
|
6770
|
+
/* Initialize/uninitialize a msglayout from a msginit. If upb uses v1
|
6771
|
+
* internally, this will not allocate any memory. Should only be used by
|
6772
|
+
* generated code. */
|
6773
|
+
upb_msglayout *upb_msglayout_frominit_v1(
|
6774
|
+
const upb_msglayout_msginit_v1 *init, upb_alloc *a);
|
6775
|
+
void upb_msglayout_uninit_v1(upb_msglayout *layout, upb_alloc *a);
|
6776
|
+
|
6901
6777
|
UPB_END_EXTERN_C
|
6902
6778
|
|
6903
6779
|
#endif /* UPB_MSG_H_ */
|
6780
|
+
|
6781
|
+
UPB_BEGIN_EXTERN_C
|
6782
|
+
|
6783
|
+
bool upb_decode(upb_stringview buf, void *msg,
|
6784
|
+
const upb_msglayout_msginit_v1 *l, upb_env *env);
|
6785
|
+
|
6786
|
+
UPB_END_EXTERN_C
|
6787
|
+
|
6788
|
+
#endif /* UPB_DECODE_H_ */
|
6789
|
+
/*
|
6790
|
+
** structs.int.h: structures definitions that are internal to upb.
|
6791
|
+
*/
|
6792
|
+
|
6793
|
+
#ifndef UPB_STRUCTS_H_
|
6794
|
+
#define UPB_STRUCTS_H_
|
6795
|
+
|
6796
|
+
struct upb_array {
|
6797
|
+
upb_fieldtype_t type;
|
6798
|
+
uint8_t element_size;
|
6799
|
+
void *data; /* Each element is element_size. */
|
6800
|
+
size_t len; /* Measured in elements. */
|
6801
|
+
size_t size; /* Measured in elements. */
|
6802
|
+
upb_alloc *alloc;
|
6803
|
+
};
|
6804
|
+
|
6805
|
+
#endif /* UPB_STRUCTS_H_ */
|
6806
|
+
|
6807
|
+
/*
|
6808
|
+
** This file contains definitions of structs that should be considered private
|
6809
|
+
** and NOT stable across versions of upb.
|
6810
|
+
**
|
6811
|
+
** The only reason they are declared here and not in .c files is to allow upb
|
6812
|
+
** and the application (if desired) to embed statically-initialized instances
|
6813
|
+
** of structures like defs.
|
6814
|
+
**
|
6815
|
+
** If you include this file, all guarantees of ABI compatibility go out the
|
6816
|
+
** window! Any code that includes this file needs to recompile against the
|
6817
|
+
** exact same version of upb that they are linking against.
|
6818
|
+
**
|
6819
|
+
** You also need to recompile if you change the value of the UPB_DEBUG_REFS
|
6820
|
+
** flag.
|
6821
|
+
*/
|
6822
|
+
|
6823
|
+
|
6824
|
+
#ifndef UPB_STATICINIT_H_
|
6825
|
+
#define UPB_STATICINIT_H_
|
6826
|
+
|
6827
|
+
#ifdef __cplusplus
|
6828
|
+
/* Because of how we do our typedefs, this header can't be included from C++. */
|
6829
|
+
#error This file cannot be included from C++
|
6830
|
+
#endif
|
6831
|
+
|
6832
|
+
/* upb_refcounted *************************************************************/
|
6833
|
+
|
6834
|
+
|
6835
|
+
/* upb_def ********************************************************************/
|
6836
|
+
|
6837
|
+
struct upb_def {
|
6838
|
+
upb_refcounted base;
|
6839
|
+
|
6840
|
+
const char *fullname;
|
6841
|
+
const upb_filedef* file;
|
6842
|
+
char type; /* A upb_deftype_t (char to save space) */
|
6843
|
+
|
6844
|
+
/* Used as a flag during the def's mutable stage. Must be false unless
|
6845
|
+
* it is currently being used by a function on the stack. This allows
|
6846
|
+
* us to easily determine which defs were passed into the function's
|
6847
|
+
* current invocation. */
|
6848
|
+
bool came_from_user;
|
6849
|
+
};
|
6850
|
+
|
6851
|
+
#define UPB_DEF_INIT(name, type, vtbl, refs, ref2s) \
|
6852
|
+
{ UPB_REFCOUNT_INIT(vtbl, refs, ref2s), name, NULL, type, false }
|
6853
|
+
|
6854
|
+
|
6855
|
+
/* upb_fielddef ***************************************************************/
|
6856
|
+
|
6857
|
+
struct upb_fielddef {
|
6858
|
+
upb_def base;
|
6859
|
+
|
6860
|
+
union {
|
6861
|
+
int64_t sint;
|
6862
|
+
uint64_t uint;
|
6863
|
+
double dbl;
|
6864
|
+
float flt;
|
6865
|
+
void *bytes;
|
6866
|
+
} defaultval;
|
6867
|
+
union {
|
6868
|
+
const upb_msgdef *def; /* If !msg_is_symbolic. */
|
6869
|
+
char *name; /* If msg_is_symbolic. */
|
6870
|
+
} msg;
|
6871
|
+
union {
|
6872
|
+
const upb_def *def; /* If !subdef_is_symbolic. */
|
6873
|
+
char *name; /* If subdef_is_symbolic. */
|
6874
|
+
} sub; /* The msgdef or enumdef for this field, if upb_hassubdef(f). */
|
6875
|
+
bool subdef_is_symbolic;
|
6876
|
+
bool msg_is_symbolic;
|
6877
|
+
const upb_oneofdef *oneof;
|
6878
|
+
bool default_is_string;
|
6879
|
+
bool type_is_set_; /* False until type is explicitly set. */
|
6880
|
+
bool is_extension_;
|
6881
|
+
bool lazy_;
|
6882
|
+
bool packed_;
|
6883
|
+
upb_intfmt_t intfmt;
|
6884
|
+
bool tagdelim;
|
6885
|
+
upb_fieldtype_t type_;
|
6886
|
+
upb_label_t label_;
|
6887
|
+
uint32_t number_;
|
6888
|
+
uint32_t selector_base; /* Used to index into a upb::Handlers table. */
|
6889
|
+
uint32_t index_;
|
6890
|
+
};
|
6891
|
+
|
6892
|
+
extern const struct upb_refcounted_vtbl upb_fielddef_vtbl;
|
6893
|
+
|
6894
|
+
#define UPB_FIELDDEF_INIT(label, type, intfmt, tagdelim, is_extension, lazy, \
|
6895
|
+
packed, name, num, msgdef, subdef, selector_base, \
|
6896
|
+
index, defaultval, refs, ref2s) \
|
6897
|
+
{ \
|
6898
|
+
UPB_DEF_INIT(name, UPB_DEF_FIELD, &upb_fielddef_vtbl, refs, ref2s), \
|
6899
|
+
defaultval, {msgdef}, {subdef}, NULL, false, false, \
|
6900
|
+
type == UPB_TYPE_STRING || type == UPB_TYPE_BYTES, true, is_extension, \
|
6901
|
+
lazy, packed, intfmt, tagdelim, type, label, num, selector_base, index \
|
6902
|
+
}
|
6903
|
+
|
6904
|
+
|
6905
|
+
/* upb_msgdef *****************************************************************/
|
6906
|
+
|
6907
|
+
struct upb_msgdef {
|
6908
|
+
upb_def base;
|
6909
|
+
|
6910
|
+
size_t selector_count;
|
6911
|
+
uint32_t submsg_field_count;
|
6912
|
+
|
6913
|
+
/* Tables for looking up fields by number and name. */
|
6914
|
+
upb_inttable itof; /* int to field */
|
6915
|
+
upb_strtable ntof; /* name to field/oneof */
|
6916
|
+
|
6917
|
+
/* Is this a map-entry message? */
|
6918
|
+
bool map_entry;
|
6919
|
+
|
6920
|
+
/* Whether this message has proto2 or proto3 semantics. */
|
6921
|
+
upb_syntax_t syntax;
|
6922
|
+
|
6923
|
+
/* TODO(haberman): proper extension ranges (there can be multiple). */
|
6924
|
+
};
|
6925
|
+
|
6926
|
+
extern const struct upb_refcounted_vtbl upb_msgdef_vtbl;
|
6927
|
+
|
6928
|
+
/* TODO: also support static initialization of the oneofs table. This will be
|
6929
|
+
* needed if we compile in descriptors that contain oneofs. */
|
6930
|
+
#define UPB_MSGDEF_INIT(name, selector_count, submsg_field_count, itof, ntof, \
|
6931
|
+
map_entry, syntax, refs, ref2s) \
|
6932
|
+
{ \
|
6933
|
+
UPB_DEF_INIT(name, UPB_DEF_MSG, &upb_fielddef_vtbl, refs, ref2s), \
|
6934
|
+
selector_count, submsg_field_count, itof, ntof, map_entry, syntax \
|
6935
|
+
}
|
6936
|
+
|
6937
|
+
|
6938
|
+
/* upb_enumdef ****************************************************************/
|
6939
|
+
|
6940
|
+
struct upb_enumdef {
|
6941
|
+
upb_def base;
|
6942
|
+
|
6943
|
+
upb_strtable ntoi;
|
6944
|
+
upb_inttable iton;
|
6945
|
+
int32_t defaultval;
|
6946
|
+
};
|
6947
|
+
|
6948
|
+
extern const struct upb_refcounted_vtbl upb_enumdef_vtbl;
|
6949
|
+
|
6950
|
+
#define UPB_ENUMDEF_INIT(name, ntoi, iton, defaultval, refs, ref2s) \
|
6951
|
+
{ UPB_DEF_INIT(name, UPB_DEF_ENUM, &upb_enumdef_vtbl, refs, ref2s), ntoi, \
|
6952
|
+
iton, defaultval }
|
6953
|
+
|
6954
|
+
|
6955
|
+
/* upb_oneofdef ***************************************************************/
|
6956
|
+
|
6957
|
+
struct upb_oneofdef {
|
6958
|
+
upb_refcounted base;
|
6959
|
+
|
6960
|
+
uint32_t index; /* Index within oneofs. */
|
6961
|
+
const char *name;
|
6962
|
+
upb_strtable ntof;
|
6963
|
+
upb_inttable itof;
|
6964
|
+
const upb_msgdef *parent;
|
6965
|
+
};
|
6966
|
+
|
6967
|
+
extern const struct upb_refcounted_vtbl upb_oneofdef_vtbl;
|
6968
|
+
|
6969
|
+
#define UPB_ONEOFDEF_INIT(name, ntof, itof, refs, ref2s) \
|
6970
|
+
{ UPB_REFCOUNT_INIT(&upb_oneofdef_vtbl, refs, ref2s), 0, name, ntof, itof }
|
6971
|
+
|
6972
|
+
|
6973
|
+
/* upb_symtab *****************************************************************/
|
6974
|
+
|
6975
|
+
struct upb_symtab {
|
6976
|
+
upb_refcounted base;
|
6977
|
+
|
6978
|
+
upb_strtable symtab;
|
6979
|
+
};
|
6980
|
+
|
6981
|
+
struct upb_filedef {
|
6982
|
+
upb_refcounted base;
|
6983
|
+
|
6984
|
+
const char *name;
|
6985
|
+
const char *package;
|
6986
|
+
const char *phpprefix;
|
6987
|
+
const char *phpnamespace;
|
6988
|
+
upb_syntax_t syntax;
|
6989
|
+
|
6990
|
+
upb_inttable defs;
|
6991
|
+
upb_inttable deps;
|
6992
|
+
};
|
6993
|
+
|
6994
|
+
extern const struct upb_refcounted_vtbl upb_filedef_vtbl;
|
6995
|
+
|
6996
|
+
#endif /* UPB_STATICINIT_H_ */
|
6997
|
+
/*
|
6998
|
+
** upb_encode: parsing into a upb_msg using a upb_msglayout.
|
6999
|
+
*/
|
7000
|
+
|
7001
|
+
#ifndef UPB_ENCODE_H_
|
7002
|
+
#define UPB_ENCODE_H_
|
7003
|
+
|
7004
|
+
|
7005
|
+
UPB_BEGIN_EXTERN_C
|
7006
|
+
|
7007
|
+
char *upb_encode(const void *msg, const upb_msglayout_msginit_v1 *l,
|
7008
|
+
upb_env *env, size_t *size);
|
7009
|
+
|
7010
|
+
UPB_END_EXTERN_C
|
7011
|
+
|
7012
|
+
#endif /* UPB_ENCODE_H_ */
|
6904
7013
|
/*
|
6905
7014
|
** upb::descriptor::Reader (upb_descreader)
|
6906
7015
|
**
|
@@ -8290,21 +8399,9 @@ UPB_INLINE void upb_pbdecoder_unpackdispatch(uint64_t dispatch, uint64_t *ofs,
|
|
8290
8399
|
extern "C" {
|
8291
8400
|
#endif
|
8292
8401
|
|
8293
|
-
/* A list of types as they are encoded on-the-wire. */
|
8294
|
-
typedef enum {
|
8295
|
-
UPB_WIRE_TYPE_VARINT = 0,
|
8296
|
-
UPB_WIRE_TYPE_64BIT = 1,
|
8297
|
-
UPB_WIRE_TYPE_DELIMITED = 2,
|
8298
|
-
UPB_WIRE_TYPE_START_GROUP = 3,
|
8299
|
-
UPB_WIRE_TYPE_END_GROUP = 4,
|
8300
|
-
UPB_WIRE_TYPE_32BIT = 5
|
8301
|
-
} upb_wiretype_t;
|
8302
|
-
|
8303
8402
|
#define UPB_MAX_WIRE_TYPE 5
|
8304
8403
|
|
8305
|
-
/* The maximum number of bytes that it takes to encode a 64-bit varint.
|
8306
|
-
* Note that with a better encoding this could be 9 (TODO: write up a
|
8307
|
-
* wiki document about this). */
|
8404
|
+
/* The maximum number of bytes that it takes to encode a 64-bit varint. */
|
8308
8405
|
#define UPB_PB_VARINT_MAX_LEN 10
|
8309
8406
|
|
8310
8407
|
/* Array of the "native" (ie. non-packed-repeated) wire type for the given a
|