diff options
author | Elliott Hughes <enh@google.com> | 2011-07-13 12:10:30 -0700 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2011-07-13 12:10:30 -0700 |
commit | b9eba866b203b28e58f35598023f49b4b58a0635 (patch) | |
tree | f32811a7b51001e4cd6e85fa44b0f199bf1e8a55 /tools/aidl/Type.cpp | |
parent | 4a6d113ba0f33ce5dc14e59463e928ba309e1c2e (diff) | |
download | frameworks_base-b9eba866b203b28e58f35598023f49b4b58a0635.zip frameworks_base-b9eba866b203b28e58f35598023f49b4b58a0635.tar.gz frameworks_base-b9eba866b203b28e58f35598023f49b4b58a0635.tar.bz2 |
Fix aidl to cope with multiple collection types per method.
Bug: http://code.google.com/p/android/issues/detail?id=18497
Change-Id: I152416022524d2860cb16b46c4812c5be6bdcbad
Diffstat (limited to 'tools/aidl/Type.cpp')
-rwxr-xr-x | tools/aidl/Type.cpp | 120 |
1 files changed, 60 insertions, 60 deletions
diff --git a/tools/aidl/Type.cpp b/tools/aidl/Type.cpp index a44072d..6b69864 100755 --- a/tools/aidl/Type.cpp +++ b/tools/aidl/Type.cpp @@ -198,7 +198,7 @@ Type::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int fl } void -Type::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +Type::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__, __LINE__, m_qualifiedName.c_str()); @@ -207,7 +207,7 @@ Type::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) } void -Type::ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +Type::ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__, __LINE__, m_qualifiedName.c_str()); @@ -226,7 +226,7 @@ Type::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, i void Type::CreateArrayFromParcel(StatementBlock* addTo, Variable* v, - Variable* parcel) + Variable* parcel, Variable**) { fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__, __LINE__, m_qualifiedName.c_str()); @@ -235,7 +235,7 @@ Type::CreateArrayFromParcel(StatementBlock* addTo, Variable* v, } void -Type::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +Type::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__, __LINE__, m_qualifiedName.c_str()); @@ -284,7 +284,7 @@ BasicType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, i } void -BasicType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +BasicType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { addTo->Add(new Assignment(v, new MethodCall(parcel, m_unmarshallMethod))); } @@ -303,13 +303,13 @@ BasicType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parc void BasicType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v, - Variable* parcel) + Variable* parcel, Variable**) { addTo->Add(new Assignment(v, new MethodCall(parcel, m_createArrayMethod))); } void -BasicType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +BasicType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { addTo->Add(new MethodCall(parcel, m_readArrayMethod, 1, v)); } @@ -331,7 +331,7 @@ BooleanType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, } void -BooleanType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +BooleanType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { addTo->Add(new Assignment(v, new Comparison(new LiteralExpression("0"), "!=", new MethodCall(parcel, "readInt")))); @@ -351,13 +351,13 @@ BooleanType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* pa void BooleanType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v, - Variable* parcel) + Variable* parcel, Variable**) { addTo->Add(new Assignment(v, new MethodCall(parcel, "createBooleanArray"))); } void -BooleanType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +BooleanType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { addTo->Add(new MethodCall(parcel, "readBooleanArray", 1, v)); } @@ -378,7 +378,7 @@ CharType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, in } void -CharType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +CharType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { addTo->Add(new Assignment(v, new MethodCall(parcel, "readInt"), this)); } @@ -397,13 +397,13 @@ CharType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parce void CharType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v, - Variable* parcel) + Variable* parcel, Variable**) { addTo->Add(new Assignment(v, new MethodCall(parcel, "createCharArray"))); } void -CharType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +CharType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { addTo->Add(new MethodCall(parcel, "readCharArray", 1, v)); } @@ -428,7 +428,7 @@ StringType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, } void -StringType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +StringType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { addTo->Add(new Assignment(v, new MethodCall(parcel, "readString"))); } @@ -447,13 +447,13 @@ StringType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* par void StringType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v, - Variable* parcel) + Variable* parcel, Variable**) { addTo->Add(new Assignment(v, new MethodCall(parcel, "createStringArray"))); } void -StringType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +StringType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { addTo->Add(new MethodCall(parcel, "readStringArray", 1, v)); } @@ -496,7 +496,7 @@ CharSequenceType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* pa void CharSequenceType::CreateFromParcel(StatementBlock* addTo, Variable* v, - Variable* parcel) + Variable* parcel, Variable**) { // if (0 != parcel.readInt()) { // v = TextUtils.createFromParcel(parcel) @@ -532,7 +532,7 @@ RemoteExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* } void -RemoteExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +RemoteExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__); } @@ -551,7 +551,7 @@ RuntimeExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable } void -RuntimeExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +RuntimeExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__); } @@ -571,7 +571,7 @@ IBinderType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, } void -IBinderType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +IBinderType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { addTo->Add(new Assignment(v, new MethodCall(parcel, "readStrongBinder"))); } @@ -584,13 +584,13 @@ IBinderType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* pa void IBinderType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v, - Variable* parcel) + Variable* parcel, Variable**) { addTo->Add(new Assignment(v, new MethodCall(parcel, "createBinderArray"))); } void -IBinderType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +IBinderType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { addTo->Add(new MethodCall(parcel, "readBinderArray", 1, v)); } @@ -610,7 +610,7 @@ IInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parc } void -IInterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +IInterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__); } @@ -631,7 +631,7 @@ BinderType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, void BinderType::CreateFromParcel(StatementBlock* addTo, Variable* v, - Variable* parcel) + Variable* parcel, Variable**) { fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__); } @@ -652,7 +652,7 @@ BinderProxyType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* par void BinderProxyType::CreateFromParcel(StatementBlock* addTo, Variable* v, - Variable* parcel) + Variable* parcel, Variable**) { fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__); } @@ -672,7 +672,7 @@ ParcelType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, } void -ParcelType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +ParcelType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__); } @@ -691,7 +691,7 @@ ParcelableInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v, Varia } void -ParcelableInterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +ParcelableInterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__); } @@ -709,25 +709,31 @@ MapType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int addTo->Add(new MethodCall(parcel, "writeMap", 1, v)); } +static void EnsureClassLoader(StatementBlock* addTo, Variable** cl) +{ + // We don't want to look up the class loader once for every + // collection argument, so ensure we do it at most once per method. + if (*cl == NULL) { + *cl = new Variable(CLASSLOADER_TYPE, "cl"); + addTo->Add(new VariableDeclaration(*cl, + new LiteralExpression("this.getClass().getClassLoader()"), + CLASSLOADER_TYPE)); + } +} + void -MapType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +MapType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable** cl) { - Variable *cl = new Variable(CLASSLOADER_TYPE, "cl"); - addTo->Add(new VariableDeclaration(cl, - new LiteralExpression("this.getClass().getClassLoader()"), - CLASSLOADER_TYPE)); - addTo->Add(new Assignment(v, new MethodCall(parcel, "readHashMap", 1, cl))); + EnsureClassLoader(addTo, cl); + addTo->Add(new Assignment(v, new MethodCall(parcel, "readHashMap", 1, *cl))); } void MapType::ReadFromParcel(StatementBlock* addTo, Variable* v, - Variable* parcel) + Variable* parcel, Variable** cl) { - Variable *cl = new Variable(CLASSLOADER_TYPE, "cl"); - addTo->Add(new VariableDeclaration(cl, - new LiteralExpression("this.getClass().getClassLoader()"), - CLASSLOADER_TYPE)); - addTo->Add(new MethodCall(parcel, "readMap", 2, v, cl)); + EnsureClassLoader(addTo, cl); + addTo->Add(new MethodCall(parcel, "readMap", 2, v, *cl)); } @@ -751,24 +757,18 @@ ListType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, in } void -ListType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +ListType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable** cl) { - Variable *cl = new Variable(CLASSLOADER_TYPE, "cl"); - addTo->Add(new VariableDeclaration(cl, - new LiteralExpression("this.getClass().getClassLoader()"), - CLASSLOADER_TYPE)); - addTo->Add(new Assignment(v, new MethodCall(parcel, "readArrayList", 1, cl))); + EnsureClassLoader(addTo, cl); + addTo->Add(new Assignment(v, new MethodCall(parcel, "readArrayList", 1, *cl))); } void ListType::ReadFromParcel(StatementBlock* addTo, Variable* v, - Variable* parcel) + Variable* parcel, Variable** cl) { - Variable *cl = new Variable(CLASSLOADER_TYPE, "cl"); - addTo->Add(new VariableDeclaration(cl, - new LiteralExpression("this.getClass().getClassLoader()"), - CLASSLOADER_TYPE)); - addTo->Add(new MethodCall(parcel, "readList", 2, v, cl)); + EnsureClassLoader(addTo, cl); + addTo->Add(new MethodCall(parcel, "readList", 2, v, *cl)); } @@ -811,7 +811,7 @@ ParcelableType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parc } void -ParcelableType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +ParcelableType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { // if (0 != parcel.readInt()) { // v = CLASS.CREATOR.createFromParcel(parcel) @@ -833,7 +833,7 @@ ParcelableType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* p void ParcelableType::ReadFromParcel(StatementBlock* addTo, Variable* v, - Variable* parcel) + Variable* parcel, Variable**) { // TODO: really, we don't need to have this extra check, but we // don't have two separate marshalling code paths @@ -862,7 +862,7 @@ ParcelableType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* void ParcelableType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v, - Variable* parcel) + Variable* parcel, Variable**) { string creator = v->type->QualifiedName() + ".CREATOR"; addTo->Add(new Assignment(v, new MethodCall(parcel, @@ -870,7 +870,7 @@ ParcelableType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v, } void -ParcelableType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +ParcelableType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { string creator = v->type->QualifiedName() + ".CREATOR"; addTo->Add(new MethodCall(parcel, "readTypedArray", 2, @@ -907,7 +907,7 @@ InterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parce } void -InterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +InterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { // v = Interface.asInterface(parcel.readStrongBinder()); string type = v->type->QualifiedName(); @@ -961,14 +961,14 @@ GenericType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, } void -GenericType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +GenericType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { fprintf(stderr, "implement GenericType::CreateFromParcel\n"); } void GenericType::ReadFromParcel(StatementBlock* addTo, Variable* v, - Variable* parcel) + Variable* parcel, Variable**) { fprintf(stderr, "implement GenericType::ReadFromParcel\n"); } @@ -1009,7 +1009,7 @@ GenericListType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* par } void -GenericListType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel) +GenericListType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**) { if (m_creator == STRING_TYPE->CreatorName()) { addTo->Add(new Assignment(v, @@ -1027,7 +1027,7 @@ GenericListType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* void GenericListType::ReadFromParcel(StatementBlock* addTo, Variable* v, - Variable* parcel) + Variable* parcel, Variable**) { if (m_creator == STRING_TYPE->CreatorName()) { addTo->Add(new MethodCall(parcel, "readStringList", 1, v)); |