NDK Backend: read/write result first.
This was a bug in the original implementations. Return variable values
go at the end of the parcel.
Bug: 112664205
Test: atest android.binder.cts
Change-Id: Ib474a0aa545d231c5c6f8c7e4d4bc34b0b6c8c71
diff --git a/generate_ndk.cpp b/generate_ndk.cpp
index 678608d..5b505eb 100644
--- a/generate_ndk.cpp
+++ b/generate_ndk.cpp
@@ -260,19 +260,18 @@
out << "if (!AStatus_isOk(_aidl_status.get())) return _aidl_status;\n\n";
}
- for (const AidlArgument* arg : method.GetOutArguments()) {
- out << "_aidl_ret_status = ";
- ReadFromParcelFor({out, types, arg->GetType(), "_aidl_out.get()", cpp::BuildVarName(*arg)});
- out << ";\n";
- StatusCheckGoto(out);
- }
-
if (method.GetType().GetName() != "void") {
out << "_aidl_ret_status = ";
ReadFromParcelFor({out, types, method.GetType(), "_aidl_out.get()", "_aidl_return"});
out << ";\n";
StatusCheckGoto(out);
}
+ for (const AidlArgument* arg : method.GetOutArguments()) {
+ out << "_aidl_ret_status = ";
+ ReadFromParcelFor({out, types, arg->GetType(), "_aidl_out.get()", cpp::BuildVarName(*arg)});
+ out << ";\n";
+ StatusCheckGoto(out);
+ }
out << "_aidl_error:\n";
out << "_aidl_status.set(AStatus_fromStatus(_aidl_ret_status));\n";
@@ -315,18 +314,18 @@
out << "if (!AStatus_isOk(_aidl_status.get())) break;\n\n";
- for (const AidlArgument* arg : method.GetOutArguments()) {
- out << "_aidl_ret_status = ";
- WriteToParcelFor({out, types, arg->GetType(), "_aidl_out", cpp::BuildVarName(*arg)});
- out << ";\n";
- StatusCheckBreak(out);
- }
if (method.GetType().GetName() != "void") {
out << "_aidl_ret_status = ";
WriteToParcelFor({out, types, method.GetType(), "_aidl_out", "_aidl_return"});
out << ";\n";
StatusCheckBreak(out);
}
+ for (const AidlArgument* arg : method.GetOutArguments()) {
+ out << "_aidl_ret_status = ";
+ WriteToParcelFor({out, types, arg->GetType(), "_aidl_out", cpp::BuildVarName(*arg)});
+ out << ";\n";
+ StatusCheckBreak(out);
+ }
}
out << "break;\n";