diff --git a/tools/hdi-gen/ast/ast_array_type.cpp b/tools/hdi-gen/ast/ast_array_type.cpp index a2a1ec63..38fbd262 100755 --- a/tools/hdi-gen/ast/ast_array_type.cpp +++ b/tools/hdi-gen/ast/ast_array_type.cpp @@ -34,29 +34,13 @@ String ASTArrayType::EmitCType(TypeMode mode) const case TypeMode::PARAM_IN: { if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { return String::Format("%s*", elementType_->EmitCType(TypeMode::NO_MODE).string()); - } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT - || elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { - return String::Format("%s", elementType_->EmitCType(TypeMode::PARAM_IN).string()); - } else { - return String::Format("%s*", elementType_->EmitCType(TypeMode::PARAM_IN).string()); - } - } - case TypeMode::PARAM_OUT: { - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT - || elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { - return elementType_->EmitCType(TypeMode::PARAM_OUT); - } else { - return String::Format("%s*", elementType_->EmitCType(TypeMode::PARAM_OUT).string()); - } - } - case TypeMode::LOCAL_VAR: { - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT - || elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { - return String::Format("%s", elementType_->EmitCType(TypeMode::LOCAL_VAR).string()); - } else { - return String::Format("%s*", elementType_->EmitCType(TypeMode::LOCAL_VAR).string()); } + return String::Format("const %s*", elementType_->EmitCType(TypeMode::NO_MODE).string()); } + case TypeMode::PARAM_OUT: + return String::Format("%s*", elementType_->EmitCType(TypeMode::NO_MODE).string()); + case TypeMode::LOCAL_VAR: + return String::Format("%s*", elementType_->EmitCType(TypeMode::NO_MODE).string()); default: return "unknow type"; } @@ -83,15 +67,15 @@ String ASTArrayType::EmitJavaType(TypeMode mode, bool isInnerType) const return String::Format("%s[]", elementType_->EmitJavaType(TypeMode::NO_MODE, false).string()); } -void ASTArrayType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTArrayType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { String lenName = String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint32(%s, %s)) {\n", parcelName.string(), lenName.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); @@ -109,25 +93,35 @@ void ASTArrayType::EmitCWriteVar(const String& parcelName, const String& name, c elementName = String::Format("%s[i]", name.string()); } - elementType_->EmitCWriteVar(parcelName, elementName, gotoLabel, sb, prefix + g_tab); + elementType_->EmitCWriteVar(parcelName, elementName, ecName, gotoLabel, sb, prefix + g_tab); + sb.Append(prefix).Append("}\n"); +} + +void ASTArrayType::EmitCProxyWriteOutVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + String lenName = String::Format("*%sLen", name.string()); + sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint32(%s, %s)) {\n", + parcelName.string(), lenName.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } void ASTArrayType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, - const String& gotoLabel, StringBuilder& sb, const String& prefix) const + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { String lenName = String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, %s)) {\n", parcelName.string(), lenName.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s size failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n\n"); - EmitCMallocVar(name, lenName, true, gotoLabel, sb, prefix); - sb.Append("\n"); - if (Options::GetInstance().DoGenerateKernelCode()) { sb.Append(prefix).AppendFormat("for (i = 0; i < *%s; i++) {\n", lenName.string()); } else { @@ -135,41 +129,41 @@ void ASTArrayType::EmitCProxyReadVar(const String& parcelName, const String& nam } if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - EmitCProxyReadStrElement(parcelName, name, gotoLabel, sb, prefix); + EmitCProxyReadStrElement(parcelName, name, ecName, gotoLabel, sb, prefix); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { - String element = String::Format("&(*%s)[i]", name.string()); - elementType_->EmitCProxyReadVar(parcelName, element, true, gotoLabel, sb, prefix + g_tab); + String element = String::Format("&%s[i]", name.string()); + elementType_->EmitCProxyReadVar(parcelName, element, true, ecName, gotoLabel, sb, prefix + g_tab); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { - String element = String::Format("&(*%s)[i]", name.string()); + String element = String::Format("&%s[i]", name.string()); String elementCp = String::Format("%sElementCp", name.string()); - elementType_->EmitCProxyReadVar(parcelName, elementCp, true, gotoLabel, sb, prefix + g_tab); + elementType_->EmitCProxyReadVar(parcelName, elementCp, true, ecName, gotoLabel, sb, prefix + g_tab); sb.Append(prefix + g_tab).AppendFormat("(void)memcpy_s(%s, sizeof(%s), %s, sizeof(%s));\n", element.string(), elementType_->EmitCType().string(), elementCp.string(), elementType_->EmitCType().string()); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_FILEDESCRIPTOR) { - String element = String::Format("(*%s)[i]", name.string()); - elementType_->EmitCProxyReadVar(parcelName, element, true, gotoLabel, sb, prefix + g_tab); + String element = String::Format("%s[i]", name.string()); + elementType_->EmitCProxyReadVar(parcelName, element, true, ecName, gotoLabel, sb, prefix + g_tab); } else { - String element = String::Format("&(*%s)[i]", name.string()); - elementType_->EmitCProxyReadVar(parcelName, element, true, gotoLabel, sb, prefix + g_tab); + String element = String::Format("&%s[i]", name.string()); + elementType_->EmitCProxyReadVar(parcelName, element, true, ecName, gotoLabel, sb, prefix + g_tab); } sb.Append(prefix).Append("}\n"); } -void ASTArrayType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const +void ASTArrayType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { String lenName = String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, &%s)) {\n", parcelName.string(), lenName.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s size failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n\n"); sb.Append(prefix).AppendFormat("if (%s > 0) {\n", lenName.string()); - EmitCMallocVar(name, lenName, false, "errors", sb, prefix + g_tab); + EmitCMallocVar(name, lenName, false, ecName, gotoLabel, sb, prefix + g_tab); sb.Append("\n"); if (Options::GetInstance().DoGenerateKernelCode()) { @@ -178,28 +172,46 @@ void ASTArrayType::EmitCStubReadVar(const String& parcelName, const String& name sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); } if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - EmitCStubReadStrElement(parcelName, name, sb, prefix); + EmitCStubReadStrElement(parcelName, name, ecName, gotoLabel, sb, prefix); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { String element = String::Format("&%s[i]", name.string()); - elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); + elementType_->EmitCStubReadVar(parcelName, element, ecName, gotoLabel, sb, prefix + g_tab + g_tab); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { String element = String::Format("%s[i]", name.string()); String elementCp = String::Format("%sElementCp", name.string()); - elementType_->EmitCStubReadVar(parcelName, elementCp, sb, prefix + g_tab + g_tab); + elementType_->EmitCStubReadVar(parcelName, elementCp, ecName, gotoLabel, sb, prefix + g_tab + g_tab); sb.Append(prefix + g_tab + g_tab).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", element.string(), elementType_->EmitCType().string(), elementCp.string(), elementType_->EmitCType().string()); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_FILEDESCRIPTOR) { String element = String::Format("%s[i]", name.string()); - elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); + elementType_->EmitCStubReadVar(parcelName, element, ecName, gotoLabel, sb, prefix + g_tab + g_tab); } else { String element = String::Format("&%s[i]", name.string()); - elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); + elementType_->EmitCStubReadVar(parcelName, element, ecName, gotoLabel, sb, prefix + g_tab + g_tab); } sb.Append(prefix + g_tab).Append("}\n"); sb.Append(prefix).Append("}\n"); } +void ASTArrayType::EmitCStubReadOutVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + String lenName = String::Format("%sLen", name.string()); + sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, &%s)) {\n", + parcelName.string(), lenName.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s size failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n\n"); + + sb.Append(prefix).AppendFormat("if (%s > 0) {\n", lenName.string()); + EmitCMallocVar(name, lenName, false, ecName, gotoLabel, sb, prefix + g_tab); + sb.Append(prefix).Append("}\n"); +} + + void ASTArrayType::EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel) const { @@ -250,14 +262,14 @@ void ASTArrayType::EmitCMarshalling(const String& name, StringBuilder& sb, const sb.Append(prefix).Append("}\n"); } -void ASTArrayType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, - std::vector& freeObjStatements) const +void ASTArrayType::EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& prefix, std::vector& freeObjStatements) const { String lenName = String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(data, &%s)) {\n", lenName.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", lenName.string()); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); sb.Append(prefix).AppendFormat("if (%s > 0) {\n", lenName.string()); String newPrefix = prefix + g_tab; @@ -265,7 +277,7 @@ void ASTArrayType::EmitCUnMarshalling(const String& name, StringBuilder& sb, con sb.Append(newPrefix).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * %s);\n", name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenName.string()); sb.Append(newPrefix).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n"); + sb.Append(newPrefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(newPrefix).Append("}\n"); freeObjStatements.push_back(String::Format("OsalMemFree(%s);\n", name.string())); @@ -276,31 +288,31 @@ void ASTArrayType::EmitCUnMarshalling(const String& name, StringBuilder& sb, con } if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - EmitCStringElementUnMarshalling(name, sb, newPrefix, freeObjStatements); + EmitCStringElementUnMarshalling(name, gotoLabel, sb, newPrefix, freeObjStatements); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { String element = String::Format("&%s[i]", name.string()); - elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); + elementType_->EmitCUnMarshalling(element, gotoLabel, sb, newPrefix + g_tab, freeObjStatements); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { String element = String::Format("%s[i]", name.string()); String elementCp = String::Format("%sElementCp", name.string()); - elementType_->EmitCUnMarshalling(elementCp, sb, newPrefix + g_tab, freeObjStatements); + elementType_->EmitCUnMarshalling(elementCp, gotoLabel, sb, newPrefix + g_tab, freeObjStatements); sb.Append(newPrefix + g_tab).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", element.string(), elementType_->EmitCType().string(), elementCp.string(), elementType_->EmitCType().string()); } else { String element = String::Format("%s[i]", name.string()); - elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); + elementType_->EmitCUnMarshalling(element, gotoLabel, sb, newPrefix + g_tab, freeObjStatements); } sb.Append(newPrefix).Append("}\n"); sb.Append(prefix).Append("}\n"); freeObjStatements.pop_back(); } -void ASTArrayType::EmitCStringElementUnMarshalling(const String& name, StringBuilder& sb, const String& newPrefix, - std::vector& freeObjStatements) const +void ASTArrayType::EmitCStringElementUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& newPrefix, std::vector& freeObjStatements) const { String element = String::Format("%sElement", name.string()); - elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); + elementType_->EmitCUnMarshalling(element, gotoLabel, sb, newPrefix + g_tab, freeObjStatements); if (Options::GetInstance().DoGenerateKernelCode()) { sb.Append(newPrefix).AppendFormat("%s[i] = (char*)OsalMemCalloc(strlen(%s) + 1);\n", name.string(), element.string()); @@ -373,7 +385,7 @@ void ASTArrayType::EmitCppUnMarshalling(const String& parcelName, const String& void ASTArrayType::EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, const String& prefix) const { - String varName = isClient ? String::Format("*%s", name.string()) : name; + String varName = name; String lenName = isClient ? String::Format("*%sLen", name.string()) : String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (%s > 0 && %s != NULL) {\n", lenName.string(), varName.string()); @@ -384,8 +396,7 @@ void ASTArrayType::EmitMemoryRecycle(const String& name, bool isClient, bool own sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); } - String elementName = isClient ? String::Format("(%s)[i]", varName.string()) : - String::Format("%s[i]", varName.string()); + String elementName = String::Format("%s[i]", varName.string()); elementType_->EmitMemoryRecycle(elementName, false, false, sb, prefix + g_tab + g_tab); sb.Append(prefix + g_tab).Append("}\n"); } @@ -402,7 +413,7 @@ void ASTArrayType::EmitJavaWriteVar(const String& parcelName, const String& name const String& prefix) const { sb.Append(prefix).AppendFormat("if (%s == null) {\n", name.string()); - sb.Append(prefix).AppendFormat(" %s.writeInt(-1);\n", parcelName.string()); + sb.Append(prefix + g_tab).AppendFormat("%s.writeInt(-1);\n", parcelName.string()); sb.Append(prefix).Append("} else { \n"); EmitJavaWriteArrayVar(parcelName, name, sb, prefix + g_tab); sb.Append(prefix).Append("}\n"); @@ -534,8 +545,8 @@ void ASTArrayType::EmitJavaWriteArrayVar(const String& parcelName, const String& } } -void ASTArrayType::EmitCMallocVar(const String& name, const String& lenName, bool isClient, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTArrayType::EmitCMallocVar(const String& name, const String& lenName, bool isClient, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { String varName = isClient ? String::Format("*%s", name.string()) : name; String lenVarName = isClient ? String::Format("*%s", lenName.string()) : lenName; @@ -543,58 +554,62 @@ void ASTArrayType::EmitCMallocVar(const String& name, const String& lenName, boo sb.Append(prefix).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * (%s));\n", varName.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenVarName.string()); sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", varName.string()); - sb.Append(prefix + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: malloc %s failed\", __func__);\n", + varName.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_MALLOC_FAIL;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).AppendFormat("}\n"); + sb.Append(prefix).Append("}\n"); } -void ASTArrayType::EmitCProxyReadStrElement(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTArrayType::EmitCProxyReadStrElement(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { String cpName = String::Format("%sCp", name.string()); - elementType_->EmitCProxyReadVar(parcelName, cpName, true, gotoLabel, sb, prefix + g_tab); + elementType_->EmitCProxyReadVar(parcelName, cpName, true, ecName, gotoLabel, sb, prefix + g_tab); sb.Append("\n"); if (Options::GetInstance().DoGenerateKernelCode()) { - sb.Append(prefix + g_tab).AppendFormat("(*%s)[i] = (char*)OsalMemCalloc(strlen(%s) + 1);\n", + sb.Append(prefix + g_tab).AppendFormat("%s[i] = (char*)OsalMemCalloc(strlen(%s) + 1);\n", name.string(), cpName.string()); - sb.Append(prefix + g_tab).AppendFormat("if ((*%s)[i] == NULL) {\n", name.string()); - sb.Append(prefix + g_tab + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).AppendFormat("if (%s[i] == NULL) {\n", name.string()); + sb.Append(prefix + g_tab + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: malloc %s[i] failed\", __func__);\n", + name.string()); + sb.Append(prefix + g_tab + g_tab).AppendFormat("%s = HDF_ERR_MALLOC_FAIL;\n", ecName.string()); sb.Append(prefix + g_tab + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix + g_tab).Append("}\n\n"); - sb.Append(prefix + g_tab).AppendFormat("if (strcpy_s((*%s)[i], (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", + sb.Append(prefix + g_tab).AppendFormat("if (strcpy_s(%s[i], (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", name.string(), cpName.string(), cpName.string()); sb.Append(prefix + g_tab + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", cpName.string()); - sb.Append(prefix + g_tab + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix + g_tab).Append("}\n"); } else { - sb.Append(prefix + g_tab).AppendFormat("(*%s)[i] = strdup(%sCp);\n", + sb.Append(prefix + g_tab).AppendFormat("%s[i] = strdup(%sCp);\n", name.string(), name.string()); } } -void ASTArrayType::EmitCStubReadStrElement(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const +void ASTArrayType::EmitCStubReadStrElement(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { String element = String::Format("%sCp", name.string()); String newPrefix = prefix + g_tab + g_tab; - elementType_->EmitCStubReadVar(parcelName, element, sb, newPrefix); + elementType_->EmitCStubReadVar(parcelName, element, ecName, gotoLabel, sb, newPrefix); sb.Append("\n"); if (Options::GetInstance().DoGenerateKernelCode()) { sb.Append(newPrefix).AppendFormat("%s[i] = (char*)OsalMemCalloc(strlen(%s) + 1);\n", name.string(), element.string()); sb.Append(newPrefix).AppendFormat("if (%s[i] == NULL) {\n", name.string()); - sb.Append(newPrefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n"); + sb.Append(newPrefix + g_tab).AppendFormat("%s = HDF_ERR_MALLOC_FAIL;\n", ecName.string()); + sb.Append(newPrefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(newPrefix).Append("}\n\n"); - sb.Append(newPrefix).AppendFormat("if (strcpy_s((%s)[i], (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", + sb.Append(newPrefix).AppendFormat("if (strcpy_s(%s[i], (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", name.string(), element.string(), element.string()); sb.Append(newPrefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", element.string()); - sb.Append(newPrefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(newPrefix + g_tab).Append("goto errors;\n"); + sb.Append(newPrefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(newPrefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(newPrefix).Append("}\n"); } else { sb.Append(newPrefix).AppendFormat("%s[i] = strdup(%sCp);\n", name.string(), name.string()); diff --git a/tools/hdi-gen/ast/ast_array_type.h b/tools/hdi-gen/ast/ast_array_type.h index 7cc0ffe8..a897c0f1 100755 --- a/tools/hdi-gen/ast/ast_array_type.h +++ b/tools/hdi-gen/ast/ast_array_type.h @@ -37,14 +37,20 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const override; - - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; + void EmitCProxyWriteOutVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadOutVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; void EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel = 0) const override; @@ -54,7 +60,7 @@ public: void EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const override; - void EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, + void EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix, std::vector& freeObjStatements) const override; void EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb, @@ -78,17 +84,17 @@ private: void EmitJavaWriteArrayVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix) const; - void EmitCMallocVar(const String& name, const String& lenName, bool isClient, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const; + void EmitCMallocVar(const String& name, const String& lenName, bool isClient, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const; - void EmitCProxyReadStrElement(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const; + void EmitCProxyReadStrElement(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const; - void EmitCStubReadStrElement(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const; + void EmitCStubReadStrElement(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const; - void EmitCStringElementUnMarshalling(const String& name, StringBuilder& sb, const String& newPrefix, - std::vector& freeObjStatements) const; + void EmitCStringElementUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& newPrefix, std::vector& freeObjStatements) const; AutoPtr elementType_; }; diff --git a/tools/hdi-gen/ast/ast_boolean_type.cpp b/tools/hdi-gen/ast/ast_boolean_type.cpp index 956854bb..eda2eaf4 100755 --- a/tools/hdi-gen/ast/ast_boolean_type.cpp +++ b/tools/hdi-gen/ast/ast_boolean_type.cpp @@ -62,42 +62,42 @@ String ASTBooleanType::EmitJavaType(TypeMode mode, bool isInnerType) const return isInnerType ? "Boolean" : "boolean"; } -void ASTBooleanType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTBooleanType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt8(%s, %s ? 1 : 0)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } void ASTBooleanType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt8(%s, (int8_t *)%s)) {\n", + parcelName.string(), name.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTBooleanType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt8(%s, (int8_t *)%s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } -void ASTBooleanType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt8(%s, (int8_t *)%s)) {\n", - parcelName.string(), name.string()); - sb.Append(prefix + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); - sb.Append(prefix).Append("}\n"); -} - void ASTBooleanType::EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel) const { @@ -129,14 +129,14 @@ void ASTBooleanType::EmitCMarshalling(const String& name, StringBuilder& sb, con sb.Append(prefix).Append("}\n"); } -void ASTBooleanType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, - std::vector& freeObjStatements) const +void ASTBooleanType::EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& prefix, std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt8(data, (int8_t *)&%s)) {\n", name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_boolean_type.h b/tools/hdi-gen/ast/ast_boolean_type.h index ebc90802..b376d1ce 100755 --- a/tools/hdi-gen/ast/ast_boolean_type.h +++ b/tools/hdi-gen/ast/ast_boolean_type.h @@ -27,14 +27,14 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const override; - - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; + void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; void EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel = 0) const override; @@ -44,7 +44,7 @@ public: void EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const override; - void EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, + void EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix, std::vector& freeObjStatements) const override; void EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb, diff --git a/tools/hdi-gen/ast/ast_byte_type.cpp b/tools/hdi-gen/ast/ast_byte_type.cpp index fb114c3b..a449449c 100755 --- a/tools/hdi-gen/ast/ast_byte_type.cpp +++ b/tools/hdi-gen/ast/ast_byte_type.cpp @@ -62,40 +62,40 @@ String ASTByteType::EmitJavaType(TypeMode mode, bool isInnerType) const return isInnerType ? "Byte" : "byte"; } -void ASTByteType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTByteType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt8(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } void ASTByteType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt8(%s, %s)) {\n", parcelName.string(), name.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTByteType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt8(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } -void ASTByteType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt8(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); - sb.Append(prefix).Append("}\n"); -} - void ASTByteType::EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel) const { @@ -127,14 +127,14 @@ void ASTByteType::EmitCMarshalling(const String& name, StringBuilder& sb, const sb.Append(prefix).Append("}\n"); } -void ASTByteType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, - std::vector& freeObjStatements) const +void ASTByteType::EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& prefix, std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt8(data, &%s)) {\n", name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_byte_type.h b/tools/hdi-gen/ast/ast_byte_type.h index d5b2cda3..6641352d 100755 --- a/tools/hdi-gen/ast/ast_byte_type.h +++ b/tools/hdi-gen/ast/ast_byte_type.h @@ -27,14 +27,14 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const override; - - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; + void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; void EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel = 0) const override; @@ -44,7 +44,7 @@ public: void EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const override; - void EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, + void EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix, std::vector& freeObjStatements) const override; void EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb, diff --git a/tools/hdi-gen/ast/ast_double_type.cpp b/tools/hdi-gen/ast/ast_double_type.cpp index bf6820a4..98e7f4a3 100755 --- a/tools/hdi-gen/ast/ast_double_type.cpp +++ b/tools/hdi-gen/ast/ast_double_type.cpp @@ -62,40 +62,40 @@ String ASTDoubleType::EmitJavaType(TypeMode mode, bool isInnerType) const return isInnerType ? "Double" : "double"; } -void ASTDoubleType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTDoubleType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteDouble(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } void ASTDoubleType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("if (!HdfSbufReadDouble(%s, %s)) {\n", parcelName.string(), name.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTDoubleType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadDouble(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } -void ASTDoubleType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufReadDouble(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); - sb.Append(prefix).Append("}\n"); -} - void ASTDoubleType::EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel) const { @@ -126,14 +126,14 @@ void ASTDoubleType::EmitCMarshalling(const String& name, StringBuilder& sb, cons sb.Append(prefix).Append("}\n"); } -void ASTDoubleType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, - std::vector& freeObjStatements) const +void ASTDoubleType::EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& prefix, std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadDouble(data, &%s)) {\n", name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_double_type.h b/tools/hdi-gen/ast/ast_double_type.h index 545482d8..0819a8ee 100755 --- a/tools/hdi-gen/ast/ast_double_type.h +++ b/tools/hdi-gen/ast/ast_double_type.h @@ -27,14 +27,14 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const override; - - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; + void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; void EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel = 0) const override; @@ -44,7 +44,7 @@ public: void EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const override; - void EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, + void EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix, std::vector& freeObjStatements) const override; void EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb, diff --git a/tools/hdi-gen/ast/ast_enum_type.cpp b/tools/hdi-gen/ast/ast_enum_type.cpp index bca78d25..23d27a7f 100755 --- a/tools/hdi-gen/ast/ast_enum_type.cpp +++ b/tools/hdi-gen/ast/ast_enum_type.cpp @@ -161,42 +161,42 @@ String ASTEnumType::EmitJavaTypeDecl() const return sb.ToString(); } -void ASTEnumType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTEnumType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint32(%s, (uint32_t)%s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } void ASTEnumType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, (uint32_t*)%s)) {\n", + parcelName.string(), name.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTEnumType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, (uint32_t*)%s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } -void ASTEnumType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, (uint32_t*)%s)) {\n", - parcelName.string(), name.string()); - sb.Append(prefix + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); - sb.Append(prefix).Append("}\n"); -} - void ASTEnumType::EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel) const { @@ -229,13 +229,13 @@ void ASTEnumType::EmitCMarshalling(const String& name, StringBuilder& sb, const sb.Append(prefix).Append("}\n"); } -void ASTEnumType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, - std::vector& freeObjStatements) const +void ASTEnumType::EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& prefix, std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt32(data, (int32_t*)&%s)) {\n", name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_enum_type.h b/tools/hdi-gen/ast/ast_enum_type.h index 6f5ebc6d..c21073c7 100755 --- a/tools/hdi-gen/ast/ast_enum_type.h +++ b/tools/hdi-gen/ast/ast_enum_type.h @@ -146,14 +146,14 @@ public: String EmitJavaTypeDecl() const; - void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const override; - - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; + void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; void EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel = 0) const override; @@ -163,7 +163,7 @@ public: void EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const override; - void EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, + void EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix, std::vector& freeObjStatements) const override; void EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb, diff --git a/tools/hdi-gen/ast/ast_fd_type.cpp b/tools/hdi-gen/ast/ast_fd_type.cpp index deb7b3e5..79bfd554 100755 --- a/tools/hdi-gen/ast/ast_fd_type.cpp +++ b/tools/hdi-gen/ast/ast_fd_type.cpp @@ -62,20 +62,20 @@ String ASTFdType::EmitJavaType(TypeMode mode, bool isInnerType) const return isInnerType ? "Integer" : "int"; } -void ASTFdType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTFdType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteFileDescriptor(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } void ASTFdType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, - const String& gotoLabel, StringBuilder& sb, const String& prefix) const + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { if (isInnerType) { sb.Append(prefix).AppendFormat("%s = HdfSbufReadFileDescriptor(%s);\n", @@ -88,21 +88,21 @@ void ASTFdType::EmitCProxyReadVar(const String& parcelName, const String& name, } sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } -void ASTFdType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const +void ASTFdType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("%s = HdfSbufReadFileDescriptor(%s);\n", name.string(), parcelName.string()); sb.Append(prefix).AppendFormat("if (%s < 0) {\n", name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -136,14 +136,14 @@ void ASTFdType::EmitCMarshalling(const String& name, StringBuilder& sb, const St sb.Append(prefix).Append("}\n"); } -void ASTFdType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, - std::vector& freeObjStatements) const +void ASTFdType::EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& prefix, std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("%s = HdfSbufReadFileDescriptor(data);\n", name.string()); sb.Append(prefix).AppendFormat("if (%s < 0) {\n", name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_fd_type.h b/tools/hdi-gen/ast/ast_fd_type.h index ca6eed64..723252e3 100755 --- a/tools/hdi-gen/ast/ast_fd_type.h +++ b/tools/hdi-gen/ast/ast_fd_type.h @@ -27,14 +27,14 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const override; - - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; + void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; void EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel = 0) const override; @@ -44,7 +44,7 @@ public: void EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const override; - void EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, + void EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix, std::vector& freeObjStatements) const override; void EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb, diff --git a/tools/hdi-gen/ast/ast_float_type.cpp b/tools/hdi-gen/ast/ast_float_type.cpp index b4dd4544..d76b61ce 100755 --- a/tools/hdi-gen/ast/ast_float_type.cpp +++ b/tools/hdi-gen/ast/ast_float_type.cpp @@ -62,40 +62,40 @@ String ASTFloatType::EmitJavaType(TypeMode mode, bool isInnerType) const return isInnerType ? "Float" : "float"; } -void ASTFloatType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTFloatType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteFloat(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } void ASTFloatType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("if (!HdfSbufReadFloat(%s, %s)) {\n", parcelName.string(), name.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTFloatType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadFloat(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } -void ASTFloatType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufReadFloat(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); - sb.Append(prefix).Append("}\n"); -} - void ASTFloatType::EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel) const { @@ -126,14 +126,14 @@ void ASTFloatType::EmitCMarshalling(const String& name, StringBuilder& sb, const sb.Append(prefix).Append("}\n"); } -void ASTFloatType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, - std::vector& freeObjStatements) const +void ASTFloatType::EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& prefix, std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadFloat(data, &%s)) {\n", name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_float_type.h b/tools/hdi-gen/ast/ast_float_type.h index cb0b07f5..c8fadc35 100755 --- a/tools/hdi-gen/ast/ast_float_type.h +++ b/tools/hdi-gen/ast/ast_float_type.h @@ -27,14 +27,14 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const override; - - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; + void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; void EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel = 0) const override; @@ -44,7 +44,7 @@ public: void EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const override; - void EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, + void EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix, std::vector& freeObjStatements) const override; void EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb, diff --git a/tools/hdi-gen/ast/ast_integer_type.cpp b/tools/hdi-gen/ast/ast_integer_type.cpp index 62d19751..fa46b79a 100755 --- a/tools/hdi-gen/ast/ast_integer_type.cpp +++ b/tools/hdi-gen/ast/ast_integer_type.cpp @@ -62,40 +62,40 @@ String ASTIntegerType::EmitJavaType(TypeMode mode, bool isInnerType) const return isInnerType ? "Integer" : "int"; } -void ASTIntegerType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTIntegerType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt32(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } void ASTIntegerType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt32(%s, %s)) {\n", parcelName.string(), name.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTIntegerType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt32(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } -void ASTIntegerType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt32(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); - sb.Append(prefix).Append("}\n"); -} - void ASTIntegerType::EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel) const { @@ -126,14 +126,14 @@ void ASTIntegerType::EmitCMarshalling(const String& name, StringBuilder& sb, con sb.Append(prefix).Append("}\n"); } -void ASTIntegerType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, - std::vector& freeObjStatements) const +void ASTIntegerType::EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& prefix, std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt32(data, &%s)) {\n", name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_integer_type.h b/tools/hdi-gen/ast/ast_integer_type.h index 5ed7723b..0c9c7208 100755 --- a/tools/hdi-gen/ast/ast_integer_type.h +++ b/tools/hdi-gen/ast/ast_integer_type.h @@ -27,14 +27,14 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const override; - - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; + void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; void EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel = 0) const override; @@ -44,7 +44,7 @@ public: void EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const override; - void EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, + void EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix, std::vector& freeObjStatements) const override; void EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb, diff --git a/tools/hdi-gen/ast/ast_interface_type.cpp b/tools/hdi-gen/ast/ast_interface_type.cpp index 79adb8a1..5db83ea2 100755 --- a/tools/hdi-gen/ast/ast_interface_type.cpp +++ b/tools/hdi-gen/ast/ast_interface_type.cpp @@ -129,31 +129,31 @@ String ASTInterfaceType::EmitJavaType(TypeMode mode, bool isInnerType) const return name_; } -void ASTInterfaceType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTInterfaceType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { - sb.Append(prefix).AppendFormat("if (HdfSBufWriteRemoteService(%s, %s->AsObject(%s)) != 0) {\n", + sb.Append(prefix).AppendFormat("if (HdfSbufWriteRemoteService(%s, %s->AsObject(%s)) != 0) {\n", parcelName.string(), name.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } -void ASTInterfaceType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const +void ASTInterfaceType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { String remoteName = String::Format("%sRemote", name.string()); String miName = name_.StartsWith("I") ? name_.Substring(1) : name_; - sb.Append(prefix).AppendFormat("struct HdfRemoteService *%s = HdfSBufReadRemoteService(%s);\n", + sb.Append(prefix).AppendFormat("struct HdfRemoteService *%s = HdfSbufReadRemoteService(%s);\n", remoteName.string(), parcelName.string()); sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", remoteName.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", remoteName.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); sb.Append(prefix).AppendFormat("%s = %sGet(%s);\n", name.string(), miName.string(), remoteName.string()); diff --git a/tools/hdi-gen/ast/ast_interface_type.h b/tools/hdi-gen/ast/ast_interface_type.h index 70870730..08fbb295 100755 --- a/tools/hdi-gen/ast/ast_interface_type.h +++ b/tools/hdi-gen/ast/ast_interface_type.h @@ -105,11 +105,11 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const override; + void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; + void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; void EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel = 0) const override; diff --git a/tools/hdi-gen/ast/ast_list_type.cpp b/tools/hdi-gen/ast/ast_list_type.cpp index e8ce1aeb..f515a080 100755 --- a/tools/hdi-gen/ast/ast_list_type.cpp +++ b/tools/hdi-gen/ast/ast_list_type.cpp @@ -34,29 +34,13 @@ String ASTListType::EmitCType(TypeMode mode) const case TypeMode::PARAM_IN: { if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { return String::Format("%s*", elementType_->EmitCType(TypeMode::NO_MODE).string()); - } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT - || elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { - return String::Format("%s", elementType_->EmitCType(TypeMode::PARAM_IN).string()); - } else { - return String::Format("%s*", elementType_->EmitCType(TypeMode::PARAM_IN).string()); - } - } - case TypeMode::PARAM_OUT: { - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT - || elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { - return elementType_->EmitCType(TypeMode::PARAM_OUT); - } else { - return String::Format("%s*", elementType_->EmitCType(TypeMode::PARAM_OUT).string()); - } - } - case TypeMode::LOCAL_VAR: { - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT - || elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { - return String::Format("%s", elementType_->EmitCType(TypeMode::LOCAL_VAR).string()); - } else { - return String::Format("%s*", elementType_->EmitCType(TypeMode::LOCAL_VAR).string()); } + return String::Format("const %s*", elementType_->EmitCType(TypeMode::NO_MODE).string()); } + case TypeMode::PARAM_OUT: + return String::Format("%s*", elementType_->EmitCType(TypeMode::NO_MODE).string()); + case TypeMode::LOCAL_VAR: + return String::Format("%s*", elementType_->EmitCType(TypeMode::NO_MODE).string()); default: return "unknow type"; } @@ -83,15 +67,15 @@ String ASTListType::EmitJavaType(TypeMode mode, bool isInnerType) const return String::Format("List<%s>", elementType_->EmitJavaType(mode, true).string()); } -void ASTListType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTListType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { String lenName = String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint32(%s, %s)) {\n", parcelName.string(), lenName.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); @@ -109,25 +93,35 @@ void ASTListType::EmitCWriteVar(const String& parcelName, const String& name, co elementName = String::Format("%s[i]", name.string()); } - elementType_->EmitCWriteVar(parcelName, elementName, gotoLabel, sb, prefix + g_tab); + elementType_->EmitCWriteVar(parcelName, elementName, ecName.string(), gotoLabel, sb, prefix + g_tab); + sb.Append(prefix).Append("}\n"); +} + +void ASTListType::EmitCProxyWriteOutVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + String lenName = String::Format("*%sLen", name.string()); + sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint32(%s, %s)) {\n", + parcelName.string(), lenName.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } void ASTListType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, - const String& gotoLabel, StringBuilder& sb, const String& prefix) const + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { String lenName = String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, %s)) {\n", parcelName.string(), lenName.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s size failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n\n"); - EmitCMallocVar(name, lenName, true, gotoLabel, sb, prefix); - sb.Append("\n"); - if (Options::GetInstance().DoGenerateKernelCode()) { sb.Append(prefix).AppendFormat("for (i = 0; i < *%s; i++) {\n", lenName.string()); } else { @@ -135,29 +129,29 @@ void ASTListType::EmitCProxyReadVar(const String& parcelName, const String& name } if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - EmitCProxyReadStrElement(parcelName, name, gotoLabel, sb, prefix); + EmitCProxyReadStrElement(parcelName, name, ecName, gotoLabel, sb, prefix); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { - String element = String::Format("&(*%s)[i]", name.string()); - elementType_->EmitCProxyReadVar(parcelName, element, true, gotoLabel, sb, prefix + g_tab); + String element = String::Format("&%s[i]", name.string()); + elementType_->EmitCProxyReadVar(parcelName, element, true, ecName, gotoLabel, sb, prefix + g_tab); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { - String element = String::Format("&(*%s)[i]", name.string()); + String element = String::Format("&%s[i]", name.string()); String elementCp = String::Format("%sElementCp", name.string()); - elementType_->EmitCProxyReadVar(parcelName, elementCp, true, gotoLabel, sb, prefix + g_tab); + elementType_->EmitCProxyReadVar(parcelName, elementCp, true, ecName, gotoLabel, sb, prefix + g_tab); sb.Append(prefix + g_tab).AppendFormat("(void)memcpy_s(%s, sizeof(%s), %s, sizeof(%s));\n", element.string(), elementType_->EmitCType().string(), elementCp.string(), elementType_->EmitCType().string()); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_FILEDESCRIPTOR) { - String element = String::Format("(*%s)[i]", name.string()); - elementType_->EmitCProxyReadVar(parcelName, element, true, gotoLabel, sb, prefix + g_tab); + String element = String::Format("%s[i]", name.string()); + elementType_->EmitCProxyReadVar(parcelName, element, true, ecName, gotoLabel, sb, prefix + g_tab); } else { - String element = String::Format("&(*%s)[i]", name.string()); - elementType_->EmitCProxyReadVar(parcelName, element, true, gotoLabel, sb, prefix + g_tab); + String element = String::Format("&%s[i]", name.string()); + elementType_->EmitCProxyReadVar(parcelName, element, true, ecName, gotoLabel, sb, prefix + g_tab); } sb.Append(prefix).Append("}\n"); } -void ASTListType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const +void ASTListType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { String lenName = String::Format("%sLen", name.string()); @@ -165,12 +159,12 @@ void ASTListType::EmitCStubReadVar(const String& parcelName, const String& name, parcelName.string(), lenName.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s size failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n\n"); sb.Append(prefix).AppendFormat("if (%s > 0) {\n", lenName.string()); - EmitCMallocVar(name, lenName, false, "errors", sb, prefix + g_tab); + EmitCMallocVar(name, lenName, false, ecName, gotoLabel, sb, prefix + g_tab); sb.Append("\n"); if (Options::GetInstance().DoGenerateKernelCode()) { @@ -180,28 +174,45 @@ void ASTListType::EmitCStubReadVar(const String& parcelName, const String& name, } if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - EmitCStubReadStrElement(parcelName, name, sb, prefix); + EmitCStubReadStrElement(parcelName, name, ecName, gotoLabel, sb, prefix); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { String element = String::Format("&%s[i]", name.string()); - elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); + elementType_->EmitCStubReadVar(parcelName, element, ecName, gotoLabel, sb, prefix + g_tab + g_tab); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { String element = String::Format("%s[i]", name.string()); String elementCp = String::Format("%sElementCp", name.string()); - elementType_->EmitCStubReadVar(parcelName, elementCp, sb, prefix + g_tab + g_tab); + elementType_->EmitCStubReadVar(parcelName, elementCp, ecName, gotoLabel, sb, prefix + g_tab + g_tab); sb.Append(prefix + g_tab + g_tab).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", element.string(), elementType_->EmitCType().string(), elementCp.string(), elementType_->EmitCType().string()); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_FILEDESCRIPTOR) { String element = String::Format("%s[i]", name.string()); - elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); + elementType_->EmitCStubReadVar(parcelName, element, ecName, gotoLabel, sb, prefix + g_tab + g_tab); } else { String element = String::Format("&%s[i]", name.string()); - elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); + elementType_->EmitCStubReadVar(parcelName, element, ecName, gotoLabel, sb, prefix + g_tab + g_tab); } sb.Append(prefix + g_tab).Append("}\n"); sb.Append(prefix).Append("}\n"); } +void ASTListType::EmitCStubReadOutVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + String lenName = String::Format("%sLen", name.string()); + sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, &%s)) {\n", + parcelName.string(), lenName.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s size failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n\n"); + + sb.Append(prefix).AppendFormat("if (%s > 0) {\n", lenName.string()); + EmitCMallocVar(name, lenName, false, ecName, gotoLabel, sb, prefix + g_tab); + sb.Append(prefix).Append("}\n"); +} + void ASTListType::EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel) const { @@ -252,14 +263,14 @@ void ASTListType::EmitCMarshalling(const String& name, StringBuilder& sb, const sb.Append(prefix).Append("}\n"); } -void ASTListType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, - std::vector& freeObjStatements) const +void ASTListType::EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& prefix, std::vector& freeObjStatements) const { String lenName = String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(data, &%s)) {\n", lenName.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", lenName.string()); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); sb.Append(prefix).AppendFormat("if (%s > 0) {\n", lenName.string()); @@ -268,7 +279,7 @@ void ASTListType::EmitCUnMarshalling(const String& name, StringBuilder& sb, cons sb.Append(newPrefix).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * %s);\n", name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenName.string()); sb.Append(newPrefix).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(newPrefix).Append("}\n"); freeObjStatements.push_back(String::Format("OsalMemFree(%s);\n", name.string())); @@ -280,31 +291,31 @@ void ASTListType::EmitCUnMarshalling(const String& name, StringBuilder& sb, cons } if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - EmitCStringElementUnMarshalling(name, sb, newPrefix, freeObjStatements); + EmitCStringElementUnMarshalling(name, gotoLabel, sb, newPrefix, freeObjStatements); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { String element = String::Format("&%s[i]", name.string()); - elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); + elementType_->EmitCUnMarshalling(element, gotoLabel, sb, newPrefix + g_tab, freeObjStatements); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { String element = String::Format("%s[i]", name.string()); String elementCp = String::Format("%sElementCp", name.string()); - elementType_->EmitCUnMarshalling(elementCp, sb, newPrefix + g_tab, freeObjStatements); + elementType_->EmitCUnMarshalling(elementCp, gotoLabel, sb, newPrefix + g_tab, freeObjStatements); sb.Append(newPrefix + g_tab).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", element.string(), elementType_->EmitCType().string(), elementCp.string(), elementType_->EmitCType().string()); } else { String element = String::Format("%s[i]", name.string()); - elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); + elementType_->EmitCUnMarshalling(element, gotoLabel, sb, newPrefix + g_tab, freeObjStatements); } sb.Append(newPrefix).Append("}\n"); sb.Append(prefix).Append("}\n"); freeObjStatements.pop_back(); } -void ASTListType::EmitCStringElementUnMarshalling(const String& name, StringBuilder& sb, const String& newPrefix, - std::vector& freeObjStatements) const +void ASTListType::EmitCStringElementUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& newPrefix, std::vector& freeObjStatements) const { String element = String::Format("%sElement", name.string()); - elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); + elementType_->EmitCUnMarshalling(element, gotoLabel, sb, newPrefix + g_tab, freeObjStatements); if (Options::GetInstance().DoGenerateKernelCode()) { sb.Append(newPrefix).AppendFormat("%s[i] = (char*)OsalMemCalloc(strlen(%s) + 1);\n", name.string(), element.string()); @@ -376,7 +387,7 @@ void ASTListType::EmitCppUnMarshalling(const String& parcelName, const String& n void ASTListType::EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, const String& prefix) const { - String varName = isClient ? String::Format("*%s", name.string()) : name; + String varName = name; String lenName = isClient ? String::Format("*%sLen", name.string()) : String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (%s > 0 && %s != NULL) {\n", lenName.string(), varName.string()); @@ -387,8 +398,7 @@ void ASTListType::EmitMemoryRecycle(const String& name, bool isClient, bool owne sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); } - String elementName = isClient ? String::Format("(%s)[i]", varName.string()) : - String::Format("%s[i]", varName.string()); + String elementName = String::Format("%s[i]", varName.string()); elementType_->EmitMemoryRecycle(elementName, false, false, sb, prefix + g_tab + g_tab); sb.Append(prefix + g_tab).Append("}\n"); } @@ -434,8 +444,8 @@ void ASTListType::EmitJavaReadInnerVar(const String& parcelName, const String& n sb.Append(prefix).Append("}\n"); } -void ASTListType::EmitCMallocVar(const String& name, const String& lenName, bool isClient, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTListType::EmitCMallocVar(const String& name, const String& lenName, bool isClient, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { String varName = isClient ? String::Format("*%s", name.string()) : name; String lenVarName = isClient ? String::Format("*%s", lenName.string()) : lenName; @@ -443,58 +453,62 @@ void ASTListType::EmitCMallocVar(const String& name, const String& lenName, bool sb.Append(prefix).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * (%s));\n", varName.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenVarName.string()); sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", varName.string()); - sb.Append(prefix + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: malloc %s failed\", __func__);\n", + varName.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_MALLOC_FAIL;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).AppendFormat("}\n"); + sb.Append(prefix).Append("}\n"); } -void ASTListType::EmitCProxyReadStrElement(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTListType::EmitCProxyReadStrElement(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { String cpName = String::Format("%sCp", name.string()); - elementType_->EmitCProxyReadVar(parcelName, cpName, true, gotoLabel, sb, prefix + g_tab); + elementType_->EmitCProxyReadVar(parcelName, cpName, true, ecName, gotoLabel, sb, prefix + g_tab); sb.Append("\n"); if (Options::GetInstance().DoGenerateKernelCode()) { - sb.Append(prefix + g_tab).AppendFormat("(*%s)[i] = (char*)OsalMemCalloc(strlen(%s) + 1);\n", + sb.Append(prefix + g_tab).AppendFormat("%s[i] = (char*)OsalMemCalloc(strlen(%s) + 1);\n", name.string(), cpName.string()); - sb.Append(prefix + g_tab).AppendFormat("if ((*%s)[i] == NULL) {\n", name.string()); - sb.Append(prefix + g_tab + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).AppendFormat("if (%s[i] == NULL) {\n", name.string()); + sb.Append(prefix + g_tab + g_tab).AppendFormat("%s = HDF_ERR_MALLOC_FAIL;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: malloc %s[i] failed\", __func__);\n", + name.string()); sb.Append(prefix + g_tab + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix + g_tab).Append("}\n\n"); - sb.Append(prefix + g_tab).AppendFormat("if (strcpy_s((*%s)[i], (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", + sb.Append(prefix + g_tab).AppendFormat("if (strcpy_s(%s[i], (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", name.string(), cpName.string(), cpName.string()); sb.Append(prefix + g_tab + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", cpName.string()); - sb.Append(prefix + g_tab + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix + g_tab).Append("}\n"); } else { - sb.Append(prefix + g_tab).AppendFormat("(*%s)[i] = strdup(%sCp);\n", + sb.Append(prefix + g_tab).AppendFormat("%s[i] = strdup(%sCp);\n", name.string(), name.string()); } } -void ASTListType::EmitCStubReadStrElement(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const +void ASTListType::EmitCStubReadStrElement(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { String element = String::Format("%sCp", name.string()); String newPrefix = prefix + g_tab + g_tab; - elementType_->EmitCStubReadVar(parcelName, element, sb, newPrefix); + elementType_->EmitCStubReadVar(parcelName, element, ecName, gotoLabel, sb, newPrefix); sb.Append("\n"); if (Options::GetInstance().DoGenerateKernelCode()) { sb.Append(newPrefix).AppendFormat("%s[i] = (char*)OsalMemCalloc(strlen(%s) + 1);\n", name.string(), element.string()); sb.Append(newPrefix).AppendFormat("if (%s[i] == NULL) {\n", name.string()); - sb.Append(newPrefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n"); + sb.Append(newPrefix + g_tab).AppendFormat("%s = HDF_ERR_MALLOC_FAIL;\n", ecName.string()); + sb.Append(newPrefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(newPrefix).Append("}\n\n"); - sb.Append(newPrefix).AppendFormat("if (strcpy_s((%s)[i], (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", + sb.Append(newPrefix).AppendFormat("if (strcpy_s(%s[i], (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", name.string(), element.string(), element.string()); sb.Append(newPrefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", element.string()); - sb.Append(newPrefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(newPrefix + g_tab).Append("goto errors;\n"); + sb.Append(newPrefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(newPrefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(newPrefix).Append("}\n"); } else { sb.Append(newPrefix).AppendFormat("%s[i] = strdup(%sCp);\n", name.string(), name.string()); diff --git a/tools/hdi-gen/ast/ast_list_type.h b/tools/hdi-gen/ast/ast_list_type.h index a0ab05eb..9b0b8fb4 100755 --- a/tools/hdi-gen/ast/ast_list_type.h +++ b/tools/hdi-gen/ast/ast_list_type.h @@ -38,14 +38,20 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const override; - - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; + void EmitCProxyWriteOutVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadOutVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; void EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel = 0) const override; @@ -55,7 +61,7 @@ public: void EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const override; - void EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, + void EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix, std::vector& freeObjStatements) const override; void EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb, @@ -76,17 +82,17 @@ public: void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, const String& prefix) const override; private: - void EmitCMallocVar(const String& name, const String& lenName, bool isClient, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const; + void EmitCMallocVar(const String& name, const String& lenName, bool isClient, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const; - void EmitCProxyReadStrElement(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const; + void EmitCProxyReadStrElement(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const; - void EmitCStubReadStrElement(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const; + void EmitCStubReadStrElement(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const; - void EmitCStringElementUnMarshalling(const String& name, StringBuilder& sb, const String& newPrefix, - std::vector& freeObjStatements) const; + void EmitCStringElementUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& newPrefix, std::vector& freeObjStatements) const; AutoPtr elementType_ = nullptr; }; diff --git a/tools/hdi-gen/ast/ast_long_type.cpp b/tools/hdi-gen/ast/ast_long_type.cpp index fa0cd6f2..f1fd0eea 100755 --- a/tools/hdi-gen/ast/ast_long_type.cpp +++ b/tools/hdi-gen/ast/ast_long_type.cpp @@ -62,40 +62,40 @@ String ASTLongType::EmitJavaType(TypeMode mode, bool isInnerType) const return isInnerType ? "Long" : "long"; } -void ASTLongType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTLongType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt64(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } void ASTLongType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt64(%s, %s)) {\n", parcelName.string(), name.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTLongType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt64(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } -void ASTLongType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt64(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); - sb.Append(prefix).Append("}\n"); -} - void ASTLongType::EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel) const { @@ -126,14 +126,14 @@ void ASTLongType::EmitCMarshalling(const String& name, StringBuilder& sb, const sb.Append(prefix).Append("}\n"); } -void ASTLongType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, - std::vector& freeObjStatements) const +void ASTLongType::EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& prefix, std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt64(data, &%s)) {\n", name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_long_type.h b/tools/hdi-gen/ast/ast_long_type.h index 130a4bbe..dac32efc 100755 --- a/tools/hdi-gen/ast/ast_long_type.h +++ b/tools/hdi-gen/ast/ast_long_type.h @@ -27,14 +27,14 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const override; - - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; + void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; void EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel = 0) const override; @@ -44,7 +44,7 @@ public: void EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const override; - void EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, + void EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix, std::vector& freeObjStatements) const override; void EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb, diff --git a/tools/hdi-gen/ast/ast_parameter.cpp b/tools/hdi-gen/ast/ast_parameter.cpp index 1e87e1b2..396685df 100755 --- a/tools/hdi-gen/ast/ast_parameter.cpp +++ b/tools/hdi-gen/ast/ast_parameter.cpp @@ -36,7 +36,6 @@ String ASTParameter::Dump(const String& prefix) String ASTParameter::EmitCParameter() { StringBuilder sb; - switch (type_->GetTypeKind()) { case TypeKind::TYPE_BOOLEAN: case TypeKind::TYPE_BYTE: @@ -51,16 +50,21 @@ String ASTParameter::EmitCParameter() case TypeKind::TYPE_DOUBLE: case TypeKind::TYPE_ENUM: case TypeKind::TYPE_FILEDESCRIPTOR: - case TypeKind::TYPE_STRING: case TypeKind::TYPE_INTERFACE: + case TypeKind::TYPE_STRING: case TypeKind::TYPE_STRUCT: case TypeKind::TYPE_UNION: case TypeKind::TYPE_VOID: { + StringBuilder paramStr; if (attribute_ == ParamAttr::PARAM_IN) { - return String::Format("%s %s", type_->EmitCType(TypeMode::PARAM_IN).string(), name_.string()); + paramStr.AppendFormat("%s %s", type_->EmitCType(TypeMode::PARAM_IN).string(), name_.string()); } else { - return String::Format("%s %s", type_->EmitCType(TypeMode::PARAM_OUT).string(), name_.string()); + paramStr.AppendFormat("%s %s", type_->EmitCType(TypeMode::PARAM_OUT).string(), name_.string()); } + if (type_->GetTypeKind() == TypeKind::TYPE_STRING && attribute_ == ParamAttr::PARAM_OUT) { + paramStr.AppendFormat(", uint32_t %sLen", name_.string()); + } + return paramStr.ToString(); } case TypeKind::TYPE_ARRAY: case TypeKind::TYPE_LIST: { @@ -70,19 +74,13 @@ String ASTParameter::EmitCParameter() } else { paramStr.AppendFormat("%s %s", type_->EmitCType(TypeMode::PARAM_OUT).string(), name_.string()); } - - if (attribute_ == ParamAttr::PARAM_IN) { - paramStr.AppendFormat(", uint32_t %sLen", name_.string()); - } else { - paramStr.AppendFormat(", uint32_t* %sLen", name_.string()); - } - + paramStr.AppendFormat(", uint32_t%s %sLen", (attribute_ == ParamAttr::PARAM_IN) ? "" : "*", + name_.string()); return paramStr.ToString(); } default: return String::Format("unknow type %s", name_.string()); } - return sb.ToString(); } @@ -206,14 +204,45 @@ String ASTParameter::EmitJavaLocalVar() return ""; } -void ASTParameter::EmitCWriteVar(const String& parcelName, const String& gotoLabel, StringBuilder& sb, - const String& prefix) const +void ASTParameter::EmitCWriteVar(const String& parcelName, const String& ecName, const String& gotoLabel, + StringBuilder& sb, const String& prefix) const { if (type_ == nullptr) { return; } - type_->EmitCWriteVar(parcelName, name_, gotoLabel, sb, prefix); + type_->EmitCWriteVar(parcelName, name_, ecName, gotoLabel, sb, prefix); +} + +bool ASTParameter::EmitCProxyWriteOutVar(const String& parcelName, const String& ecName, const String& gotoLabel, + StringBuilder& sb, const String& prefix) const +{ + if (type_ == nullptr) { + return false; + } + + if (type_->IsStringType() || type_->IsArrayType() || type_->IsListType()) { + type_->EmitCProxyWriteOutVar(parcelName, name_, ecName, gotoLabel, sb, prefix); + return true; + } + + return false; +} + +bool ASTParameter::EmitCStubReadOutVar(const String& parcelName, const String& ecName, const String& gotoLabel, + StringBuilder& sb, const String& prefix) const +{ + if (type_ == nullptr) { + return false; + } + + if (type_->IsStringType() || type_->IsArrayType() || type_->IsListType() + || type_->IsStructType() || type_->IsUnionType()) { + type_->EmitCStubReadOutVar(parcelName, name_, ecName, gotoLabel, sb, prefix); + return true; + } + + return false; } void ASTParameter::EmitJavaWriteVar(const String& parcelName, StringBuilder& sb, const String& prefix) const diff --git a/tools/hdi-gen/ast/ast_parameter.h b/tools/hdi-gen/ast/ast_parameter.h index 85603674..96ba2d36 100755 --- a/tools/hdi-gen/ast/ast_parameter.h +++ b/tools/hdi-gen/ast/ast_parameter.h @@ -72,9 +72,15 @@ public: String EmitJavaLocalVar(); - void EmitCWriteVar(const String& parcelName, const String& gotoLabel, StringBuilder& sb, + void EmitCWriteVar(const String& parcelName, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const; + bool EmitCProxyWriteOutVar(const String& parcelName, const String& ecName, const String& gotoLabel, + StringBuilder& sb, const String& prefix) const; + + bool EmitCStubReadOutVar(const String& parcelName, const String& ecName, const String& gotoLabel, + StringBuilder& sb, const String& prefix) const; + void EmitJavaWriteVar(const String& parcelName, StringBuilder& sb, const String& prefix) const; void EmitJavaReadVar(const String& parcelName, StringBuilder& sb, const String& prefix) const; diff --git a/tools/hdi-gen/ast/ast_short_type.cpp b/tools/hdi-gen/ast/ast_short_type.cpp index 9f2b4eea..28cb8e0f 100755 --- a/tools/hdi-gen/ast/ast_short_type.cpp +++ b/tools/hdi-gen/ast/ast_short_type.cpp @@ -62,40 +62,40 @@ String ASTShortType::EmitJavaType(TypeMode mode, bool isInnerType) const return isInnerType ? "Short" : "short"; } -void ASTShortType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTShortType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt16(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } void ASTShortType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt16(%s, %s)) {\n", parcelName.string(), name.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTShortType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt16(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } -void ASTShortType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt16(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); - sb.Append(prefix).Append("}\n"); -} - void ASTShortType::EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel) const { @@ -127,14 +127,14 @@ void ASTShortType::EmitCMarshalling(const String& name, StringBuilder& sb, const sb.Append(prefix).Append("}\n"); } -void ASTShortType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, - std::vector& freeObjStatements) const +void ASTShortType::EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& prefix, std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt16(data, &%s)) {\n", name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_short_type.h b/tools/hdi-gen/ast/ast_short_type.h index 1b5e7642..d49c09c4 100755 --- a/tools/hdi-gen/ast/ast_short_type.h +++ b/tools/hdi-gen/ast/ast_short_type.h @@ -27,14 +27,14 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const override; - - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; + void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; void EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel = 0) const override; @@ -44,7 +44,7 @@ public: void EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const override; - void EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, + void EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix, std::vector& freeObjStatements) const override; void EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb, diff --git a/tools/hdi-gen/ast/ast_string_type.cpp b/tools/hdi-gen/ast/ast_string_type.cpp index a3c891b1..1fed0f4e 100755 --- a/tools/hdi-gen/ast/ast_string_type.cpp +++ b/tools/hdi-gen/ast/ast_string_type.cpp @@ -33,7 +33,7 @@ String ASTStringType::EmitCType(TypeMode mode) const case TypeMode::PARAM_IN: return "const char*"; case TypeMode::PARAM_OUT: - return "char**"; + return "char*"; case TypeMode::LOCAL_VAR: return "char*"; default: @@ -62,19 +62,45 @@ String ASTStringType::EmitJavaType(TypeMode mode, bool isInnerType) const return "String"; } -void ASTStringType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTStringType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteString(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTStringType::EmitCProxyWriteOutVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + String lenName = String::Format("%sLen", name.string()); + sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint32(%s, %s)) {\n", + parcelName.string(), lenName.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } void ASTStringType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("const char *%s = HdfSbufReadString(%s);\n", + name.string(), parcelName.string()); + sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTStringType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("const char *%s = HdfSbufReadString(%s);\n", @@ -82,21 +108,32 @@ void ASTStringType::EmitCProxyReadVar(const String& parcelName, const String& na sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } -void ASTStringType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const +void ASTStringType::EmitCStubReadOutVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { - sb.Append(prefix).AppendFormat("const char *%s = HdfSbufReadString(%s);\n", - name.string(), parcelName.string()); - sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); + String lenName = String::Format("%sLen", name.string()); + sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, &%s)) {\n", + parcelName.string(), lenName.string()); sb.Append(prefix + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + "HDF_LOGE(\"%%{public}s: read %s size failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n\n"); + + sb.Append(prefix).AppendFormat("if (%s > 0) {\n", lenName.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = (%s)OsalMemCalloc(%s);\n", name.string(), EmitCType().string(), + lenName.string()); + sb.Append(prefix + g_tab).AppendFormat("if (%s == NULL) {\n", name.string()); + sb.Append(prefix + g_tab + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: malloc %s failed\", __func__);\n", + name.string()); + sb.Append(prefix + g_tab + g_tab).AppendFormat("%s = HDF_ERR_MALLOC_FAIL;\n", ecName.string()); + sb.Append(prefix + g_tab + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("}\n"); sb.Append(prefix).Append("}\n"); } @@ -130,15 +167,15 @@ void ASTStringType::EmitCMarshalling(const String& name, StringBuilder& sb, cons sb.Append(prefix).Append("}\n"); } -void ASTStringType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, - std::vector& freeObjStatements) const +void ASTStringType::EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& prefix, std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("const char *%s = HdfSbufReadString(data);\n", name.string()); sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -167,10 +204,9 @@ void ASTStringType::EmitCppUnMarshalling(const String& parcelName, const String& void ASTStringType::EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, const String& prefix) const { - String varName = isClient ? String::Format("*%s", name.string()) : name; - sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", varName.string()); - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", varName.string()); - sb.Append(prefix + g_tab).AppendFormat("%s = NULL;\n", varName.string()); + sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = NULL;\n", name.string()); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_string_type.h b/tools/hdi-gen/ast/ast_string_type.h index 55f67076..e6088e22 100755 --- a/tools/hdi-gen/ast/ast_string_type.h +++ b/tools/hdi-gen/ast/ast_string_type.h @@ -27,14 +27,20 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const override; - - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; + void EmitCProxyWriteOutVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadOutVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; void EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel = 0) const override; @@ -44,7 +50,7 @@ public: void EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const override; - void EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, + void EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix, std::vector& freeObjStatements) const override; void EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb, diff --git a/tools/hdi-gen/ast/ast_struct_type.cpp b/tools/hdi-gen/ast/ast_struct_type.cpp index 474c12d6..d4ac962b 100755 --- a/tools/hdi-gen/ast/ast_struct_type.cpp +++ b/tools/hdi-gen/ast/ast_struct_type.cpp @@ -77,7 +77,7 @@ String ASTStructType::EmitCType(TypeMode mode) const case TypeMode::PARAM_IN: return String::Format("const struct %s*", name_.string()); case TypeMode::PARAM_OUT: - return String::Format("struct %s**", name_.string()); + return String::Format("struct %s*", name_.string()); case TypeMode::LOCAL_VAR: return String::Format("struct %s*", name_.string()); default: @@ -147,40 +147,53 @@ String ASTStructType::EmitJavaTypeDecl() const return sb.ToString(); } -void ASTStructType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTStructType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!%sBlockMarshalling(%s, %s)) {\n", name_.string(), parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } void ASTStructType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("if (!%sBlockUnmarshalling(%s, %s)) {\n", + name_.string(), parcelName.string(), name.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTStructType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!%sBlockUnmarshalling(%s, %s)) {\n", name_.string(), parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); + sb.Append(prefix).AppendFormat("}\n"); } -void ASTStructType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const +void ASTStructType::EmitCStubReadOutVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { - sb.Append(prefix).AppendFormat("if (!%sBlockUnmarshalling(%s, %s)) {\n", - name_.string(), parcelName.string(), name.string()); - sb.Append(prefix + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); - sb.Append(prefix).AppendFormat("}\n"); + sb.Append(prefix).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s));\n", name.string(), + EmitCType(TypeMode::NO_MODE).string(), EmitCType(TypeMode::NO_MODE).string()); + sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: malloc %s failed\", __func__);\n", + name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_MALLOC_FAIL;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); } void ASTStructType::EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, @@ -217,14 +230,14 @@ void ASTStructType::EmitCMarshalling(const String& name, StringBuilder& sb, cons sb.Append(prefix).Append("}\n"); } -void ASTStructType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, - std::vector& freeObjStatements) const +void ASTStructType::EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& prefix, std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!%sBlockUnmarshalling(data, %s)) {\n", name_.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -253,7 +266,7 @@ void ASTStructType::EmitCppUnMarshalling(const String& parcelName, const String& void ASTStructType::EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, const String& prefix) const { - String varName = isClient ? String::Format("*%s", name.string()) : name; + String varName = name; if (ownership) { sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", varName.string()); sb.Append(prefix + g_tab).AppendFormat("%sFree(%s, true);\n", name_.string(), varName.string()); diff --git a/tools/hdi-gen/ast/ast_struct_type.h b/tools/hdi-gen/ast/ast_struct_type.h index 3eb3f246..dfb5ea0a 100755 --- a/tools/hdi-gen/ast/ast_struct_type.h +++ b/tools/hdi-gen/ast/ast_struct_type.h @@ -92,14 +92,17 @@ public: String EmitJavaTypeDecl() const; - void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const override; - - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; + void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadOutVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; void EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel = 0) const override; @@ -109,7 +112,7 @@ public: void EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const override; - void EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, + void EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix, std::vector& freeObjStatements) const override; void EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb, diff --git a/tools/hdi-gen/ast/ast_type.cpp b/tools/hdi-gen/ast/ast_type.cpp index b1a9b1da..9cf45ff2 100755 --- a/tools/hdi-gen/ast/ast_type.cpp +++ b/tools/hdi-gen/ast/ast_type.cpp @@ -177,20 +177,32 @@ String ASTType::EmitJavaType(TypeMode mode, bool isInnerType) const return "unknow"; } -void ASTType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { - sb.Append(prefix).AppendFormat("//Writeing \"%s\" type of data is not supported\n", name_.string()); + sb.Append(prefix).AppendFormat("//Writing \"%s\" type of data is not supported\n", name_.string()); +} + +void ASTType::EmitCProxyWriteOutVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("//Writing \"%s\" type of data is not supported\n", name_.string()); } void ASTType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("//Reading \"%s\" type of data is not supported\n", name_.string()); +} + +void ASTType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("//Reading \"%s\" type of data is not supported\n", name_.string()); } -void ASTType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const +void ASTType::EmitCStubReadOutVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("//Reading \"%s\" type of data is not supported\n", name_.string()); } @@ -212,8 +224,8 @@ void ASTType::EmitCMarshalling(const String& name, StringBuilder& sb, const Stri sb.Append(prefix).AppendFormat("//Writing \"%s\" type of data is not supported\n", name_.string()); } -void ASTType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, - std::vector& freeObjStatements) const +void ASTType::EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& prefix, std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("//Reading \"%s\" type of data is not supported\n", name_.string()); } diff --git a/tools/hdi-gen/ast/ast_type.h b/tools/hdi-gen/ast/ast_type.h index 09d4955d..6438a2d4 100755 --- a/tools/hdi-gen/ast/ast_type.h +++ b/tools/hdi-gen/ast/ast_type.h @@ -126,14 +126,20 @@ public: virtual String EmitJavaType(TypeMode mode, bool isInnerType = false) const; - virtual void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const; - - virtual void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + virtual void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const; - virtual void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const; + virtual void EmitCProxyWriteOutVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const; + + virtual void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const; + + virtual void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const; + + virtual void EmitCStubReadOutVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const; virtual void EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel = 0) const; @@ -143,8 +149,8 @@ public: virtual void EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const; - virtual void EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, - std::vector& freeObjStatements) const; + virtual void EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& prefix, std::vector& freeObjStatements) const; void EmitFreeStatements(const std::vector& freeObjStatements, StringBuilder& sb, const String& prefix) const; diff --git a/tools/hdi-gen/ast/ast_uchar_type.cpp b/tools/hdi-gen/ast/ast_uchar_type.cpp index 94e17782..0ce0b48a 100755 --- a/tools/hdi-gen/ast/ast_uchar_type.cpp +++ b/tools/hdi-gen/ast/ast_uchar_type.cpp @@ -63,40 +63,40 @@ String ASTUcharType::EmitJavaType(TypeMode mode, bool isInnerType) const return "/"; } -void ASTUcharType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTUcharType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint8(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } void ASTUcharType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint8(%s, %s)) {\n", parcelName.string(), name.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTUcharType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint8(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } -void ASTUcharType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint8(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); - sb.Append(prefix).Append("}\n"); -} - void ASTUcharType::EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel) const { @@ -127,14 +127,14 @@ void ASTUcharType::EmitCMarshalling(const String& name, StringBuilder& sb, const sb.Append(prefix).Append("}\n"); } -void ASTUcharType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, - std::vector& freeObjStatements) const +void ASTUcharType::EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& prefix, std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint8(data, &%s)) {\n", name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_uchar_type.h b/tools/hdi-gen/ast/ast_uchar_type.h index 87cd0615..edd4c65b 100755 --- a/tools/hdi-gen/ast/ast_uchar_type.h +++ b/tools/hdi-gen/ast/ast_uchar_type.h @@ -27,14 +27,14 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const override; - - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; + void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; void EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel = 0) const override; @@ -44,7 +44,7 @@ public: void EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const override; - void EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, + void EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix, std::vector& freeObjStatements) const override; void EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb, diff --git a/tools/hdi-gen/ast/ast_uint_type.cpp b/tools/hdi-gen/ast/ast_uint_type.cpp index 964d61ea..d259c81b 100755 --- a/tools/hdi-gen/ast/ast_uint_type.cpp +++ b/tools/hdi-gen/ast/ast_uint_type.cpp @@ -63,40 +63,40 @@ String ASTUintType::EmitJavaType(TypeMode mode, bool isInnerType) const return "/"; } -void ASTUintType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTUintType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint32(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } void ASTUintType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, %s)) {\n", parcelName.string(), name.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTUintType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } -void ASTUintType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); - sb.Append(prefix).Append("}\n"); -} - void ASTUintType::EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel) const { @@ -127,14 +127,14 @@ void ASTUintType::EmitCMarshalling(const String& name, StringBuilder& sb, const sb.Append(prefix).Append("}\n"); } -void ASTUintType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, - std::vector& freeObjStatements) const +void ASTUintType::EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& prefix, std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(data, &%s)) {\n", name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_uint_type.h b/tools/hdi-gen/ast/ast_uint_type.h index d33e9fcd..a63fd9bf 100755 --- a/tools/hdi-gen/ast/ast_uint_type.h +++ b/tools/hdi-gen/ast/ast_uint_type.h @@ -27,14 +27,14 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const override; - - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; + void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; void EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel = 0) const override; @@ -44,7 +44,7 @@ public: void EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const override; - void EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, + void EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix, std::vector& freeObjStatements) const override; void EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb, diff --git a/tools/hdi-gen/ast/ast_ulong_type.cpp b/tools/hdi-gen/ast/ast_ulong_type.cpp index dd09f23f..30c41e17 100755 --- a/tools/hdi-gen/ast/ast_ulong_type.cpp +++ b/tools/hdi-gen/ast/ast_ulong_type.cpp @@ -63,40 +63,40 @@ String ASTUlongType::EmitJavaType(TypeMode mode, bool isInnerType) const return "/"; } -void ASTUlongType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTUlongType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint64(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } void ASTUlongType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint64(%s, %s)) {\n", parcelName.string(), name.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTUlongType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint64(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } -void ASTUlongType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint64(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); - sb.Append(prefix).Append("}\n"); -} - void ASTUlongType::EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel) const { @@ -127,14 +127,14 @@ void ASTUlongType::EmitCMarshalling(const String& name, StringBuilder& sb, const sb.Append(prefix).Append("}\n"); } -void ASTUlongType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, - std::vector& freeObjStatements) const +void ASTUlongType::EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& prefix, std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint64(data, &%s)) {\n", name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_ulong_type.h b/tools/hdi-gen/ast/ast_ulong_type.h index 9d616eb9..d3875dcf 100755 --- a/tools/hdi-gen/ast/ast_ulong_type.h +++ b/tools/hdi-gen/ast/ast_ulong_type.h @@ -27,14 +27,14 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const override; - - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; + void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; void EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel = 0) const override; @@ -44,7 +44,7 @@ public: void EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const override; - void EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, + void EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix, std::vector& freeObjStatements) const override; void EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb, diff --git a/tools/hdi-gen/ast/ast_union_type.cpp b/tools/hdi-gen/ast/ast_union_type.cpp index 328b4eab..1d123eca 100755 --- a/tools/hdi-gen/ast/ast_union_type.cpp +++ b/tools/hdi-gen/ast/ast_union_type.cpp @@ -78,7 +78,7 @@ String ASTUnionType::EmitCType(TypeMode mode) const case TypeMode::PARAM_IN: return String::Format("const union %s*", name_.string()); case TypeMode::PARAM_OUT: - return String::Format("union %s**", name_.string()); + return String::Format("union %s*", name_.string()); case TypeMode::LOCAL_VAR: return String::Format("union %s*", name_.string()); default: @@ -148,8 +148,8 @@ String ASTUnionType::EmitJavaTypeDecl() const return sb.ToString(); } -void ASTUnionType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTUnionType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { if (Options::GetInstance().DoGenerateKernelCode()) { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteBuffer(%s, (const void *)%s, sizeof(%s))) {\n", @@ -160,13 +160,13 @@ void ASTUnionType::EmitCWriteVar(const String& parcelName, const String& name, c } sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } void ASTUnionType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, - const String& gotoLabel, StringBuilder& sb, const String& prefix) const + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { if (Options::GetInstance().DoGenerateKernelCode()) { sb.Append(prefix).AppendFormat("%s *%s = NULL;\n", EmitCType().string(), name.string()); @@ -175,7 +175,7 @@ void ASTUnionType::EmitCProxyReadVar(const String& parcelName, const String& nam parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n\n"); sb.Append(prefix).AppendFormat("if (%s == NULL || sizeof(%s) != len) {\n", @@ -188,13 +188,13 @@ void ASTUnionType::EmitCProxyReadVar(const String& parcelName, const String& nam sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } -void ASTUnionType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const +void ASTUnionType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { if (Options::GetInstance().DoGenerateKernelCode()) { sb.Append(prefix).AppendFormat("%s *%s = NULL;\n", EmitCType().string(), name.string()); @@ -203,8 +203,8 @@ void ASTUnionType::EmitCStubReadVar(const String& parcelName, const String& name parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n\n"); sb.Append(prefix).AppendFormat("if (%s == NULL || sizeof(%s) != len) {\n", name.string(), EmitCType().string()); @@ -216,8 +216,21 @@ void ASTUnionType::EmitCStubReadVar(const String& parcelName, const String& name sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTUnionType::EmitCStubReadOutVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s));\n", name.string(), + EmitCType(TypeMode::NO_MODE).string(), EmitCType(TypeMode::NO_MODE).string()); + sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: malloc %s failed\", __func__);\n", + name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_MALLOC_FAIL;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -265,8 +278,8 @@ void ASTUnionType::EmitCMarshalling(const String& name, StringBuilder& sb, const sb.Append(prefix).Append("}\n"); } -void ASTUnionType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, - std::vector& freeObjStatements) const +void ASTUnionType::EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& prefix, std::vector& freeObjStatements) const { if (Options::GetInstance().DoGenerateKernelCode()) { sb.Append(prefix).AppendFormat("%s *%s = NULL;\n", EmitCType().string(), name.string()); @@ -274,7 +287,7 @@ void ASTUnionType::EmitCUnMarshalling(const String& name, StringBuilder& sb, con sb.Append(prefix).AppendFormat("if (!HdfSbufReadBuffer(data, (const void **)&%s, &len)) {\n", name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n\n"); sb.Append(prefix).AppendFormat("if (%s == NULL || sizeof(%s) != len) {\n", name.string(), EmitCType().string()); @@ -286,7 +299,7 @@ void ASTUnionType::EmitCUnMarshalling(const String& name, StringBuilder& sb, con sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_union_type.h b/tools/hdi-gen/ast/ast_union_type.h index 951e08ba..3102a2b0 100755 --- a/tools/hdi-gen/ast/ast_union_type.h +++ b/tools/hdi-gen/ast/ast_union_type.h @@ -92,14 +92,17 @@ public: String EmitJavaTypeDecl() const; - void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const override; - - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; + void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadOutVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; void EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel = 0) const override; @@ -109,7 +112,7 @@ public: void EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const override; - void EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, + void EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix, std::vector& freeObjStatements) const override; void EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb, diff --git a/tools/hdi-gen/ast/ast_ushort_type.cpp b/tools/hdi-gen/ast/ast_ushort_type.cpp index 57e2c76e..eb6f7382 100755 --- a/tools/hdi-gen/ast/ast_ushort_type.cpp +++ b/tools/hdi-gen/ast/ast_ushort_type.cpp @@ -63,40 +63,40 @@ String ASTUshortType::EmitJavaType(TypeMode mode, bool isInnerType) const return "/"; } -void ASTUshortType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const +void ASTUshortType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint16(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } void ASTUshortType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint16(%s, %s)) {\n", parcelName.string(), name.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTUshortType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint16(%s, %s)) {\n", parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } -void ASTUshortType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint16(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); - sb.Append(prefix).Append("}\n"); -} - void ASTUshortType::EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel) const { @@ -127,14 +127,14 @@ void ASTUshortType::EmitCMarshalling(const String& name, StringBuilder& sb, cons sb.Append(prefix).Append("}\n"); } -void ASTUshortType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, - std::vector& freeObjStatements) const +void ASTUshortType::EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, + const String& prefix, std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint16(data, &%s)) {\n", name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_ushort_type.h b/tools/hdi-gen/ast/ast_ushort_type.h index 3ba7204a..3c13bbae 100755 --- a/tools/hdi-gen/ast/ast_ushort_type.h +++ b/tools/hdi-gen/ast/ast_ushort_type.h @@ -27,14 +27,14 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, - StringBuilder& sb, const String& prefix) const override; - - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; + void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + + void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; void EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel = 0) const override; @@ -44,7 +44,7 @@ public: void EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const override; - void EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, + void EmitCUnMarshalling(const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix, std::vector& freeObjStatements) const override; void EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb, diff --git a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp index ae87d1df..ae13bc7c 100755 --- a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp @@ -225,67 +225,44 @@ void CClientProxyCodeEmitter::EmitProxyMethodImpl(const AutoPtr& meth void CClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& method, StringBuilder& sb, const String& prefix) { - String dataName = "data_"; - String replyName = "reply_"; sb.Append(prefix).Append("{\n"); - sb.Append(prefix + g_tab).Append("int32_t ec = HDF_FAILURE;\n"); + sb.Append(prefix + g_tab).AppendFormat("int32_t %s = HDF_FAILURE;\n", errorCodeName_.string()); // Local variable definitions must precede all execution statements. - if (isKernelCode_) { - for (size_t i = 0; i < method->GetParameterNumber(); i++) { - AutoPtr param = method->GetParameter(i); - AutoPtr type = param->GetType(); - if (type->GetTypeKind() == TypeKind::TYPE_ARRAY || - type->GetTypeKind() == TypeKind::TYPE_LIST) { - sb.Append(prefix + g_tab).Append("uint32_t i = 0;\n"); - break; - } - } - } + EmitInitLoopVar(method, sb, prefix + g_tab); sb.Append("\n"); - EmitCreateBuf(dataName, replyName, sb, prefix + g_tab); + EmitCreateBuf(dataParcelName_, replyParcelName_, sb, prefix + g_tab); sb.Append("\n"); - String gotoName = GetGotLabel(method); for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_IN) { - param->EmitCWriteVar(dataName, gotoName, sb, prefix + g_tab); + param->EmitCWriteVar(dataParcelName_, errorCodeName_, finishedLabelName_, sb, prefix + g_tab); + sb.Append("\n"); + } else if (param->EmitCProxyWriteOutVar(dataParcelName_, errorCodeName_, finishedLabelName_, sb, + prefix + g_tab)) { sb.Append("\n"); } } - if (!isKernelCode_) { - sb.Append(prefix + g_tab).AppendFormat("ec = %sCall(self, %s, %s, %s, %s);\n", proxyName_.string(), - EmitMethodCmdID(method).string(), dataName.string(), replyName.string(), - method->IsOneWay() ? "true" : "false"); - } else { - sb.Append(prefix + g_tab).AppendFormat("ec = %sCall(self, %s, %s, %s);\n", proxyName_.string(), - EmitMethodCmdID(method).string(), dataName.string(), replyName.string()); - } - sb.Append(prefix + g_tab).Append("if (ec != HDF_SUCCESS) {\n"); - sb.Append(prefix + g_tab + g_tab).Append( - "HDF_LOGE(\"%{public}s: call failed! error code is %{public}d\", __func__, ec);\n"); - sb.Append(prefix + g_tab + g_tab).AppendFormat("goto %s;\n", gotoName.string()); - sb.Append(prefix + g_tab).Append("}\n"); + EmitStubCallMethod(method, sb, prefix + g_tab); sb.Append("\n"); if (!method->IsOneWay()) { for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_OUT) { - EmitReadProxyMethodParameter(param, replyName, gotoName, sb, prefix + g_tab); + EmitReadProxyMethodParameter(param, replyParcelName_, finishedLabelName_, sb, prefix + g_tab); sb.Append("\n"); } } } - EmitErrorHandle(method, "errors", true, sb, prefix); - sb.Append(prefix).Append("finished:\n"); - EmitReleaseBuf(dataName, replyName, sb, prefix + g_tab); + sb.Append(prefix).AppendFormat("%s:\n", finishedLabelName_); + EmitReleaseBuf(dataParcelName_, replyParcelName_, sb, prefix + g_tab); - sb.Append(prefix + g_tab).Append("return ec;\n"); + sb.Append(prefix + g_tab).AppendFormat("return %s;\n", errorCodeName_.string()); sb.Append("}\n"); } @@ -293,18 +270,18 @@ void CClientProxyCodeEmitter::EmitCreateBuf(const String& dataBufName, const Str StringBuilder& sb, const String& prefix) { if (isKernelCode_) { - sb.Append(prefix).AppendFormat("struct HdfSBuf *%s = HdfSBufObtainDefaultSize();\n", dataBufName.string()); - sb.Append(prefix).AppendFormat("struct HdfSBuf *%s = HdfSBufObtainDefaultSize();\n", replyBufName.string()); + sb.Append(prefix).AppendFormat("struct HdfSBuf *%s = HdfSbufObtainDefaultSize();\n", dataBufName.string()); + sb.Append(prefix).AppendFormat("struct HdfSBuf *%s = HdfSbufObtainDefaultSize();\n", replyBufName.string()); } else { - sb.Append(prefix).AppendFormat("struct HdfSBuf *%s = HdfSBufTypedObtain(SBUF_IPC);\n", dataBufName.string()); - sb.Append(prefix).AppendFormat("struct HdfSBuf *%s = HdfSBufTypedObtain(SBUF_IPC);\n", replyBufName.string()); + sb.Append(prefix).AppendFormat("struct HdfSBuf *%s = HdfSbufTypedObtain(SBUF_IPC);\n", dataBufName.string()); + sb.Append(prefix).AppendFormat("struct HdfSBuf *%s = HdfSbufTypedObtain(SBUF_IPC);\n", replyBufName.string()); } sb.Append("\n"); sb.Append(prefix).AppendFormat("if (%s == NULL || %s == NULL) {\n", dataBufName.string(), replyBufName.string()); sb.Append(prefix + g_tab).Append("HDF_LOGE(\"%{public}s: HdfSubf malloc failed!\", __func__);\n"); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab).Append("goto finished;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_MALLOC_FAIL;\n", errorCodeName_.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", finishedLabelName_); sb.Append(prefix).Append("}\n"); } @@ -312,10 +289,10 @@ void CClientProxyCodeEmitter::EmitReleaseBuf(const String& dataBufName, const St const String& prefix) { sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", dataBufName.string()); - sb.Append(prefix + g_tab).AppendFormat("HdfSBufRecycle(%s);\n", dataBufName.string()); + sb.Append(prefix + g_tab).AppendFormat("HdfSbufRecycle(%s);\n", dataBufName.string()); sb.Append(prefix).Append("}\n"); sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", replyBufName.string()); - sb.Append(prefix + g_tab).AppendFormat("HdfSBufRecycle(%s);\n", replyBufName.string()); + sb.Append(prefix + g_tab).AppendFormat("HdfSbufRecycle(%s);\n", replyBufName.string()); sb.Append(prefix).Append("}\n"); } @@ -325,69 +302,43 @@ void CClientProxyCodeEmitter::EmitReadProxyMethodParameter(const AutoPtr type = param->GetType(); if (type->GetTypeKind() == TypeKind::TYPE_STRING) { String cloneName = String::Format("%sCopy", param->GetName().string()); - type->EmitCProxyReadVar(parcelName, cloneName, false, gotoLabel, sb, prefix); - String leftVar = String::Format("*%s", param->GetName().string()); - if (isKernelCode_) { - sb.Append("\n"); - sb.Append(prefix).AppendFormat("%s = (char*)OsalMemCalloc(strlen(%s) + 1);\n", - leftVar.string(), cloneName.string()); - sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", leftVar.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n\n"); - sb.Append(prefix).AppendFormat("if (strcpy_s(%s, (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", - leftVar.string(), cloneName.string(), cloneName.string()); - sb.Append(prefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", - leftVar.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); - } else { - sb.Append(prefix).AppendFormat("%s = strdup(%s);\n", leftVar.string(), cloneName.string()); - } - } else if (type->GetTypeKind() == TypeKind::TYPE_STRUCT) { - String name = String::Format("*%s", param->GetName().string()); - sb.Append(prefix).AppendFormat("%s = (%s*)OsalMemAlloc(sizeof(%s));\n", - name.string(), type->EmitCType().string(), type->EmitCType().string()); - sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); + type->EmitCProxyReadVar(parcelName, cloneName, false, errorCodeName_, gotoLabel, sb, prefix); + sb.Append(prefix).AppendFormat("if (strcpy_s(%s, %sLen, %s) != EOK) {\n", + param->GetName().string(), param->GetName().string(), cloneName.string()); + sb.Append(prefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", + param->GetName().string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", errorCodeName_.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); - type->EmitCProxyReadVar(parcelName, name, false, gotoLabel, sb, prefix); + } else if (type->GetTypeKind() == TypeKind::TYPE_STRUCT) { + type->EmitCProxyReadVar(parcelName, param->GetName().string(), false, errorCodeName_, gotoLabel, sb, prefix); } else if (type->GetTypeKind() == TypeKind::TYPE_UNION) { String cpName = String::Format("%sCp", param->GetName().string()); - type->EmitCProxyReadVar(parcelName, cpName, false, gotoLabel, sb, prefix); - sb.Append(prefix).AppendFormat("*%s = (%s*)OsalMemAlloc(sizeof(%s));\n", - param->GetName().string(), type->EmitCType().string(), type->EmitCType().string()); - sb.Append(prefix).AppendFormat("if (*%s == NULL) {\n", param->GetName().string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); - sb.Append(prefix).AppendFormat("(void)memcpy_s(*%s, sizeof(%s), %s, sizeof(%s));\n", + type->EmitCProxyReadVar(parcelName, cpName, false, errorCodeName_, gotoLabel, sb, prefix); + sb.Append(prefix).AppendFormat("(void)memcpy_s(%s, sizeof(%s), %s, sizeof(%s));\n", param->GetName().string(), type->EmitCType().string(), cpName.string(), type->EmitCType().string()); } else { - type->EmitCProxyReadVar(parcelName, param->GetName(), false, gotoLabel, sb, prefix); + type->EmitCProxyReadVar(parcelName, param->GetName(), false, errorCodeName_, gotoLabel, sb, prefix); } } -String CClientProxyCodeEmitter::GetGotLabel(const AutoPtr& method) +void CClientProxyCodeEmitter::EmitStubCallMethod(const AutoPtr& method, StringBuilder& sb, + const String& prefix) { - String labelName = "finished"; - for (size_t i = 0; i < method->GetParameterNumber(); i++) { - AutoPtr param = method->GetParameter(i); - AutoPtr paramType = param->GetType(); - if (param->GetAttribute() == ParamAttr::PARAM_OUT && - (paramType->GetTypeKind() == TypeKind::TYPE_STRING - || paramType->GetTypeKind() == TypeKind::TYPE_ARRAY - || paramType->GetTypeKind() == TypeKind::TYPE_LIST - || paramType->GetTypeKind() == TypeKind::TYPE_STRUCT - || paramType->GetTypeKind() == TypeKind::TYPE_UNION)) { - labelName = "errors"; - break; - } + if (!isKernelCode_) { + sb.Append(prefix).AppendFormat("%s = %sCall(self, %s, %s, %s, %s);\n", errorCodeName_.string(), + proxyName_.string(), EmitMethodCmdID(method).string(), dataParcelName_.string(), + replyParcelName_.string(), method->IsOneWay() ? "true" : "false"); + } else { + sb.Append(prefix).AppendFormat("%s = %sCall(self, %s, %s, %s);\n", errorCodeName_.string(), + proxyName_.string(), EmitMethodCmdID(method).string(), dataParcelName_.string(), + replyParcelName_.string()); } - - return labelName; + sb.Append(prefix).AppendFormat("if (%s != HDF_SUCCESS) {\n", errorCodeName_.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: call failed! error code is %%{public}d\", __func__, %s);\n", errorCodeName_.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", finishedLabelName_); + sb.Append(prefix).Append("}\n"); } void CClientProxyCodeEmitter::EmitProxyAsObjectMethodImpl(StringBuilder& sb) @@ -471,9 +422,9 @@ void CClientProxyCodeEmitter::EmitProxyGetInstanceMethodImpl(StringBuilder& sb) sb.Append(g_tab).AppendFormat("%sProxyConstruct(%s);\n", infName_.string(), objName.string()); sb.Append(g_tab).AppendFormat("uint32_t %s = 0;\n", SerMajorName.string()); sb.Append(g_tab).AppendFormat("uint32_t %s = 0;\n", SerMinorName.string()); - sb.Append(g_tab).AppendFormat("int32_t ec = %s->GetVersion(%s, &%s, &%s);\n", objName.string(), objName.string(), - SerMajorName.string(), SerMinorName.string()); - sb.Append(g_tab).Append("if (ec != HDF_SUCCESS) {\n"); + sb.Append(g_tab).AppendFormat("int32_t %s = %s->GetVersion(%s, &%s, &%s);\n", + errorCodeName_.string(), objName.string(), objName.string(), SerMajorName.string(), SerMinorName.string()); + sb.Append(g_tab).AppendFormat("if (%s != HDF_SUCCESS) {\n", errorCodeName_.string()); sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: get version failed!\", __func__);\n"); sb.Append(g_tab).Append(g_tab).AppendFormat("%sRelease(%s);\n", infName_.string(), objName.string()); sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); @@ -546,9 +497,9 @@ void CClientProxyCodeEmitter::EmitCbProxyGetMethodImpl(StringBuilder& sb) sb.Append(g_tab).AppendFormat("%sProxyConstruct(%s);\n", infName_.string(), objName.string()); sb.Append(g_tab).AppendFormat("uint32_t %s = 0;\n", SerMajorName.string()); sb.Append(g_tab).AppendFormat("uint32_t %s = 0;\n", SerMinorName.string()); - sb.Append(g_tab).AppendFormat("int32_t ec = %s->GetVersion(%s, &%s, &%s);\n", objName.string(), objName.string(), - SerMajorName.string(), SerMinorName.string()); - sb.Append(g_tab).Append("if (ec != HDF_SUCCESS) {\n"); + sb.Append(g_tab).AppendFormat("int32_t %s = %s->GetVersion(%s, &%s, &%s);\n", + errorCodeName_.string(), objName.string(), objName.string(), SerMajorName.string(), SerMinorName.string()); + sb.Append(g_tab).AppendFormat("if (%s != HDF_SUCCESS) {\n", errorCodeName_.string()); sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: get version failed!\", __func__);\n"); sb.Append(g_tab).Append(g_tab).AppendFormat("%sRelease(%s);\n", infName_.string(), objName.string()); sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); diff --git a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h index c2bfe910..1467d869 100755 --- a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h +++ b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h @@ -48,8 +48,8 @@ private: void EmitReadProxyMethodParameter(const AutoPtr& param, const String& parcelName, const String& gotoLabel, StringBuilder& sb, const String& prefix); - - String GetGotLabel(const AutoPtr& method); + + void EmitStubCallMethod(const AutoPtr& method, StringBuilder& sb, const String& prefix); void EmitProxyAsObjectMethodImpl(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/c_code_emitter.cpp b/tools/hdi-gen/codegen/c_code_emitter.cpp index ef704989..6d0b9b78 100755 --- a/tools/hdi-gen/codegen/c_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_code_emitter.cpp @@ -72,6 +72,21 @@ void CCodeEmitter::EmitInterfaceMethodParameter(const AutoPtr& par sb.Append(prefix).Append(parameter->EmitCParameter()); } +void CCodeEmitter::EmitInitLoopVar(const AutoPtr& method, StringBuilder& sb, const String& prefix) +{ + if (isKernelCode_) { + for (size_t i = 0; i < method->GetParameterNumber(); i++) { + AutoPtr param = method->GetParameter(i); + AutoPtr type = param->GetType(); + if (type->GetTypeKind() == TypeKind::TYPE_ARRAY || + type->GetTypeKind() == TypeKind::TYPE_LIST) { + sb.Append(prefix).Append("uint32_t i = 0;\n"); + break; + } + } + } +} + void CCodeEmitter::EmitErrorHandle(const AutoPtr& method, const String& gotoLabel, bool isClient, StringBuilder& sb, const String& prefix) { @@ -84,28 +99,6 @@ void CCodeEmitter::EmitErrorHandle(const AutoPtr& method, const Strin } return; } - - bool errorLabel = false; - for (size_t i = 0; i < method->GetParameterNumber(); i++) { - AutoPtr param = method->GetParameter(i); - AutoPtr paramType = param->GetType(); - if (param->GetAttribute() == ParamAttr::PARAM_OUT && - (paramType->GetTypeKind() == TypeKind::TYPE_STRING - || paramType->GetTypeKind() == TypeKind::TYPE_ARRAY - || paramType->GetTypeKind() == TypeKind::TYPE_LIST - || paramType->GetTypeKind() == TypeKind::TYPE_STRUCT - || paramType->GetTypeKind() == TypeKind::TYPE_UNION)) { - if (!errorLabel) { - sb.Append(prefix + g_tab).Append("goto finished;\n"); - sb.Append("\n"); - sb.Append(prefix).AppendFormat("%s:\n", gotoLabel.string()); - errorLabel = true; - } - - paramType->EmitMemoryRecycle(param->GetName(), isClient, true, sb, prefix + g_tab); - sb.Append("\n"); - } - } } void CCodeEmitter::EmitLicense(StringBuilder& sb) diff --git a/tools/hdi-gen/codegen/c_code_emitter.h b/tools/hdi-gen/codegen/c_code_emitter.h index 9e0abf87..bf415018 100755 --- a/tools/hdi-gen/codegen/c_code_emitter.h +++ b/tools/hdi-gen/codegen/c_code_emitter.h @@ -31,6 +31,8 @@ protected: void EmitInterfaceMethodParameter(const AutoPtr& parameter, StringBuilder& sb, const String& prefix); + void EmitInitLoopVar(const AutoPtr& method, StringBuilder& sb, const String& prefix); + void EmitErrorHandle(const AutoPtr& method, const String& gotoLabel, bool isClient, StringBuilder& sb, const String& prefix); @@ -58,6 +60,9 @@ protected: } String SpecificationParam(StringBuilder& sb, const String& prefix); + + static constexpr const char *errorsLabelName_ = "ERRORS"; + static constexpr const char *finishedLabelName_ = "FINISHED"; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp b/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp index 75c77d9e..affcfdc6 100755 --- a/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp @@ -280,7 +280,7 @@ void CCustomTypesCodeEmitter::EmitCustomTypeUnmarshallingImpl(StringBuilder& sb, } sb.Append(g_tab).AppendFormat("return true;\n"); - sb.Append("errors:\n"); + sb.AppendFormat("%s:\n", errorsLabelName_); EmitCustomTypeMemoryRecycle(type, objName, sb, g_tab); sb.Append(g_tab).Append("return false;\n"); @@ -294,38 +294,38 @@ void CCustomTypesCodeEmitter::EmitMemberUnmarshalling(const AutoPtr& ty switch (type->GetTypeKind()) { case TypeKind::TYPE_STRING: { String tmpName = String::Format("%sCp", memberName.string()); - type->EmitCUnMarshalling(tmpName, sb, g_tab, freeObjStatements_); + type->EmitCUnMarshalling(tmpName, errorsLabelName_, sb, g_tab, freeObjStatements_); if (Options::GetInstance().DoGenerateKernelCode()) { sb.Append(g_tab).AppendFormat("%s = (char*)OsalMemCalloc(strlen(%s) + 1);\n", varName.string(), tmpName.string()); sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", varName.string()); - sb.Append(g_tab).Append(g_tab).Append("goto errors;\n"); + sb.Append(g_tab).Append(g_tab).AppendFormat("goto %s;\n", errorsLabelName_); sb.Append(g_tab).Append("}\n"); sb.Append(g_tab).AppendFormat("if (strcpy_s(%s, (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", varName.string(), tmpName.string(), tmpName.string()); - sb.Append(g_tab).Append(g_tab).Append("goto errors;\n"); + sb.Append(g_tab).Append(g_tab).AppendFormat("goto %s;\n", errorsLabelName_); sb.Append(g_tab).Append("}\n"); } else { sb.Append(g_tab).AppendFormat("%s = strdup(%s);\n", varName.string(), tmpName.string()); } sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", varName.string()); - sb.Append(g_tab).Append(g_tab).Append("goto errors;\n"); + sb.Append(g_tab).Append(g_tab).AppendFormat("goto %s;\n", errorsLabelName_); sb.Append(g_tab).Append("}\n"); sb.Append("\n"); break; } case TypeKind::TYPE_STRUCT: { String paramName = String::Format("&%s", varName.string()); - type->EmitCUnMarshalling(paramName, sb, g_tab, freeObjStatements_); + type->EmitCUnMarshalling(paramName, errorsLabelName_, sb, g_tab, freeObjStatements_); sb.Append("\n"); break; } case TypeKind::TYPE_UNION: { String tmpName = String::Format("%sCp", memberName.string()); - type->EmitCUnMarshalling(tmpName, sb, g_tab, freeObjStatements_); + type->EmitCUnMarshalling(tmpName, errorsLabelName_, sb, g_tab, freeObjStatements_); sb.Append(g_tab).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", varName.string(), type->EmitCType().string(), tmpName.string(), type->EmitCType().string()); @@ -339,7 +339,7 @@ void CCustomTypesCodeEmitter::EmitMemberUnmarshalling(const AutoPtr& ty break; } default: { - type->EmitCUnMarshalling(varName, sb, g_tab, freeObjStatements_); + type->EmitCUnMarshalling(varName, errorsLabelName_, sb, g_tab, freeObjStatements_); sb.Append("\n"); } } @@ -360,7 +360,7 @@ void CCustomTypesCodeEmitter::EmitArrayMemberUnmarshalling(const AutoPtrEmitCType().string(), tmpName.string()); sb.Append(prefix).AppendFormat("uint32_t %sLen = 0;\n", tmpName.string()); - type->EmitCUnMarshalling(tmpName, sb, prefix, freeObjStatements_); + type->EmitCUnMarshalling(tmpName, errorsLabelName_, sb, prefix, freeObjStatements_); sb.Append(prefix).AppendFormat("%s = %s;\n", varName.string(), tmpName.string()); sb.Append(prefix).AppendFormat("%sLen = %sLen;\n", varName.string(), tmpName.string()); } diff --git a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp index 986f7f38..b2f2d285 100755 --- a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp @@ -193,35 +193,24 @@ void CServiceStubCodeEmitter::EmitServiceStubMethodImpls(StringBuilder& sb, cons } EmitStubGetVerMethodImpl(interface_->GetVersionMethod(), sb, prefix); - sb.Append("\n"); - EmitStubAsObjectMethodImpl(sb, prefix); + if (!isKernelCode_) { + sb.Append("\n"); + EmitStubAsObjectMethodImpl(sb, prefix); + } } void CServiceStubCodeEmitter::EmitServiceStubMethodImpl(const AutoPtr& method, StringBuilder& sb, const String& prefix) { - String dataName = "data_"; - String replyName = "reply_"; sb.Append(prefix).AppendFormat( "static int32_t SerStub%s(struct %s *serviceImpl, struct HdfSBuf *%s, struct HdfSBuf *%s)\n", - method->GetName().string(), interfaceName_.string(), dataName.string(), replyName.string()); + method->GetName().string(), interfaceName_.string(), dataParcelName_.string(), replyParcelName_.string()); sb.Append(prefix).Append("{\n"); - sb.Append(prefix + g_tab).Append("int32_t ec = HDF_FAILURE;\n"); + sb.Append(prefix + g_tab).AppendFormat("int32_t %s = HDF_FAILURE;\n", errorCodeName_.string()); // Local variable definitions must precede all execution statements. - if (isKernelCode_) { - for (size_t i = 0; i < method->GetParameterNumber(); i++) { - AutoPtr param = method->GetParameter(i); - AutoPtr type = param->GetType(); - if (type->GetTypeKind() == TypeKind::TYPE_ARRAY || - type->GetTypeKind() == TypeKind::TYPE_LIST) { - sb.Append(prefix + g_tab).Append("uint32_t i = 0;\n"); - break; - } - } - } + EmitInitLoopVar(method, sb, prefix + g_tab); - String gotoName = "errors"; if (method->GetParameterNumber() > 0) { for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); @@ -232,25 +221,28 @@ void CServiceStubCodeEmitter::EmitServiceStubMethodImpl(const AutoPtr for (int i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_IN) { - EmitReadStubMethodParameter(param, dataName, sb, prefix + g_tab); + EmitReadStubMethodParameter(param, dataParcelName_, finishedLabelName_, sb, prefix + g_tab); + sb.Append("\n"); + } else if (param->EmitCStubReadOutVar(dataParcelName_, errorCodeName_, finishedLabelName_, sb, + prefix + g_tab)) { sb.Append("\n"); } } } - EmitStubCallMethod(method, gotoName, sb, prefix + g_tab); + EmitStubCallMethod(method, finishedLabelName_, sb, prefix + g_tab); sb.Append("\n"); for (int i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_OUT) { - param->EmitCWriteVar(replyName, gotoName, sb, prefix + g_tab); + param->EmitCWriteVar(replyParcelName_, errorCodeName_, finishedLabelName_, sb, prefix + g_tab); sb.Append("\n"); } } - EmitErrorHandle(method, gotoName, false, sb, prefix); - sb.Append(prefix + g_tab).Append("return ec;\n"); + EmitErrorHandle(method, finishedLabelName_, false, sb, prefix); + sb.Append(prefix + g_tab).AppendFormat("return %s;\n", errorCodeName_.string()); sb.Append(prefix).Append("}\n"); } @@ -259,68 +251,77 @@ void CServiceStubCodeEmitter::EmitStubLocalVariable(const AutoPtr& { AutoPtr type = param->GetType(); sb.Append(prefix).Append(param->EmitCLocalVar()).Append("\n"); - if (type->GetTypeKind() == TypeKind::TYPE_ARRAY || type->GetTypeKind() == TypeKind::TYPE_LIST) { + if (type->GetTypeKind() == TypeKind::TYPE_ARRAY + || type->GetTypeKind() == TypeKind::TYPE_LIST + || (type->GetTypeKind() == TypeKind::TYPE_STRING && param->GetAttribute() == ParamAttr::PARAM_OUT)) { sb.Append(prefix).AppendFormat("uint32_t %sLen = 0;\n", param->GetName().string()); } } void CServiceStubCodeEmitter::EmitReadStubMethodParameter(const AutoPtr& param, - const String& parcelName, StringBuilder& sb, const String& prefix) + const String& parcelName, const String& gotoLabel, StringBuilder& sb, const String& prefix) { AutoPtr type = param->GetType(); if (type->GetTypeKind() == TypeKind::TYPE_STRING) { - EmitReadCStringStubMethodParameter(param, parcelName, sb, prefix, type); + EmitReadCStringStubMethodParameter(param, parcelName, gotoLabel, sb, prefix, type); } else if (type->GetTypeKind() == TypeKind::TYPE_INTERFACE) { - type->EmitCStubReadVar(parcelName, param->GetName(), sb, prefix); + type->EmitCStubReadVar(parcelName, param->GetName(), errorCodeName_, gotoLabel, sb, prefix); } else if (type->GetTypeKind() == TypeKind::TYPE_STRUCT) { sb.Append(prefix).AppendFormat("%s = (%s*)OsalMemAlloc(sizeof(%s));\n", param->GetName().string(), type->EmitCType(TypeMode::NO_MODE).string(), type->EmitCType(TypeMode::NO_MODE).string()); sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", param->GetName().string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: malloc %s failed\", __func__);\n", + param->GetName().string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_MALLOC_FAIL;\n", errorCodeName_.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", finishedLabelName_); sb.Append(prefix).Append("}\n"); - type->EmitCStubReadVar(parcelName, param->GetName(), sb, prefix); + type->EmitCStubReadVar(parcelName, param->GetName(), errorCodeName_, gotoLabel, sb, prefix); } else if (type->GetTypeKind() == TypeKind::TYPE_UNION) { String cpName = String::Format("%sCp", param->GetName().string()); - type->EmitCStubReadVar(parcelName, cpName, sb, prefix); + type->EmitCStubReadVar(parcelName, cpName, errorCodeName_, gotoLabel, sb, prefix); sb.Append(prefix).AppendFormat("%s = (%s*)OsalMemAlloc(sizeof(%s));\n", param->GetName().string(), type->EmitCType(TypeMode::NO_MODE).string(), type->EmitCType(TypeMode::NO_MODE).string()); sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", param->GetName().string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: malloc %s failed\", __func__);\n", + param->GetName().string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_MALLOC_FAIL;\n", errorCodeName_.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", finishedLabelName_); sb.Append(prefix).Append("}\n"); sb.Append(prefix).AppendFormat("(void)memcpy_s(%s, sizeof(%s), %s, sizeof(%s));\n", param->GetName().string(), type->EmitCType(TypeMode::NO_MODE).string(), cpName.string(), type->EmitCType(TypeMode::NO_MODE).string()); } else if (type->GetTypeKind() == TypeKind::TYPE_ARRAY || type->GetTypeKind() == TypeKind::TYPE_LIST) { - type->EmitCStubReadVar(parcelName, param->GetName(), sb, prefix); + type->EmitCStubReadVar(parcelName, param->GetName(), errorCodeName_, gotoLabel, sb, prefix); } else if (type->GetTypeKind() == TypeKind::TYPE_FILEDESCRIPTOR) { - type->EmitCStubReadVar(parcelName, param->GetName(), sb, prefix); + type->EmitCStubReadVar(parcelName, param->GetName(), errorCodeName_, gotoLabel, sb, prefix); } else { String name = String::Format("&%s", param->GetName().string()); - type->EmitCStubReadVar(parcelName, name, sb, prefix); + type->EmitCStubReadVar(parcelName, name, errorCodeName_, gotoLabel, sb, prefix); } } void CServiceStubCodeEmitter::EmitReadCStringStubMethodParameter(const AutoPtr& param, - const String& parcelName, StringBuilder& sb, const String& prefix, AutoPtr& type) + const String& parcelName, const String& gotoLabel, StringBuilder& sb, const String& prefix, + AutoPtr& type) { String cloneName = String::Format("%sCp", param->GetName().string()); - type->EmitCStubReadVar(parcelName, cloneName, sb, prefix); + type->EmitCStubReadVar(parcelName, cloneName, errorCodeName_, gotoLabel, sb, prefix); if (isKernelCode_) { sb.Append("\n"); sb.Append(prefix).AppendFormat("%s = (char*)OsalMemCalloc(strlen(%s) + 1);\n", param->GetName().string(), cloneName.string()); sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", param->GetName().string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_MALLOC_FAIL;\n", errorCodeName_.string()); + sb.Append(prefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: malloc %s failed\", __func__);\n", + param->GetName().string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n\n"); sb.Append(prefix).AppendFormat("if (strcpy_s(%s, (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", param->GetName().string(), cloneName.string(), cloneName.string()); sb.Append(prefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", param->GetName().string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", errorCodeName_.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } else { sb.Append(prefix).AppendFormat("%s = strdup(%s);\n", param->GetName().string(), cloneName.string()); @@ -331,9 +332,11 @@ void CServiceStubCodeEmitter::EmitStubCallMethod(const AutoPtr& metho StringBuilder& sb, const String& prefix) { if (method->GetParameterNumber() == 0) { - sb.Append(prefix).AppendFormat("ec = serviceImpl->%s(serviceImpl);\n", method->GetName().string()); + sb.Append(prefix).AppendFormat("%s = serviceImpl->%s(serviceImpl);\n", errorCodeName_.string(), + method->GetName().string()); } else { - sb.Append(prefix).AppendFormat("ec = serviceImpl->%s(serviceImpl, ", method->GetName().string()); + sb.Append(prefix).AppendFormat("%s = serviceImpl->%s(serviceImpl, ", errorCodeName_.string(), + method->GetName().string()); for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); EmitCallParameter(sb, param->GetType(), param->GetAttribute(), param->GetName()); @@ -344,7 +347,7 @@ void CServiceStubCodeEmitter::EmitStubCallMethod(const AutoPtr& metho sb.AppendFormat(");\n", method->GetName().string()); } - sb.Append(prefix).Append("if (ec != HDF_SUCCESS) {\n"); + sb.Append(prefix).AppendFormat("if (%s != HDF_SUCCESS) {\n", errorCodeName_.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: call %s function failed!\", __func__);\n", method->GetName().string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); @@ -355,8 +358,19 @@ void CServiceStubCodeEmitter::EmitCallParameter(StringBuilder& sb, const AutoPtr const String& name) { if (attribute == ParamAttr::PARAM_OUT) { - sb.AppendFormat("&%s", name.string()); - if (type->GetTypeKind() == TypeKind::TYPE_ARRAY || type->GetTypeKind() == TypeKind::TYPE_LIST) { + if (type->GetTypeKind() == TypeKind::TYPE_STRING + || type->GetTypeKind() == TypeKind::TYPE_ARRAY + || type->GetTypeKind() == TypeKind::TYPE_LIST + || type->GetTypeKind() == TypeKind::TYPE_STRUCT + || type->GetTypeKind() == TypeKind::TYPE_UNION) { + sb.AppendFormat("%s", name.string()); + } else { + sb.AppendFormat("&%s", name.string()); + } + + if (type->GetTypeKind() == TypeKind::TYPE_STRING) { + sb.AppendFormat(", %sLen", name.string()); + } else if (type->GetTypeKind() == TypeKind::TYPE_ARRAY || type->GetTypeKind() == TypeKind::TYPE_LIST) { sb.AppendFormat(", &%sLen", name.string()); } } else { @@ -370,23 +384,20 @@ void CServiceStubCodeEmitter::EmitCallParameter(StringBuilder& sb, const AutoPtr void CServiceStubCodeEmitter::EmitStubGetVerMethodImpl(const AutoPtr& method, StringBuilder& sb, const String& prefix) { - String dataName = "data_"; - String replyName = "reply_"; sb.Append(prefix).AppendFormat( "static int32_t SerStub%s(struct %s *serviceImpl, struct HdfSBuf *%s, struct HdfSBuf *%s)\n", - method->GetName().string(), interfaceName_.string(), dataName.string(), replyName.string()); + method->GetName().string(), interfaceName_.string(), dataParcelName_.string(), replyParcelName_.string()); sb.Append(prefix).Append("{\n"); - sb.Append(prefix + g_tab).Append("int32_t ec = HDF_FAILURE;\n"); + sb.Append(prefix + g_tab).AppendFormat("int32_t %s = HDF_FAILURE;\n", errorCodeName_.string()); - String gotoName = "errors"; AutoPtr type = new ASTUintType(); - type->EmitCWriteVar(replyName, majorVerName_, gotoName, sb, prefix + g_tab); + type->EmitCWriteVar(replyParcelName_, majorVerName_, errorCodeName_, finishedLabelName_, sb, prefix + g_tab); sb.Append("\n"); - type->EmitCWriteVar(replyName, minorVerName_, gotoName, sb, prefix + g_tab); + type->EmitCWriteVar(replyParcelName_, minorVerName_, errorCodeName_, finishedLabelName_, sb, prefix + g_tab); sb.Append("\n"); - sb.Append(gotoName).Append(":\n"); - sb.Append(prefix + g_tab).Append("return ec;\n"); + sb.Append(finishedLabelName_).Append(":\n"); + sb.Append(prefix + g_tab).AppendFormat("return %s;\n", errorCodeName_.string()); sb.Append(prefix).Append("}\n"); } @@ -429,7 +440,7 @@ void CServiceStubCodeEmitter::EmitStubOnRequestMethodImpl(StringBuilder& sb, con AutoPtr getVerMethod = interface_->GetVersionMethod(); sb.Append(prefix + g_tab + g_tab).AppendFormat("case %s:\n", EmitMethodCmdID(getVerMethod).string()); sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("return SerStub%s(serviceImpl, data, reply);\n", - getVerMethod->GetName().string()); + getVerMethod->GetName().string()); sb.Append(prefix + g_tab + g_tab).Append("default: {\n"); sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat( @@ -460,7 +471,7 @@ void CServiceStubCodeEmitter::EmitServiceStubOnRequestMethodImpl(StringBuilder& AutoPtr getVerMethod = interface_->GetVersionMethod(); sb.Append(prefix + g_tab + g_tab).AppendFormat("case %s:\n", EmitMethodCmdID(getVerMethod).string()); sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("return SerStub%s(serviceImpl, data, reply);\n", - getVerMethod->GetName().string()); + getVerMethod->GetName().string()); sb.Append(prefix + g_tab + g_tab).Append("default: {\n"); sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat( @@ -514,7 +525,6 @@ void CServiceStubCodeEmitter::EmitKernelStubGetMethodImpl(StringBuilder& sb) interfaceName_.string(), objName.string()); sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); sb.Append(g_tab).Append("}\n"); - sb.Append(g_tab).AppendFormat("%sServiceConstruct(%s);\n", infName_.string(), objName.string()); sb.Append(g_tab).AppendFormat("return %s;\n", objName.string()); sb.Append("}\n"); } diff --git a/tools/hdi-gen/codegen/c_service_stub_code_emitter.h b/tools/hdi-gen/codegen/c_service_stub_code_emitter.h index 885604c2..88b0e812 100755 --- a/tools/hdi-gen/codegen/c_service_stub_code_emitter.h +++ b/tools/hdi-gen/codegen/c_service_stub_code_emitter.h @@ -43,11 +43,11 @@ private: void EmitStubLocalVariable(const AutoPtr& param, StringBuilder& sb, const String& prefix); - void EmitReadStubMethodParameter(const AutoPtr& param, const String& parcelName, StringBuilder& sb, - const String& prefix); + void EmitReadStubMethodParameter(const AutoPtr& param, const String& parcelName, + const String& gotoLabel, StringBuilder& sb, const String& prefix); void EmitReadCStringStubMethodParameter(const AutoPtr& param, const String& parcelName, - StringBuilder& sb, const String& prefix, AutoPtr& type); + const String& gotoLabel, StringBuilder& sb, const String& prefix, AutoPtr& type); void EmitStubCallMethod(const AutoPtr& method, const String& gotoLabel, StringBuilder& sb, const String& prefix); diff --git a/tools/hdi-gen/codegen/code_emitter.cpp b/tools/hdi-gen/codegen/code_emitter.cpp index 63679309..8151b44f 100755 --- a/tools/hdi-gen/codegen/code_emitter.cpp +++ b/tools/hdi-gen/codegen/code_emitter.cpp @@ -52,6 +52,12 @@ bool CodeEmitter::Reset(const AutoPtr& ast, const String& targetDirectory, majorVerName_ = String::Format("%s_MAJOR_VERSION", interfaceName_.ToUnderLineUpper().string()); minorVerName_ = String::Format("%s_MINOR_VERSION", interfaceName_.ToUnderLineUpper().string()); + String prefix = String::Format("%c%s", tolower(infName_[0]), infName_.Substring(1).string()); + dataParcelName_ = prefix + "Data"; + replyParcelName_ = prefix + "Reply"; + optionName_ = prefix + "Option"; + errorCodeName_ = prefix + "Ret"; + if (!ResolveDirectory(targetDirectory)) { return false; } @@ -74,6 +80,10 @@ void CodeEmitter::CleanData() stubFullName_ = ""; implName_ = ""; implFullName_ = ""; + dataParcelName_ = ""; + replyParcelName_ = ""; + optionName_ = ""; + errorCodeName_ = ""; } String CodeEmitter::GetFilePath(const String& outDir) diff --git a/tools/hdi-gen/codegen/code_emitter.h b/tools/hdi-gen/codegen/code_emitter.h index 14d946d2..4dad7809 100755 --- a/tools/hdi-gen/codegen/code_emitter.h +++ b/tools/hdi-gen/codegen/code_emitter.h @@ -97,6 +97,11 @@ protected: String implFullName_; String majorVerName_; String minorVerName_; + + String dataParcelName_; + String replyParcelName_; + String optionName_; + String errorCodeName_; }; } } diff --git a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp index 5f672ada..156a2009 100755 --- a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp @@ -245,9 +245,9 @@ void CppClientProxyCodeEmitter::EmitGetInstanceMethodImpl(StringBuilder& sb, con sb.Append(prefix + g_tab).AppendFormat("uint32_t %s = 0;\n", SerMajorName.string()); sb.Append(prefix + g_tab).AppendFormat("uint32_t %s = 0;\n", SerMinorName.string()); - sb.Append(prefix + g_tab).AppendFormat("int32_t ec = %s->GetVersion(%s, %s);\n", + sb.Append(prefix + g_tab).AppendFormat("int32_t %s = %s->GetVersion(%s, %s);\n", errorCodeName_.string(), objName.string(), SerMajorName.string(), SerMinorName.string()); - sb.Append(prefix + g_tab).AppendFormat("if (ec != HDF_SUCCESS) {\n"); + sb.Append(prefix + g_tab).AppendFormat("if (%s != HDF_SUCCESS) {\n", errorCodeName_.string()); sb.Append(prefix + g_tab + g_tab).Append("HDF_LOGE(\"%{public}s:get version failed!\", __func__);\n"); sb.Append(prefix + g_tab + g_tab).Append("return nullptr;\n"); sb.Append(prefix + g_tab).Append("}\n\n"); @@ -301,32 +301,30 @@ void CppClientProxyCodeEmitter::EmitProxyMethodImpl(const AutoPtr& me void CppClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& method, StringBuilder& sb, const String& prefix) { - String dataName = "data_"; - String replyName = "reply_"; - String optionName = "option_"; String option = method->IsOneWay() ? "MessageOption::TF_ASYNC" : "MessageOption::TF_SYNC"; sb.Append(prefix).Append("{\n"); - sb.Append(prefix + g_tab).AppendFormat("MessageParcel %s;\n", dataName.string()); - sb.Append(prefix + g_tab).AppendFormat("MessageParcel %s;\n", replyName.string()); - sb.Append(prefix + g_tab).AppendFormat("MessageOption %s(%s);\n", optionName.string(), option.string()); + sb.Append(prefix + g_tab).AppendFormat("MessageParcel %s;\n", dataParcelName_.string()); + sb.Append(prefix + g_tab).AppendFormat("MessageParcel %s;\n", replyParcelName_.string()); + sb.Append(prefix + g_tab).AppendFormat("MessageOption %s(%s);\n", optionName_.string(), option.string()); sb.Append("\n"); if (method->GetParameterNumber() > 0) { for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_IN) { - EmitWriteMethodParameter(param, dataName, sb, prefix + g_tab); + EmitWriteMethodParameter(param, dataParcelName_, sb, prefix + g_tab); sb.Append("\n"); } } } - sb.Append(prefix + g_tab).AppendFormat("int32_t ec = Remote()->SendRequest(%s, %s, %s, %s);\n", - EmitMethodCmdID(method).string(), dataName.string(), replyName.string(), optionName.string()); - sb.Append(prefix + g_tab).Append("if (ec != HDF_SUCCESS) {\n"); + sb.Append(prefix + g_tab).AppendFormat("int32_t %s = Remote()->SendRequest(%s, %s, %s, %s);\n", + errorCodeName_.string(), EmitMethodCmdID(method).string(), dataParcelName_.string(), + replyParcelName_.string(), optionName_.string()); + sb.Append(prefix + g_tab).AppendFormat("if (%s != HDF_SUCCESS) {\n", errorCodeName_.string()); sb.Append(prefix + g_tab + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s failed, error code is %%{public}d\", __func__, ec);\n", method->GetName().string()); - sb.Append(prefix + g_tab + g_tab).Append("return ec;\n"); + "HDF_LOGE(\"%%{public}s failed, error code is %%{public}d\", __func__, %s);\n", errorCodeName_.string()); + sb.Append(prefix + g_tab + g_tab).AppendFormat("return %s;\n", errorCodeName_.string()); sb.Append(prefix + g_tab).Append("}\n"); if (!method->IsOneWay()) { @@ -334,7 +332,7 @@ void CppClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& me for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_OUT) { - EmitReadMethodParameter(param, replyName, false, sb, prefix + g_tab); + EmitReadMethodParameter(param, replyParcelName_, false, sb, prefix + g_tab); sb.Append("\n"); } } diff --git a/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp index 27266667..53304e3b 100755 --- a/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp @@ -268,8 +268,6 @@ void CppCustomTypesCodeEmitter::EmitBeginNamespace(StringBuilder& sb) { std::vector cppNamespaceVec = EmitCppNameSpaceVec(ast_->GetPackageName()); for (const auto& nspace : cppNamespaceVec) { - Logger::D("EmitBeginNamespace", "%s", nspace.string()); - sb.AppendFormat("namespace %s {\n", nspace.string()); } } @@ -282,4 +280,4 @@ void CppCustomTypesCodeEmitter::EmitEndNamespace(StringBuilder& sb) } } } // namespace HDI -} // namespace OHOS \ No newline at end of file +} // namespace OHOS diff --git a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp index ab222022..2b87f174 100755 --- a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp @@ -150,11 +150,9 @@ void CppServiceStubCodeEmitter::EmitStubMethodDecls(StringBuilder& sb, const Str void CppServiceStubCodeEmitter::EmitStubMethodDecl(const AutoPtr& method, StringBuilder& sb, const String& prefix) { - String dataName = "data_"; - String replyName = "reply_"; - String optionName = "option_"; sb.Append(prefix).AppendFormat("int32_t %s%s(MessageParcel& %s, MessageParcel& %s, MessageOption& %s);\n", - stubName_.string(), method->GetName().string(), dataName.string(), replyName.string(), optionName.string()); + stubName_.string(), method->GetName().string(), dataParcelName_.string(), replyParcelName_.string(), + optionName_.string()); } void CppServiceStubCodeEmitter::EmitStubSourceFile() @@ -280,19 +278,16 @@ void CppServiceStubCodeEmitter::EmitStubMethodImpls(StringBuilder& sb, const Str void CppServiceStubCodeEmitter::EmitStubMethodImpl(const AutoPtr& method, StringBuilder& sb, const String& prefix) { - String dataName = "data_"; - String replyName = "reply_"; - String optionName = "option_"; sb.Append(prefix).AppendFormat( "int32_t %s::%s%s(MessageParcel& %s, MessageParcel& %s, MessageOption& %s)\n", stubName_.string(), stubName_.string(), method->GetName().string(), - dataName.string(), replyName.string(), optionName.string()); + dataParcelName_.string(), replyParcelName_.string(), optionName_.string()); sb.Append(prefix).Append("{\n"); for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_IN) { - EmitReadMethodParameter(param, dataName, true, sb, prefix + g_tab); + EmitReadMethodParameter(param, dataParcelName_, true, sb, prefix + g_tab); sb.Append("\n"); } else { EmitLocalVariable(param, sb, prefix + g_tab); @@ -307,7 +302,7 @@ void CppServiceStubCodeEmitter::EmitStubMethodImpl(const AutoPtr& met for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_OUT) { - EmitWriteMethodParameter(param, replyName, sb, prefix + g_tab); + EmitWriteMethodParameter(param, replyParcelName_, sb, prefix + g_tab); sb.Append("\n"); } } @@ -320,7 +315,7 @@ void CppServiceStubCodeEmitter::EmitStubMethodImpl(const AutoPtr& met void CppServiceStubCodeEmitter::EmitStubCallMethod(const AutoPtr& method, StringBuilder& sb, const String& prefix) { - sb.Append(prefix).AppendFormat("int32_t ec = %s(", method->GetName().string()); + sb.Append(prefix).AppendFormat("int32_t %s = %s(", errorCodeName_.string(), method->GetName().string()); for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); sb.Append(param->GetName()); @@ -330,10 +325,10 @@ void CppServiceStubCodeEmitter::EmitStubCallMethod(const AutoPtr& met } sb.Append(");\n"); - sb.Append(prefix).Append("if (ec != HDF_SUCCESS) {\n"); + sb.Append(prefix).AppendFormat("if (%s != HDF_SUCCESS) {\n", errorCodeName_.string()); sb.Append(prefix + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s failed, error code is %%d\", __func__, ec);\n", method->GetName().string()); - sb.Append(prefix + g_tab).Append("return ec;\n"); + "HDF_LOGE(\"%%{public}s failed, error code is %%d\", __func__, %s);\n", errorCodeName_.string()); + sb.Append(prefix + g_tab).AppendFormat("return %s;\n", errorCodeName_.string()); sb.Append(prefix).Append("}\n"); } } // namespace HDI