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

Commit 49062e3b authored by Elliott Hughes's avatar Elliott Hughes Committed by Android (Google) Code Review
Browse files

Merge "Fix aidl to cope with multiple collection types per method."

parents c1df573a b9eba866
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;
        }