Skip to content

Commit

Permalink
Inline unknownFieldData{Equals,HashCode} to generated code.
Browse files Browse the repository at this point in the history
It turns out dex (apparently) was inlining these protected final
methods from ExtendableMessageNano into every message class. Removing
these methods from the base class and inlining their code reduces
the method count by 2 methods / message when the store_unknown_fields
option is on.

Change-Id: I0aa09f2016d39939c4c8b8219601793b8fab301f
  • Loading branch information
brianduff committed Apr 28, 2015
1 parent dac7e02 commit a69b461
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -160,31 +160,6 @@ protected final boolean storeUnknownField(CodedInputByteBufferNano input, int ta
return true;
}

/**
* Returns whether the stored unknown field data in this message is equivalent to that in the
* other message.
*
* @param other the other message.
* @return whether the two sets of unknown field data are equal.
*/
protected final boolean unknownFieldDataEquals(M other) {
if (unknownFieldData == null || unknownFieldData.isEmpty()) {
return other.unknownFieldData == null || other.unknownFieldData.isEmpty();
} else {
return unknownFieldData.equals(other.unknownFieldData);
}
}

/**
* Computes the hashcode representing the unknown field data stored in this message.
*
* @return the hashcode for the unknown field data.
*/
protected final int unknownFieldDataHashCode() {
return (unknownFieldData == null || unknownFieldData.isEmpty()
? 0 : unknownFieldData.hashCode());
}

@Override
public M clone() throws CloneNotSupportedException {
M cloned = (M) super.clone();
Expand Down
19 changes: 11 additions & 8 deletions javanano/src/main/java/com/google/protobuf/nano/FieldArray.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,12 @@
* A custom version of {@link android.util.SparseArray} with the minimal API
* for storing {@link FieldData} objects.
*
* <p>This class is an internal implementation detail of nano and should not
* be called directly by clients.
*
* Based on {@link android.support.v4.util.SpareArrayCompat}.
*/
class FieldArray implements Cloneable {
public final class FieldArray implements Cloneable {
private static final FieldData DELETED = new FieldData();
private boolean mGarbage = false;

Expand All @@ -48,7 +51,7 @@ class FieldArray implements Cloneable {
/**
* Creates a new FieldArray containing no fields.
*/
public FieldArray() {
FieldArray() {
this(10);
}

Expand All @@ -57,7 +60,7 @@ public FieldArray() {
* require any additional memory allocation to store the specified
* number of mappings.
*/
public FieldArray(int initialCapacity) {
FieldArray(int initialCapacity) {
initialCapacity = idealIntArraySize(initialCapacity);
mFieldNumbers = new int[initialCapacity];
mData = new FieldData[initialCapacity];
Expand All @@ -68,7 +71,7 @@ public FieldArray(int initialCapacity) {
* Gets the FieldData mapped from the specified fieldNumber, or <code>null</code>
* if no such mapping has been made.
*/
public FieldData get(int fieldNumber) {
FieldData get(int fieldNumber) {
int i = binarySearch(fieldNumber);

if (i < 0 || mData[i] == DELETED) {
Expand All @@ -81,7 +84,7 @@ public FieldData get(int fieldNumber) {
/**
* Removes the data from the specified fieldNumber, if there was any.
*/
public void remove(int fieldNumber) {
void remove(int fieldNumber) {
int i = binarySearch(fieldNumber);

if (i >= 0 && mData[i] != DELETED) {
Expand Down Expand Up @@ -118,7 +121,7 @@ private void gc() {
* Adds a mapping from the specified fieldNumber to the specified data,
* replacing the previous mapping if there was one.
*/
public void put(int fieldNumber, FieldData data) {
void put(int fieldNumber, FieldData data) {
int i = binarySearch(fieldNumber);

if (i >= 0) {
Expand Down Expand Up @@ -167,7 +170,7 @@ public void put(int fieldNumber, FieldData data) {
* Returns the number of key-value mappings that this FieldArray
* currently stores.
*/
public int size() {
int size() {
if (mGarbage) {
gc();
}
Expand All @@ -184,7 +187,7 @@ public boolean isEmpty() {
* the value from the <code>index</code>th key-value mapping that this
* FieldArray stores.
*/
public FieldData dataAt(int index) {
FieldData dataAt(int index) {
if (mGarbage) {
gc();
}
Expand Down
10 changes: 8 additions & 2 deletions src/google/protobuf/compiler/javanano/javanano_message.cc
Original file line number Diff line number Diff line change
Expand Up @@ -612,7 +612,11 @@ void MessageGenerator::GenerateEquals(io::Printer* printer) {

if (params_.store_unknown_fields()) {
printer->Print(
"return unknownFieldDataEquals(other);\n");
"if (unknownFieldData == null || unknownFieldData.isEmpty()) {\n"
" return other.unknownFieldData == null || other.unknownFieldData.isEmpty();\n"
"} else {\n"
" return unknownFieldData.equals(other.unknownFieldData);\n"
"}");
} else {
printer->Print(
"return true;\n");
Expand Down Expand Up @@ -642,7 +646,9 @@ void MessageGenerator::GenerateHashCode(io::Printer* printer) {

if (params_.store_unknown_fields()) {
printer->Print(
"result = 31 * result + unknownFieldDataHashCode();\n");
"result = 31 * result + \n"
" (unknownFieldData == null || unknownFieldData.isEmpty() ? 0 : \n"
" unknownFieldData.hashCode());\n");
}

printer->Print("return result;\n");
Expand Down

0 comments on commit a69b461

Please sign in to comment.