Merge pull request #7154 from tswast/issue4498-googleapis.dev
python: publish sphinx docs to googleapis.dev
diff --git a/BUILD b/BUILD
index 79871d6..c45fc45 100644
--- a/BUILD
+++ b/BUILD
@@ -1,7 +1,6 @@
# Bazel (https://bazel.build/) BUILD file for Protobuf.
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test", "objc_library", native_cc_proto_library = "cc_proto_library")
-load("@rules_java//java:defs.bzl", "java_library")
load("@rules_proto//proto:defs.bzl", "proto_lang_toolchain", "proto_library")
load("@rules_proto//proto/private:native.bzl", "native_proto_common")
load("@rules_python//python:defs.bzl", "py_library")
@@ -12,17 +11,6 @@
exports_files(["LICENSE"])
################################################################################
-# Java 9 configuration
-################################################################################
-
-config_setting(
- name = "jdk9",
- values = {
- "java_toolchain": "@bazel_tools//tools/jdk:toolchain_jdk9",
- },
-)
-
-################################################################################
# ZLIB configuration
################################################################################
@@ -70,6 +58,10 @@
create_compiler_config_setting(
name = "msvc",
value = "msvc-cl",
+ visibility = [
+ # Public, but Protobuf only visibility.
+ "//:__subpackages__",
+ ],
)
config_setting(
@@ -77,6 +69,10 @@
values = {
"crosstool_top": "//external:android/crosstool",
},
+ visibility = [
+ # Public, but Protobuf only visibility.
+ "//:__subpackages__",
+ ],
)
config_setting(
@@ -84,6 +80,10 @@
values = {
"crosstool_top": "@androidndk//:toolchain-libcpp",
},
+ visibility = [
+ # Public, but Protobuf only visibility.
+ "//:__subpackages__",
+ ],
)
config_setting(
@@ -91,6 +91,10 @@
values = {
"crosstool_top": "@androidndk//:toolchain-gnu-libstdcpp",
},
+ visibility = [
+ # Public, but Protobuf only visibility.
+ "//:__subpackages__",
+ ],
)
# Android and MSVC builds do not need to link in a separate pthread library.
@@ -653,144 +657,43 @@
################################################################################
# Java support
################################################################################
+
internal_gen_well_known_protos_java(
- srcs = WELL_KNOWN_PROTOS,
+ name = "gen_well_known_protos_java",
+ deps = [proto + "_proto" for proto in WELL_KNOWN_PROTO_MAP.keys()],
+ visibility = [
+ "//java:__subpackages__",
+ ],
)
-java_library(
+alias(
name = "protobuf_java",
- srcs = glob([
- "java/core/src/main/java/com/google/protobuf/*.java",
- ]) + [
- ":gen_well_known_protos_java",
- ],
- javacopts = select({
- "//:jdk9": ["--add-modules=jdk.unsupported"],
- "//conditions:default": [
- "-source 7",
- "-target 7",
- ],
- }),
+ actual = "//java/core",
visibility = ["//visibility:public"],
)
-java_library(
+alias(
name = "protobuf_javalite",
- srcs = [
- # Keep in sync with java/lite/pom.xml
- "java/core/src/main/java/com/google/protobuf/AbstractMessageLite.java",
- "java/core/src/main/java/com/google/protobuf/AbstractParser.java",
- "java/core/src/main/java/com/google/protobuf/AbstractProtobufList.java",
- "java/core/src/main/java/com/google/protobuf/AllocatedBuffer.java",
- "java/core/src/main/java/com/google/protobuf/Android.java",
- "java/core/src/main/java/com/google/protobuf/ArrayDecoders.java",
- "java/core/src/main/java/com/google/protobuf/BinaryReader.java",
- "java/core/src/main/java/com/google/protobuf/BinaryWriter.java",
- "java/core/src/main/java/com/google/protobuf/BooleanArrayList.java",
- "java/core/src/main/java/com/google/protobuf/BufferAllocator.java",
- "java/core/src/main/java/com/google/protobuf/ByteBufferWriter.java",
- "java/core/src/main/java/com/google/protobuf/ByteOutput.java",
- "java/core/src/main/java/com/google/protobuf/ByteString.java",
- "java/core/src/main/java/com/google/protobuf/CodedInputStream.java",
- "java/core/src/main/java/com/google/protobuf/CodedInputStreamReader.java",
- "java/core/src/main/java/com/google/protobuf/CodedOutputStream.java",
- "java/core/src/main/java/com/google/protobuf/CodedOutputStreamWriter.java",
- "java/core/src/main/java/com/google/protobuf/DoubleArrayList.java",
- "java/core/src/main/java/com/google/protobuf/ExperimentalApi.java",
- "java/core/src/main/java/com/google/protobuf/ExtensionLite.java",
- "java/core/src/main/java/com/google/protobuf/ExtensionRegistryFactory.java",
- "java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java",
- "java/core/src/main/java/com/google/protobuf/ExtensionSchema.java",
- "java/core/src/main/java/com/google/protobuf/ExtensionSchemaLite.java",
- "java/core/src/main/java/com/google/protobuf/ExtensionSchemas.java",
- "java/core/src/main/java/com/google/protobuf/FieldInfo.java",
- "java/core/src/main/java/com/google/protobuf/FieldSet.java",
- "java/core/src/main/java/com/google/protobuf/FieldType.java",
- "java/core/src/main/java/com/google/protobuf/FloatArrayList.java",
- "java/core/src/main/java/com/google/protobuf/GeneratedMessageInfoFactory.java",
- "java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java",
- "java/core/src/main/java/com/google/protobuf/IntArrayList.java",
- "java/core/src/main/java/com/google/protobuf/Internal.java",
- "java/core/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java",
- "java/core/src/main/java/com/google/protobuf/IterableByteBufferInputStream.java",
- "java/core/src/main/java/com/google/protobuf/JavaType.java",
- "java/core/src/main/java/com/google/protobuf/LazyField.java",
- "java/core/src/main/java/com/google/protobuf/LazyFieldLite.java",
- "java/core/src/main/java/com/google/protobuf/LazyStringArrayList.java",
- "java/core/src/main/java/com/google/protobuf/LazyStringList.java",
- "java/core/src/main/java/com/google/protobuf/ListFieldSchema.java",
- "java/core/src/main/java/com/google/protobuf/LongArrayList.java",
- "java/core/src/main/java/com/google/protobuf/ManifestSchemaFactory.java",
- "java/core/src/main/java/com/google/protobuf/MapEntryLite.java",
- "java/core/src/main/java/com/google/protobuf/MapFieldLite.java",
- "java/core/src/main/java/com/google/protobuf/MapFieldSchema.java",
- "java/core/src/main/java/com/google/protobuf/MapFieldSchemaLite.java",
- "java/core/src/main/java/com/google/protobuf/MapFieldSchemas.java",
- "java/core/src/main/java/com/google/protobuf/MessageInfo.java",
- "java/core/src/main/java/com/google/protobuf/MessageInfoFactory.java",
- "java/core/src/main/java/com/google/protobuf/MessageLite.java",
- "java/core/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java",
- "java/core/src/main/java/com/google/protobuf/MessageLiteToString.java",
- "java/core/src/main/java/com/google/protobuf/MessageSchema.java",
- "java/core/src/main/java/com/google/protobuf/MessageSetSchema.java",
- "java/core/src/main/java/com/google/protobuf/MutabilityOracle.java",
- "java/core/src/main/java/com/google/protobuf/NewInstanceSchema.java",
- "java/core/src/main/java/com/google/protobuf/NewInstanceSchemaLite.java",
- "java/core/src/main/java/com/google/protobuf/NewInstanceSchemas.java",
- "java/core/src/main/java/com/google/protobuf/NioByteString.java",
- "java/core/src/main/java/com/google/protobuf/OneofInfo.java",
- "java/core/src/main/java/com/google/protobuf/Parser.java",
- "java/core/src/main/java/com/google/protobuf/PrimitiveNonBoxingCollection.java",
- "java/core/src/main/java/com/google/protobuf/ProtoSyntax.java",
- "java/core/src/main/java/com/google/protobuf/Protobuf.java",
- "java/core/src/main/java/com/google/protobuf/ProtobufArrayList.java",
- "java/core/src/main/java/com/google/protobuf/ProtobufLists.java",
- "java/core/src/main/java/com/google/protobuf/ProtocolStringList.java",
- "java/core/src/main/java/com/google/protobuf/RawMessageInfo.java",
- "java/core/src/main/java/com/google/protobuf/Reader.java",
- "java/core/src/main/java/com/google/protobuf/RopeByteString.java",
- "java/core/src/main/java/com/google/protobuf/Schema.java",
- "java/core/src/main/java/com/google/protobuf/SchemaFactory.java",
- "java/core/src/main/java/com/google/protobuf/SchemaUtil.java",
- "java/core/src/main/java/com/google/protobuf/SmallSortedMap.java",
- "java/core/src/main/java/com/google/protobuf/StructuralMessageInfo.java",
- "java/core/src/main/java/com/google/protobuf/TextFormatEscaper.java",
- "java/core/src/main/java/com/google/protobuf/UninitializedMessageException.java",
- "java/core/src/main/java/com/google/protobuf/UnknownFieldSchema.java",
- "java/core/src/main/java/com/google/protobuf/UnknownFieldSetLite.java",
- "java/core/src/main/java/com/google/protobuf/UnknownFieldSetLiteSchema.java",
- "java/core/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java",
- "java/core/src/main/java/com/google/protobuf/UnsafeUtil.java",
- "java/core/src/main/java/com/google/protobuf/Utf8.java",
- "java/core/src/main/java/com/google/protobuf/WireFormat.java",
- "java/core/src/main/java/com/google/protobuf/Writer.java",
- ],
- javacopts = select({
- "//:jdk9": ["--add-modules=jdk.unsupported"],
- "//conditions:default": [
- "-source 7",
- "-target 7",
- ],
- }),
+ actual = "//java/lite",
visibility = ["//visibility:public"],
)
-java_library(
+alias(
name = "protobuf_java_util",
- srcs = glob([
- "java/util/src/main/java/com/google/protobuf/util/*.java",
- ]),
- javacopts = [
- "-source 7",
- "-target 7",
- ],
+ actual = "//java/util",
visibility = ["//visibility:public"],
- deps = [
- "protobuf_java",
- "//external:error_prone_annotations",
- "//external:gson",
- "//external:guava",
- ],
+)
+
+alias(
+ name = "java_toolchain",
+ actual = "//java/core:toolchain",
+ visibility = ["//visibility:public"],
+)
+
+alias(
+ name = "javalite_toolchain",
+ actual = "//java/lite:toolchain",
+ visibility = ["//visibility:public"],
)
################################################################################
@@ -859,6 +762,10 @@
values = {
"define": "use_fast_cpp_protos=true",
},
+ visibility = [
+ # Public, but Protobuf only visibility.
+ "//:__subpackages__",
+ ],
)
config_setting(
@@ -866,6 +773,10 @@
values = {
"define": "allow_oversize_protos=true",
},
+ visibility = [
+ # Public, but Protobuf only visibility.
+ "//:__subpackages__",
+ ],
)
# Copy the builtin proto files from src/google/protobuf to
@@ -1011,20 +922,6 @@
visibility = ["//visibility:public"],
)
-proto_lang_toolchain(
- name = "java_toolchain",
- command_line = "--java_out=$(OUT)",
- runtime = ":protobuf_java",
- visibility = ["//visibility:public"],
-)
-
-proto_lang_toolchain(
- name = "javalite_toolchain",
- command_line = "--java_out=lite:$(OUT)",
- runtime = ":protobuf_javalite",
- visibility = ["//visibility:public"],
-)
-
alias(
name = "objectivec",
actual = ":protobuf_objc",
diff --git a/CHANGES.txt b/CHANGES.txt
index 48bd7af..cbd3a20 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,3 +1,23 @@
+2020-02-14 version 3.11.4 (C++/Java/Python/PHP/Objective-C/C#/Ruby/JavaScript)
+
+ C#
+ * Fix latest ArgumentException for C# extensions (#7188)
+ * Enforce recursion depth checking for unknown fields (#7210)
+
+ Ruby
+ * Fix wrappers with a zero value (#7195)
+ * Fix JSON serialization of 0/empty-valued wrapper types (#7198)
+
+2020-01-31 version 3.11.3 (C++/Java/Python/PHP/Objective-C/C#/Ruby/JavaScript)
+
+ C++
+ * Add OUT and OPTIONAL to windows portability files (#7087)
+
+ PHP
+ * Refactored ulong to zend_ulong for php7.4 compatibility (#7147)
+ * Call register_class before getClass from desc to fix segfault (#7077)
+
+
2019-12-10 version 3.11.2 (C++/Java/Python/PHP/Objective-C/C#/Ruby/JavaScript)
PHP
diff --git a/Makefile.am b/Makefile.am
index 704aad6..b4e6ebd 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -247,8 +247,10 @@
csharp/src/Google.Protobuf/UnknownFieldSet.cs
java_EXTRA_DIST= \
+ java/BUILD \
java/README.md \
java/bom/pom.xml \
+ java/core/BUILD \
java/core/generate-sources-build.xml \
java/core/generate-test-sources-build.xml \
java/core/pom.xml \
@@ -504,6 +506,7 @@
java/core/src/test/proto/com/google/protobuf/test_extra_interfaces.proto \
java/core/src/test/proto/com/google/protobuf/wrappers_test.proto \
java/lite.md \
+ java/lite/BUILD \
java/lite/generate-sources-build.xml \
java/lite/generate-test-sources-build.xml \
java/lite/lite.awk \
@@ -512,6 +515,7 @@
java/lite/src/test/java/com/google/protobuf/LiteTest.java \
java/lite/src/test/java/com/google/protobuf/Proto2MessageLiteInfoFactory.java \
java/pom.xml \
+ java/util/BUILD \
java/util/pom.xml \
java/util/src/main/java/com/google/protobuf/util/Durations.java \
java/util/src/main/java/com/google/protobuf/util/FieldMaskTree.java \
@@ -1213,6 +1217,7 @@
js/test_bootstrap.js \
js/testbinary.proto \
js/testempty.proto \
+ js/testlargenumbers.proto \
js/experimental/runtime/testing/jasmine_protobuf.js \
js/experimental/runtime/testing/ensure_custom_equality_test.js \
js/experimental/runtime/testing/binary/test_message.js \
@@ -1298,7 +1303,7 @@
WORKSPACE \
cmake/CMakeLists.txt \
cmake/README.md \
- cmake/conformance.cmake \
+ cmake/conformance.cmake \
cmake/examples.cmake \
cmake/extract_includes.bat.in \
cmake/install.cmake \
@@ -1315,6 +1320,8 @@
cmake/tests.cmake \
cmake/version.rc.in \
compiler_config_setting.bzl \
+ build_files_updated_unittest.sh \
+ cc_proto_blacklist_test.bzl \
editors/README.txt \
editors/proto.vim \
editors/protobuf-mode.el \
diff --git a/Protobuf-C++.podspec b/Protobuf-C++.podspec
index 1359d02..dcb9f4d 100644
--- a/Protobuf-C++.podspec
+++ b/Protobuf-C++.podspec
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = 'Protobuf-C++'
- s.version = '3.11.2'
+ s.version = '3.11.4'
s.summary = 'Protocol Buffers v3 runtime library for C++.'
s.homepage = 'https://github.com/google/protobuf'
s.license = '3-Clause BSD License'
diff --git a/Protobuf.podspec b/Protobuf.podspec
index 0371b7b..d6d6a8e 100644
--- a/Protobuf.podspec
+++ b/Protobuf.podspec
@@ -5,7 +5,7 @@
# dependent projects use the :git notation to refer to the library.
Pod::Spec.new do |s|
s.name = 'Protobuf'
- s.version = '3.11.2'
+ s.version = '3.11.4'
s.summary = 'Protocol Buffers v.3 runtime library for Objective-C.'
s.homepage = 'https://github.com/protocolbuffers/protobuf'
s.license = '3-Clause BSD License'
diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
index 8e5e680..8496799 100644
--- a/cmake/CMakeLists.txt
+++ b/cmake/CMakeLists.txt
@@ -28,6 +28,14 @@
set(CMAKE_CXX_EXTENSIONS OFF)
endif()
+# The Intel compiler isn't able to deal with noinline member functions of
+# template classses defined in headers. As such it spams the output with
+# warning #2196: routine is both "inline" and "noinline"
+# This silences that warning.
+if (CMAKE_CXX_COMPILER_ID MATCHES Intel)
+ string(APPEND CMAKE_CXX_FLAGS " -diag-disable=2196")
+endif()
+
# Options
option(protobuf_BUILD_TESTS "Build tests" ON)
option(protobuf_BUILD_CONFORMANCE "Build conformance tests" OFF)
diff --git a/compiler_config_setting.bzl b/compiler_config_setting.bzl
index 5e52a65..f4d1f7b 100644
--- a/compiler_config_setting.bzl
+++ b/compiler_config_setting.bzl
@@ -1,6 +1,6 @@
"""Creates config_setting that allows selecting based on 'compiler' value."""
-def create_compiler_config_setting(name, value):
+def create_compiler_config_setting(name, value, visibility = None):
# The "do_not_use_tools_cpp_compiler_present" attribute exists to
# distinguish between older versions of Bazel that do not support
# "@bazel_tools//tools/cpp:compiler" flag_value, and newer ones that do.
@@ -13,9 +13,11 @@
flag_values = {
"@bazel_tools//tools/cpp:compiler": value,
},
+ visibility = visibility,
)
else:
native.config_setting(
name = name,
values = {"compiler": value},
+ visibility = visibility,
)
diff --git a/configure.ac b/configure.ac
index df39c05..a86499a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -17,7 +17,7 @@
# In the SVN trunk, the version should always be the next anticipated release
# version with the "-pre" suffix. (We used to use "-SNAPSHOT" but this pushed
# the size of one file name in the dist tarfile over the 99-char limit.)
-AC_INIT([Protocol Buffers],[3.11.2],[protobuf@googlegroups.com],[protobuf])
+AC_INIT([Protocol Buffers],[3.11.4],[protobuf@googlegroups.com],[protobuf])
AM_MAINTAINER_MODE([enable])
diff --git a/conformance/failure_list_ruby.txt b/conformance/failure_list_ruby.txt
index 4573c59..f9533ae 100644
--- a/conformance/failure_list_ruby.txt
+++ b/conformance/failure_list_ruby.txt
@@ -94,25 +94,7 @@
Required.Proto3.JsonInput.IgnoreUnknownJsonString.ProtobufOutput
Required.Proto3.JsonInput.IgnoreUnknownJsonTrue.ProtobufOutput
Required.Proto3.JsonInput.OneofFieldDuplicate
-Required.Proto3.JsonInput.OptionalBoolWrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalBytesWrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalDoubleWrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalFloatWrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalInt32Wrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalInt64Wrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalStringWrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalUint32Wrapper.JsonOutput
-Required.Proto3.JsonInput.OptionalUint64Wrapper.JsonOutput
Required.Proto3.JsonInput.RejectTopLevelNull
-Required.Proto3.JsonInput.RepeatedBoolWrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedBytesWrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedDoubleWrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedFloatWrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedInt32Wrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedInt64Wrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedStringWrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedUint32Wrapper.JsonOutput
-Required.Proto3.JsonInput.RepeatedUint64Wrapper.JsonOutput
Required.Proto3.JsonInput.StringFieldSurrogatePair.JsonOutput
Required.Proto3.JsonInput.StringFieldSurrogatePair.ProtobufOutput
Required.Proto3.ProtobufInput.DoubleFieldNormalizeQuietNan.JsonOutput
diff --git a/csharp/Google.Protobuf.Tools.nuspec b/csharp/Google.Protobuf.Tools.nuspec
index 3823e20..91d28ed 100644
--- a/csharp/Google.Protobuf.Tools.nuspec
+++ b/csharp/Google.Protobuf.Tools.nuspec
@@ -5,7 +5,7 @@
<title>Google Protocol Buffers tools</title>
<summary>Tools for Protocol Buffers - Google's data interchange format.</summary>
<description>See project site for more info.</description>
- <version>3.11.2</version>
+ <version>3.11.4</version>
<authors>Google Inc.</authors>
<owners>protobuf-packages</owners>
<licenseUrl>https://github.com/protocolbuffers/protobuf/blob/master/LICENSE</licenseUrl>
@@ -20,7 +20,6 @@
<file src="protoc\windows_x64\protoc.exe" target="tools\windows_x64\protoc.exe"/>
<file src="protoc\linux_x86\protoc" target="tools\linux_x86\protoc"/>
<file src="protoc\linux_x64\protoc" target="tools\linux_x64\protoc"/>
- <file src="protoc\macosx_x86\protoc" target="tools\macosx_x86\protoc"/>
<file src="protoc\macosx_x64\protoc" target="tools\macosx_x64\protoc"/>
<file src="..\src\google\protobuf\any.proto" target="tools\google\protobuf"/>
<file src="..\src\google\protobuf\api.proto" target="tools\google\protobuf"/>
diff --git a/csharp/build_tools.sh b/csharp/build_tools.sh
index 182c5c5..771affd 100755
--- a/csharp/build_tools.sh
+++ b/csharp/build_tools.sh
@@ -19,7 +19,6 @@
declare -a FILE_NAMES=( \
windows_x86 windows-x86_32.exe \
windows_x64 windows-x86_64.exe \
- macosx_x86 osx-x86_32.exe \
macosx_x64 osx-x86_64.exe \
linux_x86 linux-x86_32.exe \
linux_x64 linux-x86_64.exe \
diff --git a/csharp/src/Google.Protobuf/Google.Protobuf.csproj b/csharp/src/Google.Protobuf/Google.Protobuf.csproj
index e8e33e2..53f45fe 100644
--- a/csharp/src/Google.Protobuf/Google.Protobuf.csproj
+++ b/csharp/src/Google.Protobuf/Google.Protobuf.csproj
@@ -4,7 +4,7 @@
<Description>C# runtime library for Protocol Buffers - Google's data interchange format.</Description>
<Copyright>Copyright 2015, Google Inc.</Copyright>
<AssemblyTitle>Google Protocol Buffers</AssemblyTitle>
- <VersionPrefix>3.11.2</VersionPrefix>
+ <VersionPrefix>3.11.4</VersionPrefix>
<LangVersion>6</LangVersion>
<Authors>Google Inc.</Authors>
<TargetFrameworks>netstandard1.0;netstandard2.0;net45</TargetFrameworks>
diff --git a/docs/options.md b/docs/options.md
index ad7cd0d..5e90579 100644
--- a/docs/options.md
+++ b/docs/options.md
@@ -224,3 +224,7 @@
1. Wire since and until
* Website: https://square.github.io/wire/
* Extensions: 1076, 1077
+
+1. Bazel, Failure Details
+ * Website: https://github.com/bazelbuild/bazel
+ * Extensions: 1078
diff --git a/examples/.gitignore b/examples/.gitignore
new file mode 100644
index 0000000..229542d
--- /dev/null
+++ b/examples/.gitignore
@@ -0,0 +1,2 @@
+# Ignore the bazel symlinks
+/bazel-*
diff --git a/java/BUILD b/java/BUILD
new file mode 100644
index 0000000..779fa9e
--- /dev/null
+++ b/java/BUILD
@@ -0,0 +1,9 @@
+config_setting(
+ name = "jdk9",
+ values = {
+ "java_toolchain": "@bazel_tools//tools/jdk:toolchain_jdk9",
+ },
+ visibility = [
+ "//java:__subpackages__",
+ ],
+)
diff --git a/java/bom/pom.xml b/java/bom/pom.xml
index ea15d48..f499bd1 100644
--- a/java/bom/pom.xml
+++ b/java/bom/pom.xml
@@ -4,7 +4,7 @@
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-bom</artifactId>
- <version>3.11.2</version>
+ <version>3.11.4</version>
<packaging>pom</packaging>
<name>Protocol Buffers [BOM]</name>
diff --git a/java/core/BUILD b/java/core/BUILD
new file mode 100644
index 0000000..5f4a7ab
--- /dev/null
+++ b/java/core/BUILD
@@ -0,0 +1,137 @@
+load("@rules_java//java:defs.bzl", "java_library")
+load("@rules_proto//proto:defs.bzl", "proto_lang_toolchain")
+
+LITE_SRCS = [
+ # Keep in sync with `//java/lite:pom.xml`.
+ "src/main/java/com/google/protobuf/AbstractMessageLite.java",
+ "src/main/java/com/google/protobuf/AbstractParser.java",
+ "src/main/java/com/google/protobuf/AbstractProtobufList.java",
+ "src/main/java/com/google/protobuf/AllocatedBuffer.java",
+ "src/main/java/com/google/protobuf/Android.java",
+ "src/main/java/com/google/protobuf/ArrayDecoders.java",
+ "src/main/java/com/google/protobuf/BinaryReader.java",
+ "src/main/java/com/google/protobuf/BinaryWriter.java",
+ "src/main/java/com/google/protobuf/BooleanArrayList.java",
+ "src/main/java/com/google/protobuf/BufferAllocator.java",
+ "src/main/java/com/google/protobuf/ByteBufferWriter.java",
+ "src/main/java/com/google/protobuf/ByteOutput.java",
+ "src/main/java/com/google/protobuf/ByteString.java",
+ "src/main/java/com/google/protobuf/CodedInputStream.java",
+ "src/main/java/com/google/protobuf/CodedInputStreamReader.java",
+ "src/main/java/com/google/protobuf/CodedOutputStream.java",
+ "src/main/java/com/google/protobuf/CodedOutputStreamWriter.java",
+ "src/main/java/com/google/protobuf/DoubleArrayList.java",
+ "src/main/java/com/google/protobuf/ExperimentalApi.java",
+ "src/main/java/com/google/protobuf/ExtensionLite.java",
+ "src/main/java/com/google/protobuf/ExtensionRegistryFactory.java",
+ "src/main/java/com/google/protobuf/ExtensionRegistryLite.java",
+ "src/main/java/com/google/protobuf/ExtensionSchema.java",
+ "src/main/java/com/google/protobuf/ExtensionSchemaLite.java",
+ "src/main/java/com/google/protobuf/ExtensionSchemas.java",
+ "src/main/java/com/google/protobuf/FieldInfo.java",
+ "src/main/java/com/google/protobuf/FieldSet.java",
+ "src/main/java/com/google/protobuf/FieldType.java",
+ "src/main/java/com/google/protobuf/FloatArrayList.java",
+ "src/main/java/com/google/protobuf/GeneratedMessageInfoFactory.java",
+ "src/main/java/com/google/protobuf/GeneratedMessageLite.java",
+ "src/main/java/com/google/protobuf/IntArrayList.java",
+ "src/main/java/com/google/protobuf/Internal.java",
+ "src/main/java/com/google/protobuf/InvalidProtocolBufferException.java",
+ "src/main/java/com/google/protobuf/IterableByteBufferInputStream.java",
+ "src/main/java/com/google/protobuf/JavaType.java",
+ "src/main/java/com/google/protobuf/LazyField.java",
+ "src/main/java/com/google/protobuf/LazyFieldLite.java",
+ "src/main/java/com/google/protobuf/LazyStringArrayList.java",
+ "src/main/java/com/google/protobuf/LazyStringList.java",
+ "src/main/java/com/google/protobuf/ListFieldSchema.java",
+ "src/main/java/com/google/protobuf/LongArrayList.java",
+ "src/main/java/com/google/protobuf/ManifestSchemaFactory.java",
+ "src/main/java/com/google/protobuf/MapEntryLite.java",
+ "src/main/java/com/google/protobuf/MapFieldLite.java",
+ "src/main/java/com/google/protobuf/MapFieldSchema.java",
+ "src/main/java/com/google/protobuf/MapFieldSchemaLite.java",
+ "src/main/java/com/google/protobuf/MapFieldSchemas.java",
+ "src/main/java/com/google/protobuf/MessageInfo.java",
+ "src/main/java/com/google/protobuf/MessageInfoFactory.java",
+ "src/main/java/com/google/protobuf/MessageLite.java",
+ "src/main/java/com/google/protobuf/MessageLiteOrBuilder.java",
+ "src/main/java/com/google/protobuf/MessageLiteToString.java",
+ "src/main/java/com/google/protobuf/MessageSchema.java",
+ "src/main/java/com/google/protobuf/MessageSetSchema.java",
+ "src/main/java/com/google/protobuf/MutabilityOracle.java",
+ "src/main/java/com/google/protobuf/NewInstanceSchema.java",
+ "src/main/java/com/google/protobuf/NewInstanceSchemaLite.java",
+ "src/main/java/com/google/protobuf/NewInstanceSchemas.java",
+ "src/main/java/com/google/protobuf/NioByteString.java",
+ "src/main/java/com/google/protobuf/OneofInfo.java",
+ "src/main/java/com/google/protobuf/Parser.java",
+ "src/main/java/com/google/protobuf/PrimitiveNonBoxingCollection.java",
+ "src/main/java/com/google/protobuf/ProtoSyntax.java",
+ "src/main/java/com/google/protobuf/Protobuf.java",
+ "src/main/java/com/google/protobuf/ProtobufArrayList.java",
+ "src/main/java/com/google/protobuf/ProtobufLists.java",
+ "src/main/java/com/google/protobuf/ProtocolStringList.java",
+ "src/main/java/com/google/protobuf/RawMessageInfo.java",
+ "src/main/java/com/google/protobuf/Reader.java",
+ "src/main/java/com/google/protobuf/RopeByteString.java",
+ "src/main/java/com/google/protobuf/Schema.java",
+ "src/main/java/com/google/protobuf/SchemaFactory.java",
+ "src/main/java/com/google/protobuf/SchemaUtil.java",
+ "src/main/java/com/google/protobuf/SmallSortedMap.java",
+ "src/main/java/com/google/protobuf/StructuralMessageInfo.java",
+ "src/main/java/com/google/protobuf/TextFormatEscaper.java",
+ "src/main/java/com/google/protobuf/UninitializedMessageException.java",
+ "src/main/java/com/google/protobuf/UnknownFieldSchema.java",
+ "src/main/java/com/google/protobuf/UnknownFieldSetLite.java",
+ "src/main/java/com/google/protobuf/UnknownFieldSetLiteSchema.java",
+ "src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java",
+ "src/main/java/com/google/protobuf/UnsafeUtil.java",
+ "src/main/java/com/google/protobuf/Utf8.java",
+ "src/main/java/com/google/protobuf/WireFormat.java",
+ "src/main/java/com/google/protobuf/Writer.java",
+]
+
+javacopts = select({
+ "//java:jdk9": ["--add-modules=jdk.unsupported"],
+ "//conditions:default": [
+ "-source 7",
+ "-target 7",
+ ],
+})
+
+# Should be used as `//java/lite`.
+java_library(
+ name = "lite",
+ srcs = LITE_SRCS,
+ javacopts = javacopts,
+ visibility = [
+ "//java/lite:__pkg__",
+ ],
+)
+
+java_library(
+ name = "core",
+ srcs = glob(
+ [
+ "src/main/java/com/google/protobuf/*.java",
+ ],
+ exclude = LITE_SRCS,
+ ) + [
+ "//:gen_well_known_protos_java",
+ ],
+ javacopts = javacopts,
+ visibility = ["//visibility:public"],
+ exports = [
+ "//java/lite",
+ ],
+ deps = [
+ "//java/lite",
+ ],
+)
+
+proto_lang_toolchain(
+ name = "toolchain",
+ command_line = "--java_out=$(OUT)",
+ runtime = ":core",
+ visibility = ["//visibility:public"],
+)
diff --git a/java/core/pom.xml b/java/core/pom.xml
index a57f2aa..79a1e71 100644
--- a/java/core/pom.xml
+++ b/java/core/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-parent</artifactId>
- <version>3.11.2</version>
+ <version>3.11.4</version>
</parent>
<artifactId>protobuf-java</artifactId>
diff --git a/java/lite/BUILD b/java/lite/BUILD
new file mode 100644
index 0000000..22840ec
--- /dev/null
+++ b/java/lite/BUILD
@@ -0,0 +1,14 @@
+load("@rules_proto//proto:defs.bzl", "proto_lang_toolchain")
+
+alias(
+ name = "lite",
+ actual = "//java/core:lite",
+ visibility = ["//visibility:public"],
+)
+
+proto_lang_toolchain(
+ name = "toolchain",
+ command_line = "--java_out=lite:$(OUT)",
+ runtime = ":lite",
+ visibility = ["//visibility:public"],
+)
diff --git a/java/lite/pom.xml b/java/lite/pom.xml
index 81e0521..9c7d6ef 100644
--- a/java/lite/pom.xml
+++ b/java/lite/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-parent</artifactId>
- <version>3.11.2</version>
+ <version>3.11.4</version>
</parent>
<artifactId>protobuf-javalite</artifactId>
@@ -89,7 +89,7 @@
<resource>
<directory>${basedir}/../core/src/main/java/com/google/protobuf</directory>
<includes>
- <!-- Keep in sync with //:BUILD -->
+ <!-- Keep in sync with //java/core:BUILD -->
<include>AbstractMessageLite.java</include>
<include>AbstractParser.java</include>
<include>AbstractProtobufList.java</include>
diff --git a/java/pom.xml b/java/pom.xml
index 8d07e08..2889f90 100644
--- a/java/pom.xml
+++ b/java/pom.xml
@@ -4,7 +4,7 @@
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-parent</artifactId>
- <version>3.11.2</version>
+ <version>3.11.4</version>
<packaging>pom</packaging>
<name>Protocol Buffers [Parent]</name>
diff --git a/java/util/BUILD b/java/util/BUILD
new file mode 100644
index 0000000..cfdb28e
--- /dev/null
+++ b/java/util/BUILD
@@ -0,0 +1,20 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+java_library(
+ name = "util",
+ srcs = glob([
+ "src/main/java/com/google/protobuf/util/*.java",
+ ]),
+ javacopts = [
+ "-source 7",
+ "-target 7",
+ ],
+ visibility = ["//visibility:public"],
+ deps = [
+ "//external:error_prone_annotations",
+ "//external:gson",
+ "//external:guava",
+ "//java/core",
+ "//java/lite",
+ ],
+)
diff --git a/java/util/pom.xml b/java/util/pom.xml
index 56d6488..58d05d2 100644
--- a/java/util/pom.xml
+++ b/java/util/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-parent</artifactId>
- <version>3.11.2</version>
+ <version>3.11.4</version>
</parent>
<artifactId>protobuf-java-util</artifactId>
diff --git a/js/experimental/runtime/kernel/buffer_decoder.js b/js/experimental/runtime/kernel/buffer_decoder.js
index 614659a..2b4157e 100644
--- a/js/experimental/runtime/kernel/buffer_decoder.js
+++ b/js/experimental/runtime/kernel/buffer_decoder.js
@@ -6,7 +6,7 @@
const ByteString = goog.require('protobuf.ByteString');
const functions = goog.require('goog.functions');
-const {POLYFILL_TEXT_ENCODING, checkCriticalElementIndex, checkCriticalPositionIndex, checkState} = goog.require('protobuf.internal.checks');
+const {POLYFILL_TEXT_ENCODING, checkCriticalPositionIndex, checkCriticalState, checkState} = goog.require('protobuf.internal.checks');
const {byteStringFromUint8ArrayUnsafe} = goog.require('protobuf.byteStringInternal');
const {concatenateByteArrays} = goog.require('protobuf.binary.uint8arrays');
const {decode} = goog.require('protobuf.binary.textencoding');
@@ -72,7 +72,9 @@
/** @private @const {number} */
this.startIndex_ = startIndex;
/** @private @const {number} */
- this.endIndex_ = this.startIndex_ + length;
+ this.endIndex_ = startIndex + length;
+ /** @private {number} */
+ this.cursor_ = startIndex;
}
/**
@@ -100,11 +102,37 @@
}
/**
+ * Returns the start position of the next data, i.e. end position of the last
+ * read data + 1.
+ * @return {number}
+ */
+ cursor() {
+ return this.cursor_;
+ }
+
+ /**
+ * Sets the cursor to the specified position.
+ * @param {number} position
+ */
+ setCursor(position) {
+ this.cursor_ = position;
+ }
+
+ /**
+ * Returns if there is more data to read after the current cursor position.
+ * @return {boolean}
+ */
+ hasNext() {
+ return this.cursor_ < this.endIndex_;
+ }
+
+ /**
* Returns a float32 from a given index
* @param {number} index
* @return {number}
*/
getFloat32(index) {
+ this.cursor_ = index + 4;
return this.dataView_.getFloat32(index, true);
}
@@ -114,6 +142,7 @@
* @return {number}
*/
getFloat64(index) {
+ this.cursor_ = index + 8;
return this.dataView_.getFloat64(index, true);
}
@@ -123,45 +152,40 @@
* @return {number}
*/
getInt32(index) {
+ this.cursor_ = index + 4;
return this.dataView_.getInt32(index, true);
}
/**
- * @param {number} index
- * @return {number}
- */
- getUint8(index) {
- return this.dataView_.getUint8(index);
- }
-
- /**
* Returns a uint32 from a given index
* @param {number} index
* @return {number}
*/
getUint32(index) {
+ this.cursor_ = index + 4;
return this.dataView_.getUint32(index, true);
}
/**
- * Returns two JS numbers each representing 32 bits of a 64 bit number.
+ * Returns two JS numbers each representing 32 bits of a 64 bit number. Also
+ * sets the cursor to the start of the next block of data.
* @param {number} index
- * @return {{lowBits: number, highBits: number, dataStart: number}}
+ * @return {{lowBits: number, highBits: number}}
*/
getVarint(index) {
- let start = index;
+ this.cursor_ = index;
let lowBits = 0;
let highBits = 0;
for (let shift = 0; shift < 28; shift += 7) {
- const b = this.dataView_.getUint8(start++);
+ const b = this.dataView_.getUint8(this.cursor_++);
lowBits |= (b & 0x7F) << shift;
if ((b & 0x80) === 0) {
- return {lowBits, highBits, dataStart: start};
+ return {lowBits, highBits};
}
}
- const middleByte = this.dataView_.getUint8(start++);
+ const middleByte = this.dataView_.getUint8(this.cursor_++);
// last four bits of the first 32 bit number
lowBits |= (middleByte & 0x0F) << 28;
@@ -170,36 +194,100 @@
highBits = (middleByte & 0x70) >> 4;
if ((middleByte & 0x80) === 0) {
- return {lowBits, highBits, dataStart: start};
+ return {lowBits, highBits};
}
for (let shift = 3; shift <= 31; shift += 7) {
- const b = this.dataView_.getUint8(start++);
+ const b = this.dataView_.getUint8(this.cursor_++);
highBits |= (b & 0x7F) << shift;
if ((b & 0x80) === 0) {
- return {lowBits, highBits, dataStart: start};
+ return {lowBits, highBits};
}
}
- checkState(false, 'Data is longer than 10 bytes');
- return {lowBits, highBits, dataStart: start};
+ checkCriticalState(false, 'Data is longer than 10 bytes');
+
+ return {lowBits, highBits};
}
/**
- * Skips over a varint at a given index and returns the next position.
+ * Returns an unsigned int32 number at the current cursor position. The upper
+ * bits are discarded if the varint is longer than 32 bits. Also sets the
+ * cursor to the start of the next block of data.
+ * @return {number}
+ */
+ getUnsignedVarint32() {
+ let b = this.dataView_.getUint8(this.cursor_++);
+ let result = b & 0x7F;
+ if ((b & 0x80) === 0) {
+ return result;
+ }
+
+ b = this.dataView_.getUint8(this.cursor_++);
+ result |= (b & 0x7F) << 7;
+ if ((b & 0x80) === 0) {
+ return result;
+ }
+
+ b = this.dataView_.getUint8(this.cursor_++);
+ result |= (b & 0x7F) << 14;
+ if ((b & 0x80) === 0) {
+ return result;
+ }
+
+ b = this.dataView_.getUint8(this.cursor_++);
+ result |= (b & 0x7F) << 21;
+ if ((b & 0x80) === 0) {
+ return result;
+ }
+
+ // Extract only last 4 bits
+ b = this.dataView_.getUint8(this.cursor_++);
+ result |= (b & 0x0F) << 28;
+
+ for (let readBytes = 5; ((b & 0x80) !== 0) && readBytes < 10; readBytes++) {
+ b = this.dataView_.getUint8(this.cursor_++);
+ }
+
+ checkCriticalState((b & 0x80) === 0, 'Data is longer than 10 bytes');
+
+ // Result can be have 32 bits, convert it to unsigned
+ return result >>> 0;
+ }
+
+ /**
+ * Returns an unsigned int32 number at the specified index. The upper bits are
+ * discarded if the varint is longer than 32 bits. Also sets the cursor to the
+ * start of the next block of data.
+ * @param {number} index
+ * @return {number}
+ */
+ getUnsignedVarint32At(index) {
+ this.cursor_ = index;
+ return this.getUnsignedVarint32();
+ }
+
+ /**
+ * Seeks forward by the given amount.
+ * @param {number} skipAmount
+ * @package
+ */
+ skip(skipAmount) {
+ this.cursor_ += skipAmount;
+ checkCriticalPositionIndex(this.cursor_, this.endIndex_);
+ }
+
+ /**
+ * Skips over a varint at a given index.
* @param {number} index Start of the data.
- * @return {number} Position of the first byte after the varint.
* @package
*/
skipVarint(index) {
- let cursor = index;
- checkCriticalElementIndex(cursor, this.endIndex());
- while (this.dataView_.getUint8(cursor++) & 0x80) {
- checkCriticalElementIndex(cursor, this.endIndex());
+ this.cursor_ = index;
+ while (this.dataView_.getUint8(this.cursor_++) & 0x80) {
}
- checkCriticalPositionIndex(cursor, index + 10);
- return cursor;
+ checkCriticalPositionIndex(this.cursor_, index + 10);
}
/**
diff --git a/js/experimental/runtime/kernel/buffer_decoder_test.js b/js/experimental/runtime/kernel/buffer_decoder_test.js
index aed045a..7c549f8 100644
--- a/js/experimental/runtime/kernel/buffer_decoder_test.js
+++ b/js/experimental/runtime/kernel/buffer_decoder_test.js
@@ -5,7 +5,7 @@
goog.module('protobuf.binary.varintsTest');
const BufferDecoder = goog.require('protobuf.binary.BufferDecoder');
-const {CHECK_CRITICAL_BOUNDS, CHECK_STATE} = goog.require('protobuf.internal.checks');
+const {CHECK_CRITICAL_STATE, CHECK_STATE} = goog.require('protobuf.internal.checks');
goog.setTestOnly();
@@ -17,25 +17,47 @@
return new Uint8Array(bytes).buffer;
}
+describe('setCursor does', () => {
+ it('set the cursor at the position specified', () => {
+ const bufferDecoder =
+ BufferDecoder.fromArrayBuffer(createArrayBuffer(0x0, 0x1));
+ expect(bufferDecoder.cursor()).toBe(0);
+ bufferDecoder.setCursor(1);
+ expect(bufferDecoder.cursor()).toBe(1);
+ });
+});
+
+describe('skip does', () => {
+ it('advance the cursor', () => {
+ const bufferDecoder =
+ BufferDecoder.fromArrayBuffer(createArrayBuffer(0x0, 0x1, 0x2));
+ bufferDecoder.setCursor(1);
+ bufferDecoder.skip(1);
+ expect(bufferDecoder.cursor()).toBe(2);
+ });
+});
+
describe('Skip varint does', () => {
it('skip a varint', () => {
const bufferDecoder =
BufferDecoder.fromArrayBuffer(createArrayBuffer(0x01));
- expect(bufferDecoder.skipVarint(0)).toBe(1);
+ bufferDecoder.skipVarint(0);
+ expect(bufferDecoder.cursor()).toBe(1);
});
it('fail when varint is larger than 10 bytes', () => {
const bufferDecoder = BufferDecoder.fromArrayBuffer(createArrayBuffer(
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00));
- if (CHECK_CRITICAL_BOUNDS) {
+ if (CHECK_CRITICAL_STATE) {
expect(() => bufferDecoder.skipVarint(0)).toThrow();
} else {
// Note in unchecked mode we produce invalid output for invalid inputs.
// This test just documents our behavior in those cases.
// These values might change at any point and are not considered
// what the implementation should be doing here.
- expect(bufferDecoder.skipVarint(0)).toBe(11);
+ bufferDecoder.skipVarint(0);
+ expect(bufferDecoder.cursor()).toBe(11);
}
});
@@ -50,28 +72,144 @@
it('read zero', () => {
const bufferDecoder =
BufferDecoder.fromArrayBuffer(createArrayBuffer(0x00));
- const {dataStart, lowBits, highBits} = bufferDecoder.getVarint(0);
- expect(dataStart).toBe(1);
+ const {lowBits, highBits} = bufferDecoder.getVarint(0);
expect(lowBits).toBe(0);
expect(highBits).toBe(0);
+ expect(bufferDecoder.cursor()).toBe(1);
});
it('read one', () => {
const bufferDecoder =
BufferDecoder.fromArrayBuffer(createArrayBuffer(0x01));
- const {dataStart, lowBits, highBits} = bufferDecoder.getVarint(0);
- expect(dataStart).toBe(1);
+ const {lowBits, highBits} = bufferDecoder.getVarint(0);
expect(lowBits).toBe(1);
expect(highBits).toBe(0);
+ expect(bufferDecoder.cursor()).toBe(1);
});
it('read max value', () => {
const bufferDecoder = BufferDecoder.fromArrayBuffer(createArrayBuffer(
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01));
- const {dataStart, lowBits, highBits} = bufferDecoder.getVarint(0);
- expect(dataStart).toBe(10);
+ const {lowBits, highBits} = bufferDecoder.getVarint(0);
expect(lowBits).toBe(-1);
expect(highBits).toBe(-1);
+ expect(bufferDecoder.cursor()).toBe(10);
+ });
+});
+
+describe('readUnsignedVarint32 does', () => {
+ it('read zero', () => {
+ const bufferDecoder =
+ BufferDecoder.fromArrayBuffer(createArrayBuffer(0x00));
+ const result = bufferDecoder.getUnsignedVarint32();
+ expect(result).toBe(0);
+ expect(bufferDecoder.cursor()).toBe(1);
+ });
+
+ it('read one', () => {
+ const bufferDecoder =
+ BufferDecoder.fromArrayBuffer(createArrayBuffer(0x01));
+ const result = bufferDecoder.getUnsignedVarint32();
+ expect(result).toBe(1);
+ expect(bufferDecoder.cursor()).toBe(1);
+ });
+
+ it('read max int32', () => {
+ const bufferDecoder = BufferDecoder.fromArrayBuffer(
+ createArrayBuffer(0xFF, 0xFF, 0xFF, 0xFF, 0x0F));
+ const result = bufferDecoder.getUnsignedVarint32();
+ expect(result).toBe(4294967295);
+ expect(bufferDecoder.cursor()).toBe(5);
+ });
+
+ it('read max value', () => {
+ const bufferDecoder = BufferDecoder.fromArrayBuffer(createArrayBuffer(
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01));
+ const result = bufferDecoder.getUnsignedVarint32();
+ expect(result).toBe(4294967295);
+ expect(bufferDecoder.cursor()).toBe(10);
+ });
+
+ it('fail if data is longer than 10 bytes', () => {
+ const bufferDecoder = BufferDecoder.fromArrayBuffer(createArrayBuffer(
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01));
+ if (CHECK_CRITICAL_STATE) {
+ expect(() => bufferDecoder.getUnsignedVarint32()).toThrow();
+ } else {
+ // Note in unchecked mode we produce invalid output for invalid inputs.
+ // This test just documents our behavior in those cases.
+ // These values might change at any point and are not considered
+ // what the implementation should be doing here.
+ const result = bufferDecoder.getUnsignedVarint32();
+ expect(result).toBe(4294967295);
+ expect(bufferDecoder.cursor()).toBe(10);
+ }
+ });
+});
+
+describe('readUnsignedVarint32At does', () => {
+ it('reads from a specific index', () => {
+ const bufferDecoder =
+ BufferDecoder.fromArrayBuffer(createArrayBuffer(0x1, 0x2));
+ const result = bufferDecoder.getUnsignedVarint32At(1);
+ expect(result).toBe(2);
+ expect(bufferDecoder.cursor()).toBe(2);
+ });
+});
+
+describe('getFloat32 does', () => {
+ it('read one', () => {
+ const bufferDecoder = BufferDecoder.fromArrayBuffer(
+ createArrayBuffer(0x00, 0x00, 0x80, 0x3F));
+ const result = bufferDecoder.getFloat32(0);
+ expect(result).toBe(1);
+ expect(bufferDecoder.cursor()).toBe(4);
+ });
+});
+
+describe('getFloat64 does', () => {
+ it('read one', () => {
+ const bufferDecoder = BufferDecoder.fromArrayBuffer(
+ createArrayBuffer(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F));
+ const result = bufferDecoder.getFloat64(0);
+ expect(result).toBe(1);
+ expect(bufferDecoder.cursor()).toBe(8);
+ });
+});
+
+describe('getInt32 does', () => {
+ it('read one', () => {
+ const bufferDecoder = BufferDecoder.fromArrayBuffer(
+ createArrayBuffer(0x01, 0x00, 0x00, 0x00));
+ const result = bufferDecoder.getInt32(0);
+ expect(result).toBe(1);
+ expect(bufferDecoder.cursor()).toBe(4);
+ });
+
+ it('read minus one', () => {
+ const bufferDecoder = BufferDecoder.fromArrayBuffer(
+ createArrayBuffer(0xFF, 0xFF, 0xFF, 0xFF));
+ const result = bufferDecoder.getInt32(0);
+ expect(result).toBe(-1);
+ expect(bufferDecoder.cursor()).toBe(4);
+ });
+});
+
+describe('getUint32 does', () => {
+ it('read one', () => {
+ const bufferDecoder =
+ BufferDecoder.fromArrayBuffer(createArrayBuffer(0x01, 0x00, 0x00, 0x0));
+ const result = bufferDecoder.getUint32(0);
+ expect(result).toBe(1);
+ expect(bufferDecoder.cursor()).toBe(4);
+ });
+
+ it('read max uint32', () => {
+ const bufferDecoder = BufferDecoder.fromArrayBuffer(
+ createArrayBuffer(0xFF, 0xFF, 0xFF, 0xFF));
+ const result = bufferDecoder.getUint32(0);
+ expect(result).toBe(4294967295);
+ expect(bufferDecoder.cursor()).toBe(4);
});
});
diff --git a/js/experimental/runtime/kernel/indexer.js b/js/experimental/runtime/kernel/indexer.js
index c247c2f..e281994 100644
--- a/js/experimental/runtime/kernel/indexer.js
+++ b/js/experimental/runtime/kernel/indexer.js
@@ -8,7 +8,7 @@
const Storage = goog.require('protobuf.binary.Storage');
const WireType = goog.require('protobuf.binary.WireType');
const {Field} = goog.require('protobuf.binary.field');
-const {checkCriticalPositionIndex, checkCriticalState} = goog.require('protobuf.internal.checks');
+const {checkCriticalElementIndex, checkCriticalState} = goog.require('protobuf.internal.checks');
/**
* Appends a new entry in the index array for the given field number.
@@ -57,8 +57,6 @@
constructor(bufferDecoder) {
/** @private @const {!BufferDecoder} */
this.bufferDecoder_ = bufferDecoder;
- /** @private {number} */
- this.cursor_ = bufferDecoder.startIndex();
}
/**
@@ -66,15 +64,18 @@
* @return {!Storage<!Field>}
*/
index(pivot) {
+ this.bufferDecoder_.setCursor(this.bufferDecoder_.startIndex());
+
const storage = new Storage(pivot);
- while (this.hasNextByte_()) {
- const tag = this.readVarInt32_();
+ while (this.bufferDecoder_.hasNext()) {
+ const tag = this.bufferDecoder_.getUnsignedVarint32();
const wireType = tagToWireType(tag);
const fieldNumber = tagToFieldNumber(tag);
checkCriticalState(
fieldNumber > 0, `Invalid field number ${fieldNumber}`);
- addIndexEntry(storage, fieldNumber, wireType, this.cursor_);
+ addIndexEntry(
+ storage, fieldNumber, wireType, this.bufferDecoder_.cursor());
checkCriticalState(
!this.skipField_(wireType, fieldNumber),
@@ -93,14 +94,18 @@
skipField_(wireType, fieldNumber) {
switch (wireType) {
case WireType.VARINT:
- this.cursor_ = this.bufferDecoder_.skipVarint(this.cursor_);
+ checkCriticalElementIndex(
+ this.bufferDecoder_.cursor(), this.bufferDecoder_.endIndex());
+ this.bufferDecoder_.skipVarint(this.bufferDecoder_.cursor());
return false;
case WireType.FIXED64:
- this.skip_(8);
+ this.bufferDecoder_.skip(8);
return false;
case WireType.DELIMITED:
- const length = this.readVarInt32_();
- this.skip_(length);
+ checkCriticalElementIndex(
+ this.bufferDecoder_.cursor(), this.bufferDecoder_.endIndex());
+ const length = this.bufferDecoder_.getUnsignedVarint32();
+ this.bufferDecoder_.skip(length);
return false;
case WireType.START_GROUP:
checkCriticalState(this.skipGroup_(fieldNumber), 'No end group found.');
@@ -109,7 +114,7 @@
// Signal that we found a stop group to the caller
return true;
case WireType.FIXED32:
- this.skip_(4);
+ this.bufferDecoder_.skip(4);
return false;
default:
throw new Error(`Invalid wire type: ${wireType}`);
@@ -117,16 +122,6 @@
}
/**
- * Seeks forward by the given amount.
- * @param {number} skipAmount
- * @private
- */
- skip_(skipAmount) {
- this.cursor_ += skipAmount;
- checkCriticalPositionIndex(this.cursor_, this.bufferDecoder_.endIndex());
- }
-
- /**
* Skips over fields until it finds the end of a given group.
* @param {number} groupFieldNumber
* @return {boolean} Returns true if an end was found.
@@ -138,8 +133,8 @@
// Note: Since we are calling skipField from here nested groups will be
// handled by recursion of this method and thus we will not see a nested
// STOP GROUP here unless there is something wrong with the input data.
- while (this.hasNextByte_()) {
- const tag = this.readVarInt32_();
+ while (this.bufferDecoder_.hasNext()) {
+ const tag = this.bufferDecoder_.getUnsignedVarint32();
const wireType = tagToWireType(tag);
const fieldNumber = tagToFieldNumber(tag);
@@ -153,26 +148,6 @@
}
return false;
}
-
- /**
- * Returns a JS number for a 32 bit var int.
- * @return {number}
- * @private
- */
- readVarInt32_() {
- const {lowBits, dataStart} = this.bufferDecoder_.getVarint(this.cursor_);
- this.cursor_ = dataStart;
- return lowBits;
- }
-
- /**
- * Returns true if there are more bytes to read in the array.
- * @return {boolean}
- * @private
- */
- hasNextByte_() {
- return this.cursor_ < this.bufferDecoder_.endIndex();
- }
}
/**
@@ -186,7 +161,6 @@
return new Indexer(bufferDecoder).index(pivot);
}
-
exports = {
buildIndex,
};
diff --git a/js/experimental/runtime/kernel/lazy_accessor.js b/js/experimental/runtime/kernel/lazy_accessor.js
index cebf0c0..fe1f8ef 100644
--- a/js/experimental/runtime/kernel/lazy_accessor.js
+++ b/js/experimental/runtime/kernel/lazy_accessor.js
@@ -808,8 +808,10 @@
* @return {!Iterable<boolean>}
*/
getRepeatedBoolIterable(fieldNumber) {
- const array = this.getRepeatedBoolArray_(fieldNumber);
- return new ArrayIterable(array);
+ // Don't split this statement unless needed. JS compiler thinks
+ // getRepeatedBoolArray_ might have side effects and doesn't inline the
+ // call in the compiled code. See cl/293894484 for details.
+ return new ArrayIterable(this.getRepeatedBoolArray_(fieldNumber));
}
/**
@@ -857,8 +859,10 @@
* @return {!Iterable<number>}
*/
getRepeatedDoubleIterable(fieldNumber) {
- const array = this.getRepeatedDoubleArray_(fieldNumber);
- return new ArrayIterable(array);
+ // Don't split this statement unless needed. JS compiler thinks
+ // getRepeatedDoubleArray_ might have side effects and doesn't inline the
+ // call in the compiled code. See cl/293894484 for details.
+ return new ArrayIterable(this.getRepeatedDoubleArray_(fieldNumber));
}
/**
@@ -906,8 +910,10 @@
* @return {!Iterable<number>}
*/
getRepeatedFixed32Iterable(fieldNumber) {
- const array = this.getRepeatedFixed32Array_(fieldNumber);
- return new ArrayIterable(array);
+ // Don't split this statement unless needed. JS compiler thinks
+ // getRepeatedFixed32Array_ might have side effects and doesn't inline the
+ // call in the compiled code. See cl/293894484 for details.
+ return new ArrayIterable(this.getRepeatedFixed32Array_(fieldNumber));
}
/**
@@ -986,8 +992,10 @@
* @return {!Iterable<number>}
*/
getRepeatedFloatIterable(fieldNumber) {
- const array = this.getRepeatedFloatArray_(fieldNumber);
- return new ArrayIterable(array);
+ // Don't split this statement unless needed. JS compiler thinks
+ // getRepeatedFloatArray_ might have side effects and doesn't inline the
+ // call in the compiled code. See cl/293894484 for details.
+ return new ArrayIterable(this.getRepeatedFloatArray_(fieldNumber));
}
/**
@@ -1035,8 +1043,10 @@
* @return {!Iterable<number>}
*/
getRepeatedInt32Iterable(fieldNumber) {
- const array = this.getRepeatedInt32Array_(fieldNumber);
- return new ArrayIterable(array);
+ // Don't split this statement unless needed. JS compiler thinks
+ // getRepeatedInt32Array_ might have side effects and doesn't inline the
+ // call in the compiled code. See cl/293894484 for details.
+ return new ArrayIterable(this.getRepeatedInt32Array_(fieldNumber));
}
/**
@@ -1084,8 +1094,10 @@
* @return {!Iterable<!Int64>}
*/
getRepeatedInt64Iterable(fieldNumber) {
- const array = this.getRepeatedInt64Array_(fieldNumber);
- return new ArrayIterable(array);
+ // Don't split this statement unless needed. JS compiler thinks
+ // getRepeatedInt64Array_ might have side effects and doesn't inline the
+ // call in the compiled code. See cl/293894484 for details.
+ return new ArrayIterable(this.getRepeatedInt64Array_(fieldNumber));
}
/**
@@ -1133,8 +1145,10 @@
* @return {!Iterable<number>}
*/
getRepeatedSfixed32Iterable(fieldNumber) {
- const array = this.getRepeatedSfixed32Array_(fieldNumber);
- return new ArrayIterable(array);
+ // Don't split this statement unless needed. JS compiler thinks
+ // getRepeatedSfixed32Array_ might have side effects and doesn't inline the
+ // call in the compiled code. See cl/293894484 for details.
+ return new ArrayIterable(this.getRepeatedSfixed32Array_(fieldNumber));
}
/**
@@ -1182,8 +1196,10 @@
* @return {!Iterable<!Int64>}
*/
getRepeatedSfixed64Iterable(fieldNumber) {
- const array = this.getRepeatedSfixed64Array_(fieldNumber);
- return new ArrayIterable(array);
+ // Don't split this statement unless needed. JS compiler thinks
+ // getRepeatedSfixed64Array_ might have side effects and doesn't inline the
+ // call in the compiled code. See cl/293894484 for details.
+ return new ArrayIterable(this.getRepeatedSfixed64Array_(fieldNumber));
}
/**
@@ -1231,8 +1247,10 @@
* @return {!Iterable<number>}
*/
getRepeatedSint32Iterable(fieldNumber) {
- const array = this.getRepeatedSint32Array_(fieldNumber);
- return new ArrayIterable(array);
+ // Don't split this statement unless needed. JS compiler thinks
+ // getRepeatedSint32Array_ might have side effects and doesn't inline the
+ // call in the compiled code. See cl/293894484 for details.
+ return new ArrayIterable(this.getRepeatedSint32Array_(fieldNumber));
}
/**
@@ -1280,8 +1298,10 @@
* @return {!Iterable<!Int64>}
*/
getRepeatedSint64Iterable(fieldNumber) {
- const array = this.getRepeatedSint64Array_(fieldNumber);
- return new ArrayIterable(array);
+ // Don't split this statement unless needed. JS compiler thinks
+ // getRepeatedSint64Array_ might have side effects and doesn't inline the
+ // call in the compiled code. See cl/293894484 for details.
+ return new ArrayIterable(this.getRepeatedSint64Array_(fieldNumber));
}
/**
@@ -1329,8 +1349,10 @@
* @return {!Iterable<number>}
*/
getRepeatedUint32Iterable(fieldNumber) {
- const array = this.getRepeatedUint32Array_(fieldNumber);
- return new ArrayIterable(array);
+ // Don't split this statement unless needed. JS compiler thinks
+ // getRepeatedUint32Array_ might have side effects and doesn't inline the
+ // call in the compiled code. See cl/293894484 for details.
+ return new ArrayIterable(this.getRepeatedUint32Array_(fieldNumber));
}
/**
@@ -1408,8 +1430,10 @@
* @return {!Iterable<!ByteString>}
*/
getRepeatedBytesIterable(fieldNumber) {
- const array = this.getRepeatedBytesArray_(fieldNumber);
- return new ArrayIterable(array);
+ // Don't split this statement unless needed. JS compiler thinks
+ // getRepeatedBytesArray_ might have side effects and doesn't inline the
+ // call in the compiled code. See cl/293894484 for details.
+ return new ArrayIterable(this.getRepeatedBytesArray_(fieldNumber));
}
/**
@@ -1456,8 +1480,10 @@
* @return {!Iterable<string>}
*/
getRepeatedStringIterable(fieldNumber) {
- const array = this.getRepeatedStringArray_(fieldNumber);
- return new ArrayIterable(array);
+ // Don't split this statement unless needed. JS compiler thinks
+ // getRepeatedStringArray_ might have side effects and doesn't inline the
+ // call in the compiled code. See cl/293894484 for details.
+ return new ArrayIterable(this.getRepeatedStringArray_(fieldNumber));
}
/**
@@ -1482,18 +1508,35 @@
* @private
*/
getRepeatedMessageArray_(fieldNumber, instanceCreator, pivot) {
+ // This method can be shortened using getFieldWithDefault and
+ // getRepeatedNonPrimitive methods. But that will require creating and
+ // passing a reader closure every time getRepeatedMessageArray_ is called,
+ // which is expensive.
checkInstanceCreator(instanceCreator);
- const bytesInstanceCreator = (bufferDecoder) =>
- instanceCreator(LazyAccessor.fromBufferDecoder_(bufferDecoder, pivot));
- const readMessageFunc = (bufferDecoder, start) =>
- bytesInstanceCreator(reader.readDelimited(bufferDecoder, start));
+ checkFieldNumber(fieldNumber);
- const readRepeatedMessageFunc = (indexArray, bufferDecoder) =>
- readRepeatedNonPrimitive(indexArray, bufferDecoder, readMessageFunc);
- const encoder = (writer, fieldNumber, values) =>
- writeRepeatedMessage(writer, fieldNumber, values);
- return this.getFieldWithDefault_(
- fieldNumber, /* defaultValue= */[], readRepeatedMessageFunc, encoder);
+ const field = this.fields_.get(fieldNumber);
+ if (field === undefined) {
+ return [];
+ }
+
+ if (field.hasDecodedValue()) {
+ return field.getDecodedValue();
+ }
+
+ const indexArray = checkDefAndNotNull(field.getIndexArray());
+ const result = new Array(indexArray.length);
+ for (let i = 0; i < indexArray.length; i++) {
+ validateWireType(indexArray[i], WireType.DELIMITED);
+ const subMessageBuffer = reader.readDelimited(
+ checkDefAndNotNull(this.bufferDecoder_),
+ Field.getStartIndex(indexArray[i]));
+ result[i] = instanceCreator(
+ LazyAccessor.fromBufferDecoder_(subMessageBuffer, pivot));
+ }
+ field.setCache(result, writeRepeatedMessage);
+
+ return result;
}
/**
@@ -1523,9 +1566,11 @@
* @template T
*/
getRepeatedMessageIterable(fieldNumber, instanceCreator, pivot = undefined) {
- const array =
- this.getRepeatedMessageArray_(fieldNumber, instanceCreator, pivot);
- return new ArrayIterable(array);
+ // Don't split this statement unless needed. JS compiler thinks
+ // getRepeatedMessageArray_ might have side effects and doesn't inline the
+ // call in the compiled code. See cl/293894484 for details.
+ return new ArrayIterable(
+ this.getRepeatedMessageArray_(fieldNumber, instanceCreator, pivot));
}
/**
diff --git a/js/experimental/runtime/kernel/reader.js b/js/experimental/runtime/kernel/reader.js
index fec79cf..2b80e15 100644
--- a/js/experimental/runtime/kernel/reader.js
+++ b/js/experimental/runtime/kernel/reader.js
@@ -6,6 +6,7 @@
const BufferDecoder = goog.require('protobuf.binary.BufferDecoder');
const ByteString = goog.require('protobuf.ByteString');
const Int64 = goog.require('protobuf.Int64');
+const {checkState} = goog.require('protobuf.internal.checks');
/******************************************************************************
@@ -13,18 +14,6 @@
******************************************************************************/
/**
- * Reads a boolean from the binary bytes.
- * Also returns the first position after the boolean.
- * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes.
- * @param {number} index Start of the data.
- * @return {{value: boolean, nextCursor: number}}
- */
-function readBoolValue(bufferDecoder, index) {
- const {lowBits, highBits, dataStart} = bufferDecoder.getVarint(index);
- return {value: lowBits !== 0 || highBits !== 0, nextCursor: dataStart};
-}
-
-/**
* Reads a boolean value from the binary bytes.
* @param {!BufferDecoder} bufferDecoder Binary format encoded bytes.
* @param {number} start Start of the data.
@@ -32,11 +21,12 @@
* @package
*/
function readBool(bufferDecoder, start) {
- return readBoolValue(bufferDecoder, start).value;
+ const {lowBits, highBits} = bufferDecoder.getVarint(start);
+ return lowBits !== 0 || highBits !== 0;
}
/**
- * Reads a double value from the binary bytes.
+ * Reads a ByteString value from the binary bytes.
* @param {!BufferDecoder} bufferDecoder Binary format encoded bytes.
* @param {number} start Start of the data.
* @return {!ByteString}
@@ -49,39 +39,15 @@
/**
* Reads a int32 value from the binary bytes encoded as varint.
* @param {!BufferDecoder} bufferDecoder Binary format encoded bytes.
- * @param {number} index Start of the data.
- * @return {{value: number, nextCursor: number}}
- * @package
- */
-function readInt32Value(bufferDecoder, index) {
- const {lowBits, dataStart} = bufferDecoder.getVarint(index);
- // Negative 32 bit integers are encoded with 64 bit values.
- // Clients are expected to truncate back to 32 bits.
- // This is why we are dropping the upper bytes here.
- return {value: lowBits | 0, nextCursor: dataStart};
-}
-
-/**
- * Reads a int32 value from the binary bytes encoded as varint.
- * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes.
* @param {number} start Start of the data.
* @return {number}
* @package
*/
function readInt32(bufferDecoder, start) {
- return readInt32Value(bufferDecoder, start).value;
-}
-
-/**
- * Reads a int32 value from the binary bytes encoded as varint.
- * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes.
- * @param {number} index Start of the data.
- * @return {{ value: !Int64, nextCursor: number}}
- * @package
- */
-function readInt64Value(bufferDecoder, index) {
- const {lowBits, highBits, dataStart} = bufferDecoder.getVarint(index);
- return {value: Int64.fromBits(lowBits, highBits), nextCursor: dataStart};
+ // Negative 32 bit integers are encoded with 64 bit values.
+ // Clients are expected to truncate back to 32 bits.
+ // This is why we are dropping the upper bytes here.
+ return bufferDecoder.getUnsignedVarint32At(start) | 0;
}
/**
@@ -92,7 +58,8 @@
* @package
*/
function readInt64(bufferDecoder, start) {
- return readInt64Value(bufferDecoder, start).value;
+ const {lowBits, highBits} = bufferDecoder.getVarint(start);
+ return Int64.fromBits(lowBits, highBits);
}
/**
@@ -132,45 +99,15 @@
/**
* Reads a sint32 value from the binary bytes encoded as varint.
- * Also returns the first position after the boolean.
- * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes.
- * @param {number} index Start of the data.
- * @return {{value: number, nextCursor: number}}
- */
-function readSint32Value(bufferDecoder, index) {
- const {lowBits, dataStart} = bufferDecoder.getVarint(index);
- // Truncate upper bits and convert from zig zag to signd int
- return {value: (lowBits >>> 1) ^ -(lowBits & 0x01), nextCursor: dataStart};
-}
-
-/**
- * Reads a sint32 value from the binary bytes encoded as varint.
* @param {!BufferDecoder} bufferDecoder Binary format encoded bytes.
* @param {number} start Start of the data.
* @return {number}
* @package
*/
function readSint32(bufferDecoder, start) {
- return readSint32Value(bufferDecoder, start).value;
-}
-
-/**
- * Reads a sint64 value from the binary bytes encoded as varint.
- * Also returns the first position after the value.
- * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes.
- * @param {number} index Start of the data.
- * @return {{value: !Int64, nextCursor: number}}
- * @package
- */
-function readSint64Value(bufferDecoder, index) {
- const {lowBits, highBits, dataStart} = bufferDecoder.getVarint(index);
- const sign = -(lowBits & 0x01);
- const decodedLowerBits = ((lowBits >>> 1) | (highBits & 0x01) << 31) ^ sign;
- const decodedUpperBits = (highBits >>> 1) ^ sign;
- return {
- value: Int64.fromBits(decodedLowerBits, decodedUpperBits),
- nextCursor: dataStart
- };
+ const bits = bufferDecoder.getUnsignedVarint32At(start);
+ // Truncate upper bits and convert from zig zag to signd int
+ return (bits >>> 1) ^ -(bits & 0x01);
}
/**
@@ -181,7 +118,11 @@
* @package
*/
function readSint64(bufferDecoder, start) {
- return readSint64Value(bufferDecoder, start).value;
+ const {lowBits, highBits} = bufferDecoder.getVarint(start);
+ const sign = -(lowBits & 0x01);
+ const decodedLowerBits = ((lowBits >>> 1) | (highBits & 0x01) << 31) ^ sign;
+ const decodedUpperBits = (highBits >>> 1) ^ sign;
+ return Int64.fromBits(decodedLowerBits, decodedUpperBits);
}
/**
@@ -192,9 +133,8 @@
* @package
*/
function readDelimited(bufferDecoder, start) {
- const {lowBits, dataStart} = bufferDecoder.getVarint(start);
- const unsignedLength = lowBits >>> 0;
- return bufferDecoder.subBufferDecoder(dataStart, unsignedLength);
+ const unsignedLength = bufferDecoder.getUnsignedVarint32At(start);
+ return bufferDecoder.subBufferDecoder(bufferDecoder.cursor(), unsignedLength);
}
/**
@@ -210,25 +150,13 @@
/**
* Reads a uint32 value from the binary bytes encoded as varint.
- * Also returns the first position after the value.
- * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes.
- * @param {number} index Start of the data.
- * @return {{value: number, nextCursor: number}}
- */
-function readUint32Value(bufferDecoder, index) {
- const {lowBits, dataStart} = bufferDecoder.getVarint(index);
- return {value: lowBits >>> 0, nextCursor: dataStart};
-}
-
-/**
- * Reads a uint32 value from the binary bytes encoded as varint.
* @param {!BufferDecoder} bufferDecoder Binary format encoded bytes.
* @param {number} start Start of the data.
* @return {number}
* @package
*/
function readUint32(bufferDecoder, start) {
- return readUint32Value(bufferDecoder, start).value;
+ return bufferDecoder.getUnsignedVarint32At(start);
}
/**
@@ -266,7 +194,7 @@
* @package
*/
function readPackedBool(bufferDecoder, start) {
- return readPackedVariableLength(bufferDecoder, start, readBoolValue);
+ return readPacked(bufferDecoder, start, readBool);
}
/**
@@ -278,7 +206,7 @@
* @package
*/
function readPackedDouble(bufferDecoder, start) {
- return readPackedFixed(bufferDecoder, start, 8, readDouble);
+ return readPacked(bufferDecoder, start, readDouble);
}
/**
@@ -290,7 +218,7 @@
* @package
*/
function readPackedFixed32(bufferDecoder, start) {
- return readPackedFixed(bufferDecoder, start, 4, readFixed32);
+ return readPacked(bufferDecoder, start, readFixed32);
}
/**
@@ -302,7 +230,7 @@
* @package
*/
function readPackedFloat(bufferDecoder, start) {
- return readPackedFixed(bufferDecoder, start, 4, readFloat);
+ return readPacked(bufferDecoder, start, readFloat);
}
/**
@@ -314,7 +242,7 @@
* @package
*/
function readPackedInt32(bufferDecoder, start) {
- return readPackedVariableLength(bufferDecoder, start, readInt32Value);
+ return readPacked(bufferDecoder, start, readInt32);
}
/**
@@ -326,7 +254,7 @@
* @package
*/
function readPackedInt64(bufferDecoder, start) {
- return readPackedVariableLength(bufferDecoder, start, readInt64Value);
+ return readPacked(bufferDecoder, start, readInt64);
}
/**
@@ -338,7 +266,7 @@
* @package
*/
function readPackedSfixed32(bufferDecoder, start) {
- return readPackedFixed(bufferDecoder, start, 4, readSfixed32);
+ return readPacked(bufferDecoder, start, readSfixed32);
}
/**
@@ -350,7 +278,7 @@
* @package
*/
function readPackedSfixed64(bufferDecoder, start) {
- return readPackedFixed(bufferDecoder, start, 8, readSfixed64);
+ return readPacked(bufferDecoder, start, readSfixed64);
}
/**
@@ -362,7 +290,7 @@
* @package
*/
function readPackedSint32(bufferDecoder, start) {
- return readPackedVariableLength(bufferDecoder, start, readSint32Value);
+ return readPacked(bufferDecoder, start, readSint32);
}
/**
@@ -374,7 +302,7 @@
* @package
*/
function readPackedSint64(bufferDecoder, start) {
- return readPackedVariableLength(bufferDecoder, start, readSint64Value);
+ return readPacked(bufferDecoder, start, readSint64);
}
/**
@@ -386,51 +314,25 @@
* @package
*/
function readPackedUint32(bufferDecoder, start) {
- return readPackedVariableLength(bufferDecoder, start, readUint32Value);
+ return readPacked(bufferDecoder, start, readUint32);
}
/**
- * Read packed variable length values.
+ * Read packed values.
* @param {!BufferDecoder} bufferDecoder Binary format encoded bytes.
* @param {number} start Start of the data.
- * @param {function(!BufferDecoder, number):{value:T, nextCursor: number}}
- * valueFunction
- * @return {!Array<T>}
- * @package
- * @template T
- */
-function readPackedVariableLength(bufferDecoder, start, valueFunction) {
- const /** !Array<T> */ result = [];
- const {lowBits, dataStart} = bufferDecoder.getVarint(start);
- let cursor = dataStart;
- const unsignedLength = lowBits >>> 0;
- while (cursor < dataStart + unsignedLength) {
- const {value, nextCursor} = valueFunction(bufferDecoder, cursor);
- cursor = nextCursor;
- result.push(value);
- }
- return result;
-}
-
-/**
- * Read a packed fixed values.
- * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes.
- * @param {number} start Start of the data.
- * @param {number} size End of the data.
* @param {function(!BufferDecoder, number):T} valueFunction
* @return {!Array<T>}
* @package
* @template T
*/
-function readPackedFixed(bufferDecoder, start, size, valueFunction) {
- const {lowBits, dataStart} = bufferDecoder.getVarint(start);
- const unsignedLength = lowBits >>> 0;
- const noOfEntries = unsignedLength / size;
- const /** !Array<T> */ result = new Array(noOfEntries);
- let cursor = dataStart;
- for (let i = 0; i < noOfEntries; i++) {
- result[i] = valueFunction(bufferDecoder, cursor);
- cursor += size;
+function readPacked(bufferDecoder, start, valueFunction) {
+ const /** !Array<T> */ result = [];
+ const unsignedLength = bufferDecoder.getUnsignedVarint32At(start);
+ const dataStart = bufferDecoder.cursor();
+ while (bufferDecoder.cursor() < dataStart + unsignedLength) {
+ checkState(bufferDecoder.cursor() > 0);
+ result.push(valueFunction(bufferDecoder, bufferDecoder.cursor()));
}
return result;
}
diff --git a/js/experimental/runtime/kernel/reader_test.js b/js/experimental/runtime/kernel/reader_test.js
index a0cbcae..dd02086 100644
--- a/js/experimental/runtime/kernel/reader_test.js
+++ b/js/experimental/runtime/kernel/reader_test.js
@@ -12,7 +12,7 @@
const BufferDecoder = goog.require('protobuf.binary.BufferDecoder');
const ByteString = goog.require('protobuf.ByteString');
const reader = goog.require('protobuf.binary.reader');
-const {CHECK_STATE} = goog.require('protobuf.internal.checks');
+const {CHECK_CRITICAL_STATE} = goog.require('protobuf.internal.checks');
const {createBufferDecoder} = goog.require('protobuf.binary.bufferDecoderHelper');
const {encode} = goog.require('protobuf.binary.textencoding');
const {getBoolPairs} = goog.require('protobuf.binary.boolTestPairs');
@@ -45,7 +45,7 @@
describe('Read bool does', () => {
for (const pair of getBoolPairs()) {
it(`decode ${pair.name}`, () => {
- if (pair.error && CHECK_STATE) {
+ if (pair.error && CHECK_CRITICAL_STATE) {
expect(() => reader.readBool(pair.bufferDecoder, 0)).toThrow();
} else {
const d = reader.readBool(
@@ -120,7 +120,7 @@
for (const pair of getInt32Pairs()) {
it(`decode ${pair.name}`, () => {
- if (pair.error && CHECK_STATE) {
+ if (pair.error && CHECK_CRITICAL_STATE) {
expect(() => reader.readInt32(pair.bufferDecoder, 0)).toThrow();
} else {
const d = reader.readInt32(pair.bufferDecoder, 0);
@@ -166,7 +166,7 @@
for (const pair of getSint32Pairs()) {
it(`decode ${pair.name}`, () => {
- if (pair.error && CHECK_STATE) {
+ if (pair.error && CHECK_CRITICAL_STATE) {
expect(() => reader.readSint32(pair.bufferDecoder, 0)).toThrow();
} else {
const d = reader.readSint32(pair.bufferDecoder, 0);
@@ -184,7 +184,7 @@
for (const pair of getInt64Pairs()) {
it(`decode ${pair.name}`, () => {
- if (pair.error && CHECK_STATE) {
+ if (pair.error && CHECK_CRITICAL_STATE) {
expect(() => reader.readInt64(pair.bufferDecoder, 0)).toThrow();
} else {
const d = reader.readInt64(pair.bufferDecoder, 0);
@@ -202,7 +202,7 @@
for (const pair of getSint64Pairs()) {
it(`decode ${pair.name}`, () => {
- if (pair.error && CHECK_STATE) {
+ if (pair.error && CHECK_CRITICAL_STATE) {
expect(() => reader.readSint64(pair.bufferDecoder, 0)).toThrow();
} else {
const d = reader.readSint64(pair.bufferDecoder, 0);
@@ -220,7 +220,7 @@
for (const pair of getUint32Pairs()) {
it(`decode ${pair.name}`, () => {
- if (pair.error && CHECK_STATE) {
+ if (pair.error && CHECK_CRITICAL_STATE) {
expect(() => reader.readUint32(pair.bufferDecoder, 0)).toThrow();
} else {
const d = reader.readUint32(pair.bufferDecoder, 0);
diff --git a/js/experimental/runtime/kernel/writer.js b/js/experimental/runtime/kernel/writer.js
index 1fc7418..73f852e 100644
--- a/js/experimental/runtime/kernel/writer.js
+++ b/js/experimental/runtime/kernel/writer.js
@@ -93,7 +93,7 @@
checkFieldNumber(fieldNumber);
checkWireType(wireType);
const tag = fieldNumber << 3 | wireType;
- this.writeUnsignedVarint32_(tag);
+ this.writeUnsignedVarint32_(tag >>> 0);
}
/**
@@ -450,12 +450,13 @@
getLength_(bufferDecoder, start, wireType) {
switch (wireType) {
case WireType.VARINT:
- return bufferDecoder.skipVarint(start) - start;
+ bufferDecoder.skipVarint(start);
+ return bufferDecoder.cursor() - start;
case WireType.FIXED64:
return 8;
case WireType.DELIMITED:
- const {lowBits: dataLength, dataStart} = bufferDecoder.getVarint(start);
- return dataLength + dataStart - start;
+ const dataLength = bufferDecoder.getUnsignedVarint32At(start);
+ return dataLength + bufferDecoder.cursor() - start;
case WireType.START_GROUP:
return this.getGroupLength_(bufferDecoder, start);
case WireType.FIXED32:
@@ -477,12 +478,13 @@
// corresponding stop group
let cursor = start;
while (cursor < bufferDecoder.endIndex()) {
- const {lowBits: tag, dataStart} = bufferDecoder.getVarint(cursor);
+ const tag = bufferDecoder.getUnsignedVarint32At(cursor);
const wireType = /** @type {!WireType} */ (tag & 0x07);
if (wireType === WireType.END_GROUP) {
- return dataStart - start;
+ return bufferDecoder.cursor() - start;
}
- cursor = dataStart + this.getLength_(bufferDecoder, dataStart, wireType);
+ cursor = bufferDecoder.cursor() +
+ this.getLength_(bufferDecoder, bufferDecoder.cursor(), wireType);
}
throw new Error('No end group found');
}
diff --git a/js/experimental/runtime/kernel/writer_test.js b/js/experimental/runtime/kernel/writer_test.js
index e4b2184..331ab2b 100644
--- a/js/experimental/runtime/kernel/writer_test.js
+++ b/js/experimental/runtime/kernel/writer_test.js
@@ -60,6 +60,18 @@
const writer = new Writer();
writer.writeTag(1, WireType.VARINT);
expect(writer.getAndResetResultBuffer()).toEqual(createArrayBuffer(0x08));
+
+ writer.writeTag(0x0FFFFFFF, WireType.VARINT);
+ expect(writer.getAndResetResultBuffer())
+ .toEqual(createArrayBuffer(0xF8, 0xFF, 0xFF, 0xFF, 0x7));
+
+ writer.writeTag(0x10000000, WireType.VARINT);
+ expect(writer.getAndResetResultBuffer())
+ .toEqual(createArrayBuffer(0x80, 0x80, 0x80, 0x80, 0x08));
+
+ writer.writeTag(0x1FFFFFFF, WireType.VARINT);
+ expect(writer.getAndResetResultBuffer())
+ .toEqual(createArrayBuffer(0xF8, 0xFF, 0xFF, 0xFF, 0x0F));
});
it('reset after calling getAndResetResultBuffer', () => {
@@ -95,7 +107,8 @@
// These values might change at any point and are not considered
// what the implementation should be doing here.
writer.writeTag(-1, WireType.VARINT);
- expect(writer.getAndResetResultBuffer()).toEqual(createArrayBuffer(0xF8));
+ expect(writer.getAndResetResultBuffer())
+ .toEqual(createArrayBuffer(0xF8, 0xFF, 0xFF, 0xFF, 0xF));
}
});
@@ -504,7 +517,11 @@
expect(new Uint8Array(writer.getAndResetResultBuffer()))
.toEqual(new Uint8Array(createArrayBuffer(
-6, // invalid tag
- 1, // string length
+ 0xff,
+ 0xff,
+ 0xff,
+ 0x0f,
+ 1, // string length
'a'.charCodeAt(0),
)));
}
diff --git a/js/gulpfile.js b/js/gulpfile.js
index 1f0946c..a81c011 100644
--- a/js/gulpfile.js
+++ b/js/gulpfile.js
@@ -37,6 +37,7 @@
'testbinary.proto',
'testempty.proto',
'test.proto',
+ 'testlargenumbers.proto',
];
var group2Protos = [
diff --git a/js/message.js b/js/message.js
index 5c08112..c1736b3 100644
--- a/js/message.js
+++ b/js/message.js
@@ -1112,8 +1112,11 @@
goog.asserts.assertInstanceof(msg, jspb.Message);
if (value !== defaultValue) {
jspb.Message.setField(msg, fieldNumber, value);
- } else {
+ } else if (fieldNumber < msg.pivot_) {
msg.array[jspb.Message.getIndex_(msg, fieldNumber)] = null;
+ } else {
+ jspb.Message.maybeInitEmptyExtensionObject_(msg);
+ delete msg.extensionObject_[fieldNumber];
}
return msg;
};
diff --git a/js/message_test.js b/js/message_test.js
index e038f65..3cac4c6 100644
--- a/js/message_test.js
+++ b/js/message_test.js
@@ -118,6 +118,8 @@
goog.require('proto.jspb.test.TestExtensionsMessage');
goog.require('proto.jspb.test.TestAllowAliasEnum');
+// CommonJS-LoadFromFile: testlargenumbers_pb proto.jspb.test
+goog.require('proto.jspb.test.MessageWithLargeFieldNumbers');
describe('Message test suite', function() {
var stubs = new goog.testing.PropertyReplacer();
@@ -1075,4 +1077,36 @@
assertEquals(12, package2Message.getA());
});
+
+ it('testMessageWithLargeFieldNumbers', function() {
+ var message = new proto.jspb.test.MessageWithLargeFieldNumbers;
+
+ message.setAString('string');
+ assertEquals('string', message.getAString());
+
+ message.setAString('');
+ assertEquals('', message.getAString());
+
+ message.setAString('new string');
+ assertEquals('new string', message.getAString());
+
+ message.setABoolean(true);
+ assertEquals(true, message.getABoolean());
+
+ message.setABoolean(false);
+ assertEquals(false, message.getABoolean());
+
+ message.setABoolean(true);
+ assertEquals(true, message.getABoolean());
+
+ message.setAInt(42);
+ assertEquals(42, message.getAInt());
+
+ message.setAInt(0);
+ assertEquals(0, message.getAInt());
+
+ message.setAInt(42);
+ assertEquals(42, message.getAInt());
+ });
+
});
diff --git a/js/package.json b/js/package.json
index a2fb371..14186be 100644
--- a/js/package.json
+++ b/js/package.json
@@ -1,6 +1,6 @@
{
"name": "google-protobuf",
- "version": "3.11.2",
+ "version": "3.11.4",
"description": "Protocol Buffers for JavaScript",
"main": "google-protobuf.js",
"files": [
diff --git a/js/testlargenumbers.proto b/js/testlargenumbers.proto
new file mode 100644
index 0000000..47aef35
--- /dev/null
+++ b/js/testlargenumbers.proto
@@ -0,0 +1,40 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package jspb.test;
+
+
+message MessageWithLargeFieldNumbers {
+ string a_string = 1;
+ bool a_boolean = 900;
+ int32 a_int = 5000;
+}
diff --git a/kokoro/linux/bazel/build.sh b/kokoro/linux/bazel/build.sh
index b5991d7..9355eba 100755
--- a/kokoro/linux/bazel/build.sh
+++ b/kokoro/linux/bazel/build.sh
@@ -25,9 +25,10 @@
trap print_test_logs EXIT
bazel test --copt=-Werror --host_copt=-Werror \
//:build_files_updated_unittest \
+ //java/... \
//:protobuf_test \
@com_google_protobuf//:cc_proto_blacklist_test
trap - EXIT
cd examples
-bazel build :all
+bazel build //...
diff --git a/kokoro/linux/build_and_run_docker.sh b/kokoro/linux/build_and_run_docker.sh
index 3dc5dbb..cdbd6e2 100755
--- a/kokoro/linux/build_and_run_docker.sh
+++ b/kokoro/linux/build_and_run_docker.sh
@@ -28,8 +28,9 @@
DOCKER_IMAGE_NAME=${DOCKERHUB_ORGANIZATION}/${DOCKERFILE_PREFIX}_$(sha1sum $DOCKERFILE_DIR/Dockerfile | cut -f1 -d\ )
fi
-# Pull dockerimage from Dockerhub
-docker pull $DOCKER_IMAGE_NAME
+# Pull dockerimage from Dockerhub. This sometimes fails intermittently, so we
+# keep trying until we succeed.
+until docker pull $DOCKER_IMAGE_NAME; do sleep 10; done
# Ensure existence of ccache directory
CCACHE_DIR=/tmp/protobuf-ccache
diff --git a/kokoro/linux/cpp_distcheck/build.sh b/kokoro/linux/cpp_distcheck/build.sh
index 1343a8c..42ac88c 100755
--- a/kokoro/linux/cpp_distcheck/build.sh
+++ b/kokoro/linux/cpp_distcheck/build.sh
@@ -11,7 +11,7 @@
# Run tests under release docker image.
DOCKER_IMAGE_NAME=protobuf/protoc_$(sha1sum protoc-artifacts/Dockerfile | cut -f1 -d " ")
-docker pull $DOCKER_IMAGE_NAME
+until docker pull $DOCKER_IMAGE_NAME; do sleep 10; done
docker run -v $(pwd):/var/local/protobuf --rm $DOCKER_IMAGE_NAME \
bash -l /var/local/protobuf/tests.sh cpp || FAILED="true"
diff --git a/kokoro/macos/php7.4_mac/build.sh b/kokoro/macos/php7.4_mac/build.sh
new file mode 100755
index 0000000..98c82d4
--- /dev/null
+++ b/kokoro/macos/php7.4_mac/build.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+#
+# Build file to set up and run tests
+
+# Change to repo root
+cd $(dirname $0)/../../..
+
+# Prepare worker environment to run tests
+source kokoro/macos/prepare_build_macos_rc
+
+./tests.sh php7.4_mac
diff --git a/kokoro/macos/php7.4_mac/continuous.cfg b/kokoro/macos/php7.4_mac/continuous.cfg
new file mode 100644
index 0000000..5b2d6fd
--- /dev/null
+++ b/kokoro/macos/php7.4_mac/continuous.cfg
@@ -0,0 +1,5 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/macos/php7.4_mac/build.sh"
+timeout_mins: 1440
diff --git a/kokoro/macos/php7.4_mac/presubmit.cfg b/kokoro/macos/php7.4_mac/presubmit.cfg
new file mode 100644
index 0000000..5b2d6fd
--- /dev/null
+++ b/kokoro/macos/php7.4_mac/presubmit.cfg
@@ -0,0 +1,5 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/macos/php7.4_mac/build.sh"
+timeout_mins: 1440
diff --git a/kokoro/macos/prepare_build_macos_rc b/kokoro/macos/prepare_build_macos_rc
index 5b134f4..2428750 100755
--- a/kokoro/macos/prepare_build_macos_rc
+++ b/kokoro/macos/prepare_build_macos_rc
@@ -5,11 +5,11 @@
##
# Select Xcode version
-# Remember to update the Xcode version when Xcode_11.0.app is not available.
+# Remember to update the Xcode version when Xcode_11.3.app is not available.
# If xcode is not available, it will probably encounter the failure for
# "autom4te: need GNU m4 1.4 or later: /usr/bin/m4"
# go/kokoro/userdocs/macos/selecting_xcode.md for more information.
-export DEVELOPER_DIR=/Applications/Xcode_11.0.app/Contents/Developer
+export DEVELOPER_DIR=/Applications/Xcode_11.3.app/Contents/Developer
##
# Select C/C++ compilers
diff --git a/kokoro/release/collect_all_artifacts.sh b/kokoro/release/collect_all_artifacts.sh
index 0023937..3b7d7d4 100755
--- a/kokoro/release/collect_all_artifacts.sh
+++ b/kokoro/release/collect_all_artifacts.sh
@@ -43,9 +43,7 @@
cp ${INPUT_ARTIFACTS_DIR}/protoc-artifacts/target/linux/x86_32/protoc.exe protoc/linux_x86/protoc
cp ${INPUT_ARTIFACTS_DIR}/protoc-artifacts/target/linux/x86_64/protoc.exe protoc/linux_x64/protoc
-mkdir -p protoc/macosx_x86
mkdir -p protoc/macosx_x64
-cp ${INPUT_ARTIFACTS_DIR}/build32/src/protoc protoc/macosx_x86/protoc
cp ${INPUT_ARTIFACTS_DIR}/build64/src/protoc protoc/macosx_x64/protoc
# Install nuget (will also install mono)
diff --git a/kokoro/release/protoc/macos/build.sh b/kokoro/release/protoc/macos/build.sh
index 6a4c79c..47c9bfa 100644
--- a/kokoro/release/protoc/macos/build.sh
+++ b/kokoro/release/protoc/macos/build.sh
@@ -6,14 +6,6 @@
cd github/protobuf
./autogen.sh
-mkdir build32 && cd build32
-export CXXFLAGS="$CXXFLAGS_COMMON -m32"
-../configure --disable-shared
-make -j4
-file src/protoc
-otool -L src/protoc | grep dylib
-cd ..
-
mkdir build64 && cd build64
export CXXFLAGS="$CXXFLAGS_COMMON -m64"
../configure --disable-shared
diff --git a/php/ext/google/protobuf/def.c b/php/ext/google/protobuf/def.c
index 95085fc..5edcb03 100644
--- a/php/ext/google/protobuf/def.c
+++ b/php/ext/google/protobuf/def.c
@@ -132,6 +132,7 @@
PHP_METHOD(Descriptor, getClass) {
Descriptor* desc = UNBOX(Descriptor, getThis());
DescriptorInternal* intern = desc->intern;
+ register_class(intern, false TSRMLS_CC);
#if PHP_MAJOR_VERSION < 7
const char* classname = intern->klass->name;
#else
diff --git a/php/ext/google/protobuf/package.xml b/php/ext/google/protobuf/package.xml
index 99080b7..5cb2b46 100644
--- a/php/ext/google/protobuf/package.xml
+++ b/php/ext/google/protobuf/package.xml
@@ -10,11 +10,11 @@
<email>protobuf-opensource@google.com</email>
<active>yes</active>
</lead>
- <date>2019-12-10</date>
- <time>11:22:54</time>
+ <date>2020-02-12</date>
+ <time>12:46:57</time>
<version>
- <release>3.11.2</release>
- <api>3.11.2</api>
+ <release>3.11.4</release>
+ <api>3.11.4</api>
</version>
<stability>
<release>stable</release>
@@ -501,5 +501,33 @@
<license uri="https://opensource.org/licenses/BSD-3-Clause">3-Clause BSD License</license>
<notes>GA release.</notes>
</release>
+ <release>
+ <version>
+ <release>3.11.3</release>
+ <api>3.11.3</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2020-01-28</date>
+ <time>10:20:43</time>
+ <license uri="https://opensource.org/licenses/BSD-3-Clause">3-Clause BSD License</license>
+ <notes>GA release.</notes>
+ </release>
+ <release>
+ <version>
+ <release>3.11.4</release>
+ <api>3.11.4</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2020-02-12</date>
+ <time>12:46:57</time>
+ <license uri="https://opensource.org/licenses/BSD-3-Clause">3-Clause BSD License</license>
+ <notes>GA release.</notes>
+ </release>
</changelog>
</package>
diff --git a/php/ext/google/protobuf/protobuf.h b/php/ext/google/protobuf/protobuf.h
index 4e6d56a..88cc400 100644
--- a/php/ext/google/protobuf/protobuf.h
+++ b/php/ext/google/protobuf/protobuf.h
@@ -37,7 +37,7 @@
#include "upb.h"
#define PHP_PROTOBUF_EXTNAME "protobuf"
-#define PHP_PROTOBUF_VERSION "3.11.2"
+#define PHP_PROTOBUF_VERSION "3.11.4"
#define MAX_LENGTH_OF_INT64 20
#define SIZEOF_INT64 8
@@ -292,7 +292,7 @@
#define PHP_PROTO_HASH_OF(array) Z_ARRVAL_P(&array)
-static inline int php_proto_zend_hash_index_update_zval(HashTable* ht, ulong h,
+static inline int php_proto_zend_hash_index_update_zval(HashTable* ht, zend_ulong h,
zval* pData) {
void* result = NULL;
result = zend_hash_index_update(ht, h, pData);
@@ -308,7 +308,7 @@
return result != NULL ? SUCCESS : FAILURE;
}
-static inline int php_proto_zend_hash_index_update_mem(HashTable* ht, ulong h,
+static inline int php_proto_zend_hash_index_update_mem(HashTable* ht, zend_ulong h,
void* pData, uint nDataSize,
void** pDest) {
void* result = NULL;
@@ -337,7 +337,7 @@
}
static inline int php_proto_zend_hash_index_find_zval(const HashTable* ht,
- ulong h, void** pDest) {
+ zend_ulong h, void** pDest) {
zval* result = zend_hash_index_find(ht, h);
if (pDest != NULL) *pDest = result;
return result != NULL ? SUCCESS : FAILURE;
@@ -351,7 +351,7 @@
}
static inline int php_proto_zend_hash_index_find_mem(const HashTable* ht,
- ulong h, void** pDest) {
+ zend_ulong h, void** pDest) {
void* result = NULL;
result = zend_hash_index_find_ptr(ht, h);
if (pDest != NULL) *pDest = result;
diff --git a/php/tests/descriptors_test.php b/php/tests/descriptors_test.php
index 93683b8..60a6292 100644
--- a/php/tests/descriptors_test.php
+++ b/php/tests/descriptors_test.php
@@ -11,6 +11,8 @@
use Descriptors\TestDescriptorsEnum;
use Descriptors\TestDescriptorsMessage;
use Descriptors\TestDescriptorsMessage\Sub;
+use Foo\TestMessage;
+use Bar\TestInclude;
class DescriptorsTest extends TestBase
{
@@ -89,6 +91,17 @@
$this->assertSame(1, $desc->getOneofDeclCount());
}
+ public function testDescriptorForIncludedMessage()
+ {
+ $pool = DescriptorPool::getGeneratedPool();
+ $class = get_class(new TestMessage());
+ $this->assertSame('Foo\TestMessage', $class);
+ $desc = $pool->getDescriptorByClassName($class);
+ $fielddesc = $desc->getField(17);
+ $subdesc = $fielddesc->getMessageType();
+ $this->assertSame('Bar\TestInclude', $subdesc->getClass());
+ }
+
#########################################################
# Test enum descriptor.
#########################################################
diff --git a/protobuf.bzl b/protobuf.bzl
index 5fa5543..26e84f5 100644
--- a/protobuf.bzl
+++ b/protobuf.bzl
@@ -318,29 +318,58 @@
**kargs
)
-def internal_gen_well_known_protos_java(srcs):
- """Bazel rule to generate the gen_well_known_protos_java genrule
+def _internal_gen_well_known_protos_java_impl(ctx):
+ args = ctx.actions.args()
- Args:
- srcs: the well known protos
- """
- root = Label("%s//protobuf_java" % (native.repository_name())).workspace_root
- pkg = native.package_name() + "/" if native.package_name() else ""
- if root == "":
- include = " -I%ssrc " % pkg
- else:
- include = " -I%s/%ssrc " % (root, pkg)
- native.genrule(
- name = "gen_well_known_protos_java",
- srcs = srcs,
- outs = [
- "wellknown.srcjar",
- ],
- cmd = "$(location :protoc) --java_out=$(@D)/wellknown.jar" +
- " %s $(SRCS) " % include +
- " && mv $(@D)/wellknown.jar $(@D)/wellknown.srcjar",
- tools = [":protoc"],
+ deps = [d[ProtoInfo] for d in ctx.attr.deps]
+
+ srcjar = ctx.actions.declare_file("{}.srcjar".format(ctx.attr.name))
+ args.add("--java_out", srcjar)
+
+ descriptors = depset(
+ transitive = [dep.transitive_descriptor_sets for dep in deps],
)
+ args.add_joined(
+ "--descriptor_set_in",
+ descriptors,
+ join_with = ctx.configuration.host_path_separator,
+ )
+
+ for dep in deps:
+ if "." == dep.proto_source_root:
+ args.add_all([src.path for src in dep.direct_sources])
+ else:
+ source_root = dep.proto_source_root
+ offset = len(source_root) + 1 # + '/'.
+ args.add_all([src.path[offset:] for src in dep.direct_sources])
+
+ ctx.actions.run(
+ executable = ctx.executable._protoc,
+ inputs = descriptors,
+ outputs = [srcjar],
+ arguments = [args],
+ )
+
+ return [
+ DefaultInfo(
+ files = depset([srcjar]),
+ ),
+ ]
+
+internal_gen_well_known_protos_java = rule(
+ implementation = _internal_gen_well_known_protos_java_impl,
+ attrs = {
+ "deps": attr.label_list(
+ mandatory = True,
+ providers = [ProtoInfo],
+ ),
+ "_protoc": attr.label(
+ executable = True,
+ cfg = "host",
+ default = "@com_google_protobuf//:protoc",
+ ),
+ },
+)
def internal_copied_filegroup(name, srcs, strip_prefix, dest, **kwargs):
"""Macro to copy files to a different directory and then create a filegroup.
diff --git a/protoc-artifacts/build-zip.sh b/protoc-artifacts/build-zip.sh
index 9921c2d..2a25d3c 100755
--- a/protoc-artifacts/build-zip.sh
+++ b/protoc-artifacts/build-zip.sh
@@ -13,10 +13,9 @@
This script will download pre-built protoc or protoc plugin binaries from maven
repository and create .zip packages suitable to be included in the github
release page. If the target is protoc, well-known type .proto files will also be
-included. Each invocation will create 9 zip packages:
+included. Each invocation will create 8 zip packages:
dist/<TARGET>-<VERSION_NUMBER>-win32.zip
dist/<TARGET>-<VERSION_NUMBER>-win64.zip
- dist/<TARGET>-<VERSION_NUMBER>-osx-x86_32.zip
dist/<TARGET>-<VERSION_NUMBER>-osx-x86_64.zip
dist/<TARGET>-<VERSION_NUMBER>-linux-x86_32.zip
dist/<TARGET>-<VERSION_NUMBER>-linux-x86_64.zip
@@ -34,7 +33,6 @@
declare -a FILE_NAMES=( \
win32.zip windows-x86_32.exe \
win64.zip windows-x86_64.exe \
- osx-x86_32.zip osx-x86_32.exe \
osx-x86_64.zip osx-x86_64.exe \
linux-x86_32.zip linux-x86_32.exe \
linux-x86_64.zip linux-x86_64.exe \
@@ -100,7 +98,7 @@
BINARY="$TARGET"
fi
BINARY_NAME=${FILE_NAMES[$(($i+1))]}
- BINARY_URL=http://repo1.maven.org/maven2/com/google/protobuf/$TARGET/${VERSION_NUMBER}/$TARGET-${VERSION_NUMBER}-${BINARY_NAME}
+ BINARY_URL=https://repo1.maven.org/maven2/com/google/protobuf/$TARGET/${VERSION_NUMBER}/$TARGET-${VERSION_NUMBER}-${BINARY_NAME}
if ! wget ${BINARY_URL} -O ${DIR}/bin/$BINARY &> /dev/null; then
echo "[ERROR] Failed to download ${BINARY_URL}" >&2
echo "[ERROR] Skipped $TARGET-${VERSION_NAME}-${ZIP_NAME}" >&2
diff --git a/protoc-artifacts/pom.xml b/protoc-artifacts/pom.xml
index 80d282d..327e3d7 100644
--- a/protoc-artifacts/pom.xml
+++ b/protoc-artifacts/pom.xml
@@ -8,7 +8,7 @@
</parent>
<groupId>com.google.protobuf</groupId>
<artifactId>protoc</artifactId>
- <version>3.11.2</version>
+ <version>3.11.4</version>
<packaging>pom</packaging>
<name>Protobuf Compiler</name>
<description>
@@ -71,11 +71,6 @@
<type>exe</type>
</artifact>
<artifact>
- <file>${basedir}/target/osx/x86_32/protoc.exe</file>
- <classifier>osx-x86_32</classifier>
- <type>exe</type>
- </artifact>
- <artifact>
<file>${basedir}/target/linux/aarch_64/protoc.exe</file>
<classifier>linux-aarch_64</classifier>
<type>exe</type>
diff --git a/python/google/protobuf/__init__.py b/python/google/protobuf/__init__.py
index 25d2445..cc9a06a 100755
--- a/python/google/protobuf/__init__.py
+++ b/python/google/protobuf/__init__.py
@@ -30,7 +30,7 @@
# Copyright 2007 Google Inc. All Rights Reserved.
-__version__ = '3.11.2'
+__version__ = '3.11.4'
if __name__ != '__main__':
try:
diff --git a/ruby/ext/google/protobuf_c/encode_decode.c b/ruby/ext/google/protobuf_c/encode_decode.c
index 22e3efb..142fd57 100644
--- a/ruby/ext/google/protobuf_c/encode_decode.c
+++ b/ruby/ext/google/protobuf_c/encode_decode.c
@@ -1466,6 +1466,7 @@
MessageHeader* msg;
upb_msg_field_iter i;
upb_status status;
+ bool json_wrapper = is_wrapper(desc->msgdef) && is_json;
if (is_json &&
upb_msgdef_wellknowntype(desc->msgdef) == UPB_WELLKNOWN_ANY) {
@@ -1542,7 +1543,7 @@
is_default = RSTRING_LEN(str) == 0;
}
- if (is_matching_oneof || emit_defaults || !is_default) {
+ if (is_matching_oneof || emit_defaults || !is_default || json_wrapper) {
putstr(str, f, sink);
}
} else if (upb_fielddef_issubmsg(f)) {
@@ -1562,7 +1563,7 @@
} else if (upb_msgdef_syntax(desc->msgdef) == UPB_SYNTAX_PROTO3) { \
is_default = default_value == value; \
} \
- if (is_matching_oneof || emit_defaults || !is_default) { \
+ if (is_matching_oneof || emit_defaults || !is_default || json_wrapper) { \
upb_sink_put##upbtype(sink, sel, value); \
} \
} break;
diff --git a/ruby/google-protobuf.gemspec b/ruby/google-protobuf.gemspec
index ba7acbc..bf60b6a 100644
--- a/ruby/google-protobuf.gemspec
+++ b/ruby/google-protobuf.gemspec
@@ -1,6 +1,6 @@
Gem::Specification.new do |s|
s.name = "google-protobuf"
- s.version = "3.11.2"
+ s.version = "3.11.4"
git_tag = "v#{s.version.to_s.sub('.rc.', '-rc')}" # Converts X.Y.Z.rc.N to vX.Y.Z-rcN, used for the git tag
s.licenses = ["BSD-3-Clause"]
s.summary = "Protocol Buffers"
diff --git a/ruby/tests/common_tests.rb b/ruby/tests/common_tests.rb
index ee05b85..7414aea 100644
--- a/ruby/tests/common_tests.rb
+++ b/ruby/tests/common_tests.rb
@@ -1293,6 +1293,7 @@
run_asserts.call(m)
m2 = proto_module::Wrapper.decode(m.to_proto)
run_asserts.call(m2)
+ m3 = proto_module::Wrapper.decode_json(m.to_json)
end
def test_wrapper_getters
diff --git a/src/Makefile.am b/src/Makefile.am
index 5ac489b..7d5e779 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -18,7 +18,7 @@
PTHREAD_DEF =
endif
-PROTOBUF_VERSION = 22:2:0
+PROTOBUF_VERSION = 22:4:0
if GCC
# Turn on all warnings except for sign comparison (we ignore sign comparison
diff --git a/src/google/protobuf/any.pb.h b/src/google/protobuf/any.pb.h
index f551818..0ff9341 100644
--- a/src/google/protobuf/any.pb.h
+++ b/src/google/protobuf/any.pb.h
@@ -13,7 +13,7 @@
#error incompatible with your Protocol Buffer headers. Please update
#error your headers.
#endif
-#if 3011002 < PROTOBUF_MIN_PROTOC_VERSION
+#if 3011004 < PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers. Please
#error regenerate this file with a newer version of protoc.
diff --git a/src/google/protobuf/api.pb.h b/src/google/protobuf/api.pb.h
index b00b88d..ed49df1 100644
--- a/src/google/protobuf/api.pb.h
+++ b/src/google/protobuf/api.pb.h
@@ -13,7 +13,7 @@
#error incompatible with your Protocol Buffer headers. Please update
#error your headers.
#endif
-#if 3011002 < PROTOBUF_MIN_PROTOC_VERSION
+#if 3011004 < PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers. Please
#error regenerate this file with a newer version of protoc.
diff --git a/src/google/protobuf/arena.h b/src/google/protobuf/arena.h
index d73b53c..2dcf817 100644
--- a/src/google/protobuf/arena.h
+++ b/src/google/protobuf/arena.h
@@ -248,7 +248,7 @@
// well as protobuf container types like RepeatedPtrField and Map. The protocol
// is internal to protobuf and is not guaranteed to be stable. Non-proto types
// should not rely on this protocol.
-class PROTOBUF_EXPORT alignas(8) Arena final {
+class PROTOBUF_EXPORT PROTOBUF_ALIGNAS(8) Arena final {
public:
// Arena constructor taking custom options. See ArenaOptions below for
// descriptions of the options available.
@@ -338,8 +338,10 @@
template <typename T>
PROTOBUF_ALWAYS_INLINE static T* CreateArray(Arena* arena,
size_t num_elements) {
+#ifndef __INTEL_COMPILER // icc mis-evaluates some types as non-pod
static_assert(std::is_pod<T>::value,
"CreateArray requires a trivially constructible type");
+#endif
static_assert(std::is_trivially_destructible<T>::value,
"CreateArray requires a trivially destructible type");
GOOGLE_CHECK_LE(num_elements, std::numeric_limits<size_t>::max() / sizeof(T))
diff --git a/src/google/protobuf/compiler/command_line_interface.cc b/src/google/protobuf/compiler/command_line_interface.cc
index c5b2030..fd64d0f 100644
--- a/src/google/protobuf/compiler/command_line_interface.cc
+++ b/src/google/protobuf/compiler/command_line_interface.cc
@@ -886,7 +886,8 @@
for (int i = 0; i < output_directives_.size(); i++) {
std::string output_location = output_directives_[i].output_location;
if (!HasSuffixString(output_location, ".zip") &&
- !HasSuffixString(output_location, ".jar")) {
+ !HasSuffixString(output_location, ".jar") &&
+ !HasSuffixString(output_location, ".srcjar")) {
AddTrailingSlash(&output_location);
}
@@ -2228,12 +2229,20 @@
}
io::FileOutputStream out(fd);
- if (!file_set.SerializeToZeroCopyStream(&out)) {
- std::cerr << descriptor_set_out_name_ << ": " << strerror(out.GetErrno())
- << std::endl;
- out.Close();
- return false;
+
+ {
+ io::CodedOutputStream coded_out(&out);
+ // Determinism is useful here because build outputs are sometimes checked
+ // into version control.
+ coded_out.SetSerializationDeterministic(true);
+ if (!file_set.SerializeToCodedStream(&coded_out)) {
+ std::cerr << descriptor_set_out_name_ << ": " << strerror(out.GetErrno())
+ << std::endl;
+ out.Close();
+ return false;
+ }
}
+
if (!out.Close()) {
std::cerr << descriptor_set_out_name_ << ": " << strerror(out.GetErrno())
<< std::endl;
diff --git a/src/google/protobuf/compiler/plugin.pb.h b/src/google/protobuf/compiler/plugin.pb.h
index 0fdf8c6..6061e3c 100644
--- a/src/google/protobuf/compiler/plugin.pb.h
+++ b/src/google/protobuf/compiler/plugin.pb.h
@@ -13,7 +13,7 @@
#error incompatible with your Protocol Buffer headers. Please update
#error your headers.
#endif
-#if 3011002 < PROTOBUF_MIN_PROTOC_VERSION
+#if 3011004 < PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers. Please
#error regenerate this file with a newer version of protoc.
diff --git a/src/google/protobuf/descriptor.pb.h b/src/google/protobuf/descriptor.pb.h
index 30e85cc..e7bae0d 100644
--- a/src/google/protobuf/descriptor.pb.h
+++ b/src/google/protobuf/descriptor.pb.h
@@ -13,7 +13,7 @@
#error incompatible with your Protocol Buffer headers. Please update
#error your headers.
#endif
-#if 3011002 < PROTOBUF_MIN_PROTOC_VERSION
+#if 3011004 < PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers. Please
#error regenerate this file with a newer version of protoc.
diff --git a/src/google/protobuf/duration.pb.h b/src/google/protobuf/duration.pb.h
index 7b34a4b..b2efc3c 100644
--- a/src/google/protobuf/duration.pb.h
+++ b/src/google/protobuf/duration.pb.h
@@ -13,7 +13,7 @@
#error incompatible with your Protocol Buffer headers. Please update
#error your headers.
#endif
-#if 3011002 < PROTOBUF_MIN_PROTOC_VERSION
+#if 3011004 < PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers. Please
#error regenerate this file with a newer version of protoc.
diff --git a/src/google/protobuf/empty.pb.h b/src/google/protobuf/empty.pb.h
index 66312bc..7d24d89 100644
--- a/src/google/protobuf/empty.pb.h
+++ b/src/google/protobuf/empty.pb.h
@@ -13,7 +13,7 @@
#error incompatible with your Protocol Buffer headers. Please update
#error your headers.
#endif
-#if 3011002 < PROTOBUF_MIN_PROTOC_VERSION
+#if 3011004 < PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers. Please
#error regenerate this file with a newer version of protoc.
diff --git a/src/google/protobuf/field_mask.pb.h b/src/google/protobuf/field_mask.pb.h
index f3f8319..af6b8a9 100644
--- a/src/google/protobuf/field_mask.pb.h
+++ b/src/google/protobuf/field_mask.pb.h
@@ -13,7 +13,7 @@
#error incompatible with your Protocol Buffer headers. Please update
#error your headers.
#endif
-#if 3011002 < PROTOBUF_MIN_PROTOC_VERSION
+#if 3011004 < PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers. Please
#error regenerate this file with a newer version of protoc.
diff --git a/src/google/protobuf/message.h b/src/google/protobuf/message.h
index 3bd6263..0b393fb 100644
--- a/src/google/protobuf/message.h
+++ b/src/google/protobuf/message.h
@@ -1193,11 +1193,11 @@
const Message* unused = static_cast<T*>(nullptr);
(void)unused;
-#ifdef GOOGLE_PROTOBUF_NO_RTTI
+#if PROTOBUF_RTTI
+ return dynamic_cast<const T*>(from);
+#else
bool ok = T::default_instance().GetReflection() == from->GetReflection();
return ok ? down_cast<const T*>(from) : nullptr;
-#else
- return dynamic_cast<const T*>(from);
#endif
}
diff --git a/src/google/protobuf/port_def.inc b/src/google/protobuf/port_def.inc
index 3e39f91..d09877b 100644
--- a/src/google/protobuf/port_def.inc
+++ b/src/google/protobuf/port_def.inc
@@ -297,7 +297,7 @@
// Shared google3/opensource definitions. //////////////////////////////////////
-#define PROTOBUF_VERSION 3011002
+#define PROTOBUF_VERSION 3011004
#define PROTOBUF_MIN_HEADER_VERSION_FOR_PROTOC 3011000
#define PROTOBUF_MIN_PROTOC_VERSION 3011000
#define PROTOBUF_VERSION_SUFFIX ""
@@ -382,6 +382,8 @@
// Windows declares several inconvenient macro names. We #undef them and then
// restore them in port_undef.inc.
#ifdef _MSC_VER
+#pragma push_macro("ERROR")
+#undef ERROR
#pragma push_macro("GetMessage")
#undef GetMessage
#pragma push_macro("IGNORE")
@@ -420,3 +422,32 @@
#else
#define PROTOBUF_ASSUME(pred) GOOGLE_DCHECK(pred)
#endif
+
+// Specify memory alignment for structs, classes, etc.
+// Use like:
+// class PROTOBUF_ALIGNAS(16) MyClass { ... }
+// PROTOBUF_ALIGNAS(16) int array[4];
+//
+// In most places you can use the C++11 keyword "alignas", which is preferred.
+//
+// But compilers have trouble mixing __attribute__((...)) syntax with
+// alignas(...) syntax.
+//
+// Doesn't work in clang or gcc:
+// struct alignas(16) __attribute__((packed)) S { char c; };
+// Works in clang but not gcc:
+// struct __attribute__((packed)) alignas(16) S2 { char c; };
+// Works in clang and gcc:
+// struct alignas(16) S3 { char c; } __attribute__((packed));
+//
+// There are also some attributes that must be specified *before* a class
+// definition: visibility (used for exporting functions/classes) is one of
+// these attributes. This means that it is not possible to use alignas() with a
+// class that is marked as exported.
+#if defined(_MSC_VER)
+#define PROTOBUF_ALIGNAS(byte_alignment) __declspec(align(byte_alignment))
+#elif defined(__GNUC__)
+#define PROTOBUF_ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment)))
+#else
+#define PROTOBUF_ALIGNAS(byte_alignment) alignas(byte_alignment)
+#endif
diff --git a/src/google/protobuf/port_undef.inc b/src/google/protobuf/port_undef.inc
index 80822b4..2cc56f3 100644
--- a/src/google/protobuf/port_undef.inc
+++ b/src/google/protobuf/port_undef.inc
@@ -68,9 +68,11 @@
#undef PROTOBUF_ASSUME
#undef PROTOBUF_EXPORT_TEMPLATE_DECLARE
#undef PROTOBUF_EXPORT_TEMPLATE_DEFINE
+#undef PROTOBUF_ALIGNAS
// Restore macro that may have been #undef'd in port_def.inc.
#ifdef _MSC_VER
+#pragma pop_macro("ERROR")
#pragma pop_macro("GetMessage")
#pragma pop_macro("IGNORE")
#pragma pop_macro("IN")
diff --git a/src/google/protobuf/source_context.pb.h b/src/google/protobuf/source_context.pb.h
index c9c70c8..2861a69 100644
--- a/src/google/protobuf/source_context.pb.h
+++ b/src/google/protobuf/source_context.pb.h
@@ -13,7 +13,7 @@
#error incompatible with your Protocol Buffer headers. Please update
#error your headers.
#endif
-#if 3011002 < PROTOBUF_MIN_PROTOC_VERSION
+#if 3011004 < PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers. Please
#error regenerate this file with a newer version of protoc.
diff --git a/src/google/protobuf/struct.pb.h b/src/google/protobuf/struct.pb.h
index 9d2ccb2..46363e4 100644
--- a/src/google/protobuf/struct.pb.h
+++ b/src/google/protobuf/struct.pb.h
@@ -13,7 +13,7 @@
#error incompatible with your Protocol Buffer headers. Please update
#error your headers.
#endif
-#if 3011002 < PROTOBUF_MIN_PROTOC_VERSION
+#if 3011004 < PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers. Please
#error regenerate this file with a newer version of protoc.
diff --git a/src/google/protobuf/stubs/casts.h b/src/google/protobuf/stubs/casts.h
index b509f68..780857b 100644
--- a/src/google/protobuf/stubs/casts.h
+++ b/src/google/protobuf/stubs/casts.h
@@ -35,9 +35,12 @@
#include <google/protobuf/stubs/common.h>
+#include <google/protobuf/port_def.inc>
+
namespace google {
namespace protobuf {
namespace internal {
+
// Use implicit_cast as a safe version of static_cast or const_cast
// for upcasting in the type hierarchy (i.e. casting a pointer to Foo
// to a pointer to SuperclassOfFoo or casting a pointer to Foo to
@@ -88,7 +91,7 @@
implicit_cast<From*, To>(0);
}
-#if !defined(NDEBUG) && !defined(GOOGLE_PROTOBUF_NO_RTTI)
+#if !defined(NDEBUG) && PROTOBUF_RTTI
assert(f == nullptr || dynamic_cast<To>(f) != nullptr); // RTTI: debug mode only!
#endif
return static_cast<To>(f);
@@ -105,7 +108,7 @@
implicit_cast<From*, ToAsPointer>(0);
}
-#if !defined(NDEBUG) && !defined(GOOGLE_PROTOBUF_NO_RTTI)
+#if !defined(NDEBUG) && PROTOBUF_RTTI
// RTTI: debug mode only!
assert(dynamic_cast<ToAsPointer>(&f) != nullptr);
#endif
@@ -131,4 +134,7 @@
} // namespace protobuf
} // namespace google
+
+#include <google/protobuf/port_undef.inc>
+
#endif // GOOGLE_PROTOBUF_CASTS_H__
diff --git a/src/google/protobuf/stubs/common.h b/src/google/protobuf/stubs/common.h
index ef7ace9..1c9084f 100644
--- a/src/google/protobuf/stubs/common.h
+++ b/src/google/protobuf/stubs/common.h
@@ -81,7 +81,7 @@
// The current version, represented as a single integer to make comparison
// easier: major * 10^6 + minor * 10^3 + micro
-#define GOOGLE_PROTOBUF_VERSION 3011002
+#define GOOGLE_PROTOBUF_VERSION 3011004
// A suffix string for alpha, beta or rc releases. Empty for stable releases.
#define GOOGLE_PROTOBUF_VERSION_SUFFIX ""
diff --git a/src/google/protobuf/stubs/strutil.h b/src/google/protobuf/stubs/strutil.h
index e688c8e..f319bfc 100644
--- a/src/google/protobuf/stubs/strutil.h
+++ b/src/google/protobuf/stubs/strutil.h
@@ -35,6 +35,7 @@
#include <stdlib.h>
#include <vector>
+#include <cstring>
#include <google/protobuf/stubs/common.h>
#include <google/protobuf/stubs/stringpiece.h>
@@ -117,6 +118,12 @@
return str.size() >= prefix.size() &&
str.compare(0, prefix.size(), prefix) == 0;
}
+
+inline bool HasPrefixString(StringPiece str,
+ StringPiece prefix) {
+ return str.size() >= prefix.size() &&
+ memcmp(str.data(), prefix.data(), prefix.size()) == 0;
+}
inline string StripPrefixString(const string& str, const string& prefix) {
if (HasPrefixString(str, prefix)) {
diff --git a/src/google/protobuf/timestamp.pb.h b/src/google/protobuf/timestamp.pb.h
index 338a1e7..f0a4330 100644
--- a/src/google/protobuf/timestamp.pb.h
+++ b/src/google/protobuf/timestamp.pb.h
@@ -13,7 +13,7 @@
#error incompatible with your Protocol Buffer headers. Please update
#error your headers.
#endif
-#if 3011002 < PROTOBUF_MIN_PROTOC_VERSION
+#if 3011004 < PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers. Please
#error regenerate this file with a newer version of protoc.
diff --git a/src/google/protobuf/type.pb.h b/src/google/protobuf/type.pb.h
index 40d2cd4..8756c93 100644
--- a/src/google/protobuf/type.pb.h
+++ b/src/google/protobuf/type.pb.h
@@ -13,7 +13,7 @@
#error incompatible with your Protocol Buffer headers. Please update
#error your headers.
#endif
-#if 3011002 < PROTOBUF_MIN_PROTOC_VERSION
+#if 3011004 < PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers. Please
#error regenerate this file with a newer version of protoc.
diff --git a/src/google/protobuf/wrappers.pb.h b/src/google/protobuf/wrappers.pb.h
index ebde03a..dd03416 100644
--- a/src/google/protobuf/wrappers.pb.h
+++ b/src/google/protobuf/wrappers.pb.h
@@ -13,7 +13,7 @@
#error incompatible with your Protocol Buffer headers. Please update
#error your headers.
#endif
-#if 3011002 < PROTOBUF_MIN_PROTOC_VERSION
+#if 3011004 < PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers. Please
#error regenerate this file with a newer version of protoc.
diff --git a/tests.sh b/tests.sh
index 9e72cb5..bda7e53 100755
--- a/tests.sh
+++ b/tests.sh
@@ -705,6 +705,30 @@
popd
}
+build_php7.4_mac() {
+ generate_php_test_proto
+ # Install PHP
+ curl -s https://php-osx.liip.ch/install.sh | bash -s 7.4
+ PHP_FOLDER=`find /usr/local -type d -name "php7-7.4*"` # The folder name may change upon time
+ export PATH="$PHP_FOLDER/bin:$PATH"
+
+ # Install phpunit
+ curl https://phar.phpunit.de/phpunit-8.phar -L -o phpunit.phar
+ chmod +x phpunit.phar
+ sudo mv phpunit.phar /usr/local/bin/phpunit
+
+ # Install valgrind
+ echo "#! /bin/bash" > valgrind
+ chmod ug+x valgrind
+ sudo mv valgrind /usr/local/bin/valgrind
+
+ # Test
+ cd php/tests && /bin/bash ./test.sh && cd ../..
+ pushd conformance
+ make test_php_c
+ popd
+}
+
build_php_compatibility() {
internal_build_cpp
php/tests/compatibility_test.sh $LAST_RELEASED