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
This commit is contained in:
Ficus Kirkpatrick 2013-04-08 13:47:44 -07:00
parent d4bb580f1b
commit 314a302933
3 changed files with 20 additions and 4 deletions

View File

@ -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"

View File

@ -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");

View File

@ -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"