grpc 1.30.0 → 1.31.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +560 -619
- data/include/grpc/grpc_security.h +8 -0
- data/include/grpc/grpc_security_constants.h +3 -0
- data/include/grpc/impl/codegen/grpc_types.h +7 -5
- data/include/grpc/impl/codegen/port_platform.h +0 -32
- data/src/core/ext/filters/client_channel/backend_metric.cc +12 -9
- data/src/core/ext/filters/client_channel/client_channel.cc +406 -261
- data/src/core/ext/filters/client_channel/config_selector.cc +62 -0
- data/src/core/ext/filters/client_channel/config_selector.h +93 -0
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -2
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +2 -0
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +6 -5
- data/src/core/ext/filters/client_channel/http_proxy.cc +6 -4
- data/src/core/ext/filters/client_channel/lb_policy.h +2 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +39 -23
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +4 -6
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +3 -4
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +381 -72
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +5 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +6 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +8 -6
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +9 -7
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +7 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +33 -48
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +21 -18
- data/src/core/ext/filters/client_channel/resolver_registry.cc +13 -14
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +6 -7
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +33 -28
- data/src/core/ext/filters/client_channel/resolving_lb_policy.h +39 -20
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +142 -0
- data/src/core/ext/filters/client_channel/subchannel.cc +1 -1
- data/src/core/ext/filters/client_channel/xds/xds_api.cc +327 -123
- data/src/core/ext/filters/client_channel/xds/xds_api.h +72 -7
- data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +12 -23
- data/src/core/ext/filters/client_channel/xds/xds_client.cc +112 -33
- data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +10 -10
- data/src/core/ext/filters/http/client/http_client_filter.cc +5 -5
- data/src/core/ext/filters/http/http_filters_plugin.cc +2 -1
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +74 -33
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +3 -1
- data/src/core/ext/filters/message_size/message_size_filter.cc +56 -80
- data/src/core/ext/filters/message_size/message_size_filter.h +6 -0
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +383 -347
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +6 -2
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +1 -1
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +7 -13
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +7 -8
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +19 -4
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +22 -27
- data/src/core/ext/transport/chttp2/transport/flow_control.h +14 -16
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +9 -12
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -6
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -6
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +12 -13
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -7
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +9 -12
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -29
- data/src/core/ext/transport/chttp2/transport/hpack_table.cc +13 -17
- data/src/core/ext/transport/chttp2/transport/internal.h +13 -0
- data/src/core/ext/transport/chttp2/transport/parsing.cc +33 -43
- data/src/core/ext/transport/chttp2/transport/writing.cc +9 -14
- data/src/core/ext/transport/inproc/inproc_transport.cc +35 -15
- data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +0 -1
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +3 -4
- data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +0 -1
- data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +80 -69
- data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +24 -23
- data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +66 -56
- data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +1 -2
- data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +317 -311
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +42 -34
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +7 -7
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +79 -61
- data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +55 -49
- data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +9 -8
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +163 -169
- data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +51 -45
- data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +4 -5
- data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +107 -100
- data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +137 -117
- data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +9 -9
- data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +105 -87
- data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +12 -13
- data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +95 -101
- data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +1 -2
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +49 -65
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +0 -1
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +49 -42
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +70 -62
- data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +1 -2
- data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +81 -65
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +0 -1
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +91 -80
- data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +9 -10
- data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +1 -2
- data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +36 -31
- data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +0 -1
- data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +7 -7
- data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +648 -696
- data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +16 -15
- data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +1 -2
- data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +95 -88
- data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +234 -199
- data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +5 -5
- data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +13 -13
- data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +1 -2
- data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +20 -18
- data/src/core/ext/upb-generated/envoy/type/http.upb.h +0 -1
- data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +18 -17
- data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +14 -14
- data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +23 -23
- data/src/core/ext/upb-generated/envoy/type/percent.upb.h +8 -9
- data/src/core/ext/upb-generated/envoy/type/range.upb.h +15 -16
- data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +7 -8
- data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +36 -35
- data/src/core/ext/upb-generated/gogoproto/gogo.upb.h +0 -1
- data/src/core/ext/upb-generated/google/api/annotations.upb.h +0 -1
- data/src/core/ext/upb-generated/google/api/http.upb.h +29 -28
- data/src/core/ext/upb-generated/google/protobuf/any.upb.h +5 -6
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +3 -3
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +412 -386
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +5 -6
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +1 -2
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +33 -54
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +5 -6
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +27 -28
- data/src/core/ext/upb-generated/google/rpc/status.upb.h +8 -8
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +1 -1
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +32 -45
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +4 -4
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +157 -178
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +14 -13
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +6 -7
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +59 -56
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +11 -12
- data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +0 -1
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +5 -6
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +6 -6
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +41 -68
- data/src/core/ext/upb-generated/validate/validate.upb.h +536 -535
- data/src/core/lib/channel/channel_trace.cc +2 -6
- data/src/core/lib/channel/channelz.cc +5 -15
- data/src/core/lib/gpr/log_linux.cc +6 -8
- data/src/core/lib/gpr/log_posix.cc +6 -8
- data/src/core/lib/gpr/string.cc +10 -9
- data/src/core/lib/gpr/string.h +4 -2
- data/src/core/lib/gprpp/global_config_env.cc +8 -6
- data/src/core/lib/http/httpcli.cc +13 -10
- data/src/core/lib/http/httpcli_security_connector.cc +5 -5
- data/src/core/lib/iomgr/cfstream_handle.cc +1 -0
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +10 -10
- data/src/core/lib/iomgr/error_cfstream.cc +9 -8
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +5 -6
- data/src/core/lib/iomgr/ev_epollex_linux.cc +15 -21
- data/src/core/lib/iomgr/ev_poll_posix.cc +6 -5
- data/src/core/lib/iomgr/ev_posix.cc +2 -0
- data/src/core/lib/iomgr/iomgr.cc +10 -0
- data/src/core/lib/iomgr/iomgr.h +10 -0
- data/src/core/lib/iomgr/is_epollexclusive_available.cc +14 -0
- data/src/core/lib/iomgr/port.h +1 -21
- data/src/core/lib/iomgr/resolve_address_custom.cc +13 -18
- data/src/core/lib/iomgr/resolve_address_windows.cc +8 -8
- data/src/core/lib/iomgr/resource_quota.cc +34 -31
- data/src/core/lib/iomgr/sockaddr_utils.cc +7 -5
- data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +95 -55
- data/src/core/lib/iomgr/socket_windows.cc +4 -5
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +9 -11
- data/src/core/lib/iomgr/tcp_client_custom.cc +6 -9
- data/src/core/lib/iomgr/tcp_client_posix.cc +27 -36
- data/src/core/lib/iomgr/tcp_client_windows.cc +9 -9
- data/src/core/lib/iomgr/tcp_custom.cc +1 -1
- data/src/core/lib/iomgr/tcp_custom.h +1 -1
- data/src/core/lib/iomgr/tcp_server.cc +3 -4
- data/src/core/lib/iomgr/tcp_server.h +7 -5
- data/src/core/lib/iomgr/tcp_server_custom.cc +6 -14
- data/src/core/lib/iomgr/tcp_server_posix.cc +34 -41
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -4
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -7
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +4 -9
- data/src/core/lib/iomgr/tcp_server_windows.cc +16 -16
- data/src/core/lib/iomgr/timer_generic.cc +13 -12
- data/src/core/lib/iomgr/udp_server.cc +24 -23
- data/src/core/lib/iomgr/udp_server.h +5 -2
- data/src/core/lib/iomgr/unix_sockets_posix.cc +9 -14
- data/src/core/lib/iomgr/unix_sockets_posix.h +3 -1
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +5 -2
- data/src/core/lib/json/json_reader.cc +20 -21
- data/src/core/lib/security/credentials/credentials.h +5 -3
- data/src/core/lib/security/credentials/google_default/credentials_generic.cc +8 -6
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +12 -9
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +7 -4
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +19 -28
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -6
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +10 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +10 -0
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +10 -10
- data/src/core/lib/security/security_connector/security_connector.cc +2 -0
- data/src/core/lib/security/security_connector/security_connector.h +1 -1
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +18 -11
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +5 -0
- data/src/core/lib/security/security_connector/ssl_utils.cc +44 -23
- data/src/core/lib/security/security_connector/ssl_utils.h +6 -2
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +27 -24
- data/src/core/lib/security/transport/auth_filters.h +0 -5
- data/src/core/lib/security/transport/client_auth_filter.cc +10 -9
- data/src/core/lib/security/util/json_util.cc +12 -13
- data/src/core/lib/slice/slice.cc +38 -1
- data/src/core/lib/slice/slice_internal.h +1 -0
- data/src/core/lib/surface/call.cc +40 -41
- data/src/core/lib/surface/completion_queue.cc +271 -14
- data/src/core/lib/surface/completion_queue.h +8 -0
- data/src/core/lib/surface/init.cc +2 -0
- data/src/core/lib/surface/server.cc +565 -632
- data/src/core/lib/surface/server.h +34 -12
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/transport.h +6 -0
- data/src/core/lib/uri/uri_parser.cc +8 -15
- data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +23 -13
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +2 -0
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -0
- data/src/core/tsi/ssl_transport_security.cc +108 -11
- data/src/core/tsi/ssl_transport_security.h +14 -2
- data/src/core/tsi/transport_security_interface.h +5 -0
- data/src/ruby/bin/math_services_pb.rb +4 -4
- data/src/ruby/ext/grpc/extconf.rb +5 -2
- data/src/ruby/ext/grpc/rb_call.c +3 -2
- data/src/ruby/ext/grpc/rb_call.h +4 -0
- data/src/ruby/ext/grpc/rb_call_credentials.c +57 -12
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
- data/src/ruby/lib/grpc/generic/client_stub.rb +1 -1
- data/src/ruby/lib/grpc/generic/interceptors.rb +1 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +2 -2
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +5 -0
- data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +28 -12
- data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto +23 -0
- data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +2 -0
- data/src/ruby/spec/pb/codegen/grpc/testing/same_package_service_name.proto +27 -0
- data/src/ruby/spec/pb/codegen/grpc/testing/same_ruby_package_service_name.proto +29 -0
- data/src/ruby/spec/pb/codegen/package_option_spec.rb +25 -1
- data/src/ruby/spec/support/services.rb +10 -4
- data/src/ruby/spec/user_agent_spec.rb +74 -0
- data/third_party/boringssl-with-bazel/err_data.c +89 -83
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +12 -52
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +0 -22
- data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +143 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +17 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +11 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +2 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +13 -11
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +24 -23
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +20 -16
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/util.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +62 -0
- data/third_party/boringssl-with-bazel/src/crypto/mem.c +29 -15
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +7 -0
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +36 -5
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +0 -29
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +116 -363
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +7 -45
- data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +4 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +8 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +4 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509.c +0 -67
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +13 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +10 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +41 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +4 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +28 -9
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +25 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +35 -13
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +0 -154
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +28 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +74 -35
- data/third_party/boringssl-with-bazel/src/include/openssl/aes.h +16 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +22 -22
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +1 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +69 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +33 -16
- data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +1 -10
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +789 -715
- data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +3 -3
- data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +9 -2
- data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +9 -0
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +17 -14
- data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +7 -7
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +28 -0
- data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +4 -24
- data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +5 -5
- data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +45 -24
- data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +31 -21
- data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +12 -9
- data/third_party/re2/re2/bitmap256.h +117 -0
- data/third_party/re2/re2/bitstate.cc +385 -0
- data/third_party/re2/re2/compile.cc +1279 -0
- data/third_party/re2/re2/dfa.cc +2130 -0
- data/third_party/re2/re2/filtered_re2.cc +121 -0
- data/third_party/re2/re2/filtered_re2.h +109 -0
- data/third_party/re2/re2/mimics_pcre.cc +197 -0
- data/third_party/re2/re2/nfa.cc +713 -0
- data/third_party/re2/re2/onepass.cc +623 -0
- data/third_party/re2/re2/parse.cc +2464 -0
- data/third_party/re2/re2/perl_groups.cc +119 -0
- data/third_party/re2/re2/pod_array.h +55 -0
- data/third_party/re2/re2/prefilter.cc +710 -0
- data/third_party/re2/re2/prefilter.h +108 -0
- data/third_party/re2/re2/prefilter_tree.cc +407 -0
- data/third_party/re2/re2/prefilter_tree.h +139 -0
- data/third_party/re2/re2/prog.cc +988 -0
- data/third_party/re2/re2/prog.h +436 -0
- data/third_party/re2/re2/re2.cc +1362 -0
- data/third_party/re2/re2/re2.h +1002 -0
- data/third_party/re2/re2/regexp.cc +980 -0
- data/third_party/re2/re2/regexp.h +659 -0
- data/third_party/re2/re2/set.cc +154 -0
- data/third_party/re2/re2/set.h +80 -0
- data/third_party/re2/re2/simplify.cc +657 -0
- data/third_party/re2/re2/sparse_array.h +392 -0
- data/third_party/re2/re2/sparse_set.h +264 -0
- data/third_party/re2/re2/stringpiece.cc +65 -0
- data/third_party/re2/re2/stringpiece.h +210 -0
- data/third_party/re2/re2/tostring.cc +351 -0
- data/third_party/re2/re2/unicode_casefold.cc +582 -0
- data/third_party/re2/re2/unicode_casefold.h +78 -0
- data/third_party/re2/re2/unicode_groups.cc +6269 -0
- data/third_party/re2/re2/unicode_groups.h +67 -0
- data/third_party/re2/re2/walker-inl.h +246 -0
- data/third_party/re2/util/benchmark.h +156 -0
- data/third_party/re2/util/flags.h +26 -0
- data/third_party/re2/util/logging.h +109 -0
- data/third_party/re2/util/malloc_counter.h +19 -0
- data/third_party/re2/util/mix.h +41 -0
- data/third_party/re2/util/mutex.h +148 -0
- data/third_party/re2/util/pcre.cc +1025 -0
- data/third_party/re2/util/pcre.h +681 -0
- data/third_party/re2/util/rune.cc +260 -0
- data/third_party/re2/util/strutil.cc +149 -0
- data/third_party/re2/util/strutil.h +21 -0
- data/third_party/re2/util/test.h +50 -0
- data/third_party/re2/util/utf.h +44 -0
- data/third_party/re2/util/util.h +42 -0
- data/third_party/upb/upb/decode.c +467 -504
- data/third_party/upb/upb/encode.c +163 -121
- data/third_party/upb/upb/msg.c +130 -64
- data/third_party/upb/upb/msg.h +418 -14
- data/third_party/upb/upb/port_def.inc +35 -6
- data/third_party/upb/upb/port_undef.inc +8 -1
- data/third_party/upb/upb/table.c +53 -75
- data/third_party/upb/upb/table.int.h +11 -43
- data/third_party/upb/upb/upb.c +148 -124
- data/third_party/upb/upb/upb.h +65 -147
- data/third_party/upb/upb/upb.hpp +86 -0
- metadata +90 -30
- data/third_party/upb/upb/generated_util.h +0 -105
@@ -0,0 +1,44 @@
|
|
1
|
+
/*
|
2
|
+
* The authors of this software are Rob Pike and Ken Thompson.
|
3
|
+
* Copyright (c) 2002 by Lucent Technologies.
|
4
|
+
* Permission to use, copy, modify, and distribute this software for any
|
5
|
+
* purpose without fee is hereby granted, provided that this entire notice
|
6
|
+
* is included in all copies of any software which is or includes a copy
|
7
|
+
* or modification of this software and in all copies of the supporting
|
8
|
+
* documentation for such software.
|
9
|
+
* THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
|
10
|
+
* WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
|
11
|
+
* REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
|
12
|
+
* OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
|
13
|
+
*
|
14
|
+
* This file and rune.cc have been converted to compile as C++ code
|
15
|
+
* in name space re2.
|
16
|
+
*/
|
17
|
+
|
18
|
+
#ifndef UTIL_UTF_H_
|
19
|
+
#define UTIL_UTF_H_
|
20
|
+
|
21
|
+
#include <stdint.h>
|
22
|
+
|
23
|
+
namespace re2 {
|
24
|
+
|
25
|
+
typedef signed int Rune; /* Code-point values in Unicode 4.0 are 21 bits wide.*/
|
26
|
+
|
27
|
+
enum
|
28
|
+
{
|
29
|
+
UTFmax = 4, /* maximum bytes per rune */
|
30
|
+
Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */
|
31
|
+
Runeself = 0x80, /* rune and UTF sequences are the same (<) */
|
32
|
+
Runeerror = 0xFFFD, /* decoding error in UTF */
|
33
|
+
Runemax = 0x10FFFF, /* maximum rune value */
|
34
|
+
};
|
35
|
+
|
36
|
+
int runetochar(char* s, const Rune* r);
|
37
|
+
int chartorune(Rune* r, const char* s);
|
38
|
+
int fullrune(const char* s, int n);
|
39
|
+
int utflen(const char* s);
|
40
|
+
char* utfrune(const char*, Rune);
|
41
|
+
|
42
|
+
} // namespace re2
|
43
|
+
|
44
|
+
#endif // UTIL_UTF_H_
|
@@ -0,0 +1,42 @@
|
|
1
|
+
// Copyright 2009 The RE2 Authors. All Rights Reserved.
|
2
|
+
// Use of this source code is governed by a BSD-style
|
3
|
+
// license that can be found in the LICENSE file.
|
4
|
+
|
5
|
+
#ifndef UTIL_UTIL_H_
|
6
|
+
#define UTIL_UTIL_H_
|
7
|
+
|
8
|
+
#define arraysize(array) (sizeof(array)/sizeof((array)[0]))
|
9
|
+
|
10
|
+
#ifndef ATTRIBUTE_NORETURN
|
11
|
+
#if defined(__GNUC__)
|
12
|
+
#define ATTRIBUTE_NORETURN __attribute__((noreturn))
|
13
|
+
#elif defined(_MSC_VER)
|
14
|
+
#define ATTRIBUTE_NORETURN __declspec(noreturn)
|
15
|
+
#else
|
16
|
+
#define ATTRIBUTE_NORETURN
|
17
|
+
#endif
|
18
|
+
#endif
|
19
|
+
|
20
|
+
#ifndef ATTRIBUTE_UNUSED
|
21
|
+
#if defined(__GNUC__)
|
22
|
+
#define ATTRIBUTE_UNUSED __attribute__((unused))
|
23
|
+
#else
|
24
|
+
#define ATTRIBUTE_UNUSED
|
25
|
+
#endif
|
26
|
+
#endif
|
27
|
+
|
28
|
+
#ifndef FALLTHROUGH_INTENDED
|
29
|
+
#if defined(__clang__)
|
30
|
+
#define FALLTHROUGH_INTENDED [[clang::fallthrough]]
|
31
|
+
#elif defined(__GNUC__) && __GNUC__ >= 7
|
32
|
+
#define FALLTHROUGH_INTENDED [[gnu::fallthrough]]
|
33
|
+
#else
|
34
|
+
#define FALLTHROUGH_INTENDED do {} while (0)
|
35
|
+
#endif
|
36
|
+
#endif
|
37
|
+
|
38
|
+
#ifndef NO_THREAD_SAFETY_ANALYSIS
|
39
|
+
#define NO_THREAD_SAFETY_ANALYSIS
|
40
|
+
#endif
|
41
|
+
|
42
|
+
#endif // UTIL_UTIL_H_
|
@@ -1,609 +1,572 @@
|
|
1
1
|
|
2
|
+
#include <setjmp.h>
|
2
3
|
#include <string.h>
|
3
|
-
|
4
|
+
|
4
5
|
#include "upb/decode.h"
|
6
|
+
#include "upb/upb.h"
|
5
7
|
|
6
8
|
#include "upb/port_def.inc"
|
7
9
|
|
8
10
|
/* Maps descriptor type -> upb field type. */
|
9
|
-
const uint8_t
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
11
|
+
static const uint8_t desctype_to_fieldtype[] = {
|
12
|
+
-1, /* invalid descriptor type */
|
13
|
+
UPB_TYPE_DOUBLE, /* DOUBLE */
|
14
|
+
UPB_TYPE_FLOAT, /* FLOAT */
|
15
|
+
UPB_TYPE_INT64, /* INT64 */
|
16
|
+
UPB_TYPE_UINT64, /* UINT64 */
|
17
|
+
UPB_TYPE_INT32, /* INT32 */
|
18
|
+
UPB_TYPE_UINT64, /* FIXED64 */
|
19
|
+
UPB_TYPE_UINT32, /* FIXED32 */
|
20
|
+
UPB_TYPE_BOOL, /* BOOL */
|
21
|
+
UPB_TYPE_STRING, /* STRING */
|
22
|
+
UPB_TYPE_MESSAGE, /* GROUP */
|
23
|
+
UPB_TYPE_MESSAGE, /* MESSAGE */
|
24
|
+
UPB_TYPE_BYTES, /* BYTES */
|
25
|
+
UPB_TYPE_UINT32, /* UINT32 */
|
26
|
+
UPB_TYPE_ENUM, /* ENUM */
|
27
|
+
UPB_TYPE_INT32, /* SFIXED32 */
|
28
|
+
UPB_TYPE_INT64, /* SFIXED64 */
|
29
|
+
UPB_TYPE_INT32, /* SINT32 */
|
30
|
+
UPB_TYPE_INT64, /* SINT64 */
|
31
|
+
};
|
32
|
+
|
33
|
+
/* Maps descriptor type -> upb map size. */
|
34
|
+
static const uint8_t desctype_to_mapsize[] = {
|
35
|
+
-1, /* invalid descriptor type */
|
36
|
+
8, /* DOUBLE */
|
37
|
+
4, /* FLOAT */
|
38
|
+
8, /* INT64 */
|
39
|
+
8, /* UINT64 */
|
40
|
+
4, /* INT32 */
|
41
|
+
8, /* FIXED64 */
|
42
|
+
4, /* FIXED32 */
|
43
|
+
1, /* BOOL */
|
44
|
+
UPB_MAPTYPE_STRING, /* STRING */
|
45
|
+
sizeof(void *), /* GROUP */
|
46
|
+
sizeof(void *), /* MESSAGE */
|
47
|
+
UPB_MAPTYPE_STRING, /* BYTES */
|
48
|
+
4, /* UINT32 */
|
49
|
+
4, /* ENUM */
|
50
|
+
4, /* SFIXED32 */
|
51
|
+
8, /* SFIXED64 */
|
52
|
+
4, /* SINT32 */
|
53
|
+
8, /* SINT64 */
|
54
|
+
};
|
55
|
+
|
56
|
+
static const unsigned fixed32_ok = (1 << UPB_DTYPE_FLOAT) |
|
57
|
+
(1 << UPB_DTYPE_FIXED32) |
|
58
|
+
(1 << UPB_DTYPE_SFIXED32);
|
59
|
+
|
60
|
+
static const unsigned fixed64_ok = (1 << UPB_DTYPE_DOUBLE) |
|
61
|
+
(1 << UPB_DTYPE_FIXED64) |
|
62
|
+
(1 << UPB_DTYPE_SFIXED64);
|
63
|
+
|
64
|
+
/* Op: an action to be performed for a wire-type/field-type combination. */
|
65
|
+
#define OP_SCALAR_LG2(n) (n)
|
66
|
+
#define OP_FIXPCK_LG2(n) (n + 4)
|
67
|
+
#define OP_VARPCK_LG2(n) (n + 8)
|
68
|
+
#define OP_STRING 4
|
69
|
+
#define OP_SUBMSG 5
|
70
|
+
|
71
|
+
static const int8_t varint_ops[19] = {
|
72
|
+
-1, /* field not found */
|
73
|
+
-1, /* DOUBLE */
|
74
|
+
-1, /* FLOAT */
|
75
|
+
OP_SCALAR_LG2(3), /* INT64 */
|
76
|
+
OP_SCALAR_LG2(3), /* UINT64 */
|
77
|
+
OP_SCALAR_LG2(2), /* INT32 */
|
78
|
+
-1, /* FIXED64 */
|
79
|
+
-1, /* FIXED32 */
|
80
|
+
OP_SCALAR_LG2(0), /* BOOL */
|
81
|
+
-1, /* STRING */
|
82
|
+
-1, /* GROUP */
|
83
|
+
-1, /* MESSAGE */
|
84
|
+
-1, /* BYTES */
|
85
|
+
OP_SCALAR_LG2(2), /* UINT32 */
|
86
|
+
OP_SCALAR_LG2(2), /* ENUM */
|
87
|
+
-1, /* SFIXED32 */
|
88
|
+
-1, /* SFIXED64 */
|
89
|
+
OP_SCALAR_LG2(2), /* SINT32 */
|
90
|
+
OP_SCALAR_LG2(3), /* SINT64 */
|
91
|
+
};
|
92
|
+
|
93
|
+
static const int8_t delim_ops[37] = {
|
94
|
+
/* For non-repeated field type. */
|
95
|
+
-1, /* field not found */
|
96
|
+
-1, /* DOUBLE */
|
97
|
+
-1, /* FLOAT */
|
98
|
+
-1, /* INT64 */
|
99
|
+
-1, /* UINT64 */
|
100
|
+
-1, /* INT32 */
|
101
|
+
-1, /* FIXED64 */
|
102
|
+
-1, /* FIXED32 */
|
103
|
+
-1, /* BOOL */
|
104
|
+
OP_STRING, /* STRING */
|
105
|
+
-1, /* GROUP */
|
106
|
+
OP_SUBMSG, /* MESSAGE */
|
107
|
+
OP_STRING, /* BYTES */
|
108
|
+
-1, /* UINT32 */
|
109
|
+
-1, /* ENUM */
|
110
|
+
-1, /* SFIXED32 */
|
111
|
+
-1, /* SFIXED64 */
|
112
|
+
-1, /* SINT32 */
|
113
|
+
-1, /* SINT64 */
|
114
|
+
/* For repeated field type. */
|
115
|
+
OP_FIXPCK_LG2(3), /* REPEATED DOUBLE */
|
116
|
+
OP_FIXPCK_LG2(2), /* REPEATED FLOAT */
|
117
|
+
OP_VARPCK_LG2(3), /* REPEATED INT64 */
|
118
|
+
OP_VARPCK_LG2(3), /* REPEATED UINT64 */
|
119
|
+
OP_VARPCK_LG2(2), /* REPEATED INT32 */
|
120
|
+
OP_FIXPCK_LG2(3), /* REPEATED FIXED64 */
|
121
|
+
OP_FIXPCK_LG2(2), /* REPEATED FIXED32 */
|
122
|
+
OP_VARPCK_LG2(0), /* REPEATED BOOL */
|
123
|
+
OP_STRING, /* REPEATED STRING */
|
124
|
+
OP_SUBMSG, /* REPEATED GROUP */
|
125
|
+
OP_SUBMSG, /* REPEATED MESSAGE */
|
126
|
+
OP_STRING, /* REPEATED BYTES */
|
127
|
+
OP_VARPCK_LG2(2), /* REPEATED UINT32 */
|
128
|
+
OP_VARPCK_LG2(2), /* REPEATED ENUM */
|
129
|
+
OP_FIXPCK_LG2(2), /* REPEATED SFIXED32 */
|
130
|
+
OP_FIXPCK_LG2(3), /* REPEATED SFIXED64 */
|
131
|
+
OP_VARPCK_LG2(2), /* REPEATED SINT32 */
|
132
|
+
OP_VARPCK_LG2(3), /* REPEATED SINT64 */
|
29
133
|
};
|
30
134
|
|
31
135
|
/* Data pertaining to the parse. */
|
32
136
|
typedef struct {
|
33
|
-
const char *
|
34
|
-
const char *field_start; /* Start of this field. */
|
35
|
-
const char *limit; /* End of delimited region or end of buffer. */
|
137
|
+
const char *limit; /* End of delimited region or end of buffer. */
|
36
138
|
upb_arena *arena;
|
37
139
|
int depth;
|
38
|
-
uint32_t end_group;
|
140
|
+
uint32_t end_group; /* Set to field number of END_GROUP tag, if any. */
|
141
|
+
jmp_buf err;
|
39
142
|
} upb_decstate;
|
40
143
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
144
|
+
typedef union {
|
145
|
+
bool bool_val;
|
146
|
+
int32_t int32_val;
|
147
|
+
int64_t int64_val;
|
148
|
+
uint32_t uint32_val;
|
149
|
+
uint64_t uint64_val;
|
150
|
+
upb_strview str_val;
|
151
|
+
} wireval;
|
152
|
+
|
153
|
+
static const char *decode_msg(upb_decstate *d, const char *ptr, upb_msg *msg,
|
154
|
+
const upb_msglayout *layout);
|
47
155
|
|
48
|
-
|
156
|
+
UPB_NORETURN static void decode_err(upb_decstate *d) { longjmp(d->err, 1); }
|
49
157
|
|
50
|
-
static bool
|
51
|
-
|
52
|
-
|
158
|
+
static bool decode_reserve(upb_decstate *d, upb_array *arr, size_t elem) {
|
159
|
+
bool need_realloc = arr->size - arr->len < elem;
|
160
|
+
if (need_realloc && !_upb_array_realloc(arr, arr->len + elem, d->arena)) {
|
161
|
+
decode_err(d);
|
162
|
+
}
|
163
|
+
return need_realloc;
|
164
|
+
}
|
53
165
|
|
54
|
-
|
55
|
-
|
166
|
+
UPB_NOINLINE
|
167
|
+
static const char *decode_longvarint64(upb_decstate *d, const char *ptr,
|
168
|
+
const char *limit, uint64_t *val) {
|
56
169
|
uint8_t byte;
|
57
170
|
int bitpos = 0;
|
58
|
-
|
59
|
-
*val = 0;
|
171
|
+
uint64_t out = 0;
|
60
172
|
|
61
173
|
do {
|
62
|
-
|
63
|
-
byte = *
|
64
|
-
|
65
|
-
|
174
|
+
if (bitpos >= 70 || ptr == limit) decode_err(d);
|
175
|
+
byte = *ptr;
|
176
|
+
out |= (uint64_t)(byte & 0x7F) << bitpos;
|
177
|
+
ptr++;
|
66
178
|
bitpos += 7;
|
67
179
|
} while (byte & 0x80);
|
68
180
|
|
69
|
-
*
|
70
|
-
return
|
71
|
-
}
|
72
|
-
|
73
|
-
static bool upb_decode_varint32(const char **ptr, const char *limit,
|
74
|
-
uint32_t *val) {
|
75
|
-
uint64_t u64;
|
76
|
-
CHK(upb_decode_varint(ptr, limit, &u64) && u64 <= UINT32_MAX);
|
77
|
-
*val = (uint32_t)u64;
|
78
|
-
return true;
|
181
|
+
*val = out;
|
182
|
+
return ptr;
|
79
183
|
}
|
80
184
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
}
|
88
|
-
|
89
|
-
|
90
|
-
uint32_t *val) {
|
91
|
-
CHK(limit - *ptr >= 4);
|
92
|
-
memcpy(val, *ptr, 4);
|
93
|
-
*ptr += 4;
|
94
|
-
return true;
|
95
|
-
}
|
96
|
-
|
97
|
-
static int32_t upb_zzdecode_32(uint32_t n) {
|
98
|
-
return (n >> 1) ^ -(int32_t)(n & 1);
|
99
|
-
}
|
100
|
-
|
101
|
-
static int64_t upb_zzdecode_64(uint64_t n) {
|
102
|
-
return (n >> 1) ^ -(int64_t)(n & 1);
|
103
|
-
}
|
104
|
-
|
105
|
-
static bool upb_decode_string(const char **ptr, const char *limit,
|
106
|
-
int *outlen) {
|
107
|
-
uint32_t len;
|
108
|
-
|
109
|
-
CHK(upb_decode_varint32(ptr, limit, &len) &&
|
110
|
-
len < INT32_MAX &&
|
111
|
-
limit - *ptr >= (int32_t)len);
|
112
|
-
|
113
|
-
*outlen = len;
|
114
|
-
return true;
|
115
|
-
}
|
116
|
-
|
117
|
-
static void upb_set32(void *msg, size_t ofs, uint32_t val) {
|
118
|
-
memcpy((char*)msg + ofs, &val, sizeof(val));
|
185
|
+
UPB_FORCEINLINE
|
186
|
+
static const char *decode_varint64(upb_decstate *d, const char *ptr,
|
187
|
+
const char *limit, uint64_t *val) {
|
188
|
+
if (UPB_LIKELY(ptr < limit && (*ptr & 0x80) == 0)) {
|
189
|
+
*val = (uint8_t)*ptr;
|
190
|
+
return ptr + 1;
|
191
|
+
} else {
|
192
|
+
return decode_longvarint64(d, ptr, limit, val);
|
193
|
+
}
|
119
194
|
}
|
120
195
|
|
121
|
-
static
|
122
|
-
|
123
|
-
|
124
|
-
|
196
|
+
static const char *decode_varint32(upb_decstate *d, const char *ptr,
|
197
|
+
const char *limit, uint32_t *val) {
|
198
|
+
uint64_t u64;
|
199
|
+
ptr = decode_varint64(d, ptr, limit, &u64);
|
200
|
+
if (u64 > UINT32_MAX) decode_err(d);
|
201
|
+
*val = (uint32_t)u64;
|
202
|
+
return ptr;
|
125
203
|
}
|
126
204
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
uint32_t val;
|
137
|
-
return upb_decode_32bit(&d->ptr, d->limit, &val);
|
138
|
-
}
|
139
|
-
case UPB_WIRE_TYPE_64BIT: {
|
140
|
-
uint64_t val;
|
141
|
-
return upb_decode_64bit(&d->ptr, d->limit, &val);
|
205
|
+
static void decode_munge(int type, wireval *val) {
|
206
|
+
switch (type) {
|
207
|
+
case UPB_DESCRIPTOR_TYPE_BOOL:
|
208
|
+
val->bool_val = val->uint64_val != 0;
|
209
|
+
break;
|
210
|
+
case UPB_DESCRIPTOR_TYPE_SINT32: {
|
211
|
+
uint32_t n = val->uint32_val;
|
212
|
+
val->int32_val = (n >> 1) ^ -(int32_t)(n & 1);
|
213
|
+
break;
|
142
214
|
}
|
143
|
-
case
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
return true;
|
215
|
+
case UPB_DESCRIPTOR_TYPE_SINT64: {
|
216
|
+
uint64_t n = val->uint64_val;
|
217
|
+
val->int64_val = (n >> 1) ^ -(int64_t)(n & 1);
|
218
|
+
break;
|
148
219
|
}
|
149
|
-
case UPB_WIRE_TYPE_START_GROUP:
|
150
|
-
return upb_skip_unknowngroup(d, tag >> 3);
|
151
|
-
case UPB_WIRE_TYPE_END_GROUP:
|
152
|
-
return (tag >> 3) == group_fieldnum;
|
153
220
|
}
|
154
|
-
return false;
|
155
221
|
}
|
156
222
|
|
157
|
-
static
|
158
|
-
|
159
|
-
|
160
|
-
CHK(upb_decode_varint32(&d->ptr, d->limit, &tag));
|
161
|
-
CHK(upb_skip_unknownfielddata(d, tag, field_number));
|
162
|
-
}
|
163
|
-
|
164
|
-
CHK(d->end_group == field_number);
|
165
|
-
d->end_group = 0;
|
166
|
-
return true;
|
167
|
-
}
|
168
|
-
|
169
|
-
static bool upb_array_grow(upb_array *arr, size_t elements, size_t elem_size,
|
170
|
-
upb_arena *arena) {
|
171
|
-
size_t needed = arr->len + elements;
|
172
|
-
size_t new_size = UPB_MAX(arr->size, 8);
|
173
|
-
size_t new_bytes;
|
174
|
-
size_t old_bytes;
|
175
|
-
void *new_data;
|
176
|
-
upb_alloc *alloc = upb_arena_alloc(arena);
|
177
|
-
|
178
|
-
while (new_size < needed) {
|
179
|
-
new_size *= 2;
|
180
|
-
}
|
181
|
-
|
182
|
-
old_bytes = arr->len * elem_size;
|
183
|
-
new_bytes = new_size * elem_size;
|
184
|
-
new_data = upb_realloc(alloc, arr->data, old_bytes, new_bytes);
|
185
|
-
CHK(new_data);
|
186
|
-
|
187
|
-
arr->data = new_data;
|
188
|
-
arr->size = new_size;
|
189
|
-
return true;
|
190
|
-
}
|
191
|
-
|
192
|
-
static void *upb_array_reserve(upb_array *arr, size_t elements,
|
193
|
-
size_t elem_size, upb_arena *arena) {
|
194
|
-
if (arr->size - arr->len < elements) {
|
195
|
-
CHK(upb_array_grow(arr, elements, elem_size, arena));
|
196
|
-
}
|
197
|
-
return (char*)arr->data + (arr->len * elem_size);
|
198
|
-
}
|
199
|
-
|
200
|
-
bool upb_array_add(upb_array *arr, size_t elements, size_t elem_size,
|
201
|
-
const void *data, upb_arena *arena) {
|
202
|
-
void *dest = upb_array_reserve(arr, elements, elem_size, arena);
|
203
|
-
|
204
|
-
CHK(dest);
|
205
|
-
arr->len += elements;
|
206
|
-
memcpy(dest, data, elements * elem_size);
|
207
|
-
|
208
|
-
return true;
|
209
|
-
}
|
210
|
-
|
211
|
-
static upb_array *upb_getarr(upb_decframe *frame,
|
212
|
-
const upb_msglayout_field *field) {
|
213
|
-
UPB_ASSERT(field->label == UPB_LABEL_REPEATED);
|
214
|
-
return *(upb_array**)&frame->msg[field->offset];
|
215
|
-
}
|
216
|
-
|
217
|
-
static upb_array *upb_getorcreatearr(upb_decframe *frame,
|
218
|
-
const upb_msglayout_field *field) {
|
219
|
-
upb_array *arr = upb_getarr(frame, field);
|
220
|
-
|
221
|
-
if (!arr) {
|
222
|
-
arr = upb_array_new(frame->state->arena);
|
223
|
-
CHK(arr);
|
224
|
-
*(upb_array**)&frame->msg[field->offset] = arr;
|
225
|
-
}
|
226
|
-
|
227
|
-
return arr;
|
228
|
-
}
|
229
|
-
|
230
|
-
static upb_msg *upb_getorcreatemsg(upb_decframe *frame,
|
231
|
-
const upb_msglayout_field *field,
|
232
|
-
const upb_msglayout **subm) {
|
233
|
-
upb_msg **submsg = (void*)(frame->msg + field->offset);
|
234
|
-
*subm = frame->layout->submsgs[field->submsg_index];
|
235
|
-
|
236
|
-
UPB_ASSERT(field->label != UPB_LABEL_REPEATED);
|
223
|
+
static const upb_msglayout_field *upb_find_field(const upb_msglayout *l,
|
224
|
+
uint32_t field_number) {
|
225
|
+
static upb_msglayout_field none = {0, 0, 0, 0, 0, 0};
|
237
226
|
|
238
|
-
|
239
|
-
|
240
|
-
|
227
|
+
/* Lots of optimization opportunities here. */
|
228
|
+
int i;
|
229
|
+
if (l == NULL) return &none;
|
230
|
+
for (i = 0; i < l->field_count; i++) {
|
231
|
+
if (l->fields[i].number == field_number) {
|
232
|
+
return &l->fields[i];
|
233
|
+
}
|
241
234
|
}
|
242
235
|
|
243
|
-
return
|
244
|
-
}
|
245
|
-
|
246
|
-
static upb_msg *upb_addmsg(upb_decframe *frame,
|
247
|
-
const upb_msglayout_field *field,
|
248
|
-
const upb_msglayout **subm) {
|
249
|
-
upb_msg *submsg;
|
250
|
-
upb_array *arr = upb_getorcreatearr(frame, field);
|
251
|
-
|
252
|
-
UPB_ASSERT(field->label == UPB_LABEL_REPEATED);
|
253
|
-
UPB_ASSERT(field->descriptortype == UPB_DESCRIPTOR_TYPE_MESSAGE ||
|
254
|
-
field->descriptortype == UPB_DESCRIPTOR_TYPE_GROUP);
|
255
|
-
|
256
|
-
*subm = frame->layout->submsgs[field->submsg_index];
|
257
|
-
submsg = upb_msg_new(*subm, frame->state->arena);
|
258
|
-
CHK(submsg);
|
259
|
-
upb_array_add(arr, 1, sizeof(submsg), &submsg, frame->state->arena);
|
260
|
-
|
261
|
-
return submsg;
|
236
|
+
return &none; /* Unknown field. */
|
262
237
|
}
|
263
238
|
|
264
|
-
static
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
frame->msg[hasbit / 8] |= (1 << (hasbit % 8));
|
239
|
+
static upb_msg *decode_newsubmsg(upb_decstate *d, const upb_msglayout *layout,
|
240
|
+
const upb_msglayout_field *field) {
|
241
|
+
const upb_msglayout *subl = layout->submsgs[field->submsg_index];
|
242
|
+
return _upb_msg_new(subl, d->arena);
|
269
243
|
}
|
270
244
|
|
271
|
-
static void
|
272
|
-
|
273
|
-
|
274
|
-
|
245
|
+
static void decode_tosubmsg(upb_decstate *d, upb_msg *submsg,
|
246
|
+
const upb_msglayout *layout,
|
247
|
+
const upb_msglayout_field *field, upb_strview val) {
|
248
|
+
const upb_msglayout *subl = layout->submsgs[field->submsg_index];
|
249
|
+
const char *saved_limit = d->limit;
|
250
|
+
if (--d->depth < 0) decode_err(d);
|
251
|
+
d->limit = val.data + val.size;
|
252
|
+
decode_msg(d, val.data, submsg, subl);
|
253
|
+
d->limit = saved_limit;
|
254
|
+
if (d->end_group != 0) decode_err(d);
|
255
|
+
d->depth++;
|
275
256
|
}
|
276
257
|
|
277
|
-
static
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
field_mem = upb_array_reserve(arr, 1, size, frame->state->arena);
|
287
|
-
CHK(field_mem);
|
288
|
-
}
|
289
|
-
|
290
|
-
memcpy(field_mem, val, size);
|
291
|
-
return true;
|
258
|
+
static const char *decode_group(upb_decstate *d, const char *ptr,
|
259
|
+
upb_msg *submsg, const upb_msglayout *subl,
|
260
|
+
uint32_t number) {
|
261
|
+
if (--d->depth < 0) decode_err(d);
|
262
|
+
ptr = decode_msg(d, ptr, submsg, subl);
|
263
|
+
if (d->end_group != number) decode_err(d);
|
264
|
+
d->end_group = 0;
|
265
|
+
d->depth++;
|
266
|
+
return ptr;
|
292
267
|
}
|
293
268
|
|
294
|
-
static
|
269
|
+
static const char *decode_togroup(upb_decstate *d, const char *ptr,
|
270
|
+
upb_msg *submsg, const upb_msglayout *layout,
|
295
271
|
const upb_msglayout_field *field) {
|
296
|
-
|
297
|
-
|
298
|
-
UPB_ASSERT(arr->len < arr->size);
|
299
|
-
arr->len++;
|
300
|
-
} else if (field->presence < 0) {
|
301
|
-
upb_setoneofcase(frame, field);
|
302
|
-
} else if (field->presence > 0) {
|
303
|
-
upb_sethasbit(frame, field);
|
304
|
-
}
|
272
|
+
const upb_msglayout *subl = layout->submsgs[field->submsg_index];
|
273
|
+
return decode_group(d, ptr, submsg, subl, field->number);
|
305
274
|
}
|
306
275
|
|
307
|
-
static
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
d->limit = saved_limit;
|
315
|
-
CHK(d->end_group == 0);
|
316
|
-
return true;
|
317
|
-
}
|
318
|
-
|
319
|
-
static bool upb_decode_groupfield(upb_decstate *d, upb_msg *msg,
|
320
|
-
const upb_msglayout *layout,
|
321
|
-
int field_number) {
|
322
|
-
CHK(--d->depth >= 0);
|
323
|
-
upb_decode_message(d, msg, layout);
|
324
|
-
d->depth++;
|
325
|
-
CHK(d->end_group == field_number);
|
326
|
-
d->end_group = 0;
|
327
|
-
return true;
|
328
|
-
}
|
276
|
+
static const char *decode_toarray(upb_decstate *d, const char *ptr,
|
277
|
+
upb_msg *msg, const upb_msglayout *layout,
|
278
|
+
const upb_msglayout_field *field, wireval val,
|
279
|
+
int op) {
|
280
|
+
upb_array **arrp = UPB_PTR_AT(msg, field->offset, void);
|
281
|
+
upb_array *arr = *arrp;
|
282
|
+
void *mem;
|
329
283
|
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
284
|
+
if (!arr) {
|
285
|
+
upb_fieldtype_t type = desctype_to_fieldtype[field->descriptortype];
|
286
|
+
arr = _upb_array_new(d->arena, type);
|
287
|
+
if (!arr) decode_err(d);
|
288
|
+
*arrp = arr;
|
289
|
+
}
|
334
290
|
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
case
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
291
|
+
decode_reserve(d, arr, 1);
|
292
|
+
|
293
|
+
switch (op) {
|
294
|
+
case OP_SCALAR_LG2(0):
|
295
|
+
case OP_SCALAR_LG2(2):
|
296
|
+
case OP_SCALAR_LG2(3):
|
297
|
+
/* Append scalar value. */
|
298
|
+
mem = UPB_PTR_AT(_upb_array_ptr(arr), arr->len << op, void);
|
299
|
+
arr->len++;
|
300
|
+
memcpy(mem, &val, 1 << op);
|
301
|
+
return ptr;
|
302
|
+
case OP_STRING:
|
303
|
+
/* Append string. */
|
304
|
+
mem =
|
305
|
+
UPB_PTR_AT(_upb_array_ptr(arr), arr->len * sizeof(upb_strview), void);
|
306
|
+
arr->len++;
|
307
|
+
memcpy(mem, &val, sizeof(upb_strview));
|
308
|
+
return ptr;
|
309
|
+
case OP_SUBMSG: {
|
310
|
+
/* Append submessage / group. */
|
311
|
+
upb_msg *submsg = decode_newsubmsg(d, layout, field);
|
312
|
+
*UPB_PTR_AT(_upb_array_ptr(arr), arr->len * sizeof(void *), upb_msg *) =
|
313
|
+
submsg;
|
314
|
+
arr->len++;
|
315
|
+
if (UPB_UNLIKELY(field->descriptortype == UPB_DTYPE_GROUP)) {
|
316
|
+
ptr = decode_togroup(d, ptr, submsg, layout, field);
|
317
|
+
} else {
|
318
|
+
decode_tosubmsg(d, submsg, layout, field, val.str_val);
|
319
|
+
}
|
320
|
+
return ptr;
|
351
321
|
}
|
352
|
-
case
|
353
|
-
|
354
|
-
|
355
|
-
|
322
|
+
case OP_FIXPCK_LG2(2):
|
323
|
+
case OP_FIXPCK_LG2(3): {
|
324
|
+
/* Fixed packed. */
|
325
|
+
int lg2 = op - OP_FIXPCK_LG2(0);
|
326
|
+
int mask = (1 << lg2) - 1;
|
327
|
+
size_t count = val.str_val.size >> lg2;
|
328
|
+
if ((val.str_val.size & mask) != 0) {
|
329
|
+
decode_err(d); /* Length isn't a round multiple of elem size. */
|
330
|
+
}
|
331
|
+
decode_reserve(d, arr, count);
|
332
|
+
mem = UPB_PTR_AT(_upb_array_ptr(arr), arr->len << lg2, void);
|
333
|
+
arr->len += count;
|
334
|
+
memcpy(mem, val.str_val.data, val.str_val.size);
|
335
|
+
return ptr;
|
356
336
|
}
|
357
|
-
case
|
358
|
-
|
359
|
-
|
360
|
-
|
337
|
+
case OP_VARPCK_LG2(0):
|
338
|
+
case OP_VARPCK_LG2(2):
|
339
|
+
case OP_VARPCK_LG2(3): {
|
340
|
+
/* Varint packed. */
|
341
|
+
int lg2 = op - OP_VARPCK_LG2(0);
|
342
|
+
int scale = 1 << lg2;
|
343
|
+
const char *ptr = val.str_val.data;
|
344
|
+
const char *end = ptr + val.str_val.size;
|
345
|
+
char *out = UPB_PTR_AT(_upb_array_ptr(arr), arr->len << lg2, void);
|
346
|
+
while (ptr < end) {
|
347
|
+
wireval elem;
|
348
|
+
ptr = decode_varint64(d, ptr, end, &elem.uint64_val);
|
349
|
+
decode_munge(field->descriptortype, &elem);
|
350
|
+
if (decode_reserve(d, arr, 1)) {
|
351
|
+
out = UPB_PTR_AT(_upb_array_ptr(arr), arr->len << lg2, void);
|
352
|
+
}
|
353
|
+
arr->len++;
|
354
|
+
memcpy(out, &elem, scale);
|
355
|
+
out += scale;
|
356
|
+
}
|
357
|
+
if (ptr != end) decode_err(d);
|
358
|
+
return ptr;
|
361
359
|
}
|
362
360
|
default:
|
363
|
-
|
361
|
+
UPB_UNREACHABLE();
|
364
362
|
}
|
365
|
-
|
366
|
-
upb_decode_setpresent(frame, field);
|
367
|
-
return true;
|
368
363
|
}
|
369
364
|
|
370
|
-
static
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
365
|
+
static void decode_tomap(upb_decstate *d, upb_msg *msg,
|
366
|
+
const upb_msglayout *layout,
|
367
|
+
const upb_msglayout_field *field, wireval val) {
|
368
|
+
upb_map **map_p = UPB_PTR_AT(msg, field->offset, upb_map *);
|
369
|
+
upb_map *map = *map_p;
|
370
|
+
upb_map_entry ent;
|
371
|
+
const upb_msglayout *entry = layout->submsgs[field->submsg_index];
|
372
|
+
|
373
|
+
if (!map) {
|
374
|
+
/* Lazily create map. */
|
375
|
+
const upb_msglayout *entry = layout->submsgs[field->submsg_index];
|
376
|
+
const upb_msglayout_field *key_field = &entry->fields[0];
|
377
|
+
const upb_msglayout_field *val_field = &entry->fields[1];
|
378
|
+
char key_size = desctype_to_mapsize[key_field->descriptortype];
|
379
|
+
char val_size = desctype_to_mapsize[val_field->descriptortype];
|
380
|
+
UPB_ASSERT(key_field->offset == 0);
|
381
|
+
UPB_ASSERT(val_field->offset == sizeof(upb_strview));
|
382
|
+
map = _upb_map_new(d->arena, key_size, val_size);
|
383
|
+
*map_p = map;
|
383
384
|
}
|
384
385
|
|
385
|
-
|
386
|
-
|
387
|
-
}
|
386
|
+
/* Parse map entry. */
|
387
|
+
memset(&ent, 0, sizeof(ent));
|
388
388
|
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
switch (field->descriptortype) {
|
395
|
-
case UPB_DESCRIPTOR_TYPE_FLOAT:
|
396
|
-
case UPB_DESCRIPTOR_TYPE_FIXED32:
|
397
|
-
case UPB_DESCRIPTOR_TYPE_SFIXED32:
|
398
|
-
CHK(upb_decode_addval(frame, field, &val, sizeof(val)));
|
399
|
-
break;
|
400
|
-
default:
|
401
|
-
return upb_append_unknown(d, frame);
|
389
|
+
if (entry->fields[1].descriptortype == UPB_DESCRIPTOR_TYPE_MESSAGE ||
|
390
|
+
entry->fields[1].descriptortype == UPB_DESCRIPTOR_TYPE_GROUP) {
|
391
|
+
/* Create proactively to handle the case where it doesn't appear. */
|
392
|
+
ent.v.val.val = (uint64_t)_upb_msg_new(entry->submsgs[0], d->arena);
|
402
393
|
}
|
403
394
|
|
404
|
-
|
405
|
-
return true;
|
406
|
-
}
|
407
|
-
|
408
|
-
static bool upb_decode_fixedpacked(upb_decstate *d, upb_array *arr,
|
409
|
-
uint32_t len, int elem_size) {
|
410
|
-
size_t elements = len / elem_size;
|
411
|
-
|
412
|
-
CHK((size_t)(elements * elem_size) == len);
|
413
|
-
CHK(upb_array_add(arr, elements, elem_size, d->ptr, d->arena));
|
414
|
-
d->ptr += len;
|
415
|
-
|
416
|
-
return true;
|
417
|
-
}
|
395
|
+
decode_tosubmsg(d, &ent.k, layout, field, val.str_val);
|
418
396
|
|
419
|
-
|
420
|
-
|
421
|
-
ret.data = d->ptr;
|
422
|
-
ret.size = len;
|
423
|
-
d->ptr += len;
|
424
|
-
return ret;
|
397
|
+
/* Insert into map. */
|
398
|
+
_upb_map_set(map, &ent.k, map->key_size, &ent.v, map->val_size, d->arena);
|
425
399
|
}
|
426
400
|
|
427
|
-
static
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
VARINT_CASE_EX(ctype, decode, decode)
|
434
|
-
|
435
|
-
#define VARINT_CASE_EX(ctype, decode, dtype) \
|
436
|
-
{ \
|
437
|
-
const char *ptr = d->ptr; \
|
438
|
-
const char *limit = ptr + len; \
|
439
|
-
while (ptr < limit) { \
|
440
|
-
uint64_t val; \
|
441
|
-
ctype decoded; \
|
442
|
-
CHK(upb_decode_varint(&ptr, limit, &val)); \
|
443
|
-
decoded = (decode)((dtype)val); \
|
444
|
-
CHK(upb_array_add(arr, 1, sizeof(decoded), &decoded, d->arena)); \
|
445
|
-
} \
|
446
|
-
d->ptr = ptr; \
|
447
|
-
return true; \
|
448
|
-
}
|
401
|
+
static const char *decode_tomsg(upb_decstate *d, const char *ptr, upb_msg *msg,
|
402
|
+
const upb_msglayout *layout,
|
403
|
+
const upb_msglayout_field *field, wireval val,
|
404
|
+
int op) {
|
405
|
+
void *mem = UPB_PTR_AT(msg, field->offset, void);
|
406
|
+
int type = field->descriptortype;
|
449
407
|
|
450
|
-
|
451
|
-
|
452
|
-
case
|
453
|
-
|
454
|
-
|
408
|
+
/* Set presence if necessary. */
|
409
|
+
if (field->presence < 0) {
|
410
|
+
/* Oneof case */
|
411
|
+
uint32_t *oneof_case = _upb_oneofcase_field(msg, field);
|
412
|
+
if (op == OP_SUBMSG && *oneof_case != field->number) {
|
413
|
+
memset(mem, 0, sizeof(void*));
|
455
414
|
}
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
return upb_decode_fixedpacked(d, arr, len, sizeof(int32_t));
|
460
|
-
case UPB_DESCRIPTOR_TYPE_DOUBLE:
|
461
|
-
case UPB_DESCRIPTOR_TYPE_FIXED64:
|
462
|
-
case UPB_DESCRIPTOR_TYPE_SFIXED64:
|
463
|
-
return upb_decode_fixedpacked(d, arr, len, sizeof(int64_t));
|
464
|
-
case UPB_DESCRIPTOR_TYPE_INT32:
|
465
|
-
case UPB_DESCRIPTOR_TYPE_UINT32:
|
466
|
-
case UPB_DESCRIPTOR_TYPE_ENUM:
|
467
|
-
VARINT_CASE(uint32_t, uint32_t);
|
468
|
-
case UPB_DESCRIPTOR_TYPE_INT64:
|
469
|
-
case UPB_DESCRIPTOR_TYPE_UINT64:
|
470
|
-
VARINT_CASE(uint64_t, uint64_t);
|
471
|
-
case UPB_DESCRIPTOR_TYPE_BOOL:
|
472
|
-
VARINT_CASE(bool, bool);
|
473
|
-
case UPB_DESCRIPTOR_TYPE_SINT32:
|
474
|
-
VARINT_CASE_EX(int32_t, upb_zzdecode_32, uint32_t);
|
475
|
-
case UPB_DESCRIPTOR_TYPE_SINT64:
|
476
|
-
VARINT_CASE_EX(int64_t, upb_zzdecode_64, uint64_t);
|
477
|
-
case UPB_DESCRIPTOR_TYPE_MESSAGE: {
|
478
|
-
const upb_msglayout *subm;
|
479
|
-
upb_msg *submsg = upb_addmsg(frame, field, &subm);
|
480
|
-
CHK(submsg);
|
481
|
-
return upb_decode_msgfield(d, submsg, subm, len);
|
482
|
-
}
|
483
|
-
case UPB_DESCRIPTOR_TYPE_GROUP:
|
484
|
-
return upb_append_unknown(d, frame);
|
415
|
+
*oneof_case = field->number;
|
416
|
+
} else if (field->presence > 0) {
|
417
|
+
_upb_sethas_field(msg, field);
|
485
418
|
}
|
486
|
-
#undef VARINT_CASE
|
487
|
-
UPB_UNREACHABLE();
|
488
|
-
}
|
489
|
-
|
490
|
-
static bool upb_decode_delimitedfield(upb_decstate *d, upb_decframe *frame,
|
491
|
-
const upb_msglayout_field *field) {
|
492
|
-
int len;
|
493
|
-
|
494
|
-
CHK(upb_decode_string(&d->ptr, d->limit, &len));
|
495
419
|
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
break;
|
420
|
+
/* Store into message. */
|
421
|
+
switch (op) {
|
422
|
+
case OP_SUBMSG: {
|
423
|
+
upb_msg **submsgp = mem;
|
424
|
+
upb_msg *submsg = *submsgp;
|
425
|
+
if (!submsg) {
|
426
|
+
submsg = decode_newsubmsg(d, layout, field);
|
427
|
+
*submsgp = submsg;
|
505
428
|
}
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
CHK(upb_decode_msgfield(d, submsg, subm, len));
|
511
|
-
break;
|
429
|
+
if (UPB_UNLIKELY(type == UPB_DTYPE_GROUP)) {
|
430
|
+
ptr = decode_togroup(d, ptr, submsg, layout, field);
|
431
|
+
} else {
|
432
|
+
decode_tosubmsg(d, submsg, layout, field, val.str_val);
|
512
433
|
}
|
513
|
-
|
514
|
-
/* TODO(haberman): should we accept the last element of a packed? */
|
515
|
-
d->ptr += len;
|
516
|
-
return upb_append_unknown(d, frame);
|
517
|
-
}
|
518
|
-
upb_decode_setpresent(frame, field);
|
519
|
-
return true;
|
520
|
-
}
|
521
|
-
}
|
522
|
-
|
523
|
-
static const upb_msglayout_field *upb_find_field(const upb_msglayout *l,
|
524
|
-
uint32_t field_number) {
|
525
|
-
/* Lots of optimization opportunities here. */
|
526
|
-
int i;
|
527
|
-
for (i = 0; i < l->field_count; i++) {
|
528
|
-
if (l->fields[i].number == field_number) {
|
529
|
-
return &l->fields[i];
|
434
|
+
break;
|
530
435
|
}
|
436
|
+
case OP_STRING:
|
437
|
+
memcpy(mem, &val, sizeof(upb_strview));
|
438
|
+
break;
|
439
|
+
case OP_SCALAR_LG2(3):
|
440
|
+
memcpy(mem, &val, 8);
|
441
|
+
break;
|
442
|
+
case OP_SCALAR_LG2(2):
|
443
|
+
memcpy(mem, &val, 4);
|
444
|
+
break;
|
445
|
+
case OP_SCALAR_LG2(0):
|
446
|
+
memcpy(mem, &val, 1);
|
447
|
+
break;
|
448
|
+
default:
|
449
|
+
UPB_UNREACHABLE();
|
531
450
|
}
|
532
451
|
|
533
|
-
return
|
452
|
+
return ptr;
|
534
453
|
}
|
535
454
|
|
536
|
-
static
|
537
|
-
|
538
|
-
|
539
|
-
|
455
|
+
static const char *decode_msg(upb_decstate *d, const char *ptr, upb_msg *msg,
|
456
|
+
const upb_msglayout *layout) {
|
457
|
+
while (ptr < d->limit) {
|
458
|
+
uint32_t tag;
|
459
|
+
const upb_msglayout_field *field;
|
460
|
+
int field_number;
|
461
|
+
int wire_type;
|
462
|
+
const char *field_start = ptr;
|
463
|
+
wireval val;
|
464
|
+
int op;
|
540
465
|
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
field = upb_find_field(frame->layout, field_number);
|
466
|
+
ptr = decode_varint32(d, ptr, d->limit, &tag);
|
467
|
+
field_number = tag >> 3;
|
468
|
+
wire_type = tag & 7;
|
545
469
|
|
546
|
-
|
547
|
-
|
470
|
+
field = upb_find_field(layout, field_number);
|
471
|
+
|
472
|
+
switch (wire_type) {
|
548
473
|
case UPB_WIRE_TYPE_VARINT:
|
549
|
-
|
474
|
+
ptr = decode_varint64(d, ptr, d->limit, &val.uint64_val);
|
475
|
+
op = varint_ops[field->descriptortype];
|
476
|
+
decode_munge(field->descriptortype, &val);
|
477
|
+
break;
|
550
478
|
case UPB_WIRE_TYPE_32BIT:
|
551
|
-
|
479
|
+
if (d->limit - ptr < 4) decode_err(d);
|
480
|
+
memcpy(&val, ptr, 4);
|
481
|
+
ptr += 4;
|
482
|
+
op = OP_SCALAR_LG2(2);
|
483
|
+
if (((1 << field->descriptortype) & fixed32_ok) == 0) goto unknown;
|
484
|
+
break;
|
552
485
|
case UPB_WIRE_TYPE_64BIT:
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
486
|
+
if (d->limit - ptr < 8) decode_err(d);
|
487
|
+
memcpy(&val, ptr, 8);
|
488
|
+
ptr += 8;
|
489
|
+
op = OP_SCALAR_LG2(3);
|
490
|
+
if (((1 << field->descriptortype) & fixed64_ok) == 0) goto unknown;
|
491
|
+
break;
|
492
|
+
case UPB_WIRE_TYPE_DELIMITED: {
|
493
|
+
uint32_t size;
|
494
|
+
int ndx = field->descriptortype;
|
495
|
+
if (_upb_isrepeated(field)) ndx += 18;
|
496
|
+
ptr = decode_varint32(d, ptr, d->limit, &size);
|
497
|
+
if (size >= INT32_MAX || (size_t)(d->limit - ptr) < size) {
|
498
|
+
decode_err(d); /* Length overflow. */
|
564
499
|
}
|
565
|
-
|
566
|
-
|
500
|
+
val.str_val.data = ptr;
|
501
|
+
val.str_val.size = size;
|
502
|
+
ptr += size;
|
503
|
+
op = delim_ops[ndx];
|
504
|
+
break;
|
567
505
|
}
|
506
|
+
case UPB_WIRE_TYPE_START_GROUP:
|
507
|
+
val.int32_val = field_number;
|
508
|
+
op = OP_SUBMSG;
|
509
|
+
if (field->descriptortype != UPB_DTYPE_GROUP) goto unknown;
|
510
|
+
break;
|
568
511
|
case UPB_WIRE_TYPE_END_GROUP:
|
569
512
|
d->end_group = field_number;
|
570
|
-
return
|
513
|
+
return ptr;
|
571
514
|
default:
|
572
|
-
|
515
|
+
decode_err(d);
|
573
516
|
}
|
574
|
-
} else {
|
575
|
-
CHK(field_number != 0);
|
576
|
-
CHK(upb_skip_unknownfielddata(d, tag, -1));
|
577
|
-
CHK(upb_append_unknown(d, frame));
|
578
|
-
return true;
|
579
|
-
}
|
580
|
-
UPB_UNREACHABLE();
|
581
|
-
}
|
582
|
-
|
583
|
-
static bool upb_decode_message(upb_decstate *d, char *msg, const upb_msglayout *l) {
|
584
|
-
upb_decframe frame;
|
585
|
-
frame.msg = msg;
|
586
|
-
frame.layout = l;
|
587
|
-
frame.state = d;
|
588
517
|
|
589
|
-
|
590
|
-
|
518
|
+
if (op >= 0) {
|
519
|
+
/* Parse, using op for dispatch. */
|
520
|
+
switch (field->label) {
|
521
|
+
case UPB_LABEL_REPEATED:
|
522
|
+
case _UPB_LABEL_PACKED:
|
523
|
+
ptr = decode_toarray(d, ptr, msg, layout, field, val, op);
|
524
|
+
break;
|
525
|
+
case _UPB_LABEL_MAP:
|
526
|
+
decode_tomap(d, msg, layout, field, val);
|
527
|
+
break;
|
528
|
+
default:
|
529
|
+
ptr = decode_tomsg(d, ptr, msg, layout, field, val, op);
|
530
|
+
break;
|
531
|
+
}
|
532
|
+
} else {
|
533
|
+
unknown:
|
534
|
+
/* Skip unknown field. */
|
535
|
+
if (field_number == 0) decode_err(d);
|
536
|
+
if (wire_type == UPB_WIRE_TYPE_START_GROUP) {
|
537
|
+
ptr = decode_group(d, ptr, NULL, NULL, field_number);
|
538
|
+
}
|
539
|
+
if (msg) {
|
540
|
+
if (!_upb_msg_addunknown(msg, field_start, ptr - field_start,
|
541
|
+
d->arena)) {
|
542
|
+
decode_err(d);
|
543
|
+
}
|
544
|
+
}
|
545
|
+
}
|
591
546
|
}
|
592
547
|
|
593
|
-
|
548
|
+
if (ptr != d->limit) decode_err(d);
|
549
|
+
return ptr;
|
594
550
|
}
|
595
551
|
|
596
552
|
bool upb_decode(const char *buf, size_t size, void *msg, const upb_msglayout *l,
|
597
553
|
upb_arena *arena) {
|
598
554
|
upb_decstate state;
|
599
|
-
state.ptr = buf;
|
600
555
|
state.limit = buf + size;
|
601
556
|
state.arena = arena;
|
602
557
|
state.depth = 64;
|
603
558
|
state.end_group = 0;
|
604
559
|
|
605
|
-
|
560
|
+
if (setjmp(state.err)) return false;
|
561
|
+
|
562
|
+
if (size == 0) return true;
|
563
|
+
decode_msg(&state, buf, msg, l);
|
564
|
+
|
606
565
|
return state.end_group == 0;
|
607
566
|
}
|
608
567
|
|
609
|
-
#undef
|
568
|
+
#undef OP_SCALAR_LG2
|
569
|
+
#undef OP_FIXPCK_LG2
|
570
|
+
#undef OP_VARPCK_LG2
|
571
|
+
#undef OP_STRING
|
572
|
+
#undef OP_SUBMSG
|