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
