diff options
-rw-r--r-- | CHANGES.txt | 32 | ||||
-rw-r--r-- | csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs | 16 | ||||
-rw-r--r-- | csharp/src/Google.Protobuf.Test/JsonParserTest.cs | 3 | ||||
-rw-r--r-- | csharp/src/Google.Protobuf/JsonParser.cs | 3 | ||||
-rw-r--r-- | java/README.md | 85 | ||||
-rw-r--r-- | js/binary/reader_test.js | 52 | ||||
-rw-r--r-- | protoc-artifacts/README.md | 23 | ||||
-rw-r--r-- | src/google/protobuf/map.h | 4 | ||||
-rw-r--r--[-rwxr-xr-x] | src/google/protobuf/stubs/hash.h | 58 | ||||
-rw-r--r-- | src/google/protobuf/stubs/port.h | 4 |
10 files changed, 232 insertions, 48 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index bc969ecb..3459cccf 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,11 +1,18 @@ -2016-05-10 version 3.0.0-beta-3 (C++/Java/Python/Ruby/Nano/Objective-C/C#/JavaScript) +2016-05-16 version 3.0.0-beta-3 (C++/Java/Python/Ruby/Nano/Objective-C/C#/JavaScript) General * Supported Proto3 lite-runtime in C++/Java for mobile platforms. * Any type now supports APIs to specify prefixes other than type.googleapis.com + * Removed javanano_use_deprecated_package option; Nano will always has its own + ".nano" package. C++ (Beta) - * Improved hash maps. TODO(gpike) + * Improved hash maps. + - Improved hash maps comments. In particular, please note that equal hash + maps will not necessarily have the same iteration order and + serialization. + - Added a new hash maps implementation that will become the default in a + later release. * Arenas - Several inlined methods in Arena were moved to out-of-line to improve build performance and code size. @@ -39,11 +46,15 @@ range checking. - `ByteBuffer`-backed `CodedOutputStream` now writes directly to the `ByteBuffer` rather than to an intermediate array. - * Improved the performance for lite-runtime. TODO(dweis) + * Improved lite-runtime. + - Lite protos now implement deep equals/hashCode/toString + - Significantly improved the performance of Builder#mergeFrom() and + Builder#mergeDelimitedFrom() * Various bug fixes and small feature enhancement. - Fixed stack overflow when in hashCode() for infinite recursive oneofs. - Fixed the lazy field parsing in lite to merge rather than overwrite. - TextFormat now supports reporting line/column numbers on errors. + - Updated to add appropriate @Override for better compiler errors. Python (Beta) * Added JSON format for Any, Struct, Value and ListValue @@ -91,7 +102,20 @@ * Improvements in JSON formatting and parsing Javascript (Alpha) - * TODO(haberman) + * Better support for "bytes" fields: bytes fields can be read as either a + base64 string or UInt8Array (in environments where TypedArray is supported). + * New support for CommonJS imports. This should make it easier to use the + JavaScript support in Node.js and tools like WebPack. See js/README.md for + more information. + * Some significant internal refactoring to simplify and modularize the code. + + Ruby (Alpha) + * JSON serialization now properly uses camelCased names, with a runtime option + that will preserve original names from .proto files instead. + * Well-known types are now included in the distribution. + * Release now includes binary gems for Windows, Mac, and Linux instead of just + source gems. + * Bugfix for serializing oneofs. C++/Java Lite (Alpha) A new "lite" generator parameter was introduced in the protoc for C++ and diff --git a/csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs b/csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs index 827a7595..77f9c434 100644 --- a/csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs +++ b/csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs @@ -512,6 +512,22 @@ namespace Google.Protobuf Assert.Throws<InvalidOperationException>(() => JsonFormatter.Default.Format(any)); } + [Test] + [TestCase(typeof(BoolValue), true, "true")] + [TestCase(typeof(Int32Value), 32, "32")] + [TestCase(typeof(Int64Value), 32L, "\"32\"")] + [TestCase(typeof(UInt32Value), 32U, "32")] + [TestCase(typeof(UInt64Value), 32UL, "\"32\"")] + [TestCase(typeof(StringValue), "foo", "\"foo\"")] + [TestCase(typeof(FloatValue), 1.5f, "1.5")] + [TestCase(typeof(DoubleValue), 1.5d, "1.5")] + public void Wrappers_Standalone(System.Type wrapperType, object value, string expectedJson) + { + IMessage populated = (IMessage)Activator.CreateInstance(wrapperType); + populated.Descriptor.Fields[WrappersReflection.WrapperValueFieldNumber].Accessor.SetValue(populated, value); + Assert.AreEqual(expectedJson, JsonFormatter.Default.Format(populated)); + } + /// <summary> /// Checks that the actual JSON is the same as the expected JSON - but after replacing /// all apostrophes in the expected JSON with double quotes. This basically makes the tests easier diff --git a/csharp/src/Google.Protobuf.Test/JsonParserTest.cs b/csharp/src/Google.Protobuf.Test/JsonParserTest.cs index c3ad851b..f595455a 100644 --- a/csharp/src/Google.Protobuf.Test/JsonParserTest.cs +++ b/csharp/src/Google.Protobuf.Test/JsonParserTest.cs @@ -133,9 +133,12 @@ namespace Google.Protobuf } [Test] + [TestCase(typeof(BoolValue), "true", true)] [TestCase(typeof(Int32Value), "32", 32)] [TestCase(typeof(Int64Value), "32", 32L)] + [TestCase(typeof(Int64Value), "\"32\"", 32L)] [TestCase(typeof(UInt32Value), "32", 32U)] + [TestCase(typeof(UInt64Value), "\"32\"", 32UL)] [TestCase(typeof(UInt64Value), "32", 32UL)] [TestCase(typeof(StringValue), "\"foo\"", "foo")] [TestCase(typeof(FloatValue), "1.5", 1.5f)] diff --git a/csharp/src/Google.Protobuf/JsonParser.cs b/csharp/src/Google.Protobuf/JsonParser.cs index d738ebb0..6b6f2d9a 100644 --- a/csharp/src/Google.Protobuf/JsonParser.cs +++ b/csharp/src/Google.Protobuf/JsonParser.cs @@ -86,7 +86,8 @@ namespace Google.Protobuf { FloatValue.Descriptor.FullName, MergeWrapperField }, { DoubleValue.Descriptor.FullName, MergeWrapperField }, { BytesValue.Descriptor.FullName, MergeWrapperField }, - { StringValue.Descriptor.FullName, MergeWrapperField } + { StringValue.Descriptor.FullName, MergeWrapperField }, + { BoolValue.Descriptor.FullName, MergeWrapperField } }; // Convenience method to avoid having to repeat the same code multiple times in the above diff --git a/java/README.md b/java/README.md index 060d9ac6..83f91e18 100644 --- a/java/README.md +++ b/java/README.md @@ -17,9 +17,10 @@ rather build without Maven, see below. http://maven.apache.org/ -2) Build the C++ code, or obtain a binary distribution of protoc. If - you install a binary distribution, make sure that it is the same - version as this package. If in doubt, run: +2) Build the C++ code, or obtain a binary distribution of protoc (see + the toplevel [README.md](../README.md)). If you install a binary + distribution, make sure that it is the same version as this package. + If in doubt, run: $ protoc --version @@ -44,36 +45,25 @@ rather build without Maven, see below. The .jar will be placed in the "target" directory. -Installation - 'Lite' Version - With Maven -========================================== - -Building the 'lite' version of the Java Protocol Buffers library is -the same as building the full version, except that all commands are -run using the 'lite' profile. (see -http://maven.apache.org/guides/introduction/introduction-to-profiles.html) - -E.g. to install the lite version of the jar, you would run: +The above instructions will install 3 maven artifacts: - $ mvn install -P lite - -The resulting artifact has the 'lite' classifier. To reference it -for dependency resolution, you would specify it as: - -``` - <dependency> - <groupId>com.google.protobuf</groupId> - <artifactId>protobuf-java</artifactId> - <version>${version}</version> - <classifier>lite</classifier> - </dependency> -``` + * protobuf-java: The core Java Protocol Buffers library. Most users only + need this artifact. + * protobuf-lite: The lite version of core Java Protobuf Buffers library. It + is a subset of the core library and is used together with + the 'lite' code generator flag to reduce generated code size + for mobile. + * protobuf-java-util: Utilities to work with protos. It contains JSON support + as well as utilities to work with proto3 well-known + types. Installation - Without Maven ============================ If you would rather not install Maven to build the library, you may follow these instructions instead. Note that these instructions skip -running unit tests. +running unit tests and only describes how to install the core protobuf +library (without the util package). 1) Build the C++ code, or obtain a binary distribution of protoc. If you install a binary distribution, make sure that it is the same @@ -86,15 +76,50 @@ running unit tests. 2) Invoke protoc to build DescriptorProtos.java: - $ protoc --java_out=src/main/java -I../src \ + $ protoc --java_out=core/src/main/java -I../src \ ../src/google/protobuf/descriptor.proto -3) Compile the code in src/main/java using whatever means you prefer. +3) Compile the code in core/src/main/java using whatever means you prefer. 4) Install the classes wherever you prefer. -Usage -===== +Compatibility Notice +==================== + +* Protobuf minor version releases are backwards-compatible. If your code + can build/run against the old version, it's expected to build/run against + the new version as well. Both binary compatibility and source compatbility + are guaranteed for minor version releases if the user follows the guideline + described in this section. + +* Protobuf major version releases may also be backwards-compatbile with the + last release of the previous major version. See the release notice for more + details. + +* APIs marked with the @ExperimentalApi annotation are subject to change. They + can be modified in any way, or even removed, at any time. Don't use them if + compatiblity is needed. If your code is a library itself (i.e. it is used on + the CLASSPATH of users outside your own control), you should not use + experimental APIs, unless you repackage them (e.g. using ProGuard). + +* Deprecated non-experimental APIs will be removed two years after the release + in which they are first deprecated. You must fix your references before this + time. If you don't, any manner of breakage could result (you are not + guaranteed a compilation error). + +* Protobuf message interfaces/classes are designed to be subclassed by protobuf + generated code only. Do not subclass these message interfaces/classes + yourself. We may add new methods to the message interfaces/classes which will + break your own subclasses. + +* Don't use any method/class that is marked as "used by generated code only". + Such methods/classes are subject to change. + +* Protobuf LITE runtime APIs are not stable yet. They are subject to change even + in minor version releases. + +Documentation +============= The complete documentation for Protocol Buffers is available via the web at: diff --git a/js/binary/reader_test.js b/js/binary/reader_test.js index 6f7e5d45..db674cf8 100644 --- a/js/binary/reader_test.js +++ b/js/binary/reader_test.js @@ -360,6 +360,58 @@ describe('binaryReaderTest', function() { /** + * Tests reading a field from hexadecimal string (format: '08 BE EF'). + * @param {Function} readField + * @param {number} expected + * @param {string} hexString + */ + function doTestHexStringVarint_(readField, expected, hexString) { + var bytesCount = (hexString.length + 1) / 3; + var bytes = new Uint8Array(bytesCount); + for (var i = 0; i < bytesCount; i++) { + byte = parseInt(hexString.substring(i * 3, i * 3 + 2), 16); + bytes[i] = byte; + } + var reader = jspb.BinaryReader.alloc(bytes); + reader.nextField(); + assertEquals(expected, readField.call(reader)); + } + + + /** + * Tests non-canonical redundant varint decoding. + */ + it('testRedundantVarintFields', function() { + assertNotNull(jspb.BinaryReader.prototype.readUint32); + assertNotNull(jspb.BinaryReader.prototype.readUint64); + assertNotNull(jspb.BinaryReader.prototype.readSint32); + assertNotNull(jspb.BinaryReader.prototype.readSint64); + + // uint32 and sint32 take no more than 5 bytes + // 08 - field prefix (type = 0 means varint) + doTestHexStringVarint_( + jspb.BinaryReader.prototype.readUint32, + 12, '08 8C 80 80 80 00'); + + // 11 stands for -6 in zigzag encoding + doTestHexStringVarint_( + jspb.BinaryReader.prototype.readSint32, + -6, '08 8B 80 80 80 00'); + + // uint64 and sint64 take no more than 10 bytes + // 08 - field prefix (type = 0 means varint) + doTestHexStringVarint_( + jspb.BinaryReader.prototype.readUint64, + 12, '08 8C 80 80 80 80 80 80 80 80 00'); + + // 11 stands for -6 in zigzag encoding + doTestHexStringVarint_( + jspb.BinaryReader.prototype.readSint64, + -6, '08 8B 80 80 80 80 80 80 80 80 00'); + }); + + + /** * Tests 64-bit fields that are handled as strings. */ it('testStringInt64Fields', function() { diff --git a/protoc-artifacts/README.md b/protoc-artifacts/README.md index 4320f651..a910fe0d 100644 --- a/protoc-artifacts/README.md +++ b/protoc-artifacts/README.md @@ -22,6 +22,17 @@ The scripts only work under Unix-like environments, e.g., Linux, MacOSX, and Cygwin or MinGW for Windows. Please see ``README.md`` of the Protobuf project for how to set up the build environment. +## Building from a freshly checked-out source + +If you just checked out the Protobuf source from github, you need to +generate the configure script. + +Under the protobuf project directory: + +``` +$ ./autogen.sh && ./configure && make +``` + ## To install artifacts locally The following command will install the ``protoc`` artifact to your local Maven repository. ``` @@ -43,7 +54,7 @@ Frequently used values are: - ``os.detected.name``: ``linux``, ``osx``, ``windows``. - ``os.detected.arch``: ``x86_32``, ``x86_64`` -For example, MingGW32 only ships with 32-bit compilers, but you can still build +For example, MinGW32 only ships with 32-bit compilers, but you can still build 32-bit protoc under 64-bit Windows, with the following command: ``` $ mvn install -Dos.detected.arch=x86_32 @@ -59,10 +70,14 @@ support. DO NOT close the staging repository until you have done the deployment for all platforms. Currently the following platforms are supported: - Linux (x86_32 and x86_64) - Windows (x86_32 and x86_64) with - - Cygwin with MinGW compilers (both x86_32 and x86_64) - - MSYS with MinGW32 (x86_32 only) + - Cygwin64 with MinGW compilers (x86_64) + - MSYS with MinGW32 (x86_32) - MacOSX (x86_32 and x86_64) +As for MSYS2/MinGW64 for Windows: protoc will build, but it insists on +adding a dependency of `libwinpthread-1.dll`, which isn't shipped with +Windows. + Use the following command to deploy artifacts for the host platform to a staging repository. ``` @@ -113,7 +128,7 @@ stored: <settings> <servers> <server> - <id>ossrh</id> + <id>sonatype-nexus-staging</id> <username>[username]</username> <password>[password]</password> </server> diff --git a/src/google/protobuf/map.h b/src/google/protobuf/map.h index bb0b14f9..6f1a71e4 100644 --- a/src/google/protobuf/map.h +++ b/src/google/protobuf/map.h @@ -504,9 +504,7 @@ class MapPair { // assert(m0.begin()->first == m1.begin()->first); // Bug! // // Map's interface is similar to std::unordered_map, except that Map is not -// designed to play well with exceptions. Mutations to a Map do not invalidate -// a Map's iterators, pointers to elements, or references to elements. Except -// for erase(iterator), any non-const method can reorder iterators. +// designed to play well with exceptions. template <typename Key, typename T> class Map { public: diff --git a/src/google/protobuf/stubs/hash.h b/src/google/protobuf/stubs/hash.h index bbd8ee65..4eac7d5d 100755..100644 --- a/src/google/protobuf/stubs/hash.h +++ b/src/google/protobuf/stubs/hash.h @@ -108,8 +108,13 @@ # define GOOGLE_PROTOBUF_HAS_CXX11_HASH # define GOOGLE_PROTOBUF_HASH_COMPARE std::hash_compare # elif _MSC_VER >= 1500 // Since Visual Studio 2008 -# undef GOOGLE_PROTOBUF_HAVE_HASH_MAP -# undef GOOGLE_PROTOBUF_HAVE_HASH_SET +# define GOOGLE_PROTOBUF_HASH_NAMESPACE stdext +# include <hash_map> +# define GOOGLE_PROTOBUF_HASH_MAP_CLASS hash_map +# include <hash_set> +# define GOOGLE_PROTOBUF_HASH_SET_CLASS hash_set +# define GOOGLE_PROTOBUF_HASH_COMPARE stdext::hash_compare +# define GOOGLE_PROTOBUF_CONTAINERS_NEED_HASH_COMPARE # elif _MSC_VER >= 1310 # define GOOGLE_PROTOBUF_HASH_NAMESPACE stdext # include <hash_map> @@ -247,6 +252,52 @@ template <> struct hash<const char*> : public GOOGLE_PROTOBUF_HASH_COMPARE<const char*, CstringLess> {}; +#ifdef GOOGLE_PROTOBUF_CONTAINERS_NEED_HASH_COMPARE + +template <typename Key, typename HashFcn, typename EqualKey> +struct InternalHashCompare : public GOOGLE_PROTOBUF_HASH_COMPARE<Key> { + InternalHashCompare() {} + InternalHashCompare(HashFcn hashfcn, EqualKey equalkey) + : hashfcn_(hashfcn), equalkey_(equalkey) {} + size_t operator()(const Key& key) const { return hashfcn_(key); } + bool operator()(const Key& key1, const Key& key2) const { + return !equalkey_(key1, key2); + } + HashFcn hashfcn_; + EqualKey equalkey_; +}; + +template <typename Key, typename Data, + typename HashFcn = hash<Key>, + typename EqualKey = std::equal_to<Key>, + typename Alloc = std::allocator< std::pair<const Key, Data> > > +class hash_map + : public GOOGLE_PROTOBUF_HASH_NAMESPACE::GOOGLE_PROTOBUF_HASH_MAP_CLASS< + Key, Data, InternalHashCompare<Key, HashFcn, EqualKey>, Alloc> { + typedef GOOGLE_PROTOBUF_HASH_NAMESPACE::GOOGLE_PROTOBUF_HASH_MAP_CLASS< + Key, Data, InternalHashCompare<Key, HashFcn, EqualKey>, Alloc> BaseClass; + + public: + hash_map(int a = 0, const HashFcn& b = HashFcn(), + const EqualKey& c = EqualKey(), const Alloc& d = Alloc()) + : BaseClass(InternalHashCompare<Key, HashFcn, EqualKey>(b, c), d) {} + + HashFcn hash_function() const { return HashFcn(); } +}; + +template <typename Key, typename HashFcn = hash<Key>, + typename EqualKey = std::equal_to<Key> > +class hash_set + : public GOOGLE_PROTOBUF_HASH_NAMESPACE::GOOGLE_PROTOBUF_HASH_SET_CLASS< + Key, InternalHashCompare<Key, HashFcn, EqualKey> > { + public: + hash_set(int = 0) {} + + HashFcn hash_function() const { return HashFcn(); } +}; + +#else // GOOGLE_PROTOBUF_CONTAINERS_NEED_HASH_COMPARE + template <typename Key, typename Data, typename HashFcn = hash<Key>, typename EqualKey = std::equal_to<Key>, @@ -275,8 +326,9 @@ class hash_set HashFcn hash_function() const { return HashFcn(); } }; +#endif // GOOGLE_PROTOBUF_CONTAINERS_NEED_HASH_COMPARE -#else +#else // defined(_MSC_VER) && !defined(_STLPORT_VERSION) template <typename Key> struct hash : public GOOGLE_PROTOBUF_HASH_NAMESPACE::hash<Key> { diff --git a/src/google/protobuf/stubs/port.h b/src/google/protobuf/stubs/port.h index 1036dff1..0e65fc8f 100644 --- a/src/google/protobuf/stubs/port.h +++ b/src/google/protobuf/stubs/port.h @@ -276,10 +276,8 @@ inline void GOOGLE_UNALIGNED_STORE64(void *p, uint64 v) { #define GOOGLE_THREAD_LOCAL __thread #endif -// The following guarantees declaration of the byte swap functions, and -// defines __BYTE_ORDER for MSVC +// The following guarantees declaration of the byte swap functions. #ifdef _MSC_VER -#define __BYTE_ORDER __LITTLE_ENDIAN #define bswap_16(x) _byteswap_ushort(x) #define bswap_32(x) _byteswap_ulong(x) #define bswap_64(x) _byteswap_uint64(x) |