Merge pull request #5368 from haberman/objc
Some changes to the ObjC code generator to support importing into Google.
diff --git a/cmake/README.md b/cmake/README.md
index 1f37056..29f7669 100644
--- a/cmake/README.md
+++ b/cmake/README.md
@@ -130,6 +130,13 @@
If the *gmock* directory does not exist, and you do not want to build protobuf unit tests,
you need to add *cmake* command argument `-Dprotobuf_BUILD_TESTS=OFF` to disable testing.
+To make a *Visual Studio* file for Visual Studio 15 2017, create the *Visual Studio*
+solution file above and edit the CmakeCache file.
+
+ C:Path\to\protobuf\cmake\build\solution\CMakeCache
+
+Then create the *Visual Studio* solution file again
+
Compiling
=========
diff --git a/objectivec/GPBMessage.m b/objectivec/GPBMessage.m
index a7db1e9..3d5eccd 100644
--- a/objectivec/GPBMessage.m
+++ b/objectivec/GPBMessage.m
@@ -1283,16 +1283,20 @@
NSUInteger fieldCount = fieldsArray.count;
const GPBExtensionRange *extensionRanges = descriptor.extensionRanges;
NSUInteger extensionRangesCount = descriptor.extensionRangesCount;
+ NSArray *sortedExtensions =
+ [[extensionMap_ allKeys] sortedArrayUsingSelector:@selector(compareByFieldNumber:)];
for (NSUInteger i = 0, j = 0; i < fieldCount || j < extensionRangesCount;) {
if (i == fieldCount) {
[self writeExtensionsToCodedOutputStream:output
- range:extensionRanges[j++]];
+ range:extensionRanges[j++]
+ sortedExtensions:sortedExtensions];
} else if (j == extensionRangesCount ||
GPBFieldNumber(fieldsArray[i]) < extensionRanges[j].start) {
[self writeField:fieldsArray[i++] toCodedOutputStream:output];
} else {
[self writeExtensionsToCodedOutputStream:output
- range:extensionRanges[j++]];
+ range:extensionRanges[j++]
+ sortedExtensions:sortedExtensions];
}
}
if (descriptor.isWireFormat) {
@@ -1808,17 +1812,20 @@
}
- (void)writeExtensionsToCodedOutputStream:(GPBCodedOutputStream *)output
- range:(GPBExtensionRange)range {
- NSArray *sortedExtensions = [[extensionMap_ allKeys]
- sortedArrayUsingSelector:@selector(compareByFieldNumber:)];
+ range:(GPBExtensionRange)range
+ sortedExtensions:(NSArray *)sortedExtensions {
uint32_t start = range.start;
uint32_t end = range.end;
for (GPBExtensionDescriptor *extension in sortedExtensions) {
uint32_t fieldNumber = extension.fieldNumber;
- if (fieldNumber >= start && fieldNumber < end) {
- id value = [extensionMap_ objectForKey:extension];
- GPBWriteExtensionValueToOutputStream(extension, value, output);
+ if (fieldNumber < start) {
+ continue;
}
+ if (fieldNumber >= end) {
+ break;
+ }
+ id value = [extensionMap_ objectForKey:extension];
+ GPBWriteExtensionValueToOutputStream(extension, value, output);
}
}
diff --git a/protobuf.bzl b/protobuf.bzl
index b8ec0ee..88eeb87 100644
--- a/protobuf.bzl
+++ b/protobuf.bzl
@@ -132,7 +132,7 @@
inputs += [plugin]
if not in_gen_dir:
- ctx.action(
+ ctx.actions.run(
inputs=inputs,
outputs=outs,
arguments=args + import_flags + [src.path],
@@ -154,7 +154,7 @@
generated_out = '/'.join([gen_dir, out.basename])
if generated_out != out.path:
command += ";mv %s %s" % (generated_out, out.path)
- ctx.action(
+ ctx.actions.run_shell(
inputs=inputs + [ctx.executable.protoc],
outputs=[out],
command=command,
diff --git a/ruby/tests/common_tests.rb b/ruby/tests/common_tests.rb
index 920fadc..60897b6 100644
--- a/ruby/tests/common_tests.rb
+++ b/ruby/tests/common_tests.rb
@@ -204,10 +204,10 @@
m.optional_string = "asdf".encode!('UTF-8')
# Ruby 2.5 changed to raise FrozenError. However, assert_raise don't
# accept subclass.
- ok = true
+ ok = false
begin
m.optional_string.encode!('ASCII-8BIT')
- rescue RuntimeError => e
+ rescue RuntimeError
ok = true
end
assert ok
@@ -341,16 +341,16 @@
def test_rptfield_initialize
assert_raise ArgumentError do
- l = Google::Protobuf::RepeatedField.new
+ Google::Protobuf::RepeatedField.new
end
assert_raise ArgumentError do
- l = Google::Protobuf::RepeatedField.new(:message)
+ Google::Protobuf::RepeatedField.new(:message)
end
assert_raise ArgumentError do
- l = Google::Protobuf::RepeatedField.new([1, 2, 3])
+ Google::Protobuf::RepeatedField.new([1, 2, 3])
end
assert_raise ArgumentError do
- l = Google::Protobuf::RepeatedField.new(:message, [proto_module::TestMessage2.new])
+ Google::Protobuf::RepeatedField.new(:message, [proto_module::TestMessage2.new])
end
end
@@ -620,14 +620,14 @@
encoded_field_d = proto_module::OneofMessage.encode(proto_module::OneofMessage.new(:d => :B))
d3 = proto_module::OneofMessage.decode(
- encoded_field_c + encoded_field_a + encoded_field_d)
+ encoded_field_c + encoded_field_a + encoded_field_b + encoded_field_d)
assert d3.a == ""
assert d3.b == 0
assert d3.c == nil
assert d3.d == :B
d4 = proto_module::OneofMessage.decode(
- encoded_field_c + encoded_field_a + encoded_field_d +
+ encoded_field_c + encoded_field_a + encoded_field_b + encoded_field_d +
encoded_field_c)
assert d4.a == ""
assert d4.b == 0
@@ -800,7 +800,7 @@
m = proto_module::Recursive1.new(:foo => proto_module::Recursive2.new)
m.foo.foo = m
assert_raise RuntimeError do
- serialized = proto_module::Recursive1.encode(m)
+ proto_module::Recursive1.encode(m)
end
end
@@ -933,7 +933,6 @@
data = proto_module::TestMessage.encode(m)
- l = 0
10_000.times do
m = proto_module::TestMessage.decode(data)
data_new = proto_module::TestMessage.encode(m)
diff --git a/ruby/tests/encode_decode_test.rb b/ruby/tests/encode_decode_test.rb
index f8b991c..d2b25fd 100644
--- a/ruby/tests/encode_decode_test.rb
+++ b/ruby/tests/encode_decode_test.rb
@@ -86,7 +86,7 @@
end
def test_encode_wrong_msg
- e = assert_raise ::ArgumentError do
+ assert_raise ::ArgumentError do
m = A::B::C::TestMessage.new(
:optional_int32 => 1,
)
diff --git a/ruby/tests/generated_code_proto2_test.rb b/ruby/tests/generated_code_proto2_test.rb
index e988abd..302f945 100644
--- a/ruby/tests/generated_code_proto2_test.rb
+++ b/ruby/tests/generated_code_proto2_test.rb
@@ -14,8 +14,8 @@
# is to ensure that the output of the code generator is valid Ruby and
# successfully creates message definitions and classes, not to test every
# aspect of the extension (basic.rb is for that).
- m = A::B::Proto2::TestMessage.new()
- m2 = FooBar::Proto2::TestImportedMessage.new()
- m3 = A::B::Proto2::TestRubyPackageMessage.new()
+ A::B::Proto2::TestMessage.new
+ FooBar::Proto2::TestImportedMessage.new
+ A::B::Proto2::TestRubyPackageMessage.new
end
end
diff --git a/ruby/tests/generated_code_test.rb b/ruby/tests/generated_code_test.rb
index 431d681..6e6f915 100644
--- a/ruby/tests/generated_code_test.rb
+++ b/ruby/tests/generated_code_test.rb
@@ -14,8 +14,8 @@
# is to ensure that the output of the code generator is valid Ruby and
# successfully creates message definitions and classes, not to test every
# aspect of the extension (basic.rb is for that).
- m = A::B::C::TestMessage.new()
- m2 = FooBar::TestImportedMessage.new()
- m3 = A::B::TestRubyPackageMessage.new()
+ A::B::C::TestMessage.new
+ FooBar::TestImportedMessage.new
+ A::B::TestRubyPackageMessage.new
end
end