Don't use Arrays.copyOf in generated code.

It didn't appear until API 9 and is thus incompatible with Froyo.
Instead, allocate a new array and System.arraycopy inline.

Change-Id: I2e1cd07a4a762ef8edd5ec06ceaa1d38b302823d
pull/91/head
Ficus Kirkpatrick 12 years ago
parent d4bb580f1b
commit 314a302933
  1. 4
      src/google/protobuf/compiler/javanano/javanano_enum_field.cc
  2. 4
      src/google/protobuf/compiler/javanano/javanano_message_field.cc
  3. 16
      src/google/protobuf/compiler/javanano/javanano_primitive_field.cc

@ -166,7 +166,9 @@ GenerateParsingCode(io::Printer* printer) const {
printer->Print(variables_, printer->Print(variables_,
"int arrayLength = com.google.protobuf.nano.WireFormatNano.getRepeatedFieldArrayLength(input, $tag$);\n" "int arrayLength = com.google.protobuf.nano.WireFormatNano.getRepeatedFieldArrayLength(input, $tag$);\n"
"int i = this.$name$.length;\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" "for (; i < this.$name$.length - 1; i++) {\n"
" this.$name$[i] = input.readInt32();\n" " this.$name$[i] = input.readInt32();\n"
" input.readTag();\n" " input.readTag();\n"

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

@ -391,8 +391,20 @@ GenerateParsingCode(io::Printer* printer) const {
} else { } else {
printer->Print(variables_, printer->Print(variables_,
"int arrayLength = com.google.protobuf.nano.WireFormatNano.getRepeatedFieldArrayLength(input, $tag$);\n" "int arrayLength = com.google.protobuf.nano.WireFormatNano.getRepeatedFieldArrayLength(input, $tag$);\n"
"int i = this.$name$.length;\n" "int i = this.$name$.length;\n");
"this.$name$ = java.util.Arrays.copyOf(this.$name$, this.$name$.length + arrayLength);\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" "for (; i < this.$name$.length - 1; i++) {\n"
" this.$name$[i] = input.read$capitalized_type$();\n" " this.$name$[i] = input.read$capitalized_type$();\n"
" input.readTag();\n" " input.readTag();\n"

Loading…
Cancel
Save