浏览代码

Merge "Don't use Arrays.copyOf in generated code."

Ficus Kirkpatrick 12 年之前
父节点
当前提交
4349e11df9

+ 3 - 1
src/google/protobuf/compiler/javanano/javanano_enum_field.cc

@@ -166,7 +166,9 @@ GenerateParsingCode(io::Printer* printer) const {
     printer->Print(variables_,
       "int arrayLength = com.google.protobuf.nano.WireFormatNano.getRepeatedFieldArrayLength(input, $tag$);\n"
       "int i = this.$name$.length;\n"
-      "this.$name$ = java.util.Arrays.copyOf(this.$name$, this.$name$.length + arrayLength);\n"
+      "int[] newArray = new int[i + arrayLength];\n"
+      "System.arraycopy(this.$name$, 0, newArray, 0, i);\n"
+      "this.$name$ = newArray;\n"
       "for (; i < this.$name$.length - 1; i++) {\n"
       "  this.$name$[i] = input.readInt32();\n"
       "  input.readTag();\n"

+ 3 - 1
src/google/protobuf/compiler/javanano/javanano_message_field.cc

@@ -144,7 +144,9 @@ GenerateParsingCode(io::Printer* printer) const {
   printer->Print(variables_,
     "int arrayLength = com.google.protobuf.nano.WireFormatNano.getRepeatedFieldArrayLength(input, $tag$);\n"
     "int i = this.$name$.length;\n"
-    "this.$name$ = java.util.Arrays.copyOf(this.$name$, i + arrayLength);\n"
+    "$type$[] newArray = new $type$[i + arrayLength];\n"
+    "System.arraycopy(this.$name$, 0, newArray, 0, i);\n"
+    "this.$name$ = newArray;\n"
     "for (; i < this.$name$.length - 1; i++) {\n"
     "  this.$name$[i] = new $type$();\n");
 

+ 14 - 2
src/google/protobuf/compiler/javanano/javanano_primitive_field.cc

@@ -391,8 +391,20 @@ GenerateParsingCode(io::Printer* printer) const {
   } else {
     printer->Print(variables_,
       "int arrayLength = com.google.protobuf.nano.WireFormatNano.getRepeatedFieldArrayLength(input, $tag$);\n"
-      "int i = this.$name$.length;\n"
-      "this.$name$ = java.util.Arrays.copyOf(this.$name$, this.$name$.length + arrayLength);\n"
+      "int i = this.$name$.length;\n");
+
+    if (GetJavaType(descriptor_) == JAVATYPE_BYTES) {
+      printer->Print(variables_,
+        "byte[][] newArray = new byte[i + arrayLength][];\n"
+        "System.arraycopy(this.$name$, 0, newArray, 0, i);\n"
+        "this.$name$ = newArray;\n");
+    } else {
+      printer->Print(variables_,
+        "$type$[] newArray = new $type$[i + arrayLength];\n"
+        "System.arraycopy(this.$name$, 0, newArray, 0, i);\n"
+        "this.$name$ = newArray;\n");
+    }
+    printer->Print(variables_,
       "for (; i < this.$name$.length - 1; i++) {\n"
       "  this.$name$[i] = input.read$capitalized_type$();\n"
       "  input.readTag();\n"