From 79eb1a406e89f56c20ff569579388fe5a8e21626 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Tue, 27 Feb 2018 15:18:05 +0900 Subject: [PATCH] Fix a bug about stub method handler Change-Id: Ib003e816cd4c9756661f41713365fc93907fde97 Signed-off-by: Hwankyu Jhun --- idlc/c_gen/c_stub_body_gen.cc | 54 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 7 deletions(-) diff --git a/idlc/c_gen/c_stub_body_gen.cc b/idlc/c_gen/c_stub_body_gen.cc index 69df78e..f685801 100644 --- a/idlc/c_gen/c_stub_body_gen.cc +++ b/idlc/c_gen/c_stub_body_gen.cc @@ -339,9 +339,10 @@ std::string CStubBodyGen::GetMethodString(const Interface& inf, const char do_while_block[] = "do {\n" \ " rpc_port_parcel_h result;\n" \ + "\n" \ " rpc_port_parcel_create(&result);\n" \ " rpc_port_parcel_write_int32(result, $$_METHOD_Result);\n" \ - " $$(result, result_value);\n" \ + "$$" \ " rpc_port_parcel_send(result, port);\n" \ " rpc_port_parcel_destroy(result);\n" \ "} while (0);\n"; @@ -349,11 +350,15 @@ std::string CStubBodyGen::GetMethodString(const Interface& inf, for (auto& i : decl.GetParameters().GetParams()) { str += GetParcelParamTypeString(i->GetParameterType().GetBaseType()) + " " + i->GetID() + ";" + NLine(1); - cnt++; + if (i->GetParameterType().GetDirection() == ParameterType::Direction::IN) + cnt++; } str += NLine(1); for (auto& i: decl.GetParameters().GetParams()) { + if (i->GetParameterType().GetDirection() != ParameterType::Direction::IN) + continue; + if (i->GetParameterType().GetBaseType().IsUserDefinedType() || i->GetParameterType().GetBaseType().ToString() == "list" || i->GetParameterType().GetBaseType().ToString() == "array") { @@ -391,22 +396,57 @@ std::string CStubBodyGen::GetMethodString(const Interface& inf, if (decl.GetMethodType() == Declaration::MethodType::SYNC && decl.GetType().ToString() != "void") { - str += GetReturnTypeString(decl.GetType()) + " result_value = "; + str += GetReturnTypeString(decl.GetType()) + " ret = "; } str += "context->callback." + decl.GetID() + "(context"; for (auto& i: decl.GetParameters().GetParams()) { - str += ", " + i->GetID(); + str += ", "; + if (i->GetParameterType().GetDirection() != ParameterType::Direction::IN) + str += "&" + i->GetID(); + else + str += i->GetID(); } str += ", context->user_data);" + NLine(1); - if (decl.GetMethodType() == Declaration::MethodType::SYNC && - decl.GetType().ToString() != "void") { + if (decl.GetMethodType() == Declaration::MethodType::SYNC) { str += GenTemplateString(do_while_block, [&]()->std::string { return inf.GetID(); }, [&]()->std::string { - return GetParcelWriteFunctionString(decl.GetType(), true); + std::string s; + for (auto& i: decl.GetParameters().GetParams()) { + if (i->GetParameterType().GetDirection() == ParameterType::Direction::IN) + continue; + s += GenTemplateString(parcel, + [&]()->std::string { + return GetParcelWriteFunctionString( + i->GetParameterType().GetBaseType(), true); + }, + [&]()->std::string { + if (i->GetParameterType().GetBaseType().IsUserDefinedType() || + i->GetParameterType().GetBaseType().ToString() == "list" || + i->GetParameterType().GetBaseType().ToString() == "array") + return "&" + i->GetID() + "->parcelable, " + i->GetID(); + return i->GetID(); + } + ); + } + if (decl.GetType().ToString() != "void") { + s += GenTemplateString(parcel, + [&]()->std::string { + return GetParcelWriteFunctionString(decl.GetType(), true); + }, + [&]()->std::string { + if (decl.GetType().IsUserDefinedType() || + decl.GetType().ToString() == "list" || + decl.GetType().ToString() == "array") + return "&ret->parcelable, ret"; + return "ret"; + } + ); + } + return s; } ); } -- 2.7.4