diff options
-rw-r--r-- | editors/proto.vim | 2 | ||||
-rw-r--r-- | java/src/main/java/com/google/protobuf/BoundedByteString.java | 17 | ||||
-rw-r--r-- | java/src/main/java/com/google/protobuf/ByteString.java | 3 | ||||
-rw-r--r-- | java/src/main/java/com/google/protobuf/LiteralByteString.java | 2 | ||||
-rw-r--r-- | java/src/main/java/com/google/protobuf/RopeByteString.java | 16 | ||||
-rw-r--r-- | java/src/test/java/com/google/protobuf/BoundedByteStringTest.java | 19 | ||||
-rw-r--r-- | java/src/test/java/com/google/protobuf/LiteralByteStringTest.java | 16 | ||||
-rw-r--r-- | java/src/test/java/com/google/protobuf/RopeByteStringTest.java | 18 | ||||
-rw-r--r-- | python/google/protobuf/pyext/descriptor.cc | 12 | ||||
-rwxr-xr-x | python/setup.py | 2 | ||||
-rw-r--r-- | src/google/protobuf/compiler/cpp/cpp_extension.h | 2 | ||||
-rw-r--r-- | src/google/protobuf/compiler/parser.cc | 4 | ||||
-rw-r--r-- | src/google/protobuf/compiler/parser_unittest.cc | 9 |
13 files changed, 114 insertions, 8 deletions
diff --git a/editors/proto.vim b/editors/proto.vim index 7cd1dbf2..23085a28 100644 --- a/editors/proto.vim +++ b/editors/proto.vim @@ -54,7 +54,7 @@ syn keyword pbTodo contained TODO FIXME XXX syn cluster pbCommentGrp contains=pbTodo syn keyword pbSyntax syntax import option -syn keyword pbStructure package message group +syn keyword pbStructure package message group oneof syn keyword pbRepeat optional required repeated syn keyword pbDefault default syn keyword pbExtend extend extensions to max diff --git a/java/src/main/java/com/google/protobuf/BoundedByteString.java b/java/src/main/java/com/google/protobuf/BoundedByteString.java index 2828e9c7..8cb6f463 100644 --- a/java/src/main/java/com/google/protobuf/BoundedByteString.java +++ b/java/src/main/java/com/google/protobuf/BoundedByteString.java @@ -30,6 +30,9 @@ package com.google.protobuf; +import java.io.InvalidObjectException; +import java.io.IOException; +import java.io.ObjectInputStream; import java.util.NoSuchElementException; /** @@ -123,6 +126,20 @@ class BoundedByteString extends LiteralByteString { } // ================================================================= + // Serializable + + private static final long serialVersionUID = 1L; + + Object writeReplace() { + return new LiteralByteString(toByteArray()); + } + + private void readObject(ObjectInputStream in) throws IOException { + throw new InvalidObjectException( + "BoundedByteStream instances are not to be serialized directly"); + } + + // ================================================================= // ByteIterator @Override diff --git a/java/src/main/java/com/google/protobuf/ByteString.java b/java/src/main/java/com/google/protobuf/ByteString.java index 996789c7..cff1ee51 100644 --- a/java/src/main/java/com/google/protobuf/ByteString.java +++ b/java/src/main/java/com/google/protobuf/ByteString.java @@ -34,6 +34,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -57,7 +58,7 @@ import java.util.NoSuchElementException; * @author carlanton@google.com Carl Haverl * @author martinrb@google.com Martin Buchholz */ -public abstract class ByteString implements Iterable<Byte> { +public abstract class ByteString implements Iterable<Byte>, Serializable { /** * When two strings to be concatenated have a combined length shorter than diff --git a/java/src/main/java/com/google/protobuf/LiteralByteString.java b/java/src/main/java/com/google/protobuf/LiteralByteString.java index 127c574d..767b9f35 100644 --- a/java/src/main/java/com/google/protobuf/LiteralByteString.java +++ b/java/src/main/java/com/google/protobuf/LiteralByteString.java @@ -51,6 +51,8 @@ import java.util.NoSuchElementException; */ class LiteralByteString extends ByteString { + private static final long serialVersionUID = 1L; + protected final byte[] bytes; /** diff --git a/java/src/main/java/com/google/protobuf/RopeByteString.java b/java/src/main/java/com/google/protobuf/RopeByteString.java index d1655b80..fa23c9dd 100644 --- a/java/src/main/java/com/google/protobuf/RopeByteString.java +++ b/java/src/main/java/com/google/protobuf/RopeByteString.java @@ -30,8 +30,10 @@ package com.google.protobuf; +import java.io.InvalidObjectException; import java.io.IOException; import java.io.InputStream; +import java.io.ObjectInputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.io.ByteArrayInputStream; @@ -772,6 +774,20 @@ class RopeByteString extends ByteString { } // ================================================================= + // Serializable + + private static final long serialVersionUID = 1L; + + Object writeReplace() { + return new LiteralByteString(toByteArray()); + } + + private void readObject(ObjectInputStream in) throws IOException { + throw new InvalidObjectException( + "RopeByteStream instances are not to be serialized directly"); + } + + // ================================================================= // ByteIterator @Override diff --git a/java/src/test/java/com/google/protobuf/BoundedByteStringTest.java b/java/src/test/java/com/google/protobuf/BoundedByteStringTest.java index 2b71cfbc..6c9596ca 100644 --- a/java/src/test/java/com/google/protobuf/BoundedByteStringTest.java +++ b/java/src/test/java/com/google/protobuf/BoundedByteStringTest.java @@ -30,8 +30,14 @@ package com.google.protobuf; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.io.UnsupportedEncodingException; + /** * This class tests {@link BoundedByteString}, which extends {@link LiteralByteString}, * by inheriting the tests from {@link LiteralByteStringTest}. The only method which @@ -65,4 +71,17 @@ public class BoundedByteStringTest extends LiteralByteStringTest { assertEquals(classUnderTest + " unicode bytes must match", testString.substring(2, testString.length() - 6), roundTripString); } + + public void testJavaSerialization() throws Exception { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(out); + oos.writeObject(stringUnderTest); + oos.close(); + byte[] pickled = out.toByteArray(); + InputStream in = new ByteArrayInputStream(pickled); + ObjectInputStream ois = new ObjectInputStream(in); + Object o = ois.readObject(); + assertTrue("Didn't get a ByteString back", o instanceof ByteString); + assertEquals("Should get an equal ByteString back", stringUnderTest, o); + } } diff --git a/java/src/test/java/com/google/protobuf/LiteralByteStringTest.java b/java/src/test/java/com/google/protobuf/LiteralByteStringTest.java index 475f7ffb..ff39ca3f 100644 --- a/java/src/test/java/com/google/protobuf/LiteralByteStringTest.java +++ b/java/src/test/java/com/google/protobuf/LiteralByteStringTest.java @@ -32,9 +32,12 @@ package com.google.protobuf; import junit.framework.TestCase; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; @@ -393,4 +396,17 @@ public class LiteralByteStringTest extends TestCase { assertSame("empty concatenated with " + classUnderTest + " must give " + classUnderTest, ByteString.EMPTY.concat(stringUnderTest), stringUnderTest); } + + public void testJavaSerialization() throws Exception { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(out); + oos.writeObject(stringUnderTest); + oos.close(); + byte[] pickled = out.toByteArray(); + InputStream in = new ByteArrayInputStream(pickled); + ObjectInputStream ois = new ObjectInputStream(in); + Object o = ois.readObject(); + assertTrue("Didn't get a ByteString back", o instanceof ByteString); + assertEquals("Should get an equal ByteString back", stringUnderTest, o); + } } diff --git a/java/src/test/java/com/google/protobuf/RopeByteStringTest.java b/java/src/test/java/com/google/protobuf/RopeByteStringTest.java index 9676f527..b3970196 100644 --- a/java/src/test/java/com/google/protobuf/RopeByteStringTest.java +++ b/java/src/test/java/com/google/protobuf/RopeByteStringTest.java @@ -30,6 +30,11 @@ package com.google.protobuf; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.io.UnsupportedEncodingException; import java.util.Arrays; import java.util.Iterator; @@ -112,4 +117,17 @@ public class RopeByteStringTest extends LiteralByteStringTest { assertEquals(classUnderTest + " string must must have same hashCode as the flat string", flatString.hashCode(), unicode.hashCode()); } + + public void testJavaSerialization() throws Exception { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(out); + oos.writeObject(stringUnderTest); + oos.close(); + byte[] pickled = out.toByteArray(); + InputStream in = new ByteArrayInputStream(pickled); + ObjectInputStream ois = new ObjectInputStream(in); + Object o = ois.readObject(); + assertTrue("Didn't get a ByteString back", o instanceof ByteString); + assertEquals("Should get an equal ByteString back", stringUnderTest, o); + } } diff --git a/python/google/protobuf/pyext/descriptor.cc b/python/google/protobuf/pyext/descriptor.cc index 55bb0b72..7343c0b7 100644 --- a/python/google/protobuf/pyext/descriptor.cc +++ b/python/google/protobuf/pyext/descriptor.cc @@ -247,8 +247,10 @@ PyDescriptorPool* NewDescriptorPool() { } static void Dealloc(PyDescriptorPool* self) { - for (auto it : (*self->classes_by_descriptor)) { - Py_DECREF(it.second); + typedef PyDescriptorPool::ClassesByMessageMap::iterator iterator; + for (iterator it = self->classes_by_descriptor->begin(); + it != self->classes_by_descriptor->end(); ++it) { + Py_DECREF(it->second); } delete self->classes_by_descriptor; Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self)); @@ -300,7 +302,8 @@ const google::protobuf::Descriptor* RegisterMessageClass( return NULL; } Py_INCREF(message_class); - auto ret = self->classes_by_descriptor->insert( + typedef PyDescriptorPool::ClassesByMessageMap::iterator iterator; + std::pair<iterator, bool> ret = self->classes_by_descriptor->insert( make_pair(message_descriptor, message_class)); if (!ret.second) { // Update case: DECREF the previous value. @@ -323,7 +326,8 @@ const google::protobuf::Descriptor* RegisterMessageClass( // Retrieve the message class added to our database. PyObject *GetMessageClass(PyDescriptorPool* self, const Descriptor *message_descriptor) { - auto ret = self->classes_by_descriptor->find(message_descriptor); + typedef PyDescriptorPool::ClassesByMessageMap::iterator iterator; + iterator ret = self->classes_by_descriptor->find(message_descriptor); if (ret == self->classes_by_descriptor->end()) { PyErr_Format(PyExc_TypeError, "No message class registered for '%s'", message_descriptor->full_name().c_str()); diff --git a/python/setup.py b/python/setup.py index 7337260a..69ffcd1d 100755 --- a/python/setup.py +++ b/python/setup.py @@ -157,7 +157,7 @@ if __name__ == '__main__': "google/protobuf/pyext/repeated_scalar_container.cc", "google/protobuf/pyext/repeated_composite_container.cc" ], define_macros=[('GOOGLE_PROTOBUF_HAS_ONEOF', '1')], - include_dirs = [ ".", "../src"], + include_dirs = [ ".", "..", "../src"], libraries = [ "protobuf" ], library_dirs = [ '../src/.libs' ], )) diff --git a/src/google/protobuf/compiler/cpp/cpp_extension.h b/src/google/protobuf/compiler/cpp/cpp_extension.h index d354c16a..1c1caf1f 100644 --- a/src/google/protobuf/compiler/cpp/cpp_extension.h +++ b/src/google/protobuf/compiler/cpp/cpp_extension.h @@ -57,7 +57,7 @@ namespace cpp { class ExtensionGenerator { public: // See generator.cc for the meaning of dllexport_decl. - explicit ExtensionGenerator(const FieldDescriptor* desycriptor, + explicit ExtensionGenerator(const FieldDescriptor* descriptor, const Options& options); ~ExtensionGenerator(); diff --git a/src/google/protobuf/compiler/parser.cc b/src/google/protobuf/compiler/parser.cc index 4b3efe48..fe697acf 100644 --- a/src/google/protobuf/compiler/parser.cc +++ b/src/google/protobuf/compiler/parser.cc @@ -468,6 +468,10 @@ bool Parser::Parse(io::Tokenizer* input, FileDescriptorProto* file) { // Store the syntax into the file. if (file != NULL) file->set_syntax(syntax_identifier_); } else if (!stop_after_syntax_identifier_) { + GOOGLE_LOG(WARNING) << "No syntax specified for the proto file. " + << "Please use 'syntax = \"proto2\";' or " + << "'syntax = \"proto3\";' to specify a syntax " + << "version. (Defaulted to proto2 syntax.)"; syntax_identifier_ = "proto2"; } diff --git a/src/google/protobuf/compiler/parser_unittest.cc b/src/google/protobuf/compiler/parser_unittest.cc index 00112999..45f95df1 100644 --- a/src/google/protobuf/compiler/parser_unittest.cc +++ b/src/google/protobuf/compiler/parser_unittest.cc @@ -216,6 +216,15 @@ TEST_F(ParserTest, StopAfterSyntaxIdentifierWithErrors) { EXPECT_EQ("1:9: Expected syntax identifier.\n", error_collector_.text_); } +TEST_F(ParserTest, WarnIfSyntaxIdentifierOmmitted) { + SetupParser("message A {}"); + FileDescriptorProto file; + CaptureTestStderr(); + EXPECT_TRUE(parser_->Parse(input_.get(), &file)); + EXPECT_TRUE( + GetCapturedTestStderr().find("No syntax specified") != string::npos); +} + // =================================================================== typedef ParserTest ParseMessageTest; |