From 2b055bed520391f10f714a4a34f3a5bfaad9b1d9 Mon Sep 17 00:00:00 2001 From: wangyipeng Date: Fri, 5 Nov 2021 19:13:38 +0800 Subject: [PATCH] add hdi-gen function Signed-off-by: wangyipeng --- tools/hdi-gen/Makefile | 70 +++---- tools/hdi-gen/MakefileLinux | 72 +++++++ tools/hdi-gen/MakefileWin | 73 ++++++++ tools/hdi-gen/ast/Makefile | 12 -- tools/hdi-gen/ast/ast_array_type.cpp | 126 +++++++++++-- tools/hdi-gen/ast/ast_array_type.h | 6 + tools/hdi-gen/ast/ast_list_type.cpp | 127 +++++++++++-- tools/hdi-gen/ast/ast_list_type.h | 6 + tools/hdi-gen/ast/ast_union_type.cpp | 82 ++++++-- tools/hdi-gen/codegen/Makefile | 12 -- .../c_client_interface_code_emitter.cpp | 22 ++- .../codegen/c_client_proxy_code_emitter.cpp | 117 ++++++++++-- .../codegen/c_client_proxy_code_emitter.h | 2 + tools/hdi-gen/codegen/c_code_emitter.cpp | 62 ------ tools/hdi-gen/codegen/c_code_emitter.h | 28 +-- tools/hdi-gen/codegen/c_code_generator.cpp | 66 ------- tools/hdi-gen/codegen/c_code_generator.h | 35 ---- .../codegen/c_custom_types_code_emitter.cpp | 78 +++++++- .../codegen/c_custom_types_code_emitter.h | 2 + .../codegen/c_service_driver_code_emitter.cpp | 3 +- .../codegen/c_service_impl_code_emitter.cpp | 8 +- .../c_service_interface_code_emitter.cpp | 10 +- .../codegen/c_service_stub_code_emitter.cpp | 40 +++- tools/hdi-gen/codegen/code_emitter.cpp | 77 ++++++++ tools/hdi-gen/codegen/code_emitter.h | 52 ++++++ tools/hdi-gen/codegen/code_generator.cpp | 176 ++++++++++++++++++ tools/hdi-gen/codegen/code_generator.h | 20 +- .../cpp_client_interface_code_emitter.cpp | 8 +- .../codegen/cpp_client_proxy_code_emitter.cpp | 8 +- tools/hdi-gen/codegen/cpp_code_emitter.cpp | 62 ------ tools/hdi-gen/codegen/cpp_code_emitter.h | 26 +-- tools/hdi-gen/codegen/cpp_code_generator.cpp | 66 ------- tools/hdi-gen/codegen/cpp_code_generator.h | 35 ---- .../codegen/cpp_custom_types_code_emitter.cpp | 3 +- .../cpp_service_driver_code_emitter.cpp | 11 +- .../codegen/cpp_service_impl_code_emitter.cpp | 8 +- .../cpp_service_interface_code_emitter.cpp | 8 +- .../codegen/cpp_service_stub_code_emitter.cpp | 8 +- tools/hdi-gen/codegen/generator_factory.cpp | 36 ---- tools/hdi-gen/codegen/generator_factory.h | 35 ---- .../java_client_interface_code_emitter.cpp | 8 +- .../java_client_proxy_code_emitter.cpp | 8 +- tools/hdi-gen/codegen/java_code_emitter.cpp | 52 ------ tools/hdi-gen/codegen/java_code_emitter.h | 23 +-- tools/hdi-gen/codegen/java_code_generator.cpp | 48 ----- tools/hdi-gen/codegen/java_code_generator.h | 35 ---- tools/hdi-gen/main.cpp | 5 +- tools/hdi-gen/parser/Makefile | 12 -- tools/hdi-gen/parser/module_parser.h | 2 +- tools/hdi-gen/parser/parser.cpp | 24 ++- .../array_test/v1_0/ArrayTypes.idl | 29 +++ .../array_test/v1_0/IArrayTest.idl | 40 ++++ .../kernel_test/data_test/v1_0/DataTypes.idl | 29 +++ .../kernel_test/data_test/v1_0/IDataTest.idl | 40 ++++ .../kernel_test/list_test/v1_0/IListTest.idl | 40 ++++ .../kernel_test/list_test/v1_0/ListTypes.idl | 29 +++ .../struct_test/v1_0/IStructTest.idl | 20 ++ .../struct_test/v1_0/StructTypes.idl | 87 +++++++++ tools/hdi-gen/util/Makefile | 14 -- tools/hdi-gen/util/file.cpp | 23 ++- tools/hdi-gen/util/file.h | 2 + tools/hdi-gen/util/options.cpp | 24 ++- tools/hdi-gen/util/options.h | 14 ++ 63 files changed, 1473 insertions(+), 833 deletions(-) create mode 100755 tools/hdi-gen/MakefileLinux create mode 100755 tools/hdi-gen/MakefileWin delete mode 100755 tools/hdi-gen/ast/Makefile delete mode 100755 tools/hdi-gen/codegen/Makefile delete mode 100755 tools/hdi-gen/codegen/c_code_generator.cpp delete mode 100755 tools/hdi-gen/codegen/c_code_generator.h create mode 100755 tools/hdi-gen/codegen/code_emitter.cpp create mode 100755 tools/hdi-gen/codegen/code_emitter.h create mode 100755 tools/hdi-gen/codegen/code_generator.cpp delete mode 100755 tools/hdi-gen/codegen/cpp_code_generator.cpp delete mode 100755 tools/hdi-gen/codegen/cpp_code_generator.h delete mode 100755 tools/hdi-gen/codegen/generator_factory.cpp delete mode 100755 tools/hdi-gen/codegen/generator_factory.h delete mode 100755 tools/hdi-gen/codegen/java_code_generator.cpp delete mode 100755 tools/hdi-gen/codegen/java_code_generator.h delete mode 100755 tools/hdi-gen/parser/Makefile create mode 100755 tools/hdi-gen/test/kernel_test/array_test/v1_0/ArrayTypes.idl create mode 100755 tools/hdi-gen/test/kernel_test/array_test/v1_0/IArrayTest.idl create mode 100755 tools/hdi-gen/test/kernel_test/data_test/v1_0/DataTypes.idl create mode 100755 tools/hdi-gen/test/kernel_test/data_test/v1_0/IDataTest.idl create mode 100755 tools/hdi-gen/test/kernel_test/list_test/v1_0/IListTest.idl create mode 100755 tools/hdi-gen/test/kernel_test/list_test/v1_0/ListTypes.idl create mode 100755 tools/hdi-gen/test/kernel_test/struct_test/v1_0/IStructTest.idl create mode 100755 tools/hdi-gen/test/kernel_test/struct_test/v1_0/StructTypes.idl delete mode 100755 tools/hdi-gen/util/Makefile diff --git a/tools/hdi-gen/Makefile b/tools/hdi-gen/Makefile index 22369790..47499d30 100755 --- a/tools/hdi-gen/Makefile +++ b/tools/hdi-gen/Makefile @@ -1,46 +1,24 @@ -TARGET = hdi-gen - -PWD:=$(shell pwd) -export BUILD_DIR = $(PWD)/build -export BOUNDS_CHECK_LIB := $(abspath ../../../../third_party/bounds_checking_function) -export INCLUDES = -I$(PWD) -I$(BOUNDS_CHECK_LIB)/include -export CXXFLAGS = -std=c++14 -O2 -export Q := @ -export MAKEFLAGS += --no-print-directory - -BOUNDS_CHECK_SOURCE := $(wildcard $(BOUNDS_CHECK_LIB)/src/*.c) -BOUNDS_CHECK_BUILD := $(BUILD_DIR)/bounds_checking_function -BOUNDS_CHECK_OBJS := $(addprefix $(BOUNDS_CHECK_BUILD)/, $(patsubst %.c, %.o, $(notdir $(BOUNDS_CHECK_SOURCE)))) -BOUNDS_CHECK_TARGET := $(BOUNDS_CHECK_BUILD)/bounds_checking_function.a - -SOURCE := $(wildcard *.cpp) -OBJS := $(addprefix $(BUILD_DIR)/, $(patsubst %.cpp, %.o, $(SOURCE))) - -SUBDIRS = util ast parser codegen -LIBS = $(BUILD_DIR)/codegen/codegen.a $(BUILD_DIR)/parser/parser.a $(BUILD_DIR)/ast/ast.a $(BUILD_DIR)/util/util.a - -all:$(TARGET) - -$(TARGET): $(OBJS) | $(BOUNDS_CHECK_TARGET) - $(Q) for subdir in $(SUBDIRS); do \ - $(MAKE) -C $$subdir || exit 1; \ - done - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) $^ -o $@ $(LIBS) $(BOUNDS_CHECK_TARGET) - $(Q) echo $(TARGET):build successful. - -$(OBJS):$(SOURCE) - $(Q) mkdir -p $(BUILD_DIR) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ - -$(BOUNDS_CHECK_TARGET):$(BOUNDS_CHECK_OBJS) - $(Q) echo $(BOUNDS_CHECK_TARGET) - $(Q) ar -rc $@ $^ - -$(BOUNDS_CHECK_BUILD)/%.o : $(BOUNDS_CHECK_LIB)/src/%.c - $(Q) mkdir -p $(BOUNDS_CHECK_BUILD) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ - -clean: - $(Q) rm -rf $(BUILD_DIR) $(TARGET) - -.PHONY:all clean \ No newline at end of file +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +export TARGET:=hdi-gen +export CXXFLAGS = -std=c++14 -O2 -w +export Q := @ +export MAKEFLAGS += --no-print-directory + +MAKE_FILE_NAME = MakefileLinux +ifeq ($(findstring ;, $(PATH)), ;) + MAKE_FILE_NAME := MakefileWin +endif + +all: + $(Q) echo start build $(TARGET) ... + $(Q) $(MAKE) -f $(MAKE_FILE_NAME) + +clean: + $(Q) $(MAKE) -f $(MAKE_FILE_NAME) clean + +.PHONY: clean \ No newline at end of file diff --git a/tools/hdi-gen/MakefileLinux b/tools/hdi-gen/MakefileLinux new file mode 100755 index 00000000..6d5eac49 --- /dev/null +++ b/tools/hdi-gen/MakefileLinux @@ -0,0 +1,72 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +PWD := $(abspath $(dir $(realpath $(lastword $(MAKEFILE_LIST))))) +BUILD_DIR = $(PWD)/build +BOUNDS_CHECK_DIR := $(abspath ../../../../third_party/bounds_checking_function) +INCLUDES = -I$(PWD) -I$(BOUNDS_CHECK_DIR)/include + +CODEGEN_SOURCE_DIR := $(PWD)/codegen +CODEGEN_SOURCE := $(wildcard $(CODEGEN_SOURCE_DIR)/*.cpp) +CODEGEN_OBJ_DIR := $(BUILD_DIR)/codegen +CODEGEN_OBJS := $(addprefix $(CODEGEN_OBJ_DIR)/, $(patsubst %.cpp, %.o, $(notdir $(CODEGEN_SOURCE)))) + +PARSER_SOURCE_DIR := $(PWD)/parser +PARSER_SOURCE := $(wildcard $(PARSER_SOURCE_DIR)/*.cpp) +PARSER_OBJS_DIR := $(BUILD_DIR)/parser +PARSER_OBJS := $(addprefix $(PARSER_OBJS_DIR)/, $(patsubst %.cpp, %.o, $(notdir $(PARSER_SOURCE)))) + +AST_SOURCE_DIR := $(PWD)/ast +AST_SOURCE := $(wildcard $(AST_SOURCE_DIR)/*.cpp) +AST_OBJS_DIR := $(BUILD_DIR)/ast +AST_OBJS := $(addprefix $(AST_OBJS_DIR)/, $(patsubst %.cpp, %.o, $(notdir $(AST_SOURCE)))) + +UTIL_SOURCE_DIR := $(PWD)/util +UTIL_SOURCE := $(wildcard $(UTIL_SOURCE_DIR)/*.cpp) +UTIL_OBJS_DIR := $(BUILD_DIR)/util +UTIL_OBJS := $(addprefix $(UTIL_OBJS_DIR)/, $(patsubst %.cpp, %.o, $(notdir $(UTIL_SOURCE)))) + +BOUNDS_CHECK_SOURCE_DIR := $(abspath ../../../../third_party/bounds_checking_function/src) +BOUNDS_CHECK_SOURCE := $(wildcard $(BOUNDS_CHECK_SOURCE_DIR)/*.c) +BOUNDS_CHECK_OBJS_DIR := $(BUILD_DIR)/bounds_checking_function +BOUNDS_CHECK_OBJS := $(addprefix $(BOUNDS_CHECK_OBJS_DIR)/, $(patsubst %.c, %.o, $(notdir $(BOUNDS_CHECK_SOURCE)))) + +MAIN_SOURCE := $(wildcard *.cpp) +MAIN_OBJS := $(addprefix $(BUILD_DIR)/, $(patsubst %.cpp, %.o, $(MAIN_SOURCE))) + +all:$(TARGET) +$(TARGET) : $(BOUNDS_CHECK_OBJS) $(UTIL_OBJS) $(AST_OBJS) $(PARSER_OBJS) $(CODEGEN_OBJS) $(MAIN_OBJS) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) $^ -o $@ + $(Q) echo $(TARGET):build successful. + +$(BUILD_DIR)/%.o : %.cpp + $(Q) mkdir -p $(BUILD_DIR) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(CODEGEN_OBJ_DIR)/%.o : $(CODEGEN_SOURCE_DIR)/%.cpp + $(Q) mkdir -p $(CODEGEN_OBJ_DIR) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(PARSER_OBJS_DIR)/%.o : $(PARSER_SOURCE_DIR)/%.cpp + $(Q) mkdir -p $(PARSER_OBJS_DIR) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(AST_OBJS_DIR)/%.o : $(AST_SOURCE_DIR)/%.cpp + $(Q) mkdir -p $(AST_OBJS_DIR) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(UTIL_OBJS_DIR)/%.o : $(UTIL_SOURCE_DIR)/%.cpp + $(Q) mkdir -p $(UTIL_OBJS_DIR) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(BOUNDS_CHECK_OBJS_DIR)/%.o : $(BOUNDS_CHECK_SOURCE_DIR)/%.c + $(Q) mkdir -p $(BOUNDS_CHECK_OBJS_DIR) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +clean: + $(Q) rm -rf $(TARGET) $(BUILD_DIR) + +.PHONY:all clean \ No newline at end of file diff --git a/tools/hdi-gen/MakefileWin b/tools/hdi-gen/MakefileWin new file mode 100755 index 00000000..51c1e815 --- /dev/null +++ b/tools/hdi-gen/MakefileWin @@ -0,0 +1,73 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +PWD:=$(subst /,\, $(abspath $(dir $(realpath $(lastword $(MAKEFILE_LIST)))))) +BUILD_DIR:=$(PWD)\build +BOUNDS_CHECK_DIR:=$(abspath ..\..\..\..\third_party\bounds_checking_function) +INCLUDES:=-I $(PWD) -I $(BOUNDS_CHECK_DIR)\include + +CODEGEN_SOURCE_DIR:=$(PWD)\codegen +CODEGEN_SOURCE:=$(wildcard $(CODEGEN_SOURCE_DIR)/*.cpp) +CODEGEN_OBJ_DIR:=$(BUILD_DIR)\codegen +CODEGEN_OBJS:=$(addprefix $(CODEGEN_OBJ_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(CODEGEN_SOURCE)))) + +PARSER_SOURCE_DIR:=$(PWD)\parser +PARSER_SOURCE:=$(wildcard $(PARSER_SOURCE_DIR)/*.cpp) +PARSER_OBJS_DIR:=$(BUILD_DIR)\parser +PARSER_OBJS:=$(addprefix $(PARSER_OBJS_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(PARSER_SOURCE)))) + +AST_SOURCE_DIR:=$(PWD)\ast +AST_SOURCE:=$(wildcard $(AST_SOURCE_DIR)/*.cpp) +AST_OBJS_DIR:=$(BUILD_DIR)\ast +AST_OBJS:=$(addprefix $(AST_OBJS_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(AST_SOURCE)))) + +UTIL_SOURCE_DIR:=$(PWD)\util +UTIL_SOURCE:=$(wildcard $(UTIL_SOURCE_DIR)/*.cpp) +UTIL_OBJS_DIR:=$(BUILD_DIR)\util +UTIL_OBJS:=$(addprefix $(UTIL_OBJS_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(UTIL_SOURCE)))) + +BOUNDS_CHECK_SOURCE_DIR:=$(abspath ..\..\..\..\third_party\bounds_checking_function\src) +BOUNDS_CHECK_SOURCE:=$(wildcard $(BOUNDS_CHECK_SOURCE_DIR)/*.c) +BOUNDS_CHECK_OBJS_DIR:=$(BUILD_DIR)\bounds_checking_function +BOUNDS_CHECK_OBJS:=$(addprefix $(BOUNDS_CHECK_OBJS_DIR)\, $(patsubst %.c, %.o, $(notdir $(BOUNDS_CHECK_SOURCE)))) + +MAIN_SOURCE:=$(wildcard *.cpp) +MAIN_OBJS:=$(addprefix $(BUILD_DIR)\, $(patsubst %.cpp, %.o, $(MAIN_SOURCE))) + +all : $(TARGET) +$(TARGET) : $(BOUNDS_CHECK_OBJS) $(UTIL_OBJS) $(AST_OBJS) $(PARSER_OBJS) $(CODEGEN_OBJS) $(MAIN_OBJS) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) $^ -o $@ + $(Q) echo $(TARGET):build successful. + +$(BUILD_DIR)\\%.o : %.cpp + $(Q) if not exist $(BUILD_DIR) (mkdir $(BUILD_DIR)) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(CODEGEN_OBJ_DIR)\\%.o : $(CODEGEN_SOURCE_DIR)\\%.cpp + $(Q) if not exist $(CODEGEN_OBJ_DIR) (mkdir $(CODEGEN_OBJ_DIR)) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(PARSER_OBJS_DIR)\\%.o : $(PARSER_SOURCE_DIR)\\%.cpp + $(Q) if not exist $(PARSER_OBJS_DIR) (mkdir $(PARSER_OBJS_DIR)) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(AST_OBJS_DIR)\\%.o : $(AST_SOURCE_DIR)\\%.cpp + $(Q) if not exist $(AST_OBJS_DIR) (mkdir $(AST_OBJS_DIR)) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(UTIL_OBJS_DIR)\\%.o : $(UTIL_SOURCE_DIR)\\%.cpp + $(Q) if not exist $(UTIL_OBJS_DIR) (mkdir $(UTIL_OBJS_DIR)) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(BOUNDS_CHECK_OBJS_DIR)\\%.o : $(BOUNDS_CHECK_SOURCE_DIR)\\%.c + $(Q) if not exist $(BOUNDS_CHECK_OBJS_DIR) (mkdir $(BOUNDS_CHECK_OBJS_DIR)) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +clean: + $(Q) if exist $(TARGET).exe (del $(TARGET).exe) + $(Q) if exist $(BUILD_DIR) (rd /s /q $(BUILD_DIR)) + +.PHONY:all clean \ No newline at end of file diff --git a/tools/hdi-gen/ast/Makefile b/tools/hdi-gen/ast/Makefile deleted file mode 100755 index 04f71251..00000000 --- a/tools/hdi-gen/ast/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -OBJS_DIR:=$(BUILD_DIR)/ast -TARGET = $(OBJS_DIR)/ast.a -SOURCE:=$(wildcard *.cpp) -OBJS:=$(patsubst %.cpp, $(OBJS_DIR)/%.o, $(SOURCE)) - -$(TARGET):$(OBJS) - $(Q) echo $(TARGET) - $(Q) ar -rc $@ $^ - -$(OBJS_DIR)/%.o:%.cpp - $(Q) mkdir -p $(dir $@) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_array_type.cpp b/tools/hdi-gen/ast/ast_array_type.cpp index e79d33d9..68f91e6f 100755 --- a/tools/hdi-gen/ast/ast_array_type.cpp +++ b/tools/hdi-gen/ast/ast_array_type.cpp @@ -7,6 +7,7 @@ */ #include "ast/ast_array_type.h" +#include "util/options.h" namespace OHOS { namespace HDI { @@ -93,7 +94,12 @@ void ASTArrayType::EmitCWriteVar(const String& parcelName, const String& name, c 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"); - sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("for (i = 0; i < %s; i++) {\n", lenName.string()); + } else { + sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + } String elementName = ""; if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT @@ -122,12 +128,14 @@ void ASTArrayType::EmitCProxyReadVar(const String& parcelName, const String& nam EmitCMallocVar(name, lenName, true, gotoLabel, sb, prefix); sb.Append("\n"); - sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("for (i = 0; i < *%s; i++) {\n", lenName.string()); + } else { + sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); + } + if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - String cpName = String::Format("%sCp", name.string()); - elementType_->EmitCProxyReadVar(parcelName, cpName, true, gotoLabel, sb, prefix + g_tab); - sb.Append(prefix).Append(g_tab).AppendFormat("(*%s)[i] = strdup(%sCp);\n", - name.string(), name.string()); + EmitCProxyReadStrElement(parcelName, name, 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); @@ -164,11 +172,13 @@ void ASTArrayType::EmitCStubReadVar(const String& parcelName, const String& name EmitCMallocVar(name, lenName, false, "errors", sb, prefix + g_tab); sb.Append("\n"); - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix + g_tab).AppendFormat("for (i = 0; i < %s; i++) {\n", lenName.string()); + } else { + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + } if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - String element = String::Format("%sCp", name.string()); - elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); - sb.Append(prefix + g_tab + g_tab).AppendFormat("%s[i] = strdup(%sCp);\n", name.string(), name.string()); + EmitCStubReadStrElement(parcelName, name, 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); @@ -228,7 +238,12 @@ void ASTArrayType::EmitCMarshalling(const String& name, StringBuilder& sb, const "HDF_LOGE(\"%%{public}s: write %sLen failed!\", __func__);\n", name.string()); sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); - sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); + + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("for (i = 0; i < %sLen; i++) {\n", name.string()); + } else { + sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); + } String elementName = String::Format("(%s)[i]", name.string()); elementType_->EmitCMarshalling(elementName, sb, prefix + g_tab); @@ -253,12 +268,33 @@ void ASTArrayType::EmitCUnMarshalling(const String& name, StringBuilder& sb, con sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n"); sb.Append(newPrefix).Append("}\n"); freeObjStatements.push_back(String::Format("OsalMemFree(%s);\n", name.string())); - sb.Append(newPrefix).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(newPrefix).AppendFormat("for (i = 0; i < %s; i++) {\n", lenName.string()); + } else { + sb.Append(newPrefix).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + } + if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { String element = String::Format("%sElement", name.string()); elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); - sb.Append(newPrefix).Append(g_tab).AppendFormat("%s[i] = strdup(%s);\n", - name.string(), element.string()); + 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()); + } } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { String element = String::Format("&%s[i]", name.string()); elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); @@ -335,10 +371,13 @@ void ASTArrayType::EmitMemoryRecycle(const String& name, bool isClient, bool own 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()); + if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING || elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix + g_tab).AppendFormat("for (i = 0; i < %s; i++) {\n", lenName.string()); + } else { + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + } - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING - || elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { - 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()); elementType_->EmitMemoryRecycle(elementName, false, false, sb, prefix + g_tab + g_tab); @@ -502,5 +541,58 @@ void ASTArrayType::EmitCMallocVar(const String& name, const String& lenName, boo sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).AppendFormat("}\n"); } + +void ASTArrayType::EmitCProxyReadStrElement(const String& parcelName, const String& name, 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); + sb.Append("\n"); + if (Options::GetInstance().DoGenerateKernelCode()) { + 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 + 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", + 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("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("}\n"); + } else { + 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 +{ + String element = String::Format("%sCp", name.string()); + String newPrefix = prefix + g_tab + g_tab; + elementType_->EmitCStubReadVar(parcelName, element, 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).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("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(newPrefix + g_tab).Append("goto errors;\n"); + sb.Append(newPrefix).Append("}\n"); + } else { + sb.Append(newPrefix).AppendFormat("%s[i] = strdup(%sCp);\n", name.string(), name.string()); + } +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_array_type.h b/tools/hdi-gen/ast/ast_array_type.h index 968b0c82..2d85836b 100755 --- a/tools/hdi-gen/ast/ast_array_type.h +++ b/tools/hdi-gen/ast/ast_array_type.h @@ -81,6 +81,12 @@ private: void EmitCMallocVar(const String& name, const String& lenName, bool isClient, 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 EmitCStubReadStrElement(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const; + AutoPtr elementType_; }; } // namespace HDI diff --git a/tools/hdi-gen/ast/ast_list_type.cpp b/tools/hdi-gen/ast/ast_list_type.cpp index a634ae15..fed768d3 100755 --- a/tools/hdi-gen/ast/ast_list_type.cpp +++ b/tools/hdi-gen/ast/ast_list_type.cpp @@ -7,6 +7,7 @@ */ #include "ast/ast_list_type.h" +#include "util/options.h" namespace OHOS { namespace HDI { @@ -93,7 +94,12 @@ void ASTListType::EmitCWriteVar(const String& parcelName, const String& name, co 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"); - sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("for (i = 0; i < %s; i++) {\n", lenName.string()); + } else { + sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + } String elementName = ""; if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT @@ -122,12 +128,14 @@ void ASTListType::EmitCProxyReadVar(const String& parcelName, const String& name EmitCMallocVar(name, lenName, true, gotoLabel, sb, prefix); sb.Append("\n"); - sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("for (i = 0; i < *%s; i++) {\n", lenName.string()); + } else { + sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); + } + if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - String cpName = String::Format("%sCp", name.string()); - elementType_->EmitCProxyReadVar(parcelName, cpName, true, gotoLabel, sb, prefix + g_tab); - sb.Append(prefix).Append(g_tab).AppendFormat("(*%s)[i] = strdup(%sCp);\n", - name.string(), name.string()); + EmitCProxyReadStrElement(parcelName, name, 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); @@ -165,11 +173,14 @@ void ASTListType::EmitCStubReadVar(const String& parcelName, const String& name, EmitCMallocVar(name, lenName, false, "errors", sb, prefix + g_tab); sb.Append("\n"); - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix + g_tab).AppendFormat("for (i = 0; i < %s; i++) {\n", lenName.string()); + } else { + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + } + if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - String element = String::Format("%sCp", name.string()); - elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); - sb.Append(prefix + g_tab + g_tab).AppendFormat("%s[i] = strdup(%sCp);\n", name.string(), name.string()); + EmitCStubReadStrElement(parcelName, name, 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); @@ -229,7 +240,12 @@ void ASTListType::EmitCMarshalling(const String& name, StringBuilder& sb, const "HDF_LOGE(\"%%{public}s: write %sLen failed!\", __func__);\n", name.string()); sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); - sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); + + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("for (i = 0; i < %sLen; i++) {\n", name.string()); + } else { + sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); + } String elementName = String::Format("(%s)[i]", name.string()); elementType_->EmitCMarshalling(elementName, sb, prefix + g_tab); @@ -256,12 +272,32 @@ void ASTListType::EmitCUnMarshalling(const String& name, StringBuilder& sb, cons sb.Append(newPrefix).Append("}\n"); freeObjStatements.push_back(String::Format("OsalMemFree(%s);\n", name.string())); - sb.Append(newPrefix).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(newPrefix).AppendFormat("for (i = 0; i < %s; i++) {\n", lenName.string()); + } else { + sb.Append(newPrefix).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + } + if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { String element = String::Format("%sElement", name.string()); elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); - sb.Append(newPrefix).Append(g_tab).AppendFormat("%s[i] = strdup(%s);\n", - name.string(), element.string()); + 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()); + } } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { String element = String::Format("&%s[i]", name.string()); elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); @@ -338,9 +374,13 @@ void ASTListType::EmitMemoryRecycle(const String& name, bool isClient, bool owne 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()); - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING - || elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING || elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix + g_tab).AppendFormat("for (i = 0; i < %s; i++) {\n", lenName.string()); + } else { + 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()); elementType_->EmitMemoryRecycle(elementName, false, false, sb, prefix + g_tab + g_tab); @@ -401,5 +441,58 @@ void ASTListType::EmitCMallocVar(const String& name, const String& lenName, bool sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).AppendFormat("}\n"); } + +void ASTListType::EmitCProxyReadStrElement(const String& parcelName, const String& name, 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); + sb.Append("\n"); + if (Options::GetInstance().DoGenerateKernelCode()) { + 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 + 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", + 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("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("}\n"); + } else { + 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 +{ + String element = String::Format("%sCp", name.string()); + String newPrefix = prefix + g_tab + g_tab; + elementType_->EmitCStubReadVar(parcelName, element, 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).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("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(newPrefix + g_tab).Append("goto errors;\n"); + sb.Append(newPrefix).Append("}\n"); + } else { + sb.Append(newPrefix).AppendFormat("%s[i] = strdup(%sCp);\n", name.string(), name.string()); + } +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_list_type.h b/tools/hdi-gen/ast/ast_list_type.h index fd90497e..cb99d1b7 100755 --- a/tools/hdi-gen/ast/ast_list_type.h +++ b/tools/hdi-gen/ast/ast_list_type.h @@ -79,6 +79,12 @@ private: void EmitCMallocVar(const String& name, const String& lenName, bool isClient, 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 EmitCStubReadStrElement(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const; + AutoPtr elementType_ = nullptr; }; } // namespace HDI diff --git a/tools/hdi-gen/ast/ast_union_type.cpp b/tools/hdi-gen/ast/ast_union_type.cpp index ea1404f6..328b4eab 100755 --- a/tools/hdi-gen/ast/ast_union_type.cpp +++ b/tools/hdi-gen/ast/ast_union_type.cpp @@ -7,6 +7,7 @@ */ #include "ast/ast_union_type.h" +#include "util/options.h" #include "util/string_builder.h" namespace OHOS { @@ -150,8 +151,13 @@ String ASTUnionType::EmitJavaTypeDecl() const void ASTUnionType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUnpadBuffer(%s, (const uint8_t *)%s, sizeof(%s))) {\n", - parcelName.string(), name.string(), EmitCType().string()); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("if (!HdfSbufWriteBuffer(%s, (const void *)%s, sizeof(%s))) {\n", + parcelName.string(), name.string(), EmitCType().string()); + } else { + sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUnpadBuffer(%s, (const uint8_t *)%s, sizeof(%s))) {\n", + parcelName.string(), name.string(), EmitCType().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"); @@ -162,10 +168,24 @@ void ASTUnionType::EmitCWriteVar(const String& parcelName, const String& name, c void ASTUnionType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { - sb.Append(prefix).AppendFormat("const %s *%s = (%s *)HdfSbufReadUnpadBuffer(%s, sizeof(%s));\n", - EmitCType().string(), name.string(), EmitCType().string(), parcelName.string(), - EmitCType().string()); - sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("%s *%s = NULL;\n", EmitCType().string(), name.string()); + sb.Append(prefix).Append("uint32_t len = 0;\n"); + sb.Append(prefix).AppendFormat("if (!HdfSbufReadBuffer(%s, (const void **)&%s, &len)) {\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("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()); + } else { + sb.Append(prefix).AppendFormat("const %s *%s = (%s *)HdfSbufReadUnpadBuffer(%s, sizeof(%s));\n", + EmitCType().string(), name.string(), EmitCType().string(), parcelName.string(), EmitCType().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).Append("ec = HDF_ERR_INVALID_PARAM;\n"); @@ -176,10 +196,24 @@ void ASTUnionType::EmitCProxyReadVar(const String& parcelName, const String& nam void ASTUnionType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix) const { - sb.Append(prefix).AppendFormat("const %s *%s = (%s *)HdfSbufReadUnpadBuffer(%s, sizeof(%s));\n", - EmitCType().string(), name.string(), EmitCType().string(), parcelName.string(), - EmitCType().string()); - sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("%s *%s = NULL;\n", EmitCType().string(), name.string()); + sb.Append(prefix).Append("uint32_t len = 0;\n"); + sb.Append(prefix).AppendFormat("if (!HdfSbufReadBuffer(%s, (const void **)&%s, &len)) {\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\n"); + sb.Append(prefix).AppendFormat("if (%s == NULL || sizeof(%s) != len) {\n", + name.string(), EmitCType().string()); + } else { + sb.Append(prefix).AppendFormat("const %s *%s = (%s *)HdfSbufReadUnpadBuffer(%s, sizeof(%s));\n", + EmitCType().string(), name.string(), EmitCType().string(), parcelName.string(), EmitCType().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).Append("ec = HDF_ERR_INVALID_PARAM;\n"); @@ -218,8 +252,13 @@ void ASTUnionType::EmitCppReadVar(const String& parcelName, const String& name, void ASTUnionType::EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const { - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUnpadBuffer(data, (const uint8_t *)&%s, sizeof(%s))) {\n", - name.string(), EmitCType().string()); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("if (!HdfSbufWriteBuffer(data, (const void *)&%s, sizeof(%s))) {\n", + name.string(), EmitCType().string()); + } else { + sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUnpadBuffer(data, (const uint8_t *)&%s, sizeof(%s))) {\n", + name.string(), EmitCType().string()); + } sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); sb.Append(prefix + g_tab).Append("return false;\n"); @@ -229,9 +268,22 @@ void ASTUnionType::EmitCMarshalling(const String& name, StringBuilder& sb, const void ASTUnionType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, std::vector& freeObjStatements) const { - sb.Append(prefix).AppendFormat("const %s *%s = (const %s *)HdfSbufReadUnpadBuffer(data, sizeof(%s));\n", - EmitCType().string(), name.string(), EmitCType().string(), EmitCType().string()); - sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("%s *%s = NULL;\n", EmitCType().string(), name.string()); + sb.Append(prefix).Append("uint32_t len = 0;\n"); + 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).Append("}\n\n"); + sb.Append(prefix).AppendFormat("if (%s == NULL || sizeof(%s) != len) {\n", + name.string(), EmitCType().string()); + } else { + sb.Append(prefix).AppendFormat("const %s *%s = (const %s *)HdfSbufReadUnpadBuffer(data, sizeof(%s));\n", + EmitCType().string(), name.string(), EmitCType().string(), EmitCType().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).Append("goto errors;\n"); diff --git a/tools/hdi-gen/codegen/Makefile b/tools/hdi-gen/codegen/Makefile deleted file mode 100755 index 64ac5af8..00000000 --- a/tools/hdi-gen/codegen/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -OBJS_DIR:=$(BUILD_DIR)/codegen -TARGET = $(OBJS_DIR)/codegen.a -SOURCE:=$(wildcard *.cpp) -OBJS:=$(patsubst %.cpp, $(OBJS_DIR)/%.o, $(SOURCE)) - -$(TARGET):$(OBJS) - $(Q) echo $(TARGET) - $(Q) ar -rc $@ $^ - -$(OBJS_DIR)/%.o:%.cpp - $(Q) mkdir -p $(dir $@) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp b/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp index 7ddbd0db..7c5a628c 100755 --- a/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp @@ -15,11 +15,11 @@ namespace HDI { bool CClientInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/client/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/client/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } @@ -87,13 +87,23 @@ void CClientInterfaceCodeEmitter::EmitImportInclusions(StringBuilder& sb) void CClientInterfaceCodeEmitter::EmitForwardDecls(StringBuilder& sb) { - sb.Append("struct HdfRemoteService;\n"); + if (isKernelCode_) { + sb.Append("struct HdfIoService;\n"); + } else { + sb.Append("struct HdfRemoteService;\n"); + } } void CClientInterfaceCodeEmitter::EmitInterfaceDecl(StringBuilder& sb) { sb.AppendFormat("struct %s {\n", interfaceName_.string()); - sb.Append(g_tab).Append("struct HdfRemoteService *remote;\n"); + + if (isKernelCode_) { + sb.Append(g_tab).Append("struct HdfIoService *serv;\n"); + } else { + sb.Append(g_tab).Append("struct HdfRemoteService *remote;\n"); + } + sb.Append("\n"); EmitInterfaceMethodsDecl(sb, g_tab); sb.Append("};\n"); 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 21f7e869..fd93f37b 100755 --- a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp @@ -15,11 +15,11 @@ namespace HDI { bool CClientProxyCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/client/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/client/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } @@ -91,7 +91,11 @@ void CClientProxyCodeEmitter::EmitProxySourceFile() EmitProxyConstruction(sb); if (!isCallbackInterface()) { sb.Append("\n"); - EmitProxyGetMethodImpl(sb); + if (isKernelCode_) { + EmitKernelProxyGetMethodImpl(sb); + } else { + EmitProxyGetMethodImpl(sb); + } sb.Append("\n"); EmitProxyReleaseMethodImpl(sb); } else { @@ -127,7 +131,12 @@ void CClientProxyCodeEmitter::EmitProxyStdlibInclusions(StringBuilder& sb) sb.Append("#include \n"); sb.Append("#include \n"); sb.Append("#include \n"); - sb.Append("#include \n"); + + if (isKernelCode_) { + sb.Append("#include \n"); + } else { + sb.Append("#include \n"); + } const AST::TypeStringMap& types = ast_->GetTypes(); for (const auto& pair : types) { @@ -145,13 +154,21 @@ void CClientProxyCodeEmitter::EmitProxyCallMethodImpl(StringBuilder& sb) infName_.string(), interfaceName_.string()); sb.Append(g_tab).Append("struct HdfSBuf *reply)\n"); sb.Append("{\n"); - sb.Append(g_tab).Append("if (self->remote == NULL\n"); - sb.Append(g_tab).Append(g_tab).Append("|| self->remote->dispatcher == NULL\n"); - sb.Append(g_tab).Append(g_tab).Append("|| self->remote->dispatcher->Dispatch == NULL) {\n"); + + String remoteName = isKernelCode_ ? "serv" : "remote"; + sb.Append(g_tab).AppendFormat("if (self->%s == NULL\n", remoteName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("|| self->%s->dispatcher == NULL\n", remoteName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("|| self->%s->dispatcher->Dispatch == NULL) {\n", remoteName.string()); sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: obj is null\", __func__);\n"); sb.Append(g_tab).Append(g_tab).Append("return HDF_ERR_INVALID_OBJECT;\n"); sb.Append(g_tab).Append("}\n"); - sb.Append(g_tab).Append("return self->remote->dispatcher->Dispatch(self->remote, id, data, reply);\n"); + + if (isKernelCode_) { + sb.Append(g_tab).Append("return self->serv->dispatcher->Dispatch"); + sb.Append("((struct HdfObject *)&(self->serv->object), id, data, reply);\n"); + } else { + sb.Append(g_tab).Append("return self->remote->dispatcher->Dispatch(self->remote, id, data, reply);\n"); + } sb.Append("}\n"); } @@ -195,8 +212,21 @@ void CClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& meth { sb.Append(prefix).Append("{\n"); sb.Append(prefix + g_tab).Append("int32_t ec = HDF_FAILURE;\n"); - sb.Append("\n"); + // 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; + } + } + } + + sb.Append("\n"); EmitCreateBuf(sb, prefix + g_tab); sb.Append("\n"); @@ -236,10 +266,15 @@ void CClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& meth void CClientProxyCodeEmitter::EmitCreateBuf(StringBuilder& sb, const String& prefix) { - sb.Append(prefix).Append("struct HdfSBuf *data = HdfSBufTypedObtain(SBUF_IPC);\n"); - sb.Append(prefix).Append("struct HdfSBuf *reply = HdfSBufTypedObtain(SBUF_IPC);\n"); - sb.Append("\n"); + if (isKernelCode_) { + sb.Append(prefix).Append("struct HdfSBuf *data = HdfSBufObtainDefaultSize();\n"); + sb.Append(prefix).Append("struct HdfSBuf *reply = HdfSBufObtainDefaultSize();\n"); + } else { + sb.Append(prefix).Append("struct HdfSBuf *data = HdfSBufTypedObtain(SBUF_IPC);\n"); + sb.Append(prefix).Append("struct HdfSBuf *reply = HdfSBufTypedObtain(SBUF_IPC);\n"); + } + sb.Append("\n"); sb.Append(prefix).Append("if (data == NULL || reply == NULL) {\n"); 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"); @@ -265,7 +300,24 @@ void CClientProxyCodeEmitter::EmitReadProxyMethodParameter(const AutoPtrGetName().string()); type->EmitCProxyReadVar(parcelName, cloneName, false, gotoLabel, sb, prefix); String leftVar = String::Format("*%s", param->GetName().string()); - sb.Append(prefix).AppendFormat("%s = strdup(%s);\n", leftVar.string(), cloneName.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", @@ -371,6 +423,35 @@ void CClientProxyCodeEmitter::EmitProxyGetMethodImpl(StringBuilder& sb) sb.Append("}\n"); } +void CClientProxyCodeEmitter::EmitKernelProxyGetMethodImpl(StringBuilder& sb) +{ + sb.AppendFormat("struct %s *Hdi%sGet()\n", interfaceName_.string(), infName_.string()); + sb.Append("{\n"); + sb.Append(g_tab).AppendFormat("struct HdfIoService *serv = "); + sb.AppendFormat("HdfIoServiceBind(\"%s\");\n", infName_.string()); + sb.Append(g_tab).Append("if (serv == NULL) {\n"); + sb.Append(g_tab).Append(g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: %sService not found!\", __func__);\n", infName_.string()); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n"); + sb.Append("\n"); + + sb.Append(g_tab).AppendFormat("struct %s *%sClient = (struct %s *)OsalMemAlloc(sizeof(struct %s));\n", + interfaceName_.string(), infName_.string(), interfaceName_.string(), interfaceName_.string()); + sb.Append(g_tab).AppendFormat("if (%sClient == NULL) {\n", infName_.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: malloc %s instance failed!\", __func__);\n", interfaceName_.string()); + sb.Append(g_tab).Append(g_tab).Append("HdfIoServiceRecycle(serv);\n"); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n"); + sb.Append("\n"); + + sb.Append(g_tab).AppendFormat("%sClient->serv = serv;\n", infName_.string()); + sb.Append(g_tab).AppendFormat("%sConstruct(%sClient);\n", infName_.string(), infName_.string()); + sb.Append(g_tab).AppendFormat("return %sClient;\n", infName_.string()); + sb.Append("}\n"); +} + void CClientProxyCodeEmitter::EmitProxyReleaseMethodImpl(StringBuilder& sb) { sb.AppendFormat("void Hdi%sRelease(struct %s *instance)\n", infName_.string(), interfaceName_.string()); @@ -379,7 +460,11 @@ void CClientProxyCodeEmitter::EmitProxyReleaseMethodImpl(StringBuilder& sb) sb.Append(g_tab).Append(g_tab).Append("return;\n"); sb.Append(g_tab).Append("}\n"); - sb.Append(g_tab).Append("HdfRemoteServiceRecycle(instance->remote);\n"); + if (isKernelCode_) { + sb.Append(g_tab).Append("HdfIoServiceRecycle(instance->serv);\n"); + } else { + sb.Append(g_tab).Append("HdfRemoteServiceRecycle(instance->remote);\n"); + } sb.Append(g_tab).Append("OsalMemFree(instance);\n"); sb.Append("}\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 42f83cc6..41d78d8d 100755 --- a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h +++ b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h @@ -54,6 +54,8 @@ private: void EmitProxyGetMethodImpl(StringBuilder& sb); + void EmitKernelProxyGetMethodImpl(StringBuilder& sb); + void EmitProxyReleaseMethodImpl(StringBuilder& sb); void EmitCbProxyObtainMethodImpl(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/c_code_emitter.cpp b/tools/hdi-gen/codegen/c_code_emitter.cpp index 25edb716..1845cb52 100755 --- a/tools/hdi-gen/codegen/c_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_code_emitter.cpp @@ -13,68 +13,6 @@ namespace OHOS { namespace HDI { -bool CCodeEmitter::OutPut(const AutoPtr& ast, const String& targetDirectory) -{ - if (!Reset(ast, targetDirectory)) { - return false; - } - - EmitCode(); - return true; -} - -bool CCodeEmitter::Reset(const AutoPtr& ast, const String& targetDirectory) -{ - if (ast == nullptr) { - return false; - } - - if (targetDirectory.Equals("")) { - return false; - } - - CleanData(); - ast_ = ast; - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - interface_ = ast_->GetInterfaceDef(); - interfaceName_ = interface_->GetName(); - interfaceFullName_ = interface_->GetNamespace()->ToString() + interfaceName_; - infName_ = interfaceName_.StartsWith("I") ? interfaceName_.Substring(1) : interfaceName_; - proxyName_ = infName_ + "Proxy"; - proxyFullName_ = interface_->GetNamespace()->ToString() + proxyName_; - - stubName_ = infName_ + "Stub"; - stubFullName_ = interface_->GetNamespace()->ToString() + stubName_; - - implName_ = infName_ + "Service"; - implFullName_ = interface_->GetNamespace()->ToString() + implName_; - } else if (ast_->GetASTFileType() == ASTFileType::AST_TYPES) { - infName_ = ast_->GetName(); - } - - if (!ResolveDirectory(targetDirectory)) { - return false; - } - - return true; -} - -void CCodeEmitter::CleanData() -{ - ast_ = nullptr; - interface_ = nullptr; - directory_ = ""; - interfaceName_ = ""; - interfaceFullName_ = ""; - infName_ = ""; - proxyName_ = ""; - proxyFullName_ = ""; - stubName_ = ""; - stubFullName_ = ""; - implName_ = ""; - implFullName_ = ""; -} - String CCodeEmitter::FileName(const String& name) { if (name.IsEmpty()) { diff --git a/tools/hdi-gen/codegen/c_code_emitter.h b/tools/hdi-gen/codegen/c_code_emitter.h index 997cf230..f9cabda3 100755 --- a/tools/hdi-gen/codegen/c_code_emitter.h +++ b/tools/hdi-gen/codegen/c_code_emitter.h @@ -11,29 +11,19 @@ #include #include "ast/ast.h" +#include "codegen/code_emitter.h" #include "util/autoptr.h" -#include "util/light_refcount_base.h" #include "util/string.h" #include "util/string_builder.h" namespace OHOS { namespace HDI { -class CCodeEmitter : public LightRefCountBase { +class CCodeEmitter : public CodeEmitter { public: virtual ~CCodeEmitter() = default; - bool OutPut(const AutoPtr& ast, const String& targetDirectory); - static String FileName(const String& name); protected: - bool Reset(const AutoPtr& ast, const String& targetDirectory); - - void CleanData(); - - virtual bool ResolveDirectory(const String& targetDirectory) = 0; - - virtual void EmitCode() = 0; - void EmitInterfaceMethodCommands(StringBuilder& sb); void EmitInterfaceMethodParameter(const AutoPtr& parameter, StringBuilder& sb, const String& prefix); @@ -65,20 +55,6 @@ protected: } String SpecificationParam(StringBuilder& sb, const String& prefix); - - AutoPtr ast_ = nullptr; - AutoPtr interface_ = nullptr; - String directory_; - - String interfaceName_; - String interfaceFullName_; - String infName_; - String proxyName_; - String proxyFullName_; - String stubName_; - String stubFullName_; - String implName_; - String implFullName_; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/c_code_generator.cpp b/tools/hdi-gen/codegen/c_code_generator.cpp deleted file mode 100755 index 1ff73ae3..00000000 --- a/tools/hdi-gen/codegen/c_code_generator.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "c_code_generator.h" -#include -#include -#include -#include "codegen/c_client_interface_code_emitter.h" -#include "codegen/c_client_proxy_code_emitter.h" -#include "codegen/c_custom_types_code_emitter.h" -#include "codegen/c_service_driver_code_emitter.h" -#include "codegen/c_service_impl_code_emitter.h" -#include "codegen/c_service_interface_code_emitter.h" -#include "codegen/c_service_stub_code_emitter.h" -#include "util/file.h" -#include "util/logger.h" - -namespace OHOS { -namespace HDI { -bool CCodeGenerator::Generate() -{ - Initializate(); - - for (auto& astPair : astModule_->GetAllAsts()) { - AutoPtr ast = astPair.second; - switch (ast->GetASTFileType()) { - case ASTFileType::AST_TYPES: { - emitters_["types"]->OutPut(ast, targetDirectory_); - break; - } - case ASTFileType::AST_IFACE: - case ASTFileType::AST_ICALLBACK: { - emitters_["clientIface"]->OutPut(ast, targetDirectory_); - emitters_["proxy"]->OutPut(ast, targetDirectory_); - emitters_["serviceIface"]->OutPut(ast, targetDirectory_); - emitters_["driver"]->OutPut(ast, targetDirectory_); - emitters_["stub"]->OutPut(ast, targetDirectory_); - emitters_["impl"]->OutPut(ast, targetDirectory_); - break; - } - default: - break; - } - } - return true; -} - -void CCodeGenerator::Initializate() -{ - emitters_ = { - {"types", new CCustomTypesCodeEmitter()}, - {"clientIface", new CClientInterfaceCodeEmitter()}, - {"proxy", new CClientProxyCodeEmitter()}, - {"serviceIface", new CServiceInterfaceCodeEmitter()}, - {"driver", new CServiceDriverCodeEmitter()}, - {"stub", new CServiceStubCodeEmitter()}, - {"impl", new CServiceImplCodeEmitter()}, - }; -} -} // namespace HDI -} // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_code_generator.h b/tools/hdi-gen/codegen/c_code_generator.h deleted file mode 100755 index b878a2a9..00000000 --- a/tools/hdi-gen/codegen/c_code_generator.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef OHOS_HDI_C_CODE_GENERATOR_H -#define OHOS_HDI_C_CODE_GENERATOR_H - -#include "codegen/c_code_emitter.h" -#include "codegen/code_generator.h" - -namespace OHOS { -namespace HDI { -class CCodeGenerator : public CodeGenerator { -public: - using CCodeEmitMap = std::unordered_map, StringHashFunc, StringEqualFunc>; - - CCodeGenerator(const AutoPtr& astModule, const String& targetDirectory) - : CodeGenerator(astModule, targetDirectory), emitters_() {} - - virtual ~CCodeGenerator() = default; - - bool Generate() override; -private: - void Initializate(); - - CCodeEmitMap emitters_; -}; -} // namespace HDI -} // namespace OHOS - -#endif // OHOS_HDI_C_CODE_GENERATOR_H \ No newline at end of file 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 4e8f66b2..19d9883e 100755 --- a/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp @@ -8,6 +8,7 @@ #include "codegen/c_custom_types_code_emitter.h" #include "util/file.h" +#include "util/options.h" #include "util/logger.h" namespace OHOS { @@ -18,7 +19,8 @@ bool CCustomTypesCodeEmitter::ResolveDirectory(const String& targetDirectory) return false; } - directory_ = String::Format("%s/%s/", targetDirectory.string(), FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); if (!File::CreateParentDir(directory_)) { Logger::E("CCustomTypesCodeEmitter", "Create '%s' failed!", directory_.string()); return false; @@ -210,6 +212,18 @@ void CCustomTypesCodeEmitter::EmitCustomTypeMarshallingImpl(StringBuilder& sb, c sb.AppendFormat("bool %sBlockMarshalling(struct HdfSBuf *data, const %s *%s)\n", type->GetName().string(), type->EmitCType().string(), objName.string()); sb.Append("{\n"); + + for (size_t i = 0; i < type->GetMemberNumber(); i++) { + AutoPtr memberType = type->GetMemberType(i); + if (isKernelCode_) { + if (memberType->GetTypeKind() == TypeKind::TYPE_ARRAY || + memberType->GetTypeKind() == TypeKind::TYPE_LIST) { + sb.Append(g_tab).Append("uint32_t i = 0;\n"); + break; + } + } + } + for (size_t i = 0; i < type->GetMemberNumber(); i++) { String memberName = type->GetMemberName(i); AutoPtr memberType = type->GetMemberType(i); @@ -231,6 +245,17 @@ void CCustomTypesCodeEmitter::EmitCustomTypeUnmarshallingImpl(StringBuilder& sb, type->GetName().string(), type->EmitCType().string(), objName.string()); sb.Append("{\n"); + if (isKernelCode_) { + for (size_t i = 0; i < type->GetMemberNumber(); i++) { + AutoPtr memberType = type->GetMemberType(i); + if (memberType->GetTypeKind() == TypeKind::TYPE_ARRAY || + memberType->GetTypeKind() == TypeKind::TYPE_LIST) { + sb.Append(g_tab).Append("uint32_t i = 0;\n"); + break; + } + } + } + sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", objName.string()); sb.Append(g_tab).Append(g_tab).Append("return false;\n"); sb.Append(g_tab).Append("}\n"); @@ -256,7 +281,22 @@ void CCustomTypesCodeEmitter::EmitMemberUnmarshalling(const AutoPtr& ty case TypeKind::TYPE_STRING: { String tmpName = String::Format("%sCp", memberName.string()); type->EmitCUnMarshalling(tmpName, sb, g_tab, freeObjStatements_); - sb.Append(g_tab).AppendFormat("%s = strdup(%s);\n", varName.string(), tmpName.string()); + + 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("}\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("}\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("}\n"); @@ -317,6 +357,17 @@ void CCustomTypesCodeEmitter::EmitCustomTypeFreeImpl(StringBuilder& sb, const Au sb.AppendFormat("void %sFree(%s *%s, bool freeSelf)\n", type->GetName().string(), type->EmitCType().string(), objName.string()); sb.Append("{\n"); + + if (isKernelCode_) { + for (size_t i = 0; i < type->GetMemberNumber(); i++) { + AutoPtr memberType = type->GetMemberType(i); + if (NeedEmitInitVar(memberType)) { + sb.Append(g_tab).Append("uint32_t i = 0;\n"); + break; + } + } + } + sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", objName.string()); sb.Append(g_tab).Append(g_tab).Append("return;\n"); sb.Append(g_tab).Append("}\n"); @@ -330,6 +381,29 @@ void CCustomTypesCodeEmitter::EmitCustomTypeFreeImpl(StringBuilder& sb, const Au sb.Append("}\n"); } +bool CCustomTypesCodeEmitter::NeedEmitInitVar(const AutoPtr& type) +{ + if (type == nullptr) { + return false; + } + + if (type->IsArrayType()) { + AutoPtr ArrType = dynamic_cast(type.Get()); + AutoPtr elementType = ArrType->GetElementType(); + if (elementType->IsStringType() || elementType->IsStructType()) { + return true; + } + } else if (type->IsListType()) { + AutoPtr ListType = dynamic_cast(type.Get()); + AutoPtr elementType = ListType->GetElementType(); + if (elementType->IsStringType() || elementType->IsStructType()) { + return true; + } + } + + return false; +} + void CCustomTypesCodeEmitter::EmitCustomTypeMemoryRecycle(const AutoPtr& type, const String& name, StringBuilder& sb, const String& prefix) { diff --git a/tools/hdi-gen/codegen/c_custom_types_code_emitter.h b/tools/hdi-gen/codegen/c_custom_types_code_emitter.h index 6ae5e3a2..02282252 100755 --- a/tools/hdi-gen/codegen/c_custom_types_code_emitter.h +++ b/tools/hdi-gen/codegen/c_custom_types_code_emitter.h @@ -59,6 +59,8 @@ private: void EmitCustomTypeFreeImpl(StringBuilder& sb, const AutoPtr& type); + bool NeedEmitInitVar(const AutoPtr& type); + void EmitCustomTypeMemoryRecycle(const AutoPtr& type, const String& name, StringBuilder& sb, const String& prefix); diff --git a/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp index 3fda364f..502b3de7 100755 --- a/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp @@ -18,7 +18,8 @@ bool CServiceDriverCodeEmitter::ResolveDirectory(const String& targetDirectory) return false; } - directory_ = String::Format("%s/%s/server/", targetDirectory.string(), FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); if (!File::CreateParentDir(directory_)) { Logger::E("CServiceDriverCodeEmitter", "Create '%s' failed!", directory_.string()); return false; diff --git a/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp index f483b274..d6f090d8 100755 --- a/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp @@ -15,11 +15,11 @@ namespace HDI { bool CServiceImplCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/server/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } diff --git a/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp index 01bcf358..7ee75d03 100755 --- a/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp @@ -15,11 +15,11 @@ namespace HDI { bool CServiceInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/server/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } @@ -139,7 +139,7 @@ void CServiceInterfaceCodeEmitter::EmitInterfaceMethod(const AutoPtr& void CServiceInterfaceCodeEmitter::EmitInterfaceInstanceMethodDecl(StringBuilder& sb) { - sb.AppendFormat("struct %s *Hdi%sInstance();\n", interfaceName_.string(), infName_.string()); + sb.AppendFormat("struct %s *Hdi%sInstance(void);\n", interfaceName_.string(), infName_.string()); } void CServiceInterfaceCodeEmitter::EmitInterfaceReleaseMethodDecl(StringBuilder& sb) 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 e8c6996c..c045a6df 100755 --- a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp @@ -16,11 +16,11 @@ namespace HDI { bool CServiceStubCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/server/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } @@ -152,6 +152,19 @@ void CServiceStubCodeEmitter::EmitServiceStubMethodImpl(const AutoPtr sb.Append(prefix).Append("{\n"); sb.Append(prefix + g_tab).Append("int32_t ec = HDF_FAILURE;\n"); + // 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; + } + } + } + String gotoName = "errors"; if (method->GetParameterNumber() > 0) { for (size_t i = 0; i < method->GetParameterNumber(); i++) { @@ -203,7 +216,24 @@ void CServiceStubCodeEmitter::EmitReadStubMethodParameter(const AutoPtrGetTypeKind() == TypeKind::TYPE_STRING) { String cloneName = String::Format("%sCp", param->GetName().string()); type->EmitCStubReadVar(parcelName, cloneName, sb, prefix); - sb.Append(prefix).AppendFormat("%s = strdup(%s);\n", param->GetName().string(), cloneName.string()); + 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()); + } } else if (type->GetTypeKind() == TypeKind::TYPE_INTERFACE) { type->EmitCStubReadVar(parcelName, param->GetName(), sb, prefix); } else if (type->GetTypeKind() == TypeKind::TYPE_STRUCT) { diff --git a/tools/hdi-gen/codegen/code_emitter.cpp b/tools/hdi-gen/codegen/code_emitter.cpp new file mode 100755 index 00000000..e002b2c8 --- /dev/null +++ b/tools/hdi-gen/codegen/code_emitter.cpp @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "codegen/code_emitter.h" + +#include "util/logger.h" + +namespace OHOS { +namespace HDI { + +bool CodeEmitter::OutPut(const AutoPtr& ast, const String& targetDirectory, bool isKernelCode) +{ + if (!Reset(ast, targetDirectory, isKernelCode)) { + return false; + } + + EmitCode(); + return true; +} + +bool CodeEmitter::Reset(const AutoPtr& ast, const String& targetDirectory, bool isKernelCode) +{ + if (ast == nullptr || targetDirectory.Equals("")) { + return false; + } + + CleanData(); + + isKernelCode_ = isKernelCode; + ast_ = ast; + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + interface_ = ast_->GetInterfaceDef(); + interfaceName_ = interface_->GetName(); + interfaceFullName_ = interface_->GetNamespace()->ToString() + interfaceName_; + infName_ = interfaceName_.StartsWith("I") ? interfaceName_.Substring(1) : interfaceName_; + proxyName_ = infName_ + "Proxy"; + proxyFullName_ = interface_->GetNamespace()->ToString() + proxyName_; + + stubName_ = infName_ + "Stub"; + stubFullName_ = interface_->GetNamespace()->ToString() + stubName_; + + implName_ = infName_ + "Service"; + implFullName_ = interface_->GetNamespace()->ToString() + implName_; + } else if (ast_->GetASTFileType() == ASTFileType::AST_TYPES) { + infName_ = ast_->GetName(); + } + + if (!ResolveDirectory(targetDirectory)) { + return false; + } + + return true; +} + +void CodeEmitter::CleanData() +{ + isKernelCode_ = false; + ast_ = nullptr; + interface_ = nullptr; + directory_ = ""; + interfaceName_ = ""; + interfaceFullName_ = ""; + infName_ = ""; + proxyName_ = ""; + proxyFullName_ = ""; + stubName_ = ""; + stubFullName_ = ""; + implName_ = ""; + implFullName_ = ""; +} +} // namespace HDI +} // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/code_emitter.h b/tools/hdi-gen/codegen/code_emitter.h new file mode 100755 index 00000000..7a867460 --- /dev/null +++ b/tools/hdi-gen/codegen/code_emitter.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef OHOS_HDI_CODE_EMITTER_H +#define OHOS_HDI_CODE_EMITTER_H + +#include "ast/ast.h" +#include "util/autoptr.h" +#include "util/light_refcount_base.h" +#include "util/string.h" + +namespace OHOS { +namespace HDI { +class CodeEmitter : public LightRefCountBase { +public: + virtual ~CodeEmitter() = default; + + bool OutPut(const AutoPtr& ast, const String& targetDirectory, bool isKernelCode = false); + +protected: + bool Reset(const AutoPtr& ast, const String& targetDirectory, bool isKernelCode); + + void CleanData(); + + virtual bool ResolveDirectory(const String& targetDirectory) = 0; + + virtual void EmitCode() = 0; + + bool isKernelCode_ = false; + AutoPtr ast_ = nullptr; + AutoPtr interface_ = nullptr; + String directory_; + + String interfaceName_; + String interfaceFullName_; + String infName_; + String proxyName_; + String proxyFullName_; + String stubName_; + String stubFullName_; + String implName_; + String implFullName_; +}; +} +} + +#endif // OHOS_HDI_CODE_EMITTER_H diff --git a/tools/hdi-gen/codegen/code_generator.cpp b/tools/hdi-gen/codegen/code_generator.cpp new file mode 100755 index 00000000..ba65e72c --- /dev/null +++ b/tools/hdi-gen/codegen/code_generator.cpp @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "codegen/code_generator.h" +#include "codegen/c_client_interface_code_emitter.h" +#include "codegen/c_client_proxy_code_emitter.h" +#include "codegen/c_custom_types_code_emitter.h" +#include "codegen/c_service_driver_code_emitter.h" +#include "codegen/c_service_impl_code_emitter.h" +#include "codegen/c_service_interface_code_emitter.h" +#include "codegen/c_service_stub_code_emitter.h" +#include "codegen/cpp_client_interface_code_emitter.h" +#include "codegen/cpp_client_proxy_code_emitter.h" +#include "codegen/cpp_custom_types_code_emitter.h" +#include "codegen/cpp_service_driver_code_emitter.h" +#include "codegen/cpp_service_impl_code_emitter.h" +#include "codegen/cpp_service_interface_code_emitter.h" +#include "codegen/cpp_service_stub_code_emitter.h" +#include "codegen/java_client_interface_code_emitter.h" +#include "codegen/java_client_proxy_code_emitter.h" +#include "util/options.h" + + +namespace OHOS { +namespace HDI { +CodeEmitMap CodeGenerator::cCodeEmitters_ = { + {"types", new CCustomTypesCodeEmitter()}, + {"clientIface", new CClientInterfaceCodeEmitter()}, + {"proxy", new CClientProxyCodeEmitter()}, + {"serviceIface", new CServiceInterfaceCodeEmitter()}, + {"driver", new CServiceDriverCodeEmitter()}, + {"stub", new CServiceStubCodeEmitter()}, + {"impl", new CServiceImplCodeEmitter()}, +}; + +CodeEmitMap CodeGenerator::cppCodeEmitters_ = { + {"types", new CppCustomTypesCodeEmitter()}, + {"clientIface", new CppClientInterfaceCodeEmitter()}, + {"proxy", new CppClientProxyCodeEmitter()}, + {"serviceIface", new CppServiceInterfaceCodeEmitter()}, + {"driver", new CppServiceDriverCodeEmitter()}, + {"stub", new CppServiceStubCodeEmitter()}, + {"impl", new CppServiceImplCodeEmitter()}, +}; + +CodeEmitMap CodeGenerator::javaCodeEmitters_ = { + {"clientIface", new JavaClientInterfaceCodeEmitter()}, + {"proxy", new JavaClientProxyCodeEmitter()}, +}; + +bool CodeGenerator::Generate() +{ + const Options& options = Options::GetInstance(); + + String dir = options.GetGenerationDirectory(); + String language = options.GetTargetLanguage(); + bool isModeKernel = options.DoGenerateKernelCode(); + String codePart = options.GetCodePart(); + + for (auto& astPair : astModule_->GetAllAsts()) { + AutoPtr ast = astPair.second; + if (language.Equals("c")) { + GenerateCCode(ast, dir, codePart, isModeKernel); + } else if (language.Equals("cpp")) { + GenerateCppCode(ast, dir, codePart); + } else if (language.Equals("java")) { + GenerateJavaCode(ast, dir, codePart); + } + } + + return true; +} + +void CodeGenerator::GenerateCCode(const AutoPtr& ast, const String& outDir, const String& codePart, bool isKernel) +{ + switch (ast->GetASTFileType()) { + case ASTFileType::AST_TYPES: { + cCodeEmitters_["types"]->OutPut(ast, outDir, isKernel); + break; + } + case ASTFileType::AST_IFACE: { + if (codePart.Equals("client")) { + cCodeEmitters_["clientIface"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["proxy"]->OutPut(ast, outDir, isKernel); + break; + } else if (codePart.Equals("server")) { + cCodeEmitters_["serviceIface"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["driver"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["stub"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["impl"]->OutPut(ast, outDir, isKernel); + break; + } else { + cCodeEmitters_["clientIface"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["proxy"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["serviceIface"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["driver"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["stub"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["impl"]->OutPut(ast, outDir, isKernel); + } + break; + } + case ASTFileType::AST_ICALLBACK: + // khdf doesn't support callback + cCodeEmitters_["clientIface"]->OutPut(ast, outDir); + cCodeEmitters_["proxy"]->OutPut(ast, outDir); + cCodeEmitters_["serviceIface"]->OutPut(ast, outDir); + cCodeEmitters_["driver"]->OutPut(ast, outDir); + cCodeEmitters_["stub"]->OutPut(ast, outDir); + cCodeEmitters_["impl"]->OutPut(ast, outDir); + break; + default: + break; + } +} + +void CodeGenerator::GenerateCppCode(const AutoPtr& ast, const String& outDir, const String& codePart) +{ + switch (ast->GetASTFileType()) { + case ASTFileType::AST_TYPES: + cppCodeEmitters_["types"]->OutPut(ast, outDir); + break; + case ASTFileType::AST_IFACE: { + if (codePart.Equals("client")) { + cppCodeEmitters_["clientIface"]->OutPut(ast, outDir); + cppCodeEmitters_["proxy"]->OutPut(ast, outDir); + } else if (codePart.Equals("server")) { + cppCodeEmitters_["serviceIface"]->OutPut(ast, outDir); + cppCodeEmitters_["driver"]->OutPut(ast, outDir); + cppCodeEmitters_["stub"]->OutPut(ast, outDir); + cppCodeEmitters_["impl"]->OutPut(ast, outDir); + } else { + cppCodeEmitters_["clientIface"]->OutPut(ast, outDir); + cppCodeEmitters_["proxy"]->OutPut(ast, outDir); + cppCodeEmitters_["serviceIface"]->OutPut(ast, outDir); + cppCodeEmitters_["driver"]->OutPut(ast, outDir); + cppCodeEmitters_["stub"]->OutPut(ast, outDir); + cppCodeEmitters_["impl"]->OutPut(ast, outDir); + } + break; + } + case ASTFileType::AST_ICALLBACK: + cppCodeEmitters_["clientIface"]->OutPut(ast, outDir); + cppCodeEmitters_["proxy"]->OutPut(ast, outDir); + cppCodeEmitters_["serviceIface"]->OutPut(ast, outDir); + cppCodeEmitters_["driver"]->OutPut(ast, outDir); + cppCodeEmitters_["stub"]->OutPut(ast, outDir); + cppCodeEmitters_["impl"]->OutPut(ast, outDir); + break; + default: + break; + } +} + +void CodeGenerator::GenerateJavaCode(const AutoPtr& ast, const String& outDir, const String& codePart) +{ + switch (ast->GetASTFileType()) { + case ASTFileType::AST_IFACE: + javaCodeEmitters_["clientIface"]->OutPut(ast, outDir); + javaCodeEmitters_["proxy"]->OutPut(ast, outDir); + break; + case ASTFileType::AST_ICALLBACK: + javaCodeEmitters_["clientIface"]->OutPut(ast, outDir); + javaCodeEmitters_["proxy"]->OutPut(ast, outDir); + break; + default: + break; + } +} + +} // namespace HDI +} // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/code_generator.h b/tools/hdi-gen/codegen/code_generator.h index 9e001033..c5f0f59f 100755 --- a/tools/hdi-gen/codegen/code_generator.h +++ b/tools/hdi-gen/codegen/code_generator.h @@ -9,21 +9,31 @@ #ifndef OHOS_HDI_CODEGENERATOR_H #define OHOS_HDI_CODEGENERATOR_H +#include "codegen/code_emitter.h" #include "ast/ast_module.h" namespace OHOS { namespace HDI { +using CodeEmitMap = std::unordered_map, StringHashFunc, StringEqualFunc>; + class CodeGenerator : public LightRefCountBase { public: - CodeGenerator(const AutoPtr& astModule, const String& targetDirectory) - : LightRefCountBase(), astModule_(astModule), targetDirectory_(targetDirectory) {} + explicit CodeGenerator(const AutoPtr& astModule) + : LightRefCountBase(), astModule_(astModule), targetDirectory_() {} - virtual ~CodeGenerator() = default; + bool Generate(); +private: + void GenerateCCode(const AutoPtr& ast, const String& outDir, const String& codePart, + bool isKernel); + void GenerateCppCode(const AutoPtr& ast, const String& outDir, const String& codePart); + void GenerateJavaCode(const AutoPtr& ast, const String& outDir, const String& codePart); - virtual bool Generate() = 0; -protected: AutoPtr astModule_; String targetDirectory_; + + static CodeEmitMap cCodeEmitters_; + static CodeEmitMap cppCodeEmitters_; + static CodeEmitMap javaCodeEmitters_; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp index bb8941be..6a85a0d2 100755 --- a/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp @@ -15,11 +15,11 @@ namespace HDI { bool CppClientInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/client/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/client/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } 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 5ba2bf29..2ef74107 100755 --- a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp @@ -16,11 +16,11 @@ namespace HDI { bool CppClientProxyCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/client/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/client/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } diff --git a/tools/hdi-gen/codegen/cpp_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_code_emitter.cpp index a0b6d11b..74b14832 100755 --- a/tools/hdi-gen/codegen/cpp_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_code_emitter.cpp @@ -16,68 +16,6 @@ namespace OHOS { namespace HDI { -bool CppCodeEmitter::OutPut(const AutoPtr& ast, const String& targetDirectory) -{ - if (!Reset(ast, targetDirectory)) { - return false; - } - - EmitCode(); - return true; -} - -bool CppCodeEmitter::Reset(const AutoPtr& ast, const String& targetDirectory) -{ - if (ast == nullptr) { - return false; - } - - if (targetDirectory.Equals("")) { - return false; - } - - CleanData(); - ast_ = ast; - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - interface_ = ast_->GetInterfaceDef(); - interfaceName_ = interface_->GetName(); - interfaceFullName_ = interface_->GetNamespace()->ToString() + interfaceName_; - infName_ = interfaceName_.StartsWith("I") ? interfaceName_.Substring(1) : interfaceName_; - proxyName_ = infName_ + "Proxy"; - proxyFullName_ = interface_->GetNamespace()->ToString() + proxyName_; - - stubName_ = infName_ + "Stub"; - stubFullName_ = interface_->GetNamespace()->ToString() + stubName_; - - implName_ = infName_ + "Service"; - implFullName_ = interface_->GetNamespace()->ToString() + implName_; - } else if (ast_->GetASTFileType() == ASTFileType::AST_TYPES) { - infName_ = ast_->GetName(); - } - - if (!ResolveDirectory(targetDirectory)) { - return false; - } - - return true; -} - -void CppCodeEmitter::CleanData() -{ - ast_ = nullptr; - interface_ = nullptr; - directory_ = ""; - interfaceName_ = ""; - interfaceFullName_ = ""; - infName_ = ""; - proxyName_ = ""; - proxyFullName_ = ""; - stubName_ = ""; - stubFullName_ = ""; - implName_ = ""; - implFullName_ = ""; -} - String CppCodeEmitter::FileName(const String& name) { if (name.IsEmpty()) { diff --git a/tools/hdi-gen/codegen/cpp_code_emitter.h b/tools/hdi-gen/codegen/cpp_code_emitter.h index 127161dc..c46a6ff0 100755 --- a/tools/hdi-gen/codegen/cpp_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_code_emitter.h @@ -10,14 +10,14 @@ #define OHOS_HDI_CPP_CODE_EMITTER_H #include "ast/ast.h" +#include "codegen/code_emitter.h" #include "util/autoptr.h" -#include "util/light_refcount_base.h" #include "util/string.h" #include "util/string_builder.h" namespace OHOS { namespace HDI { -class CppCodeEmitter : public LightRefCountBase { +class CppCodeEmitter : public CodeEmitter { public: virtual ~CppCodeEmitter() = default; @@ -25,14 +25,6 @@ public: static String FileName(const String& name); protected: - bool Reset(const AutoPtr& ast, const String& targetDirectory); - - void CleanData(); - - virtual bool ResolveDirectory(const String& targetDirectory) = 0; - - virtual void EmitCode() = 0; - void EmitInterfaceMethodCommands(StringBuilder& sb, const String& prefix); void EmitInterfaceMethodParameter(const AutoPtr& param, StringBuilder& sb, const String& prefix); @@ -77,20 +69,6 @@ protected: } String SpecificationParam(StringBuilder& sb, const String& prefix); - - AutoPtr ast_ = nullptr; - AutoPtr interface_ = nullptr; - String directory_; - - String interfaceName_; - String interfaceFullName_; - String infName_; - String proxyName_; - String proxyFullName_; - String stubName_; - String stubFullName_; - String implName_; - String implFullName_; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/cpp_code_generator.cpp b/tools/hdi-gen/codegen/cpp_code_generator.cpp deleted file mode 100755 index 7adb9e7a..00000000 --- a/tools/hdi-gen/codegen/cpp_code_generator.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "cpp_code_generator.h" -#include -#include -#include -#include "codegen/cpp_client_interface_code_emitter.h" -#include "codegen/cpp_client_proxy_code_emitter.h" -#include "codegen/cpp_custom_types_code_emitter.h" -#include "codegen/cpp_service_driver_code_emitter.h" -#include "codegen/cpp_service_impl_code_emitter.h" -#include "codegen/cpp_service_interface_code_emitter.h" -#include "codegen/cpp_service_stub_code_emitter.h" -#include "util/file.h" -#include "util/logger.h" - -namespace OHOS { -namespace HDI { -bool CppCodeGenerator::Generate() -{ - Initializate(); - - for (auto& astPair : astModule_->GetAllAsts()) { - AutoPtr ast = astPair.second; - switch (ast->GetASTFileType()) { - case ASTFileType::AST_TYPES: { - emitters_["types"]->OutPut(ast, targetDirectory_); - break; - } - case ASTFileType::AST_IFACE: - case ASTFileType::AST_ICALLBACK: { - emitters_["clientIface"]->OutPut(ast, targetDirectory_); - emitters_["proxy"]->OutPut(ast, targetDirectory_); - emitters_["serviceIface"]->OutPut(ast, targetDirectory_); - emitters_["driver"]->OutPut(ast, targetDirectory_); - emitters_["stub"]->OutPut(ast, targetDirectory_); - emitters_["impl"]->OutPut(ast, targetDirectory_); - break; - } - default: - break; - } - } - return true; -} - -void CppCodeGenerator::Initializate() -{ - emitters_ = { - {"types", new CppCustomTypesCodeEmitter()}, - {"clientIface", new CppClientInterfaceCodeEmitter()}, - {"proxy", new CppClientProxyCodeEmitter()}, - {"serviceIface", new CppServiceInterfaceCodeEmitter()}, - {"driver", new CppServiceDriverCodeEmitter()}, - {"stub", new CppServiceStubCodeEmitter()}, - {"impl", new CppServiceImplCodeEmitter()}, - }; -} -} // namespace HDI -} // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/cpp_code_generator.h b/tools/hdi-gen/codegen/cpp_code_generator.h deleted file mode 100755 index 5adc37ed..00000000 --- a/tools/hdi-gen/codegen/cpp_code_generator.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef OHOS_HDI_CPP_CODE_GENERATOR_H -#define OHOS_HDI_CPP_CODE_GENERATOR_H - -#include "codegen/code_generator.h" -#include "codegen/cpp_code_emitter.h" - -namespace OHOS { -namespace HDI { -class CppCodeGenerator : public CodeGenerator { -public: - using CppCodeEmitMap = std::unordered_map, StringHashFunc, StringEqualFunc>; - - CppCodeGenerator(const AutoPtr& astModule, const String& targetDirectory) - : CodeGenerator(astModule, targetDirectory), emitters_() {} - - ~CppCodeGenerator() = default; - - bool Generate() override; -private: - void Initializate(); - - CppCodeEmitMap emitters_; -}; -} // namespace HDI -} // namespace OHOS - -#endif // OHOS_HDI_CPP_CODE_GENERATOR_H \ No newline at end of file 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 f6a6d1d4..248b801e 100755 --- a/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp @@ -18,7 +18,8 @@ bool CppCustomTypesCodeEmitter::ResolveDirectory(const String& targetDirectory) return false; } - directory_ = String::Format("%s/%s/", targetDirectory.string(), FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); if (!File::CreateParentDir(directory_)) { Logger::E("CppCustomTypesCodeEmitter", "Create '%s' failed!", directory_.string()); return false; diff --git a/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp index 1c5dacf1..21a84322 100755 --- a/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp @@ -18,7 +18,8 @@ bool CppServiceDriverCodeEmitter::ResolveDirectory(const String& targetDirectory return false; } - directory_ = String::Format("%s/%s/server/", targetDirectory.string(), FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); if (!File::CreateParentDir(directory_)) { Logger::E("CppServiceDriverCodeEmitter", "Create '%s' failed!", directory_.string()); return false; @@ -147,7 +148,13 @@ void CppServiceDriverCodeEmitter::EmitDriverRelease(StringBuilder& sb) { sb.AppendFormat("void Hdf%sDriverRelease(struct HdfDeviceObject *deviceObject)", infName_.string()); sb.Append("{\n"); - sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverRelease enter.\");\n", interfaceName_.string()); + sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverRelease enter.\");\n\n", interfaceName_.string()); + sb.Append(g_tab).AppendFormat("struct Hdf%sService *hdf%sService = CONTAINER_OF(\n", + infName_.string(), infName_.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("deviceObject->service, struct Hdf%sService, ioservice);\n", + infName_.string()); + sb.Append(g_tab).AppendFormat("%sStubRelease(hdf%sService->instance);\n", infName_.string(), infName_.string()); + sb.Append(g_tab).AppendFormat("OsalMemFree(hdf%sService);\n", infName_.string()); sb.Append("}\n"); } diff --git a/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp index e06b157a..1d0d0e7d 100755 --- a/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp @@ -15,11 +15,11 @@ namespace HDI { bool CppServiceImplCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/server/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } diff --git a/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.cpp index 03dbe5bd..5081476d 100755 --- a/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.cpp @@ -15,11 +15,11 @@ namespace HDI { bool CppServiceInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/server/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } 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 a2bfac6b..aae2b7c4 100755 --- a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp @@ -15,11 +15,11 @@ namespace HDI { bool CppServiceStubCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/server/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } diff --git a/tools/hdi-gen/codegen/generator_factory.cpp b/tools/hdi-gen/codegen/generator_factory.cpp deleted file mode 100755 index e866efc9..00000000 --- a/tools/hdi-gen/codegen/generator_factory.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "codegen/generator_factory.h" -#include "codegen/c_code_generator.h" -#include "codegen/cpp_code_generator.h" -#include "codegen/java_code_generator.h" - -namespace OHOS { -namespace HDI { -GeneratorFactory& GeneratorFactory::GetInstance() -{ - static GeneratorFactory factory; - return factory; -} - -AutoPtr GeneratorFactory::GetCodeGenerator(const AutoPtr& astModule, - const String& targetLanuage, const String& targetDirectory) -{ - if (targetLanuage.Equals("c")) { - return new CCodeGenerator(astModule, targetDirectory); - } else if (targetLanuage.Equals("cpp")) { - return new CppCodeGenerator(astModule, targetDirectory); - } else if (targetLanuage.Equals("java")) { - return new JavaCodeGenerator(astModule, targetDirectory); - } - - return nullptr; -} -} // namespace HDI -} // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/generator_factory.h b/tools/hdi-gen/codegen/generator_factory.h deleted file mode 100755 index b572cc73..00000000 --- a/tools/hdi-gen/codegen/generator_factory.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef OHOS_HDI_GENERATORFACTORY_H -#define OHOS_HDI_GENERATORFACTORY_H - -#include "ast/ast_module.h" -#include "codegen/code_generator.h" - -namespace OHOS { -namespace HDI { -class GeneratorFactory { -public: - GeneratorFactory(const GeneratorFactory&) = default; - - GeneratorFactory& operator=(const GeneratorFactory&) = default; - - ~GeneratorFactory() = default; - - static GeneratorFactory& GetInstance(); - - AutoPtr GetCodeGenerator(const AutoPtr& astModule, const String& targetLanuage, - const String& targetDirectory); -private: - GeneratorFactory() = default; -}; -} // namespace HDI -} // namespace OHOS - -#endif // OHOS_HDI_GENERATORFACTORY_H \ No newline at end of file diff --git a/tools/hdi-gen/codegen/java_client_interface_code_emitter.cpp b/tools/hdi-gen/codegen/java_client_interface_code_emitter.cpp index 7f1c613c..14b56a2e 100755 --- a/tools/hdi-gen/codegen/java_client_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/java_client_interface_code_emitter.cpp @@ -16,11 +16,11 @@ namespace HDI { bool JavaClientInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } diff --git a/tools/hdi-gen/codegen/java_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/java_client_proxy_code_emitter.cpp index accefc66..3e3689bb 100755 --- a/tools/hdi-gen/codegen/java_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/java_client_proxy_code_emitter.cpp @@ -14,11 +14,11 @@ namespace HDI { bool JavaClientProxyCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } diff --git a/tools/hdi-gen/codegen/java_code_emitter.cpp b/tools/hdi-gen/codegen/java_code_emitter.cpp index b96e34c8..69716cdb 100755 --- a/tools/hdi-gen/codegen/java_code_emitter.cpp +++ b/tools/hdi-gen/codegen/java_code_emitter.cpp @@ -13,58 +13,6 @@ namespace OHOS { namespace HDI { -bool JavaCodeEmitter::OutPut(const AutoPtr& ast, const String& targetDirectory) -{ - if (!Reset(ast, targetDirectory)) { - return false; - } - - EmitCode(); - return true; -} - -bool JavaCodeEmitter::Reset(const AutoPtr& ast, const String& targetDirectory) -{ - if (ast == nullptr) { - return false; - } - - if (targetDirectory.Equals("")) { - return false; - } - - CleanData(); - ast_ = ast; - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - interface_ = ast_->GetInterfaceDef(); - interfaceName_ = interface_->GetName(); - interfaceFullName_ = interface_->GetNamespace()->ToString() + interfaceName_; - infName_ = interfaceName_.StartsWith("I") ? interfaceName_.Substring(1) : interfaceName_; - proxyName_ = infName_ + "Proxy"; - proxyFullName_ = interface_->GetNamespace()->ToString() + proxyName_; - } else if (ast_->GetASTFileType() == ASTFileType::AST_TYPES) { - infName_ = ast_->GetName(); - } - - if (!ResolveDirectory(targetDirectory)) { - return false; - } - - return true; -} - -void JavaCodeEmitter::CleanData() -{ - ast_ = nullptr; - interface_ = nullptr; - directory_ = ""; - interfaceName_ = ""; - interfaceFullName_ = ""; - infName_ = ""; - proxyName_ = ""; - proxyFullName_ = ""; -} - String JavaCodeEmitter::FileName(const String& name) { if (name.IsEmpty()) { diff --git a/tools/hdi-gen/codegen/java_code_emitter.h b/tools/hdi-gen/codegen/java_code_emitter.h index 32c1a99a..d8b2360a 100755 --- a/tools/hdi-gen/codegen/java_code_emitter.h +++ b/tools/hdi-gen/codegen/java_code_emitter.h @@ -10,6 +10,7 @@ #define OHOS_HDI_JAVA_CODE_EMITTER_H #include "ast/ast.h" +#include "codegen/code_emitter.h" #include "util/autoptr.h" #include "util/light_refcount_base.h" #include "util/string.h" @@ -17,22 +18,12 @@ namespace OHOS { namespace HDI { -class JavaCodeEmitter : public LightRefCountBase { +class JavaCodeEmitter : public CodeEmitter { public: virtual ~JavaCodeEmitter() = default; - bool OutPut(const AutoPtr& ast, const String& targetDirectory); - static String FileName(const String& name); protected: - bool Reset(const AutoPtr& ast, const String& targetDirectory); - - void CleanData(); - - virtual bool ResolveDirectory(const String& targetDirectory) = 0; - - virtual void EmitCode() = 0; - bool CreateDirectory(); void EmitLicense(StringBuilder& sb); @@ -46,16 +37,6 @@ protected: String ConstantName(const String& name); String SpecificationParam(StringBuilder& paramSb, const String& prefix); - - AutoPtr ast_ = nullptr; - AutoPtr interface_ = nullptr; - String directory_; - - String interfaceName_; - String interfaceFullName_; - String infName_; - String proxyName_; - String proxyFullName_; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/java_code_generator.cpp b/tools/hdi-gen/codegen/java_code_generator.cpp deleted file mode 100755 index 5cae0885..00000000 --- a/tools/hdi-gen/codegen/java_code_generator.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "java_code_generator.h" -#include -#include -#include -#include "codegen/java_client_interface_code_emitter.h" -#include "codegen/java_client_proxy_code_emitter.h" -#include "util/file.h" -#include "util/logger.h" - -namespace OHOS { -namespace HDI { -bool JavaCodeGenerator::Generate() -{ - Initializate(); - - for (auto& astPair : astModule_->GetAllAsts()) { - AutoPtr ast = astPair.second; - switch (ast->GetASTFileType()) { - case ASTFileType::AST_IFACE: - case ASTFileType::AST_ICALLBACK: { - emitters_["clientIface"]->OutPut(ast, targetDirectory_); - emitters_["proxy"]->OutPut(ast, targetDirectory_); - break; - } - default: - break; - } - } - return true; -} - -void JavaCodeGenerator::Initializate() -{ - emitters_ = { - {"clientIface", new JavaClientInterfaceCodeEmitter()}, - {"proxy", new JavaClientProxyCodeEmitter()}, - }; -} -} // namespace HDI -} // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/java_code_generator.h b/tools/hdi-gen/codegen/java_code_generator.h deleted file mode 100755 index 0274854e..00000000 --- a/tools/hdi-gen/codegen/java_code_generator.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef OHOS_HDI_JAVA_CODE_GENERATOR_H -#define OHOS_HDI_JAVA_CODE_GENERATOR_H - -#include "codegen/code_generator.h" -#include "codegen/java_code_emitter.h" - -namespace OHOS { -namespace HDI { -class JavaCodeGenerator : public CodeGenerator { -public: - using JavaCodeEmitMap = std::unordered_map, StringHashFunc, StringEqualFunc>; - - JavaCodeGenerator(const AutoPtr& astModule, const String& targetDirectory) - : CodeGenerator(astModule, targetDirectory), emitters_() {} - - ~JavaCodeGenerator() override {}; - - bool Generate() override; -private: - void Initializate(); - - JavaCodeEmitMap emitters_; -}; -} // namespace HDI -} // namespace OHOS - -#endif // OHOS_HDI_JAVA_CODE_GENERATOR_H \ No newline at end of file diff --git a/tools/hdi-gen/main.cpp b/tools/hdi-gen/main.cpp index e54e597a..00c6e853 100755 --- a/tools/hdi-gen/main.cpp +++ b/tools/hdi-gen/main.cpp @@ -7,7 +7,6 @@ */ #include "codegen/code_generator.h" -#include "codegen/generator_factory.h" #include "parser/module_parser.h" #include "util/file.h" #include "util/logger.h" @@ -57,9 +56,7 @@ int main(int argc, char** argv) return 0; } - AutoPtr codeGen = GeneratorFactory::GetInstance().GetCodeGenerator(astModule, - options.GetTargetLanguage(), options.GetGenerationDirectory()); - if (!codeGen->Generate()) { + if (!CodeGenerator(astModule).Generate()) { Logger::E("hdi-gen", "Generate \"%s\" codes failed.", options.GetTargetLanguage().string()); return -1; } diff --git a/tools/hdi-gen/parser/Makefile b/tools/hdi-gen/parser/Makefile deleted file mode 100755 index 186125b5..00000000 --- a/tools/hdi-gen/parser/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -OBJS_DIR:=$(BUILD_DIR)/parser -TARGET = $(OBJS_DIR)/parser.a -SOURCE:=$(wildcard *.cpp) -OBJS:=$(patsubst %.cpp, $(OBJS_DIR)/%.o, $(SOURCE)) - -$(TARGET):$(OBJS) - $(Q) echo $(TARGET) - $(Q) ar -rc $@ $^ - -$(OBJS_DIR)/%.o:%.cpp - $(Q) mkdir -p $(dir $@) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ \ No newline at end of file diff --git a/tools/hdi-gen/parser/module_parser.h b/tools/hdi-gen/parser/module_parser.h index 934ef45e..4041d914 100755 --- a/tools/hdi-gen/parser/module_parser.h +++ b/tools/hdi-gen/parser/module_parser.h @@ -9,8 +9,8 @@ #ifndef OHOS_HDI_MODULE_PARSER_H #define OHOS_HDI_MODULE_PARSER_H -#include #include +#include #include "ast/ast_module.h" #include "parser/file_detail.h" #include "util/options.h" diff --git a/tools/hdi-gen/parser/parser.cpp b/tools/hdi-gen/parser/parser.cpp index 26d4f5fd..4a47a31d 100755 --- a/tools/hdi-gen/parser/parser.cpp +++ b/tools/hdi-gen/parser/parser.cpp @@ -1223,6 +1223,20 @@ bool Parser::CheckType(int lineNo, int columnNo, const AutoPtr& type) LogError(lineNo, columnNo, String::Format("The sequenceable type is not supported by c language.")); return false; } + + if (options_.DoGenerateKernelCode()) { + switch (type->GetTypeKind()) { + case TypeKind::TYPE_FLOAT: + case TypeKind::TYPE_DOUBLE: + case TypeKind::TYPE_FILEDESCRIPTOR: + case TypeKind::TYPE_INTERFACE: + LogError(lineNo, columnNo, String::Format("The '%s' type is not supported by c language.", + lexer_->DumpToken().string())); + break; + default: + break; + } + } } else if (options_.GetTargetLanguage().Equals("java")) { switch (type->GetTypeKind()) { case TypeKind::TYPE_UCHAR: @@ -1354,8 +1368,14 @@ bool Parser::IsValidTypeName(const String& typeName) */ bool Parser::CheckPackageName(const String& filePath, const String& packageName) { - String pkgToPath = packageName.Replace('.', '/'); - int index = filePath.LastIndexOf('/'); +#ifndef __MINGW32__ + char delimiter = '/'; +#else + char delimiter = '\\'; +#endif + + String pkgToPath = packageName.Replace('.', delimiter); + int index = filePath.LastIndexOf(delimiter); if (index == -1) { return false; } diff --git a/tools/hdi-gen/test/kernel_test/array_test/v1_0/ArrayTypes.idl b/tools/hdi-gen/test/kernel_test/array_test/v1_0/ArrayTypes.idl new file mode 100755 index 00000000..404b2de0 --- /dev/null +++ b/tools/hdi-gen/test/kernel_test/array_test/v1_0/ArrayTypes.idl @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +package test.kernel_test.array_test.v1_0; + +enum AESample +{ + MEM_ONE, + MEM_TWO, + MEM_THREE, +}; + +struct ASSample +{ + boolean m1; + int m2; + String m4; +}; + +union AUSample +{ + boolean m1; + int m2; +}; \ No newline at end of file diff --git a/tools/hdi-gen/test/kernel_test/array_test/v1_0/IArrayTest.idl b/tools/hdi-gen/test/kernel_test/array_test/v1_0/IArrayTest.idl new file mode 100755 index 00000000..b1e5720c --- /dev/null +++ b/tools/hdi-gen/test/kernel_test/array_test/v1_0/IArrayTest.idl @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +package test.kernel_test.array_test.v1_0; + +import test.kernel_test.array_test.v1_0.ArrayTypes; + +interface IArrayTest { + + BoolArrayTest([in] boolean[] param1, [out] boolean[] param2); + + ByteArrayTest([in] byte[] param1, [out] byte[] param2); + + ShortArrayTest([in] short[] param1, [out] short[] param2); + + IntArrayTest([in] int[] param1, [out] int[] param2); + + LongArrayTest([in] long[] param1, [out] long[] param2); + + UCharArrayTest([in] unsigned char[] param1, [out] unsigned char[] param2); + + UShortArrayTest([in] unsigned short[] param1, [out] unsigned short[] param2); + + UIntArrayTest([in] unsigned int[] param1, [out] unsigned int[] param2); + + ULongArrayTest([in] unsigned long[] param1, [out] unsigned long[] param2); + + StringArrayTest([in] String[] param1, [out] String[] param2); + + EnumArrayTest([in] enum AESample[] param1, [out] enum AESample[] param2); + + StructArrayTest([in] struct ASSample[] param1, [out] struct ASSample[] param2); + + UnionArrayTest([in] union AUSample[] param1, [out] union AUSample[] param2); +} \ No newline at end of file diff --git a/tools/hdi-gen/test/kernel_test/data_test/v1_0/DataTypes.idl b/tools/hdi-gen/test/kernel_test/data_test/v1_0/DataTypes.idl new file mode 100755 index 00000000..08057e24 --- /dev/null +++ b/tools/hdi-gen/test/kernel_test/data_test/v1_0/DataTypes.idl @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +package test.kernel_test.data_test.v1_0; + +enum DESample +{ + MEM_ONE, + MEM_TWO, + MEM_THREE, +}; + +struct DSSample +{ + boolean m1; + int m2; + String m4; +}; + +union DUSample +{ + boolean m1; + int m2; +}; \ No newline at end of file diff --git a/tools/hdi-gen/test/kernel_test/data_test/v1_0/IDataTest.idl b/tools/hdi-gen/test/kernel_test/data_test/v1_0/IDataTest.idl new file mode 100755 index 00000000..44247114 --- /dev/null +++ b/tools/hdi-gen/test/kernel_test/data_test/v1_0/IDataTest.idl @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +package test.kernel_test.data_test.v1_0; + +import test.kernel_test.data_test.v1_0.DataTypes; + +interface IDataTest { + + BoolTest([in] boolean param1, [out] boolean param2); + + ByteTest([in] byte param1, [out] byte param2); + + ShortTest([in] short param1, [out] short param2); + + IntTest([in] int param1, [out] int param2); + + LongTest([in] long param1, [out] long param2); + + UCharTest([in] unsigned char param1, [out] unsigned char param2); + + UShortTest([in] unsigned short param1, [out] unsigned short param2); + + UIntTest([in] unsigned int param1, [out] unsigned int param2); + + ULongTest([in] unsigned long param1, [out] unsigned long param2); + + StringTest([in] String param1, [out] String param2); + + EnumTest([in] enum DESample param1, [out] enum DESample param2); + + StructTest([in] struct DSSample param1, [out] struct DSSample param2); + + UnionTest([in] union DUSample param1, [out] union DUSample param2); +} \ No newline at end of file diff --git a/tools/hdi-gen/test/kernel_test/list_test/v1_0/IListTest.idl b/tools/hdi-gen/test/kernel_test/list_test/v1_0/IListTest.idl new file mode 100755 index 00000000..ae68dc27 --- /dev/null +++ b/tools/hdi-gen/test/kernel_test/list_test/v1_0/IListTest.idl @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +package test.kernel_test.list_test.v1_0; + +import test.kernel_test.list_test.v1_0.ListTypes; + +interface IListTest { + + BoolListTest([in] List param1, [out] List param2); + + ByteListTest([in] List param1, [out] List param2); + + ShortListTest([in] List param1, [out] List param2); + + IntListTest([in] List param1, [out] List param2); + + LongListTest([in] List param1, [out] List param2); + + UCharListTest([in] List param1, [out] List param2); + + UShortListTest([in] List param1, [out] List param2); + + UIntListTest([in] List param1, [out] List param2); + + ULongListTest([in] List param1, [out] List param2); + + StringListTest([in] List param1, [out] List param2); + + EnumListTest([in] List param1, [out] List param2); + + StructListTest([in] List param1, [out] List param2); + + UnionListTest([in] List param1, [out] List param2); +} \ No newline at end of file diff --git a/tools/hdi-gen/test/kernel_test/list_test/v1_0/ListTypes.idl b/tools/hdi-gen/test/kernel_test/list_test/v1_0/ListTypes.idl new file mode 100755 index 00000000..f693a321 --- /dev/null +++ b/tools/hdi-gen/test/kernel_test/list_test/v1_0/ListTypes.idl @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +package test.kernel_test.list_test.v1_0; + +enum LESample +{ + MEM_ONE, + MEM_TWO, + MEM_THREE, +}; + +struct LSSample +{ + boolean m1; + int m2; + String m4; +}; + +union LUSample +{ + boolean m1; + int m2; +}; \ No newline at end of file diff --git a/tools/hdi-gen/test/kernel_test/struct_test/v1_0/IStructTest.idl b/tools/hdi-gen/test/kernel_test/struct_test/v1_0/IStructTest.idl new file mode 100755 index 00000000..4580b0db --- /dev/null +++ b/tools/hdi-gen/test/kernel_test/struct_test/v1_0/IStructTest.idl @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +package test.kernel_test.struct_test.v1_0; + +import test.kernel_test.struct_test.v1_0.StructTypes; + +interface IStructTest { + SSampleTest([in] struct SSample param1, [out] struct SSample param2); + SSample2Test([in] struct SSample2 param1, [out] struct SSample2 param2); + SSample3Test([in] struct SSample3 param1, [out] struct SSample3 param2); + SSample4Test([in] struct SSample4 param1, [out] struct SSample4 param2); + SSample5Test([in] struct SSample5 param1, [out] struct SSample5 param2); + SSample6Test([in] struct SSample6 param1, [out] struct SSample6 param2); +} \ No newline at end of file diff --git a/tools/hdi-gen/test/kernel_test/struct_test/v1_0/StructTypes.idl b/tools/hdi-gen/test/kernel_test/struct_test/v1_0/StructTypes.idl new file mode 100755 index 00000000..ebecca54 --- /dev/null +++ b/tools/hdi-gen/test/kernel_test/struct_test/v1_0/StructTypes.idl @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +package test.kernel_test.struct_test.v1_0; + +enum ESample +{ + MEM_ONE, + MEM_TWO, + MEM_THREE, +}; + +struct SSample +{ + boolean m1; + int m2; + String m4; +}; + +union USample +{ + boolean m1; + int m2; +}; + +struct SSample2 +{ + boolean m1; + byte m2; + short m3; + int m4; + long m5; + unsigned char m6; + unsigned short m7; + unsigned int m8; + unsigned long m9; +}; + +struct SSample3 +{ + String m1; + enum ESample m2; + struct SSample2 m3; +}; + +struct SSample4 +{ + boolean[] m1; + byte[] m2; + short[] m3; + int[] m4; + long[] m5; + unsigned char[] m6; + unsigned short[] m7; + unsigned int[] m8; + unsigned long[] m9; + String[] m12; + enum ESample[] m13; + struct SSample[] m14; +}; + +struct SSample5 +{ + List m1; + List m2; + List m3; + List m4; + List m5; + List m6; + List m7; + List m8; + List m9; + List m12; + List m13; + List m14; +}; + +struct SSample6 { + union USample m1; + union USample[] m2; + List m3; +}; \ No newline at end of file diff --git a/tools/hdi-gen/util/Makefile b/tools/hdi-gen/util/Makefile deleted file mode 100755 index dfae7c27..00000000 --- a/tools/hdi-gen/util/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -OBJS_DIR:=$(BUILD_DIR)/util -TARGET = $(OBJS_DIR)/util.a -SOURCE:=$(wildcard *.cpp) -OBJS:=$(patsubst %.cpp, $(OBJS_DIR)/%.o, $(SOURCE)) - - - -$(TARGET):$(OBJS) - $(Q) echo $(TARGET) - $(Q) ar -rc $@ $^ - -$(OBJS_DIR)/%.o:%.cpp - $(Q) mkdir -p $(dir $@) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ \ No newline at end of file diff --git a/tools/hdi-gen/util/file.cpp b/tools/hdi-gen/util/file.cpp index 319c4d3f..faaa51d9 100755 --- a/tools/hdi-gen/util/file.cpp +++ b/tools/hdi-gen/util/file.cpp @@ -182,16 +182,26 @@ bool File::CreateParentDir(const String& path) } int pos = 1; - while ((pos = path.IndexOf('/', pos)) != -1) { - String partPath = path.Substring(0, pos); +#ifndef __MINGW32__ + char Separator = '/'; +#else + char Separator = '\\'; +#endif + + while ((pos = path.IndexOf(Separator, pos)) != -1) { + String partPath = path.Substring(0, pos); struct stat st; if (stat(partPath.string(), &st) < 0) { if (errno != ENOENT) { return false; } +#ifndef __MINGW32__ if (mkdir(partPath.string(), S_IRWXU | S_IRWXG | S_IRWXO) < 0) { +#else + if (mkdir(partPath.string()) < 0) { +#endif return false; } } else if (!S_ISDIR(st.st_mode)) { @@ -202,6 +212,15 @@ bool File::CreateParentDir(const String& path) return true; } +String File::AdapterPath(const String& path) +{ +#ifndef __MINGW32__ + return path; +#else + return path.Replace('/', '\\'); +#endif +} + size_t File::GetHashKey() { StringBuilder fileStr; diff --git a/tools/hdi-gen/util/file.h b/tools/hdi-gen/util/file.h index dec9279a..94de48c8 100755 --- a/tools/hdi-gen/util/file.h +++ b/tools/hdi-gen/util/file.h @@ -60,6 +60,8 @@ public: static bool CreateParentDir(const String& path); + static String AdapterPath(const String& path); + size_t GetHashKey(); static constexpr unsigned int READ = 0x1; diff --git a/tools/hdi-gen/util/options.cpp b/tools/hdi-gen/util/options.cpp index 9f547c5a..6d872ea3 100755 --- a/tools/hdi-gen/util/options.cpp +++ b/tools/hdi-gen/util/options.cpp @@ -20,9 +20,13 @@ const char* Options::optSupportArgs = "c:d:"; static struct option g_longOpts[] = { {"help", no_argument, nullptr, 'h'}, {"version", no_argument, nullptr, 'v'}, + {"mode-k", no_argument, nullptr, 'k'}, + {"mode-u", no_argument, nullptr, 'u'}, {"gen-c", no_argument, nullptr, 'C'}, {"gen-cpp", no_argument, nullptr, 'P'}, {"gen-java", no_argument, nullptr, 'J'}, + {"client", no_argument, nullptr, 'a'}, + {"server", no_argument, nullptr, 'b'}, {"hash", no_argument, nullptr, 'H'}, {"dump-ast", no_argument, nullptr, 'D'}, {nullptr, 0, nullptr, 0} @@ -34,7 +38,7 @@ Options& Options::GetInstance() return option; } -Options& Options::Parse(int argc, char * const argv[]) +Options& Options::Parse(int argc, char* const argv[]) { program_ = argv[0]; opterr = 1; @@ -57,6 +61,12 @@ Options& Options::Parse(int argc, char * const argv[]) case 'v': doShowVersion_ = true; break; + case 'k': + doModeKernel_ = true; + break; + case 'u': + doModeKernel_ = false; + break; case 'C': doGenerateCode_ = true; targetLanguage_ = "c"; @@ -69,6 +79,14 @@ Options& Options::Parse(int argc, char * const argv[]) doGenerateCode_ = true; targetLanguage_ = "java"; break; + case 'a': + doGeneratePart_ = true; + codePart_ = "client"; + break; + case 'b': + doGeneratePart_ = true; + codePart_ = "server"; + break; case 'H': doGetHashKey_ = true; break; @@ -139,9 +157,13 @@ void Options::ShowUsage() const " --hash Display hash key of the idl file\n" " --dump-ast Display the AST of the compiled file\n" " -c Compile the .idl file\n" + " --mode-k Generate kernel-mode ioservice stub code\n" + " --mode-u Generate user-mode ioservice stub code\n" " --gen-c Generate C codes\n" " --gen-cpp Generate C++ codes\n" " --gen-java Generate Java codes\n" + " --client Generate client codes\n" + " --server Generate server codes\n" " -d Place generated codes into \n"); } } // namespace HDI diff --git a/tools/hdi-gen/util/options.h b/tools/hdi-gen/util/options.h index a8f8a7c4..0b31b04d 100755 --- a/tools/hdi-gen/util/options.h +++ b/tools/hdi-gen/util/options.h @@ -55,6 +55,11 @@ public: return doGenerateCode_; } + inline bool DoGenerateKernelCode() const + { + return doModeKernel_; + } + inline bool HasErrors() const { return !errors_.empty(); @@ -70,6 +75,11 @@ public: return targetLanguage_; } + inline String GetCodePart() const + { + return codePart_; + } + inline String GetGenerationDirectory() const { return generationDirectory_; @@ -85,6 +95,7 @@ private: Options() : program_(), sourceFilePath_(), targetLanguage_(), + codePart_("all"), generationDirectory_(), illegalOptions_(), errors_(), @@ -107,6 +118,7 @@ private: String program_; String sourceFilePath_; String targetLanguage_; + String codePart_; String generationDirectory_; String illegalOptions_; std::vector errors_; @@ -117,6 +129,8 @@ private: bool doDumpAST_ = false; bool doGetHashKey_ = false; bool doGenerateCode_ = false; + bool doModeKernel_ = false; + bool doGeneratePart_ = false; bool doOutDir_ = false; }; } // namespace HDI