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.

Files changed (383) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +560 -619
  3. data/include/grpc/grpc_security.h +8 -0
  4. data/include/grpc/grpc_security_constants.h +3 -0
  5. data/include/grpc/impl/codegen/grpc_types.h +7 -5
  6. data/include/grpc/impl/codegen/port_platform.h +0 -32
  7. data/src/core/ext/filters/client_channel/backend_metric.cc +12 -9
  8. data/src/core/ext/filters/client_channel/client_channel.cc +406 -261
  9. data/src/core/ext/filters/client_channel/config_selector.cc +62 -0
  10. data/src/core/ext/filters/client_channel/config_selector.h +93 -0
  11. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -2
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +2 -0
  13. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +6 -5
  14. data/src/core/ext/filters/client_channel/http_proxy.cc +6 -4
  15. data/src/core/ext/filters/client_channel/lb_policy.h +2 -0
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +39 -23
  17. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +4 -6
  18. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +3 -4
  19. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +381 -72
  20. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -5
  21. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +5 -2
  22. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +6 -5
  23. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +8 -6
  24. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +9 -7
  25. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +7 -5
  26. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +33 -48
  27. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
  28. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +21 -18
  29. data/src/core/ext/filters/client_channel/resolver_registry.cc +13 -14
  30. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +6 -7
  31. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +33 -28
  32. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +39 -20
  33. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +142 -0
  34. data/src/core/ext/filters/client_channel/subchannel.cc +1 -1
  35. data/src/core/ext/filters/client_channel/xds/xds_api.cc +327 -123
  36. data/src/core/ext/filters/client_channel/xds/xds_api.h +72 -7
  37. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +12 -23
  38. data/src/core/ext/filters/client_channel/xds/xds_client.cc +112 -33
  39. data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +10 -10
  40. data/src/core/ext/filters/http/client/http_client_filter.cc +5 -5
  41. data/src/core/ext/filters/http/http_filters_plugin.cc +2 -1
  42. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +74 -33
  43. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +3 -1
  44. data/src/core/ext/filters/message_size/message_size_filter.cc +56 -80
  45. data/src/core/ext/filters/message_size/message_size_filter.h +6 -0
  46. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +383 -347
  47. data/src/core/ext/transport/chttp2/server/chttp2_server.h +6 -2
  48. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +1 -1
  49. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +7 -13
  50. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +7 -8
  51. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +19 -4
  52. data/src/core/ext/transport/chttp2/transport/flow_control.cc +22 -27
  53. data/src/core/ext/transport/chttp2/transport/flow_control.h +14 -16
  54. data/src/core/ext/transport/chttp2/transport/frame_data.cc +9 -12
  55. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -6
  56. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -6
  57. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +12 -13
  58. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -7
  59. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +9 -12
  60. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -29
  61. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +13 -17
  62. data/src/core/ext/transport/chttp2/transport/internal.h +13 -0
  63. data/src/core/ext/transport/chttp2/transport/parsing.cc +33 -43
  64. data/src/core/ext/transport/chttp2/transport/writing.cc +9 -14
  65. data/src/core/ext/transport/inproc/inproc_transport.cc +35 -15
  66. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +0 -1
  67. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +3 -4
  68. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +0 -1
  69. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +80 -69
  70. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +24 -23
  71. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +66 -56
  72. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +1 -2
  73. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +2 -2
  74. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +317 -311
  75. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +42 -34
  76. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +7 -7
  77. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +79 -61
  78. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +55 -49
  79. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +9 -8
  80. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +1 -1
  81. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +163 -169
  82. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +51 -45
  83. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +4 -5
  84. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +107 -100
  85. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +137 -117
  86. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +9 -9
  87. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +105 -87
  88. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +12 -13
  89. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +1 -1
  90. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +95 -101
  91. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +1 -2
  92. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +1 -1
  93. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +49 -65
  94. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +0 -1
  95. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +49 -42
  96. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +70 -62
  97. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +1 -2
  98. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +81 -65
  99. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +0 -1
  100. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +1 -1
  101. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +91 -80
  102. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +9 -10
  103. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +1 -2
  104. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +36 -31
  105. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +0 -1
  106. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +7 -7
  107. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +648 -696
  108. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +16 -15
  109. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +1 -2
  110. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +1 -1
  111. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +95 -88
  112. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +234 -199
  113. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +5 -5
  114. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +13 -13
  115. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +1 -2
  116. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +20 -18
  117. data/src/core/ext/upb-generated/envoy/type/http.upb.h +0 -1
  118. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +18 -17
  119. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +14 -14
  120. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +23 -23
  121. data/src/core/ext/upb-generated/envoy/type/percent.upb.h +8 -9
  122. data/src/core/ext/upb-generated/envoy/type/range.upb.h +15 -16
  123. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +7 -8
  124. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +36 -35
  125. data/src/core/ext/upb-generated/gogoproto/gogo.upb.h +0 -1
  126. data/src/core/ext/upb-generated/google/api/annotations.upb.h +0 -1
  127. data/src/core/ext/upb-generated/google/api/http.upb.h +29 -28
  128. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +5 -6
  129. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +3 -3
  130. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +412 -386
  131. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +5 -6
  132. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +1 -2
  133. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +1 -1
  134. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +33 -54
  135. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +5 -6
  136. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +27 -28
  137. data/src/core/ext/upb-generated/google/rpc/status.upb.h +8 -8
  138. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +1 -1
  139. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +32 -45
  140. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +4 -4
  141. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +157 -178
  142. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +14 -13
  143. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +6 -7
  144. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +59 -56
  145. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +11 -12
  146. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +0 -1
  147. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +5 -6
  148. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +6 -6
  149. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +41 -68
  150. data/src/core/ext/upb-generated/validate/validate.upb.h +536 -535
  151. data/src/core/lib/channel/channel_trace.cc +2 -6
  152. data/src/core/lib/channel/channelz.cc +5 -15
  153. data/src/core/lib/gpr/log_linux.cc +6 -8
  154. data/src/core/lib/gpr/log_posix.cc +6 -8
  155. data/src/core/lib/gpr/string.cc +10 -9
  156. data/src/core/lib/gpr/string.h +4 -2
  157. data/src/core/lib/gprpp/global_config_env.cc +8 -6
  158. data/src/core/lib/http/httpcli.cc +13 -10
  159. data/src/core/lib/http/httpcli_security_connector.cc +5 -5
  160. data/src/core/lib/iomgr/cfstream_handle.cc +1 -0
  161. data/src/core/lib/iomgr/endpoint_pair_posix.cc +10 -10
  162. data/src/core/lib/iomgr/error_cfstream.cc +9 -8
  163. data/src/core/lib/iomgr/ev_epoll1_linux.cc +5 -6
  164. data/src/core/lib/iomgr/ev_epollex_linux.cc +15 -21
  165. data/src/core/lib/iomgr/ev_poll_posix.cc +6 -5
  166. data/src/core/lib/iomgr/ev_posix.cc +2 -0
  167. data/src/core/lib/iomgr/iomgr.cc +10 -0
  168. data/src/core/lib/iomgr/iomgr.h +10 -0
  169. data/src/core/lib/iomgr/is_epollexclusive_available.cc +14 -0
  170. data/src/core/lib/iomgr/port.h +1 -21
  171. data/src/core/lib/iomgr/resolve_address_custom.cc +13 -18
  172. data/src/core/lib/iomgr/resolve_address_windows.cc +8 -8
  173. data/src/core/lib/iomgr/resource_quota.cc +34 -31
  174. data/src/core/lib/iomgr/sockaddr_utils.cc +7 -5
  175. data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
  176. data/src/core/lib/iomgr/socket_utils_common_posix.cc +95 -55
  177. data/src/core/lib/iomgr/socket_windows.cc +4 -5
  178. data/src/core/lib/iomgr/tcp_client_cfstream.cc +9 -11
  179. data/src/core/lib/iomgr/tcp_client_custom.cc +6 -9
  180. data/src/core/lib/iomgr/tcp_client_posix.cc +27 -36
  181. data/src/core/lib/iomgr/tcp_client_windows.cc +9 -9
  182. data/src/core/lib/iomgr/tcp_custom.cc +1 -1
  183. data/src/core/lib/iomgr/tcp_custom.h +1 -1
  184. data/src/core/lib/iomgr/tcp_server.cc +3 -4
  185. data/src/core/lib/iomgr/tcp_server.h +7 -5
  186. data/src/core/lib/iomgr/tcp_server_custom.cc +6 -14
  187. data/src/core/lib/iomgr/tcp_server_posix.cc +34 -41
  188. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -4
  189. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -7
  190. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +4 -9
  191. data/src/core/lib/iomgr/tcp_server_windows.cc +16 -16
  192. data/src/core/lib/iomgr/timer_generic.cc +13 -12
  193. data/src/core/lib/iomgr/udp_server.cc +24 -23
  194. data/src/core/lib/iomgr/udp_server.h +5 -2
  195. data/src/core/lib/iomgr/unix_sockets_posix.cc +9 -14
  196. data/src/core/lib/iomgr/unix_sockets_posix.h +3 -1
  197. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +5 -2
  198. data/src/core/lib/json/json_reader.cc +20 -21
  199. data/src/core/lib/security/credentials/credentials.h +5 -3
  200. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +8 -6
  201. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +12 -9
  202. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +7 -4
  203. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +19 -28
  204. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -6
  205. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -0
  206. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +10 -0
  207. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +10 -0
  208. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +10 -10
  209. data/src/core/lib/security/security_connector/security_connector.cc +2 -0
  210. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  211. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +18 -11
  212. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +5 -0
  213. data/src/core/lib/security/security_connector/ssl_utils.cc +44 -23
  214. data/src/core/lib/security/security_connector/ssl_utils.h +6 -2
  215. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +27 -24
  216. data/src/core/lib/security/transport/auth_filters.h +0 -5
  217. data/src/core/lib/security/transport/client_auth_filter.cc +10 -9
  218. data/src/core/lib/security/util/json_util.cc +12 -13
  219. data/src/core/lib/slice/slice.cc +38 -1
  220. data/src/core/lib/slice/slice_internal.h +1 -0
  221. data/src/core/lib/surface/call.cc +40 -41
  222. data/src/core/lib/surface/completion_queue.cc +271 -14
  223. data/src/core/lib/surface/completion_queue.h +8 -0
  224. data/src/core/lib/surface/init.cc +2 -0
  225. data/src/core/lib/surface/server.cc +565 -632
  226. data/src/core/lib/surface/server.h +34 -12
  227. data/src/core/lib/surface/version.cc +2 -2
  228. data/src/core/lib/transport/transport.h +6 -0
  229. data/src/core/lib/uri/uri_parser.cc +8 -15
  230. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -0
  231. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +23 -13
  232. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +2 -0
  233. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -0
  234. data/src/core/tsi/ssl_transport_security.cc +108 -11
  235. data/src/core/tsi/ssl_transport_security.h +14 -2
  236. data/src/core/tsi/transport_security_interface.h +5 -0
  237. data/src/ruby/bin/math_services_pb.rb +4 -4
  238. data/src/ruby/ext/grpc/extconf.rb +5 -2
  239. data/src/ruby/ext/grpc/rb_call.c +3 -2
  240. data/src/ruby/ext/grpc/rb_call.h +4 -0
  241. data/src/ruby/ext/grpc/rb_call_credentials.c +57 -12
  242. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  243. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  244. data/src/ruby/lib/grpc/generic/client_stub.rb +1 -1
  245. data/src/ruby/lib/grpc/generic/interceptors.rb +1 -1
  246. data/src/ruby/lib/grpc/version.rb +1 -1
  247. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +2 -2
  248. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +5 -0
  249. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +28 -12
  250. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto +23 -0
  251. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +2 -0
  252. data/src/ruby/spec/pb/codegen/grpc/testing/same_package_service_name.proto +27 -0
  253. data/src/ruby/spec/pb/codegen/grpc/testing/same_ruby_package_service_name.proto +29 -0
  254. data/src/ruby/spec/pb/codegen/package_option_spec.rb +25 -1
  255. data/src/ruby/spec/support/services.rb +10 -4
  256. data/src/ruby/spec/user_agent_spec.rb +74 -0
  257. data/third_party/boringssl-with-bazel/err_data.c +89 -83
  258. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
  259. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +3 -3
  260. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +1 -1
  261. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -3
  262. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
  263. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +1 -1
  264. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -1
  265. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +1 -1
  266. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +1 -1
  267. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +1 -1
  268. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c +1 -1
  269. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +1 -0
  270. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +12 -52
  271. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +0 -22
  272. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +143 -0
  273. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +17 -1
  274. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +11 -1
  275. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +2 -1
  276. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +13 -11
  277. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +24 -23
  278. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +20 -16
  279. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +2 -2
  280. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/util.c +3 -3
  281. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +62 -0
  282. data/third_party/boringssl-with-bazel/src/crypto/mem.c +29 -15
  283. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +7 -0
  284. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +36 -5
  285. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +0 -29
  286. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +116 -363
  287. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +7 -45
  288. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +4 -4
  289. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +8 -0
  290. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +4 -4
  291. data/third_party/boringssl-with-bazel/src/crypto/x509/x509.c +0 -67
  292. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +13 -6
  293. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +10 -0
  294. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +41 -0
  295. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +4 -1
  296. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +28 -9
  297. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +25 -0
  298. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +35 -13
  299. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +0 -154
  300. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +28 -6
  301. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +5 -0
  302. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +74 -35
  303. data/third_party/boringssl-with-bazel/src/include/openssl/aes.h +16 -4
  304. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +22 -22
  305. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +1 -1
  306. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +69 -0
  307. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +33 -16
  308. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +1 -10
  309. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +789 -715
  310. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +3 -3
  311. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +9 -2
  312. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +2 -2
  313. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +9 -0
  314. data/third_party/boringssl-with-bazel/src/ssl/internal.h +17 -14
  315. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +7 -7
  316. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +28 -0
  317. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +4 -24
  318. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +5 -5
  319. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +45 -24
  320. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +31 -21
  321. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +12 -9
  322. data/third_party/re2/re2/bitmap256.h +117 -0
  323. data/third_party/re2/re2/bitstate.cc +385 -0
  324. data/third_party/re2/re2/compile.cc +1279 -0
  325. data/third_party/re2/re2/dfa.cc +2130 -0
  326. data/third_party/re2/re2/filtered_re2.cc +121 -0
  327. data/third_party/re2/re2/filtered_re2.h +109 -0
  328. data/third_party/re2/re2/mimics_pcre.cc +197 -0
  329. data/third_party/re2/re2/nfa.cc +713 -0
  330. data/third_party/re2/re2/onepass.cc +623 -0
  331. data/third_party/re2/re2/parse.cc +2464 -0
  332. data/third_party/re2/re2/perl_groups.cc +119 -0
  333. data/third_party/re2/re2/pod_array.h +55 -0
  334. data/third_party/re2/re2/prefilter.cc +710 -0
  335. data/third_party/re2/re2/prefilter.h +108 -0
  336. data/third_party/re2/re2/prefilter_tree.cc +407 -0
  337. data/third_party/re2/re2/prefilter_tree.h +139 -0
  338. data/third_party/re2/re2/prog.cc +988 -0
  339. data/third_party/re2/re2/prog.h +436 -0
  340. data/third_party/re2/re2/re2.cc +1362 -0
  341. data/third_party/re2/re2/re2.h +1002 -0
  342. data/third_party/re2/re2/regexp.cc +980 -0
  343. data/third_party/re2/re2/regexp.h +659 -0
  344. data/third_party/re2/re2/set.cc +154 -0
  345. data/third_party/re2/re2/set.h +80 -0
  346. data/third_party/re2/re2/simplify.cc +657 -0
  347. data/third_party/re2/re2/sparse_array.h +392 -0
  348. data/third_party/re2/re2/sparse_set.h +264 -0
  349. data/third_party/re2/re2/stringpiece.cc +65 -0
  350. data/third_party/re2/re2/stringpiece.h +210 -0
  351. data/third_party/re2/re2/tostring.cc +351 -0
  352. data/third_party/re2/re2/unicode_casefold.cc +582 -0
  353. data/third_party/re2/re2/unicode_casefold.h +78 -0
  354. data/third_party/re2/re2/unicode_groups.cc +6269 -0
  355. data/third_party/re2/re2/unicode_groups.h +67 -0
  356. data/third_party/re2/re2/walker-inl.h +246 -0
  357. data/third_party/re2/util/benchmark.h +156 -0
  358. data/third_party/re2/util/flags.h +26 -0
  359. data/third_party/re2/util/logging.h +109 -0
  360. data/third_party/re2/util/malloc_counter.h +19 -0
  361. data/third_party/re2/util/mix.h +41 -0
  362. data/third_party/re2/util/mutex.h +148 -0
  363. data/third_party/re2/util/pcre.cc +1025 -0
  364. data/third_party/re2/util/pcre.h +681 -0
  365. data/third_party/re2/util/rune.cc +260 -0
  366. data/third_party/re2/util/strutil.cc +149 -0
  367. data/third_party/re2/util/strutil.h +21 -0
  368. data/third_party/re2/util/test.h +50 -0
  369. data/third_party/re2/util/utf.h +44 -0
  370. data/third_party/re2/util/util.h +42 -0
  371. data/third_party/upb/upb/decode.c +467 -504
  372. data/third_party/upb/upb/encode.c +163 -121
  373. data/third_party/upb/upb/msg.c +130 -64
  374. data/third_party/upb/upb/msg.h +418 -14
  375. data/third_party/upb/upb/port_def.inc +35 -6
  376. data/third_party/upb/upb/port_undef.inc +8 -1
  377. data/third_party/upb/upb/table.c +53 -75
  378. data/third_party/upb/upb/table.int.h +11 -43
  379. data/third_party/upb/upb/upb.c +148 -124
  380. data/third_party/upb/upb/upb.h +65 -147
  381. data/third_party/upb/upb/upb.hpp +86 -0
  382. metadata +90 -30
  383. 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
