mirror of
https://github.com/openharmony/drivers_framework.git
synced 2026-07-21 03:35:25 -04:00
@@ -276,25 +276,7 @@ void ASTArrayType::EmitCUnMarshalling(const String& name, StringBuilder& sb, con
|
||||
}
|
||||
|
||||
if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) {
|
||||
String element = String::Format("%sElement", name.string());
|
||||
elementType_->EmitCUnMarshalling(element, 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());
|
||||
sb.Append(newPrefix).AppendFormat("if (%s[i] == NULL) {\n", name.string());
|
||||
sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n");
|
||||
sb.Append(newPrefix).Append("}\n\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("goto errors;\n");
|
||||
sb.Append(newPrefix).Append("}\n");
|
||||
} else {
|
||||
sb.Append(newPrefix).Append(g_tab).AppendFormat("%s[i] = strdup(%s);\n",
|
||||
name.string(), element.string());
|
||||
}
|
||||
EmitCStringElementUnMarshalling(name, 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);
|
||||
@@ -314,6 +296,30 @@ void ASTArrayType::EmitCUnMarshalling(const String& name, StringBuilder& sb, con
|
||||
freeObjStatements.pop_back();
|
||||
}
|
||||
|
||||
void ASTArrayType::EmitCStringElementUnMarshalling(const String& name, StringBuilder& sb, const String& newPrefix,
|
||||
std::vector<String>& freeObjStatements) const
|
||||
{
|
||||
String element = String::Format("%sElement", name.string());
|
||||
elementType_->EmitCUnMarshalling(element, 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());
|
||||
sb.Append(newPrefix).AppendFormat("if (%s[i] == NULL) {\n", name.string());
|
||||
sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n");
|
||||
sb.Append(newPrefix).Append("}\n\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("goto errors;\n");
|
||||
sb.Append(newPrefix).Append("}\n");
|
||||
} else {
|
||||
sb.Append(newPrefix).Append(g_tab).AppendFormat("%s[i] = strdup(%s);\n",
|
||||
name.string(), element.string());
|
||||
}
|
||||
}
|
||||
|
||||
void ASTArrayType::EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb,
|
||||
const String& prefix, unsigned int innerLevel) const
|
||||
{
|
||||
|
||||
@@ -87,6 +87,9 @@ private:
|
||||
void EmitCStubReadStrElement(const String& parcelName, const String& name, StringBuilder& sb,
|
||||
const String& prefix) const;
|
||||
|
||||
void EmitCStringElementUnMarshalling(const String& name, StringBuilder& sb, const String& newPrefix,
|
||||
std::vector<String>& freeObjStatements) const;
|
||||
|
||||
AutoPtr<ASTType> elementType_;
|
||||
};
|
||||
} // namespace HDI
|
||||
|
||||
@@ -280,24 +280,7 @@ void ASTListType::EmitCUnMarshalling(const String& name, StringBuilder& sb, cons
|
||||
}
|
||||
|
||||
if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) {
|
||||
String element = String::Format("%sElement", name.string());
|
||||
elementType_->EmitCUnMarshalling(element, 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());
|
||||
sb.Append(newPrefix).AppendFormat("if (%s[i] == NULL) {\n", name.string());
|
||||
sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n");
|
||||
sb.Append(newPrefix).Append("}\n\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("goto errors;\n");
|
||||
sb.Append(newPrefix).Append("}\n");
|
||||
} else {
|
||||
sb.Append(newPrefix).Append(g_tab).AppendFormat("%s[i] = strdup(%s);\n",
|
||||
name.string(), element.string());
|
||||
}
|
||||
EmitCStringElementUnMarshalling(name, 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);
|
||||
@@ -317,6 +300,29 @@ void ASTListType::EmitCUnMarshalling(const String& name, StringBuilder& sb, cons
|
||||
freeObjStatements.pop_back();
|
||||
}
|
||||
|
||||
void ASTListType::EmitCStringElementUnMarshalling(const String& name, StringBuilder& sb, const String& newPrefix,
|
||||
std::vector<String>& freeObjStatements) const
|
||||
{
|
||||
String element = String::Format("%sElement", name.string());
|
||||
elementType_->EmitCUnMarshalling(element, 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());
|
||||
sb.Append(newPrefix).AppendFormat("if (%s[i] == NULL) {\n", name.string());
|
||||
sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n");
|
||||
sb.Append(newPrefix).Append("}\n\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("goto errors;\n");
|
||||
sb.Append(newPrefix).Append("}\n");
|
||||
} else {
|
||||
sb.Append(newPrefix).Append(g_tab).AppendFormat("%s[i] = strdup(%s);\n",
|
||||
name.string(), element.string());
|
||||
}
|
||||
}
|
||||
|
||||
void ASTListType::EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb,
|
||||
const String& prefix, unsigned int innerLevel) const
|
||||
{
|
||||
|
||||
@@ -85,6 +85,9 @@ private:
|
||||
void EmitCStubReadStrElement(const String& parcelName, const String& name, StringBuilder& sb,
|
||||
const String& prefix) const;
|
||||
|
||||
void EmitCStringElementUnMarshalling(const String& name, StringBuilder& sb, const String& newPrefix,
|
||||
std::vector<String>& freeObjStatements) const;
|
||||
|
||||
AutoPtr<ASTType> elementType_ = nullptr;
|
||||
};
|
||||
} // namespace HDI
|
||||
|
||||
@@ -214,26 +214,7 @@ void CServiceStubCodeEmitter::EmitReadStubMethodParameter(const AutoPtr<ASTParam
|
||||
AutoPtr<ASTType> type = param->GetType();
|
||||
|
||||
if (type->GetTypeKind() == TypeKind::TYPE_STRING) {
|
||||
String cloneName = String::Format("%sCp", param->GetName().string());
|
||||
type->EmitCStubReadVar(parcelName, cloneName, 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).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).Append("}\n");
|
||||
} else {
|
||||
sb.Append(prefix).AppendFormat("%s = strdup(%s);\n", param->GetName().string(), cloneName.string());
|
||||
}
|
||||
EmitReadCStringStubMethodParameter(param, parcelName, sb, prefix, type);
|
||||
} else if (type->GetTypeKind() == TypeKind::TYPE_INTERFACE) {
|
||||
type->EmitCStubReadVar(parcelName, param->GetName(), sb, prefix);
|
||||
} else if (type->GetTypeKind() == TypeKind::TYPE_STRUCT) {
|
||||
@@ -265,6 +246,31 @@ void CServiceStubCodeEmitter::EmitReadStubMethodParameter(const AutoPtr<ASTParam
|
||||
}
|
||||
}
|
||||
|
||||
void CServiceStubCodeEmitter::EmitReadCStringStubMethodParameter(const AutoPtr<ASTParameter>& param,
|
||||
const String& parcelName, StringBuilder& sb, const String& prefix, AutoPtr<ASTType>& type)
|
||||
{
|
||||
String cloneName = String::Format("%sCp", param->GetName().string());
|
||||
type->EmitCStubReadVar(parcelName, cloneName, 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).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).Append("}\n");
|
||||
} else {
|
||||
sb.Append(prefix).AppendFormat("%s = strdup(%s);\n", param->GetName().string(), cloneName.string());
|
||||
}
|
||||
}
|
||||
|
||||
void CServiceStubCodeEmitter::EmitStubCallMethod(const AutoPtr<ASTMethod>& method, const String& gotoLabel,
|
||||
StringBuilder& sb, const String& prefix)
|
||||
{
|
||||
|
||||
@@ -42,6 +42,9 @@ private:
|
||||
void EmitReadStubMethodParameter(const AutoPtr<ASTParameter>& param, const String& parcelName, StringBuilder& sb,
|
||||
const String& prefix);
|
||||
|
||||
void EmitReadCStringStubMethodParameter(const AutoPtr<ASTParameter>& param, const String& parcelName,
|
||||
StringBuilder& sb, const String& prefix, AutoPtr<ASTType>& type);
|
||||
|
||||
void EmitStubCallMethod(const AutoPtr<ASTMethod>& method, const String& gotoLabel, StringBuilder& sb,
|
||||
const String& prefix);
|
||||
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
|
||||
namespace OHOS {
|
||||
namespace HDI {
|
||||
|
||||
bool CodeEmitter::OutPut(const AutoPtr<AST>& ast, const String& targetDirectory, bool isKernelCode)
|
||||
{
|
||||
if (!Reset(ast, targetDirectory, isKernelCode)) {
|
||||
|
||||
@@ -171,6 +171,5 @@ void CodeGenerator::GenerateJavaCode(const AutoPtr<AST>& ast, const String& outD
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace HDI
|
||||
} // namespace OHOS
|
||||
@@ -84,7 +84,6 @@ void CppServiceStubCodeEmitter::EmitStubDecl(StringBuilder& sb)
|
||||
EmitStubUsingNamespace(sb);
|
||||
sb.Append("\n");
|
||||
sb.AppendFormat("class %s {\n", stubName_.string());
|
||||
sb.Append("public:\n");
|
||||
EmitStubBody(sb, g_tab);
|
||||
sb.Append("};\n");
|
||||
|
||||
|
||||
@@ -46,63 +46,75 @@ Options& Options::Parse(int argc, char* const argv[])
|
||||
int optIndex = 0;
|
||||
|
||||
while ((op = getopt_long(argc, argv, optSupportArgs, g_longOpts, &optIndex)) != OPT_END) {
|
||||
switch (op) {
|
||||
case 'c':
|
||||
doCompile_ = true;
|
||||
sourceFilePath_ = optarg;
|
||||
break;
|
||||
case 'd':
|
||||
doOutDir_ = true;
|
||||
generationDirectory_ = optarg;
|
||||
break;
|
||||
case 'h':
|
||||
doShowUsage_ = true;
|
||||
break;
|
||||
case 'v':
|
||||
doShowVersion_ = true;
|
||||
break;
|
||||
case 'k':
|
||||
doModeKernel_ = true;
|
||||
break;
|
||||
case 'u':
|
||||
doModeKernel_ = false;
|
||||
break;
|
||||
case 'C':
|
||||
doGenerateCode_ = true;
|
||||
targetLanguage_ = "c";
|
||||
break;
|
||||
case 'P':
|
||||
doGenerateCode_ = true;
|
||||
targetLanguage_ = "cpp";
|
||||
break;
|
||||
case 'J':
|
||||
doGenerateCode_ = true;
|
||||
targetLanguage_ = "java";
|
||||
break;
|
||||
case 'a':
|
||||
doGeneratePart_ = true;
|
||||
codePart_ = "client";
|
||||
break;
|
||||
case 'b':
|
||||
doGeneratePart_ = true;
|
||||
codePart_ = "server";
|
||||
break;
|
||||
case 'H':
|
||||
doGetHashKey_ = true;
|
||||
break;
|
||||
case 'D':
|
||||
doDumpAST_ = true;
|
||||
break;
|
||||
case '?':
|
||||
default:
|
||||
doShowUsage_ = true;
|
||||
break;
|
||||
}
|
||||
SetOptionData(op);
|
||||
}
|
||||
CheckOptions();
|
||||
return *this;
|
||||
}
|
||||
|
||||
void Options::SetOptionData(char op)
|
||||
{
|
||||
switch (op) {
|
||||
case 'c':
|
||||
doCompile_ = true;
|
||||
sourceFilePath_ = optarg;
|
||||
break;
|
||||
case 'd':
|
||||
doOutDir_ = true;
|
||||
generationDirectory_ = optarg;
|
||||
break;
|
||||
case 'h':
|
||||
doShowUsage_ = true;
|
||||
break;
|
||||
case 'v':
|
||||
doShowVersion_ = true;
|
||||
break;
|
||||
case 'k':
|
||||
doModeKernel_ = true;
|
||||
break;
|
||||
case 'u':
|
||||
doModeKernel_ = false;
|
||||
break;
|
||||
case 'C':
|
||||
SetLanguage("c");
|
||||
break;
|
||||
case 'P':
|
||||
SetLanguage("cpp");
|
||||
break;
|
||||
case 'J':
|
||||
SetLanguage("java");
|
||||
break;
|
||||
case 'a':
|
||||
SetCodePart("client");
|
||||
break;
|
||||
case 'b':
|
||||
SetCodePart("server");
|
||||
break;
|
||||
case 'H':
|
||||
doGetHashKey_ = true;
|
||||
break;
|
||||
case 'D':
|
||||
doDumpAST_ = true;
|
||||
break;
|
||||
case '?':
|
||||
default:
|
||||
doShowUsage_ = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Options::SetLanguage(String language)
|
||||
{
|
||||
doGenerateCode_ = true;
|
||||
targetLanguage_ = language;
|
||||
}
|
||||
|
||||
void Options::SetCodePart(String part)
|
||||
{
|
||||
doGeneratePart_ = true;
|
||||
codePart_ = part;
|
||||
}
|
||||
|
||||
void Options::CheckOptions()
|
||||
{
|
||||
if (doShowUsage_ || doShowVersion_) {
|
||||
|
||||
@@ -106,7 +106,13 @@ private:
|
||||
doGetHashKey_(false),
|
||||
doGenerateCode_(false),
|
||||
doOutDir_(false) {}
|
||||
|
||||
|
||||
void SetOptionData(char op);
|
||||
|
||||
void SetLanguage(String language);
|
||||
|
||||
void SetCodePart(String part);
|
||||
|
||||
void CheckOptions();
|
||||
|
||||
static const char* optSupportArgs;
|
||||
|
||||
Reference in New Issue
Block a user