From 228ee8bc0affccb5e145c023ede334e5a7b35cd8 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Wed, 22 Feb 2023 06:23:34 +0000 Subject: [PATCH] Add missing implementation about ref keyword If there is the 'ref' keyword, we should read and wrtie the argument. Change-Id: I027cf6cc3101b474cc8ba07a7428a98d6566c488 Signed-off-by: Hwankyu Jhun --- idlc/gen/version2/c_proxy_body_generator.cc | 55 ++++++++++++++++++++------ idlc/gen/version2/c_proxy_body_generator.hh | 2 + idlc/gen/version2/c_proxy_body_generator_cb.hh | 40 +++++++++++++++++-- idlc/gen/version2/c_stub_body_generator.cc | 19 ++++----- 4 files changed, 92 insertions(+), 24 deletions(-) diff --git a/idlc/gen/version2/c_proxy_body_generator.cc b/idlc/gen/version2/c_proxy_body_generator.cc index 6112eda..54380df 100644 --- a/idlc/gen/version2/c_proxy_body_generator.cc +++ b/idlc/gen/version2/c_proxy_body_generator.cc @@ -163,7 +163,7 @@ std::string CProxyBodyGenerator::GenMethodArgs(const Interface& iface, std::string code; for (const auto& param : decl.GetParameters()) { auto& param_type = param->GetParameterType(); - if (param_type.GetDirection() != ParameterType::Direction::OUT) + if (param_type.GetDirection() == ParameterType::Direction::IN) continue; auto& type = param_type.GetBaseType(); @@ -197,37 +197,46 @@ std::string CProxyBodyGenerator::GenMethodUnitMapWrite(const Interface& iface, std::string code; for (const auto& param : decl.GetParameters()) { auto& param_type = param->GetParameterType(); - if (param_type.GetDirection() != ParameterType::Direction::IN) + if (param_type.GetDirection() == ParameterType::Direction::OUT) continue; + std::string arg = param->GetID(); + if (param_type.GetDirection() == ParameterType::Direction::REF) + arg = "*" + arg; + auto& type = param_type.GetBaseType(); if (type.GetUserDefinedType() == BaseType::UserType::DELEGATE) { code += ReplaceAll(CB_INTERFACE_METHOD_DELEGATE_UNIT_MAP_WRITE) - .Change("", param->GetID()); + .Change("", param->GetID()) + .Change("", arg); } else if (type.GetUserDefinedType() == BaseType::UserType::ENUM) { code += ReplaceAll(CB_INTERFACE_METHOD_ENUM_UNIT_MAP_WRITE) .Change("", param->GetID()) - .Change("", param->GetID()); + .Change("", arg); } else if (type.IsUserDefinedType() || type.GetMetaType() != nullptr) { code += ReplaceAll(CB_INTERFACE_METHOD_USER_DEFINED_UNIT_MAP_WRITE) .Change("", GetFullNameFromType(type, iface)) - .Change("", param->GetID()); + .Change("", param->GetID()) + .Change("", arg); code += GetPrivateSharingString(type, iface, "h->port", param->GetID()); } else if (type.ToString() == "bundle") { code += ReplaceAll(CB_INTERFACE_METHOD_BUNDLE_UNIT_MAP_WRITE) - .Change("", param->GetID()); + .Change("", param->GetID()) + .Change("", arg); } else if (type.ToString() == "string") { code += ReplaceAll(CB_INTERFACE_METHOD_STRING_UNIT_MAP_WRITE) - .Change("", param->GetID()); + .Change("", param->GetID()) + .Change("", arg); } else if (type.ToString() == "file") { code += ReplaceAll(CB_INTERFACE_METHOD_STRING_UNIT_MAP_WRITE) - .Change("", param->GetID()); + .Change("", param->GetID()) + .Change("", arg); code += GetPrivateSharingString(type, iface, "h->port", param->GetID()); } else { code += ReplaceAll(CB_INTERFACE_METHOD_BASE_UNIT_MAP_WRITE) .Change("", GetFullNameFromType(type, iface)) .Change("", param->GetID()) - .Change("", param->GetID()); + .Change("", arg); } } @@ -272,7 +281,7 @@ std::string CProxyBodyGenerator::GenMethodUnitMapReadBase( std::string code; if (type.GetUserDefinedType() == BaseType::UserType::DELEGATE || type.GetUserDefinedType() == BaseType::UserType::STRUCTURE || - type.GetMetaType() != nullptr) { + type.GetMetaType() != nullptr || type.GetKeyType() != nullptr) { code = ReplaceAll(CB_INTERFACE_METHOD_USER_DEFINED_UNIT_MAP_READ) .Change("", GetFullNameFromType(type, iface)) .Change("", arg_name) @@ -299,18 +308,42 @@ std::string CProxyBodyGenerator::GenMethodUnitMapReadBase( return code; } +std::string CProxyBodyGenerator::GenMethodRefFree( + const Interface& iface, const BaseType& type, const std::string& arg) { + std::string code; + if (type.GetUserDefinedType() == BaseType::UserType::DELEGATE || + type.GetUserDefinedType() == BaseType::UserType::STRUCTURE || + type.GetMetaType() != nullptr || type.GetKeyType() != nullptr) { + code = ReplaceAll(CB_INTERFACE_METHOD_USER_DEFINED_REF_FREE) + .Change("", GetHandlePrefix()) + .Change("", GetFullNameFromType(type, iface)) + .Change("", arg); + } else if (type.ToString() == "bundle") { + code = ReplaceAll(CB_INTERFACE_METHOD_BUNDLE_REF_FREE) + .Change("", arg); + } else if (type.ToString() == "string" || type.ToString() == "file") { + code = ReplaceAll(CB_INTERFACE_METHOD_STRING_REF_FREE) + .Change("", arg); + } + + return code; +} + std::string CProxyBodyGenerator::GenMethodUnitMapRead(const Interface& iface, const Declaration& decl) { std::string code; std::string parcel_read_code; for (const auto& p : decl.GetParameters()) { auto& param_type = p->GetParameterType(); - if (param_type.GetDirection() != ParameterType::Direction::OUT) + if (param_type.GetDirection() == ParameterType::Direction::IN) continue; auto& type = param_type.GetBaseType(); code += GenMethodUnitMapReadBase(iface, type, p->GetID(), "new_" + p->GetID()); + if (param_type.GetDirection() == ParameterType::Direction::REF) + code += GenMethodRefFree(iface, type, p->GetID()); + code += ReplaceAll(CB_INTERFACE_METHOD_PARAM_SET, "", p->GetID()); } diff --git a/idlc/gen/version2/c_proxy_body_generator.hh b/idlc/gen/version2/c_proxy_body_generator.hh index 14f75b1..c4bb347 100644 --- a/idlc/gen/version2/c_proxy_body_generator.hh +++ b/idlc/gen/version2/c_proxy_body_generator.hh @@ -60,6 +60,8 @@ class CProxyBodyGenerator : public CBodyGeneratorBase { const std::string& arg); std::string GenMethodUnitMapRead(const Interface& iface, const Declaration& decl); + std::string GenMethodRefFree(const Interface& iface, + const BaseType& type, const std::string& arg); void GenMethodBase(std::ofstream& stream, const Interface& iface, const Declaration& decl); void GenInterfaceMethodBase(std::ofstream& stream, const Interface& iface, diff --git a/idlc/gen/version2/c_proxy_body_generator_cb.hh b/idlc/gen/version2/c_proxy_body_generator_cb.hh index ec64a43..d2e1ca4 100644 --- a/idlc/gen/version2/c_proxy_body_generator_cb.hh +++ b/idlc/gen/version2/c_proxy_body_generator_cb.hh @@ -1063,40 +1063,45 @@ R"__c_cb( )__c_cb"; /** + * The name of the argument. * The type name of the argument. * The argument. */ constexpr const char CB_INTERFACE_METHOD_USER_DEFINED_UNIT_MAP_WRITE[] = R"__c_cb( -rpc_port_unit_map_write_(map_, "", ); +rpc_port_unit_map_write_(map_, "", ); )__c_cb"; /** + * The name of the argument. * The argument. */ constexpr const char CB_INTERFACE_METHOD_DELEGATE_UNIT_MAP_WRITE[] = R"__c_cb( -rpc_port_unit_map_write_delegate(map_, "", (rpc_port_delegate_h)); +rpc_port_unit_map_write_delegate(map_, "", (rpc_port_delegate_h)); )__c_cb"; /** + * The name of the argument. * The argument. */ constexpr const char CB_INTERFACE_METHOD_BUNDLE_UNIT_MAP_WRITE[] = R"__c_cb( -rpc_port_unit_map_write_bundle(map_, "", ); +rpc_port_unit_map_write_bundle(map_, "", ); )__c_cb"; /** + * The name of the argument. * The argument. */ constexpr const char CB_INTERFACE_METHOD_STRING_UNIT_MAP_WRITE[] = R"__c_cb( -rpc_port_unit_map_write_string(map_, "", ); +rpc_port_unit_map_write_string(map_, "", ); )__c_cb"; /** * The type name of the argument. + * The name of the argument. * The argument. */ constexpr const char CB_INTERFACE_METHOD_BASE_UNIT_MAP_WRITE[] = @@ -1106,6 +1111,7 @@ rpc_port_unit_map_write_(map_, "", ); /** * The type name of the argument. + * The name of the argument. * The argument. */ constexpr const char CB_INTERFACE_METHOD_ENUM_UNIT_MAP_WRITE[] = @@ -1194,6 +1200,32 @@ R"__c_cb( )__c_cb"; /** + * The prefix of the reference argument. + * The name of the reference argument. + * The argument. + */ +constexpr const char CB_INTERFACE_METHOD_USER_DEFINED_REF_FREE[] = +R"__c_cb( +__destroy(*); +)__c_cb"; + +/** + * The argument. + */ +constexpr const char CB_INTERFACE_METHOD_BUNDLE_REF_FREE[] = +R"__c_cb( +bundle_free(*); +)__c_cb"; + +/** + * The argument. + */ +constexpr const char CB_INTERFACE_METHOD_STRING_REF_FREE[] = +R"__c_cb( +free(*); +)__c_cb"; + +/** * The argument. */ constexpr const char CB_INTERFACE_METHOD_DELEGATE_APPEND[] = diff --git a/idlc/gen/version2/c_stub_body_generator.cc b/idlc/gen/version2/c_stub_body_generator.cc index e5a865e..96c2169 100644 --- a/idlc/gen/version2/c_stub_body_generator.cc +++ b/idlc/gen/version2/c_stub_body_generator.cc @@ -426,11 +426,11 @@ std::string CStubBodyGenerator::GenMethodUnitMapRead(const Interface& iface, for (const auto& p : decl.GetParameters()) { std::string parcel_read_code; auto& param_type = p->GetParameterType(); - if (param_type.GetDirection() != ParameterType::Direction::IN) + if (param_type.GetDirection() == ParameterType::Direction::OUT) continue; auto& type = param_type.GetBaseType(); - if (type.GetUserDefinedType() == BaseType::UserType::DELEGATE){ + if (type.GetUserDefinedType() == BaseType::UserType::DELEGATE) { parcel_read_code = ReplaceAll(CB_INTERFACE_METHOD_DELEGATE_UNIT_MAP_READ) .Change("", GetHandlePrefix()) .Change("", GetFullNameFromType(type, iface)) @@ -441,7 +441,8 @@ std::string CStubBodyGenerator::GenMethodUnitMapRead(const Interface& iface, .Change("", p->GetID()) .Change("", p->GetID()); } else if (type.GetUserDefinedType() == BaseType::UserType::STRUCTURE || - type.GetMetaType() != nullptr) { + type.GetMetaType() != nullptr || + type.GetKeyType() != nullptr) { parcel_read_code = ReplaceAll(CB_INTERFACE_METHOD_USER_DEFINED_UNIT_MAP_READ) .Change("", GetFullNameFromType(type, iface)) .Change("", p->GetID()) @@ -524,8 +525,8 @@ std::string CStubBodyGenerator::GenMethodUnitMapWriteBase( .Change("", arg_name) .Change("", arg); } else if (type.IsUserDefinedType() || - type.ToString() == "list" || - type.ToString() == "array") { + type.GetMetaType() != nullptr || + type.GetKeyType() != nullptr) { parcel_write_code = ReplaceAll(CB_INTERFACE_METHOD_USER_DEFINED_UNIT_MAP_WRITE) .Change("", GetFullNameFromType(type, iface)) .Change("", arg_name) @@ -600,8 +601,8 @@ std::string CStubBodyGenerator::GenMethodHandlerArgsFree(const Interface& iface, auto& type = param_type.GetBaseType(); if (type.GetUserDefinedType() == BaseType::UserType::STRUCTURE || type.GetUserDefinedType() == BaseType::UserType::DELEGATE || - type.ToString() == "list" || - type.ToString() == "array") { + type.GetMetaType() != nullptr || + type.GetKeyType() != nullptr) { free_code = ReplaceAll(CB_INTERFACE_METHOD_USER_DEFINED_FREE, "", GetHandlePrefix()); free_code = ReplaceAll(free_code, "", @@ -624,8 +625,8 @@ std::string CStubBodyGenerator::GenMethodHandlerArgsFree(const Interface& iface, auto& type = decl.GetType(); if (type.GetUserDefinedType() == BaseType::UserType::STRUCTURE || type.GetUserDefinedType() == BaseType::UserType::DELEGATE || - type.ToString() == "list" || - type.ToString() == "array") { + type.GetMetaType() != nullptr || + type.GetKeyType() != nullptr) { free_code = ReplaceAll(CB_INTERFACE_METHOD_USER_DEFINED_FREE, "", GetHandlePrefix()); free_code = ReplaceAll(free_code, "", -- 2.7.4