Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b9eba866 authored by Elliott Hughes's avatar Elliott Hughes
Browse files

Fix aidl to cope with multiple collection types per method.

Bug: http://code.google.com/p/android/issues/detail?id=18497
Change-Id: I152416022524d2860cb16b46c4812c5be6bdcbad
parent 4a6d113b
Loading
Loading
Loading
Loading
+60 −60
Original line number Diff line number Diff line
@@ -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));
}

void
MapType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel)
static void EnsureClassLoader(StatementBlock* addTo, Variable** cl)
{
    Variable *cl = new Variable(CLASSLOADER_TYPE, "cl");
    addTo->Add(new VariableDeclaration(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));
    addTo->Add(new Assignment(v, new MethodCall(parcel, "readHashMap", 1, cl)));
    }
}

void
MapType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable** 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));
+40 −40

File changed.

Preview size limit exceeded, changes collapsed.

+0 −2
Original line number Diff line number Diff line
@@ -948,8 +948,6 @@ preprocess_aidl(const Options& options)
int
main(int argc, const char **argv)
{
    int err = 0;

    Options options;
    int result = parse_options(argc, argv, &options);
    if (result) {
+10 −9
Original line number Diff line number Diff line
@@ -286,25 +286,25 @@ generate_write_to_parcel(Type* t, StatementBlock* addTo, Variable* v,

static void
generate_create_from_parcel(Type* t, StatementBlock* addTo, Variable* v,
                            Variable* parcel)
                            Variable* parcel, Variable** cl)
{
    if (v->dimension == 0) {
        t->CreateFromParcel(addTo, v, parcel);
        t->CreateFromParcel(addTo, v, parcel, cl);
    }
    if (v->dimension == 1) {
        t->CreateArrayFromParcel(addTo, v, parcel);
        t->CreateArrayFromParcel(addTo, v, parcel, cl);
    }
}

static void
generate_read_from_parcel(Type* t, StatementBlock* addTo, Variable* v,
                            Variable* parcel)
                            Variable* parcel, Variable** cl)
{
    if (v->dimension == 0) {
        t->ReadFromParcel(addTo, v, parcel);
        t->ReadFromParcel(addTo, v, parcel, cl);
    }
    if (v->dimension == 1) {
        t->ReadArrayFromParcel(addTo, v, parcel);
        t->ReadArrayFromParcel(addTo, v, parcel, cl);
    }
}

@@ -362,6 +362,7 @@ generate_method(const method_type* method, Class* interface,
            "enforceInterface", 1, new LiteralExpression("DESCRIPTOR")));

    // args
    Variable* cl = NULL;
    VariableFactory stubArgs("_arg");
    arg = method->args;
    while (arg != NULL) {
@@ -373,7 +374,7 @@ generate_method(const method_type* method, Class* interface,

        if (convert_direction(arg->direction.data) & IN_PARAMETER) {
            generate_create_from_parcel(t, c->statements, v,
                    stubClass->transact_data);
                    stubClass->transact_data, &cl);
        } else {
            if (arg->type.dimension == 0) {
                c->statements->Add(new Assignment(
@@ -531,7 +532,7 @@ generate_method(const method_type* method, Class* interface,
    if (_reply != NULL) {
        if (_result != NULL) {
            generate_create_from_parcel(proxy->returnType,
                                    tryStatement->statements, _result, _reply);
                    tryStatement->statements, _result, _reply, &cl);
        }

        // the out/inout parameters
@@ -541,7 +542,7 @@ generate_method(const method_type* method, Class* interface,
            Variable* v = new Variable(t, arg->name.data, arg->type.dimension);
            if (convert_direction(arg->direction.data) & OUT_PARAMETER) {
                generate_read_from_parcel(t, tryStatement->statements,
                                            v, _reply);
                                            v, _reply, &cl);
            }
            arg = arg->next;
        }