- #include "upb/upb.h"
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 upb_desctype_to_fieldtype[] = {
10
- UPB_WIRE_TYPE_END_GROUP, /* ENDGROUP */
11
- UPB_TYPE_DOUBLE, /* DOUBLE */
12
- UPB_TYPE_FLOAT, /* FLOAT */
13
- UPB_TYPE_INT64, /* INT64 */
14
- UPB_TYPE_UINT64, /* UINT64 */
15
- UPB_TYPE_INT32, /* INT32 */
16
- UPB_TYPE_UINT64, /* FIXED64 */
17
- UPB_TYPE_UINT32, /* FIXED32 */
18
- UPB_TYPE_BOOL, /* BOOL */
19
- UPB_TYPE_STRING, /* STRING */
20
- UPB_TYPE_MESSAGE, /* GROUP */
21
- UPB_TYPE_MESSAGE, /* MESSAGE */
22
- UPB_TYPE_BYTES, /* BYTES */
23
- UPB_TYPE_UINT32, /* UINT32 */
24
- UPB_TYPE_ENUM, /* ENUM */
25
- UPB_TYPE_INT32, /* SFIXED32 */
26
- UPB_TYPE_INT64, /* SFIXED64 */
27
- UPB_TYPE_INT32, /* SINT32 */
28
- UPB_TYPE_INT64, /* SINT64 */
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 *ptr; /* Current parsing position. */
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; /* Set to field number of END_GROUP tag, if any. */
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
- /* Data passed by value to each parsing function. */
42
- typedef struct {
43
- char *msg;
44
- const upb_msglayout *layout;
45
- upb_decstate *state;
46
- } upb_decframe;
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
- #define CHK(x) if (!(x)) { return 0; }
156
+ UPB_NORETURN static void decode_err(upb_decstate *d) { longjmp(d->err, 1); }
49
157
 
50
- static bool upb_skip_unknowngroup(upb_decstate *d, int field_number);
51
- static bool upb_decode_message(upb_decstate *d, char *msg,
52
- const upb_msglayout *l);
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
- static bool upb_decode_varint(const char **ptr, const char *limit,
55
- uint64_t *val) {
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
- const char *p = *ptr;
59
- *val = 0;
171
+ uint64_t out = 0;
60
172
 
61
173
  do {
62
- CHK(bitpos < 70 && p < limit);
63
- byte = *p;
64
- *val |= (uint64_t)(byte & 0x7F) << bitpos;
65
- p++;
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
- *ptr = p;
70
- return true;
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
- static bool upb_decode_64bit(const char **ptr, const char *limit,
82
- uint64_t *val) {
83
- CHK(limit - *ptr >= 8);
84
- memcpy(val, *ptr, 8);
85
- *ptr += 8;
86
- return true;
87
- }
88
-
89
- static bool upb_decode_32bit(const char **ptr, const char *limit,
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 bool upb_append_unknown(upb_decstate *d, upb_decframe *frame) {
122
- upb_msg_addunknown(frame->msg, d->field_start, d->ptr - d->field_start,
123
- d->arena);
124
- return true;
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
- static bool upb_skip_unknownfielddata(upb_decstate *d, uint32_t tag,
129
- uint32_t group_fieldnum) {
130
- switch (tag & 7) {
131
- case UPB_WIRE_TYPE_VARINT: {
132
- uint64_t val;
133
- return upb_decode_varint(&d->ptr, d->limit, &val);
134
- }
135
- case UPB_WIRE_TYPE_32BIT: {
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 UPB_WIRE_TYPE_DELIMITED: {
144
- int len;
145
- CHK(upb_decode_string(&d->ptr, d->limit, &len));
146
- d->ptr += len;
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 bool upb_skip_unknowngroup(upb_decstate *d, int field_number) {
158
- while (d->ptr < d->limit && d->end_group == 0) {
159
- uint32_t tag = 0;
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
- if (!*submsg) {
239
- *submsg = upb_msg_new(*subm, frame->state->arena);
240
- CHK(*submsg);
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 *submsg;
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 void upb_sethasbit(upb_decframe *frame,
265
- const upb_msglayout_field *field) {
266
- int32_t hasbit = field->presence;
267
- UPB_ASSERT(field->presence > 0);
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 upb_setoneofcase(upb_decframe *frame,
272
- const upb_msglayout_field *field) {
273
- UPB_ASSERT(field->presence < 0);
274
- upb_set32(frame->msg, ~field->presence, field->number);
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 bool upb_decode_addval(upb_decframe *frame,
278
- const upb_msglayout_field *field, void *val,
279
- size_t size) {
280
- char *field_mem = frame->msg + field->offset;
281
- upb_array *arr;
282
-
283
- if (field->label == UPB_LABEL_REPEATED) {
284
- arr = upb_getorcreatearr(frame, field);
285
- CHK(arr);
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 void upb_decode_setpresent(upb_decframe *frame,
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
- if (field->label == UPB_LABEL_REPEATED) {
297
- upb_array *arr = upb_getarr(frame, field);
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 bool upb_decode_msgfield(upb_decstate *d, upb_msg *msg,
308
- const upb_msglayout *layout, int limit) {
309
- const char* saved_limit = d->limit;
310
- d->limit = d->ptr + limit;
311
- CHK(--d->depth >= 0);
312
- upb_decode_message(d, msg, layout);
313
- d->depth++;
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
- static bool upb_decode_varintfield(upb_decstate *d, upb_decframe *frame,
331
- const upb_msglayout_field *field) {
332
- uint64_t val;
333
- CHK(upb_decode_varint(&d->ptr, d->limit, &val));
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
- switch (field->descriptortype) {
336
- case UPB_DESCRIPTOR_TYPE_INT64:
337
- case UPB_DESCRIPTOR_TYPE_UINT64:
338
- CHK(upb_decode_addval(frame, field, &val, sizeof(val)));
339
- break;
340
- case UPB_DESCRIPTOR_TYPE_INT32:
341
- case UPB_DESCRIPTOR_TYPE_UINT32:
342
- case UPB_DESCRIPTOR_TYPE_ENUM: {
343
- uint32_t val32 = (uint32_t)val;
344
- CHK(upb_decode_addval(frame, field, &val32, sizeof(val32)));
345
- break;
346
- }
347
- case UPB_DESCRIPTOR_TYPE_BOOL: {
348
- bool valbool = val != 0;
349
- CHK(upb_decode_addval(frame, field, &valbool, sizeof(valbool)));
350
- break;
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 UPB_DESCRIPTOR_TYPE_SINT32: {
353
- int32_t decoded = upb_zzdecode_32((uint32_t)val);
354
- CHK(upb_decode_addval(frame, field, &decoded, sizeof(decoded)));
355
- break;
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 UPB_DESCRIPTOR_TYPE_SINT64: {
358
- int64_t decoded = upb_zzdecode_64(val);
359
- CHK(upb_decode_addval(frame, field, &decoded, sizeof(decoded)));
360
- break;
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
- return upb_append_unknown(d, frame);
361
+ UPB_UNREACHABLE();
364
362
  }
365
-
366
- upb_decode_setpresent(frame, field);
367
- return true;
368
363
  }
369
364
 
370
- static bool upb_decode_64bitfield(upb_decstate *d, upb_decframe *frame,
371
- const upb_msglayout_field *field) {
372
- uint64_t val;
373
- CHK(upb_decode_64bit(&d->ptr, d->limit, &val));
374
-
375
- switch (field->descriptortype) {
376
- case UPB_DESCRIPTOR_TYPE_DOUBLE:
377
- case UPB_DESCRIPTOR_TYPE_FIXED64:
378
- case UPB_DESCRIPTOR_TYPE_SFIXED64:
379
- CHK(upb_decode_addval(frame, field, &val, sizeof(val)));
380
- break;
381
- default:
382
- return upb_append_unknown(d, frame);
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
- upb_decode_setpresent(frame, field);
386
- return true;
387
- }
386
+ /* Parse map entry. */
387
+ memset(&ent, 0, sizeof(ent));
388
388
 
389
- static bool upb_decode_32bitfield(upb_decstate *d, upb_decframe *frame,
390
- const upb_msglayout_field *field) {
391
- uint32_t val;
392
- CHK(upb_decode_32bit(&d->ptr, d->limit, &val));
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
- upb_decode_setpresent(frame, field);
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
- static upb_strview upb_decode_strfield(upb_decstate *d, uint32_t len) {
420
- upb_strview ret;
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 bool upb_decode_toarray(upb_decstate *d, upb_decframe *frame,
428
- const upb_msglayout_field *field, int len) {
429
- upb_array *arr = upb_getorcreatearr(frame, field);
430
- CHK(arr);
431
-
432
- #define VARINT_CASE(ctype, decode) \
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
- switch (field->descriptortype) {
451
- case UPB_DESCRIPTOR_TYPE_STRING:
452
- case UPB_DESCRIPTOR_TYPE_BYTES: {
453
- upb_strview str = upb_decode_strfield(d, len);
454
- return upb_array_add(arr, 1, sizeof(str), &str, d->arena);
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
- case UPB_DESCRIPTOR_TYPE_FLOAT:
457
- case UPB_DESCRIPTOR_TYPE_FIXED32:
458
- case UPB_DESCRIPTOR_TYPE_SFIXED32:
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
- if (field->label == UPB_LABEL_REPEATED) {
497
- return upb_decode_toarray(d, frame, field, len);
498
- } else {
499
- switch (field->descriptortype) {
500
- case UPB_DESCRIPTOR_TYPE_STRING:
501
- case UPB_DESCRIPTOR_TYPE_BYTES: {
502
- upb_strview str = upb_decode_strfield(d, len);
503
- CHK(upb_decode_addval(frame, field, &str, sizeof(str)));
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
- case UPB_DESCRIPTOR_TYPE_MESSAGE: {
507
- const upb_msglayout *subm;
508
- upb_msg *submsg = upb_getorcreatemsg(frame, field, &subm);
509
- CHK(submsg);
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
- default:
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 NULL; /* Unknown field. */
452
+ return ptr;
534
453
  }
535
454
 
536
- static bool upb_decode_field(upb_decstate *d, upb_decframe *frame) {
537
- uint32_t tag;
538
- const upb_msglayout_field *field;
539
- int field_number;
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
- d->field_start = d->ptr;
542
- CHK(upb_decode_varint32(&d->ptr, d->limit, &tag));
543
- field_number = tag >> 3;
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
- if (field) {
547
- switch (tag & 7) {
470
+ field = upb_find_field(layout, field_number);
471
+
472
+ switch (wire_type) {
548
473
  case UPB_WIRE_TYPE_VARINT:
549
- return upb_decode_varintfield(d, frame, field);
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
- return upb_decode_32bitfield(d, frame, field);
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
- return upb_decode_64bitfield(d, frame, field);
554
- case UPB_WIRE_TYPE_DELIMITED:
555
- return upb_decode_delimitedfield(d, frame, field);
556
- case UPB_WIRE_TYPE_START_GROUP: {
557
- const upb_msglayout *layout;
558
- upb_msg *group;
559
-
560
- if (field->label == UPB_LABEL_REPEATED) {
561
- group = upb_addmsg(frame, field, &layout);
562
- } else {
563
- group = upb_getorcreatemsg(frame, field, &layout);
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
- return upb_decode_groupfield(d, group, layout, field_number);
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 true;
513
+ return ptr;
571
514
  default:
572
- CHK(false);
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
- while (d->ptr < d->limit) {
590
- CHK(upb_decode_field(d, &frame));
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
- return true;
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
- CHK(upb_decode_message(&state, msg, l));
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 CHK
568
+ #undef OP_SCALAR_LG2
569
+ #undef OP_FIXPCK_LG2
570
+ #undef OP_VARPCK_LG2
571
+ #undef OP_STRING
572
+ #undef OP_SUBMSG