From 9a3ae97e226521fdb179cbc8595643fe634db29d Mon Sep 17 00:00:00 2001 From: "evgeniy.generalov" Date: Fri, 29 Aug 2025 13:37:32 +0300 Subject: [PATCH 1/5] interop: Add support for a string array --- interop/src/cpp/napi/convertors-napi.h | 114 ++++++++++++++++++------- interop/src/cpp/types/koala-types.h | 2 +- ui2abc/libarkts/native/src/bridges.cc | 93 ++++++-------------- ui2abc/libarkts/native/src/common.cc | 21 ++--- ui2abc/libarkts/native/src/common.h | 3 +- 5 files changed, 115 insertions(+), 118 deletions(-) diff --git a/interop/src/cpp/napi/convertors-napi.h b/interop/src/cpp/napi/convertors-napi.h index 1bbd236c99..0a80ab4bfe 100644 --- a/interop/src/cpp/napi/convertors-napi.h +++ b/interop/src/cpp/napi/convertors-napi.h @@ -21,6 +21,7 @@ #include #include #include +#include #ifndef KOALA_NAPI_OHOS #include @@ -244,6 +245,44 @@ struct InteropTypeConverter { static inline void release(napi_env env, InteropType value, const KInteropReturnBuffer& converted) = delete; }; +template +ElemType* getTypedElements(napi_env env, napi_value value, size_t& bytes); + +template<> +struct InteropTypeConverter { + using InteropType = napi_value; + using SelfType = InteropTypeConverter; + static constexpr auto LengthByteSize = sizeof(KUInt); + static char* strndup(const void* str, size_t n) { + char* mem = static_cast(malloc(n + 1)); + interop_memcpy(mem, n + 1, str, n); + return mem; + } + static size_t decodeLength(const uint8_t* data) { + return (data[3] << 24) | (data[2] << 16) | (data[1] << 8) | data[0]; + } + static KStringArray convertFrom(napi_env env, InteropType value) { + size_t bytes = 0; + auto const encoded = getTypedElements(env, value, bytes); + if (!bytes) return {}; + + size_t const num = decodeLength(encoded); + auto result = std::unique_ptr(new const char*[num]); + + size_t count = 0; + auto const* ptr = encoded + LengthByteSize; + auto const* const end = encoded + bytes; + while (ptr < end) { + auto length = decodeLength(ptr); + result[count++] = SelfType::strndup(ptr + LengthByteSize, length); + ptr += LengthByteSize + length; + } + return result.release(); + } + static InteropType convertTo(napi_env env, KStringArray value) = delete; + static void release(napi_env env, InteropType value, const KInteropReturnBuffer& converted) = delete; +}; + #define KOALA_INTEROP_THROW(vmContext, object, ...) \ do { \ napi_env env = (napi_env)vmContext; \ @@ -388,35 +427,44 @@ inline napi_typedarray_type getNapiType() napi_valuetype getValueTypeChecked(napi_env env, napi_value value); bool isTypedArray(napi_env env, napi_value value); -template -inline ElemType* getTypedElements(napi_env env, napi_value value) -{ - napi_valuetype valueType = getValueTypeChecked(env, value); - if (valueType == napi_null) { - return nullptr; - } - if (!isTypedArray(env, value)) { - napi_throw_error(env, nullptr, "Expected TypedArray"); - return nullptr; - } - napi_value arrayBuffer; - void* data = nullptr; - size_t byteLength; - size_t byteOffset; - napi_typedarray_type type; - napi_status status = napi_get_typedarray_info(env, value, &type, &byteLength, &data, &arrayBuffer, &byteOffset); - KOALA_NAPI_THROW_IF_FAILED(env, status, nullptr); - if (type != getNapiType()) { - printf("Array type mismatch. Expected %d got %d\n", getNapiType(), type); - napi_throw_error(env, nullptr, "Array type mismatch"); - return nullptr; - } - return reinterpret_cast(data); -} - -template -inline ElemType* getTypedElements(const CallbackInfo& info, int index) -{ +template +inline ElemType* getTypedElements(napi_env env, napi_value value, size_t& bytesLength) { + napi_valuetype valueType = getValueTypeChecked(env, value); + if (valueType == napi_null) { + return nullptr; + } + if (!isTypedArray(env, value)) { + napi_throw_error(env, nullptr, "Expected TypedArray"); + return nullptr; + } + napi_value arrayBuffer; + void* data = nullptr; + size_t byteOffset; + napi_typedarray_type type; + napi_status status = napi_get_typedarray_info(env, + value, + &type, + &bytesLength, + &data, + &arrayBuffer, + &byteOffset); + KOALA_NAPI_THROW_IF_FAILED(env, status, nullptr); + if (type != getNapiType()) { + printf("Array type mismatch. Expected %d got %d\n", getNapiType(), type); + napi_throw_error(env, nullptr, "Array type mismatch"); + return nullptr; + } + return reinterpret_cast(data); +} + +template +inline ElemType* getTypedElements(napi_env env, napi_value value) { + size_t dummy; + return getTypedElements(env, value, dummy); +} + +template +inline ElemType* getTypedElements(const CallbackInfo& info, int index) { NAPI_ASSERT_INDEX(info, index, nullptr); return getTypedElements(info.Env(), info[index]); } @@ -571,10 +619,10 @@ inline KInteropBuffer getArgument(const CallbackInfo& info, int return getArgument((napi_env)info.Env(), (napi_value)info[index]); } -template<> -inline KFloat getArgument(const CallbackInfo& info, int index) -{ - return getFloat32(info, index); +template <> +inline KStringArray getArgument(const CallbackInfo& info, int index) { + NAPI_ASSERT_INDEX(info, index, {}); + return getArgument((napi_env)info.Env(), (napi_value)info[index]); } template<> diff --git a/interop/src/cpp/types/koala-types.h b/interop/src/cpp/types/koala-types.h index dc9102cd24..69276963de 100644 --- a/interop/src/cpp/types/koala-types.h +++ b/interop/src/cpp/types/koala-types.h @@ -236,7 +236,7 @@ typedef InteropNativePointer KNativePointer; typedef KStringPtrImpl KStringPtr; typedef KFloat* KFloatArray; -typedef const uint8_t* KStringArray; +typedef const char** KStringArray; // fixme: unique_ptr typedef KNativePointer* KNativePointerArray; struct KSerializerBufferOpaque { diff --git a/ui2abc/libarkts/native/src/bridges.cc b/ui2abc/libarkts/native/src/bridges.cc index d19ed1a884..598f58308e 100644 --- a/ui2abc/libarkts/native/src/bridges.cc +++ b/ui2abc/libarkts/native/src/bridges.cc @@ -223,23 +223,18 @@ KNativePointer impl_CreateGlobalContext( KNativePointer configPtr, KStringArray externalFileListPtr, KUInt fileNum, KBoolean LspUsage) { auto config = reinterpret_cast(configPtr); - const int headerLen = 4; - const char** files = StageArena::allocArray(fileNum); - uint8_t* filesPtr = (uint8_t*)externalFileListPtr; - std::size_t position = headerLen; - std::size_t strLen; - for (std::size_t i = 0; i < static_cast(fileNum); ++i) { - strLen = unpackUInt(filesPtr + position); - position += headerLen; - files[i] = StageArena::strdup(std::string(reinterpret_cast(filesPtr + position), strLen).c_str()); - position += strLen; - } - return GetImpl()->CreateGlobalContext(config, files, fileNum, LspUsage); + return GetImpl()->CreateGlobalContext(config, getStringArray(externalFileListPtr), fileNum, LspUsage); } KOALA_INTEROP_4(CreateGlobalContext, KNativePointer, KNativePointer, KStringArray, KUInt, KBoolean) -void impl_DestroyGlobalContext(KNativePointer globalContextPtr) -{ +KNativePointer impl_mytest(KStringArray sa) { + printf("mytest: array=%p\n", sa); + printf("mytest: array=%p, array[0]=%s\n", sa, sa[0]); + return nullptr; +} +KOALA_INTEROP_1(mytest, KNativePointer, KStringArray) + +void impl_DestroyGlobalContext(KNativePointer globalContextPtr) { auto globalContext = reinterpret_cast(globalContextPtr); GetImpl()->DestroyGlobalContext(globalContext); } @@ -431,18 +426,8 @@ KNativePointer impl_CreateDiagnosticInfo( { const auto _context = reinterpret_cast(context); const auto _kind = reinterpret_cast(kind); - const auto _pos = reinterpret_cast(pos); - const std::size_t headerLen = 4; - const char** _args = new const char*[argc]; - std::size_t position = headerLen; - std::size_t strLen; - for (std::size_t i = 0; i < static_cast(argc); ++i) { - strLen = unpackUInt(argsPtr + position); - position += headerLen; - _args[i] = strdup(std::string(reinterpret_cast(argsPtr + position), strLen).c_str()); - position += strLen; - } - return GetImpl()->CreateDiagnosticInfo(_context, _kind, _args, argc, _pos); + const auto _pos = reinterpret_cast(pos); + return GetImpl()->CreateDiagnosticInfo(_context, _kind, getStringArray(argsPtr), argc, _pos); } KOALA_INTEROP_5( CreateDiagnosticInfo, KNativePointer, KNativePointer, KNativePointer, KStringArray, KInt, KNativePointer) @@ -453,40 +438,20 @@ KNativePointer impl_CreateSuggestionInfo(KNativePointer context, KNativePointer const auto _context = reinterpret_cast(context); const auto _kind = reinterpret_cast(kind); const auto _title = getStringCopy(title); - const auto _range = reinterpret_cast(range); - const std::size_t headerLen = 4; - const char** _args = new const char*[argc]; - std::size_t position = headerLen; - std::size_t strLen; - for (std::size_t i = 0; i < static_cast(argc); ++i) { - strLen = unpackUInt(argsPtr + position); - position += headerLen; - _args[i] = strdup(std::string(reinterpret_cast(argsPtr + position), strLen).c_str()); - position += strLen; - } + const auto _range = reinterpret_cast(range); const auto _substitutionCode = getStringCopy(substitutionCode); - return GetImpl()->CreateSuggestionInfo(_context, _kind, _args, argc, _substitutionCode, _title, _range); + return GetImpl()->CreateSuggestionInfo(_context, _kind, getStringArray(argsPtr), argc, _substitutionCode, _title, _range); } -KOALA_INTEROP_7(CreateSuggestionInfo, KNativePointer, KNativePointer, KNativePointer, KStringArray, KInt, KStringPtr, - KStringPtr, KNativePointer) +KOALA_INTEROP_7(CreateSuggestionInfo, KNativePointer, KNativePointer, KNativePointer, KStringArray, KInt, + KStringPtr, KStringPtr, KNativePointer) -void impl_LogDiagnostic( - KNativePointer context, KNativePointer kind, KStringArray argvPtr, KInt argc, KNativePointer pos) +void impl_LogDiagnostic(KNativePointer context, KNativePointer kind, KStringArray argvPtr, + KInt argc, KNativePointer pos) { - auto&& _context_ = reinterpret_cast(context); - auto&& _kind_ = reinterpret_cast(kind); - auto&& _pos_ = reinterpret_cast(pos); - const std::size_t headerLen = 4; - const char** argv = new const char*[argc]; - std::size_t position = headerLen; - std::size_t strLen; - for (std::size_t i = 0; i < static_cast(argc); ++i) { - strLen = unpackUInt(argvPtr + position); - position += headerLen; - argv[i] = strdup(std::string(reinterpret_cast(argvPtr + position), strLen).c_str()); - position += strLen; - } - GetImpl()->LogDiagnostic(_context_, _kind_, argv, argc, _pos_); + auto&& _context_ = reinterpret_cast(context); + auto&& _kind_ = reinterpret_cast(kind); + auto&& _pos_ = reinterpret_cast(pos); + GetImpl()->LogDiagnostic(_context_, _kind_, getStringArray(argvPtr), argc, _pos_); } KOALA_INTEROP_V5(LogDiagnostic, KNativePointer, KNativePointer, KStringArray, KInt, KNativePointer) @@ -514,18 +479,8 @@ KOALA_INTEROP_7(GenerateTsDeclarationsFromContext, KInt, KNativePointer, KString KNativePointer impl_CreateContextGenerateAbcForExternalSourceFiles( KNativePointer configPtr, KInt fileNamesCount, KStringArray fileNames) { - auto config = reinterpret_cast(configPtr); - const std::size_t headerLen = 4; - const char** argv = new const char*[static_cast(fileNamesCount)]; - std::size_t position = headerLen; - std::size_t strLen; - for (std::size_t i = 0; i < static_cast(fileNamesCount); ++i) { - strLen = unpackUInt(fileNames + position); - position += headerLen; - argv[i] = strdup(std::string(reinterpret_cast(fileNames + position), strLen).c_str()); - position += strLen; - } - return GetImpl()->CreateContextGenerateAbcForExternalSourceFiles(config, fileNamesCount, argv); + auto config = reinterpret_cast(configPtr); + return GetImpl()->CreateContextGenerateAbcForExternalSourceFiles(config, fileNamesCount, getStringArray(fileNames)); } KOALA_INTEROP_3(CreateContextGenerateAbcForExternalSourceFiles, KNativePointer, KNativePointer, KInt, KStringArray) @@ -552,4 +507,4 @@ KNativePointer impl_CreateTypeNodeFromTsType(KNativePointer context, KNativePoin auto _typeAnnotation = GetImpl()->CreateOpaqueTypeNode(_context, _nodeTsType); return _typeAnnotation; } -KOALA_INTEROP_2(CreateTypeNodeFromTsType, KNativePointer, KNativePointer, KNativePointer) \ No newline at end of file +KOALA_INTEROP_2(CreateTypeNodeFromTsType, KNativePointer, KNativePointer, KNativePointer) diff --git a/ui2abc/libarkts/native/src/common.cc b/ui2abc/libarkts/native/src/common.cc index e8a2cf8680..41b9202182 100644 --- a/ui2abc/libarkts/native/src/common.cc +++ b/ui2abc/libarkts/native/src/common.cc @@ -202,25 +202,18 @@ string getString(KStringPtr ptr) return ptr.data(); } -char* getStringCopy(KStringPtr& ptr) +const char** getStringArray(KStringArray ptr) { - return StageArena::strdup(ptr.c_str() ? ptr.c_str() : ""); + return ptr; } -KNativePointer impl_CreateConfig(KInt argc, KStringArray argvPtr) +char* getStringCopy(KStringPtr& ptr) { - const std::size_t headerLen = 4; + return StageArena::strdup(ptr.c_str() ? ptr.c_str() : ""); +} - const char** argv = StageArena::allocArray(argc); - std::size_t position = headerLen; - std::size_t strLen; - for (std::size_t i = 0; i < static_cast(argc); ++i) { - strLen = unpackUInt(argvPtr + position); - position += headerLen; - argv[i] = StageArena::strdup(std::string(reinterpret_cast(argvPtr + position), strLen).c_str()); - position += strLen; - } - return GetImpl()->CreateConfig(argc, argv); +KNativePointer impl_CreateConfig(KInt argc, KStringArray argvPtr) { + return GetImpl()->CreateConfig(argc, getStringArray(argvPtr)); } KOALA_INTEROP_2(CreateConfig, KNativePointer, KInt, KStringArray) diff --git a/ui2abc/libarkts/native/src/common.h b/ui2abc/libarkts/native/src/common.h index f2eeeb0e78..be6e52763c 100644 --- a/ui2abc/libarkts/native/src/common.h +++ b/ui2abc/libarkts/native/src/common.h @@ -55,6 +55,7 @@ inline es2panda_Impl* GetImpl() } string getString(KStringPtr ptr); +const char** getStringArray(KStringArray ptr); char* getStringCopy(KStringPtr& ptr); @@ -129,4 +130,4 @@ public: void cleanup(); }; -#endif // COMMON_H \ No newline at end of file +#endif // COMMON_H -- Gitee From 6b5e228235ba4a27874fe9f84f49a2217f009aed Mon Sep 17 00:00:00 2001 From: "evgeniy.generalov" Date: Fri, 29 Aug 2025 14:06:53 +0300 Subject: [PATCH 2/5] Fix terminating null --- interop/src/cpp/napi/convertors-napi.h | 1 + 1 file changed, 1 insertion(+) diff --git a/interop/src/cpp/napi/convertors-napi.h b/interop/src/cpp/napi/convertors-napi.h index 0a80ab4bfe..b7f4c4cadc 100644 --- a/interop/src/cpp/napi/convertors-napi.h +++ b/interop/src/cpp/napi/convertors-napi.h @@ -256,6 +256,7 @@ struct InteropTypeConverter { static char* strndup(const void* str, size_t n) { char* mem = static_cast(malloc(n + 1)); interop_memcpy(mem, n + 1, str, n); + mem[n] = 0; return mem; } static size_t decodeLength(const uint8_t* data) { -- Gitee From d40524a9adcce262de82a03315071771688731e8 Mon Sep 17 00:00:00 2001 From: "evgeniy.generalov" Date: Tue, 9 Sep 2025 12:47:32 +0300 Subject: [PATCH 3/5] Add koala type --- interop/src/cpp/napi/convertors-napi.h | 9 ++++-- interop/src/cpp/types/koala-types.h | 39 +++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/interop/src/cpp/napi/convertors-napi.h b/interop/src/cpp/napi/convertors-napi.h index b7f4c4cadc..11f0f86ae5 100644 --- a/interop/src/cpp/napi/convertors-napi.h +++ b/interop/src/cpp/napi/convertors-napi.h @@ -265,10 +265,13 @@ struct InteropTypeConverter { static KStringArray convertFrom(napi_env env, InteropType value) { size_t bytes = 0; auto const encoded = getTypedElements(env, value, bytes); - if (!bytes) return {}; + if (!bytes) return {{nullptr, nullptr}, 0}; size_t const num = decodeLength(encoded); - auto result = std::unique_ptr(new const char*[num]); + KStringArray::Holder result( + static_cast(malloc(sizeof(char*) * (num + 1))), + &free + ); size_t count = 0; auto const* ptr = encoded + LengthByteSize; @@ -278,7 +281,7 @@ struct InteropTypeConverter { result[count++] = SelfType::strndup(ptr + LengthByteSize, length); ptr += LengthByteSize + length; } - return result.release(); + return { std::move(result), num }; } static InteropType convertTo(napi_env env, KStringArray value) = delete; static void release(napi_env env, InteropType value, const KInteropReturnBuffer& converted) = delete; diff --git a/interop/src/cpp/types/koala-types.h b/interop/src/cpp/types/koala-types.h index 69276963de..ee6784ea28 100644 --- a/interop/src/cpp/types/koala-types.h +++ b/interop/src/cpp/types/koala-types.h @@ -21,6 +21,7 @@ #include #include #include +#include #include "interop-types.h" #include "interop-utils.h" @@ -159,6 +160,42 @@ private: bool _owned; }; +struct KStringArrayImpl { + // Null terminated, [char*, char*, ..., nullptr] + using Holder = std::unique_ptr; + + KStringArrayImpl() + : KStringArrayImpl({nullptr, nullptr}, 0) + { + } + + KStringArrayImpl(Holder strs, size_t num) + : _holder(std::move(strs)) + , _num(num) + { + } + + ~KStringArrayImpl() + { + for (size_t k = 0; k < _num; k++) { + free(_holder[k]); + } + } + + const char* const* get() const { + return _holder.get(); + } + + char** release() { + _num = 0; + return _holder.release(); + } + + private: + Holder _holder; + size_t _num; +}; + struct KInteropNumber { int8_t tag; union { @@ -236,7 +273,7 @@ typedef InteropNativePointer KNativePointer; typedef KStringPtrImpl KStringPtr; typedef KFloat* KFloatArray; -typedef const char** KStringArray; // fixme: unique_ptr +typedef KStringArrayImpl KStringArray; typedef KNativePointer* KNativePointerArray; struct KSerializerBufferOpaque { -- Gitee From 62e424d3a0eb4998394a3710f0a04e742afecf9e Mon Sep 17 00:00:00 2001 From: "evgeniy.generalov" Date: Tue, 9 Sep 2025 13:59:23 +0300 Subject: [PATCH 4/5] Bridges --- interop/src/cpp/napi/convertors-napi.h | 6 ++++++ ui2abc/libarkts/native/src/bridges.cc | 24 +++++++----------------- ui2abc/libarkts/native/src/common.cc | 6 +++--- ui2abc/libarkts/native/src/common.h | 2 +- 4 files changed, 17 insertions(+), 21 deletions(-) diff --git a/interop/src/cpp/napi/convertors-napi.h b/interop/src/cpp/napi/convertors-napi.h index 11f0f86ae5..448fcd17e4 100644 --- a/interop/src/cpp/napi/convertors-napi.h +++ b/interop/src/cpp/napi/convertors-napi.h @@ -629,6 +629,12 @@ inline KStringArray getArgument(const CallbackInfo& info, int inde return getArgument((napi_env)info.Env(), (napi_value)info[index]); } +template<> +inline KFloat getArgument(const CallbackInfo& info, int index) +{ + return getFloat32(info, index); +} + template<> inline KDouble getArgument(const CallbackInfo& info, int index) { diff --git a/ui2abc/libarkts/native/src/bridges.cc b/ui2abc/libarkts/native/src/bridges.cc index 598f58308e..83c4815444 100644 --- a/ui2abc/libarkts/native/src/bridges.cc +++ b/ui2abc/libarkts/native/src/bridges.cc @@ -219,21 +219,12 @@ KNativePointer impl_CreateCacheContextFromFile( } KOALA_INTEROP_4(CreateCacheContextFromFile, KNativePointer, KNativePointer, KStringPtr, KNativePointer, KBoolean) -KNativePointer impl_CreateGlobalContext( - KNativePointer configPtr, KStringArray externalFileListPtr, KUInt fileNum, KBoolean LspUsage) -{ +KNativePointer impl_CreateGlobalContext(KNativePointer configPtr, KStringArray& externalFileListPtr, KUInt fileNum, KBoolean LspUsage) { auto config = reinterpret_cast(configPtr); return GetImpl()->CreateGlobalContext(config, getStringArray(externalFileListPtr), fileNum, LspUsage); } KOALA_INTEROP_4(CreateGlobalContext, KNativePointer, KNativePointer, KStringArray, KUInt, KBoolean) -KNativePointer impl_mytest(KStringArray sa) { - printf("mytest: array=%p\n", sa); - printf("mytest: array=%p, array[0]=%s\n", sa, sa[0]); - return nullptr; -} -KOALA_INTEROP_1(mytest, KNativePointer, KStringArray) - void impl_DestroyGlobalContext(KNativePointer globalContextPtr) { auto globalContext = reinterpret_cast(globalContextPtr); GetImpl()->DestroyGlobalContext(globalContext); @@ -421,8 +412,8 @@ KNativePointer impl_CreateDiagnosticKind(KNativePointer context, KStringPtr& mes } KOALA_INTEROP_3(CreateDiagnosticKind, KNativePointer, KNativePointer, KStringPtr, KInt) -KNativePointer impl_CreateDiagnosticInfo( - KNativePointer context, KNativePointer kind, KStringArray argsPtr, KInt argc, KNativePointer pos) +KNativePointer impl_CreateDiagnosticInfo(KNativePointer context, KNativePointer kind, KStringArray& argsPtr, + KInt argc, KNativePointer pos) { const auto _context = reinterpret_cast(context); const auto _kind = reinterpret_cast(kind); @@ -432,8 +423,8 @@ KNativePointer impl_CreateDiagnosticInfo( KOALA_INTEROP_5( CreateDiagnosticInfo, KNativePointer, KNativePointer, KNativePointer, KStringArray, KInt, KNativePointer) -KNativePointer impl_CreateSuggestionInfo(KNativePointer context, KNativePointer kind, KStringArray argsPtr, KInt argc, - KStringPtr& substitutionCode, KStringPtr& title, KNativePointer range) +KNativePointer impl_CreateSuggestionInfo(KNativePointer context, KNativePointer kind, KStringArray& argsPtr, + KInt argc, KStringPtr& substitutionCode, KStringPtr& title, KNativePointer range) { const auto _context = reinterpret_cast(context); const auto _kind = reinterpret_cast(kind); @@ -445,7 +436,7 @@ KNativePointer impl_CreateSuggestionInfo(KNativePointer context, KNativePointer KOALA_INTEROP_7(CreateSuggestionInfo, KNativePointer, KNativePointer, KNativePointer, KStringArray, KInt, KStringPtr, KStringPtr, KNativePointer) -void impl_LogDiagnostic(KNativePointer context, KNativePointer kind, KStringArray argvPtr, +void impl_LogDiagnostic(KNativePointer context, KNativePointer kind, KStringArray& argvPtr, KInt argc, KNativePointer pos) { auto&& _context_ = reinterpret_cast(context); @@ -475,9 +466,8 @@ KInt impl_GenerateTsDeclarationsFromContext(KNativePointer contextPtr, KStringPt KOALA_INTEROP_7(GenerateTsDeclarationsFromContext, KInt, KNativePointer, KStringPtr, KStringPtr, KBoolean, KBoolean, KStringPtr, KBoolean) -// Improve: simplify KNativePointer impl_CreateContextGenerateAbcForExternalSourceFiles( - KNativePointer configPtr, KInt fileNamesCount, KStringArray fileNames) + KNativePointer configPtr, KInt fileNamesCount, KStringArray& fileNames) { auto config = reinterpret_cast(configPtr); return GetImpl()->CreateContextGenerateAbcForExternalSourceFiles(config, fileNamesCount, getStringArray(fileNames)); diff --git a/ui2abc/libarkts/native/src/common.cc b/ui2abc/libarkts/native/src/common.cc index 41b9202182..24aca82d50 100644 --- a/ui2abc/libarkts/native/src/common.cc +++ b/ui2abc/libarkts/native/src/common.cc @@ -202,9 +202,9 @@ string getString(KStringPtr ptr) return ptr.data(); } -const char** getStringArray(KStringArray ptr) +const char** getStringArray(KStringArray& ptr) { - return ptr; + return const_cast(ptr.get()); // release()? } char* getStringCopy(KStringPtr& ptr) @@ -212,7 +212,7 @@ char* getStringCopy(KStringPtr& ptr) return StageArena::strdup(ptr.c_str() ? ptr.c_str() : ""); } -KNativePointer impl_CreateConfig(KInt argc, KStringArray argvPtr) { +KNativePointer impl_CreateConfig(KInt argc, KStringArray& argvPtr) { return GetImpl()->CreateConfig(argc, getStringArray(argvPtr)); } KOALA_INTEROP_2(CreateConfig, KNativePointer, KInt, KStringArray) diff --git a/ui2abc/libarkts/native/src/common.h b/ui2abc/libarkts/native/src/common.h index be6e52763c..770d2a2ad3 100644 --- a/ui2abc/libarkts/native/src/common.h +++ b/ui2abc/libarkts/native/src/common.h @@ -55,7 +55,7 @@ inline es2panda_Impl* GetImpl() } string getString(KStringPtr ptr); -const char** getStringArray(KStringArray ptr); +const char** getStringArray(KStringArray& ptr); char* getStringCopy(KStringPtr& ptr); -- Gitee From 712f4b1aa3cde7e328c70f87e80f4deaf413fbc8 Mon Sep 17 00:00:00 2001 From: "evgeniy.generalov" Date: Wed, 10 Sep 2025 13:36:49 +0300 Subject: [PATCH 5/5] Format --- interop/src/cpp/napi/convertors-napi.h | 97 +++++++++++++------------- interop/src/cpp/types/koala-types.h | 26 +++---- ui2abc/libarkts/native/src/bridges.cc | 38 +++++----- ui2abc/libarkts/native/src/common.cc | 3 +- 4 files changed, 81 insertions(+), 83 deletions(-) diff --git a/interop/src/cpp/napi/convertors-napi.h b/interop/src/cpp/napi/convertors-napi.h index 448fcd17e4..4b86ca1eb0 100644 --- a/interop/src/cpp/napi/convertors-napi.h +++ b/interop/src/cpp/napi/convertors-napi.h @@ -18,10 +18,10 @@ #ifdef KOALA_NAPI +#include #include #include #include -#include #ifndef KOALA_NAPI_OHOS #include @@ -245,7 +245,7 @@ struct InteropTypeConverter { static inline void release(napi_env env, InteropType value, const KInteropReturnBuffer& converted) = delete; }; -template +template ElemType* getTypedElements(napi_env env, napi_value value, size_t& bytes); template<> @@ -253,25 +253,26 @@ struct InteropTypeConverter { using InteropType = napi_value; using SelfType = InteropTypeConverter; static constexpr auto LengthByteSize = sizeof(KUInt); - static char* strndup(const void* str, size_t n) { + static char* strndup(const void* str, size_t n) + { char* mem = static_cast(malloc(n + 1)); interop_memcpy(mem, n + 1, str, n); mem[n] = 0; return mem; } - static size_t decodeLength(const uint8_t* data) { - return (data[3] << 24) | (data[2] << 16) | (data[1] << 8) | data[0]; + static size_t decodeLength(const uint8_t* data) + { + return (data[3] << 24) | (data[2] << 16) | (data[1] << 8) | data[0]; } - static KStringArray convertFrom(napi_env env, InteropType value) { + static KStringArray convertFrom(napi_env env, InteropType value) + { size_t bytes = 0; auto const encoded = getTypedElements(env, value, bytes); - if (!bytes) return {{nullptr, nullptr}, 0}; + if (!bytes) + return { { nullptr, nullptr }, 0 }; size_t const num = decodeLength(encoded); - KStringArray::Holder result( - static_cast(malloc(sizeof(char*) * (num + 1))), - &free - ); + KStringArray::Holder result(static_cast(malloc(sizeof(char*) * (num + 1))), &free); size_t count = 0; auto const* ptr = encoded + LengthByteSize; @@ -431,44 +432,41 @@ inline napi_typedarray_type getNapiType() napi_valuetype getValueTypeChecked(napi_env env, napi_value value); bool isTypedArray(napi_env env, napi_value value); -template -inline ElemType* getTypedElements(napi_env env, napi_value value, size_t& bytesLength) { - napi_valuetype valueType = getValueTypeChecked(env, value); - if (valueType == napi_null) { - return nullptr; - } - if (!isTypedArray(env, value)) { - napi_throw_error(env, nullptr, "Expected TypedArray"); - return nullptr; - } - napi_value arrayBuffer; - void* data = nullptr; - size_t byteOffset; - napi_typedarray_type type; - napi_status status = napi_get_typedarray_info(env, - value, - &type, - &bytesLength, - &data, - &arrayBuffer, - &byteOffset); - KOALA_NAPI_THROW_IF_FAILED(env, status, nullptr); - if (type != getNapiType()) { - printf("Array type mismatch. Expected %d got %d\n", getNapiType(), type); - napi_throw_error(env, nullptr, "Array type mismatch"); - return nullptr; - } - return reinterpret_cast(data); -} - -template -inline ElemType* getTypedElements(napi_env env, napi_value value) { +template +inline ElemType* getTypedElements(napi_env env, napi_value value, size_t& bytesLength) +{ + napi_valuetype valueType = getValueTypeChecked(env, value); + if (valueType == napi_null) { + return nullptr; + } + if (!isTypedArray(env, value)) { + napi_throw_error(env, nullptr, "Expected TypedArray"); + return nullptr; + } + napi_value arrayBuffer; + void* data = nullptr; + size_t byteOffset; + napi_typedarray_type type; + napi_status status = napi_get_typedarray_info(env, value, &type, &bytesLength, &data, &arrayBuffer, &byteOffset); + KOALA_NAPI_THROW_IF_FAILED(env, status, nullptr); + if (type != getNapiType()) { + printf("Array type mismatch. Expected %d got %d\n", getNapiType(), type); + napi_throw_error(env, nullptr, "Array type mismatch"); + return nullptr; + } + return reinterpret_cast(data); +} + +template +inline ElemType* getTypedElements(napi_env env, napi_value value) +{ size_t dummy; return getTypedElements(env, value, dummy); } -template -inline ElemType* getTypedElements(const CallbackInfo& info, int index) { +template +inline ElemType* getTypedElements(const CallbackInfo& info, int index) +{ NAPI_ASSERT_INDEX(info, index, nullptr); return getTypedElements(info.Env(), info[index]); } @@ -623,10 +621,11 @@ inline KInteropBuffer getArgument(const CallbackInfo& info, int return getArgument((napi_env)info.Env(), (napi_value)info[index]); } -template <> -inline KStringArray getArgument(const CallbackInfo& info, int index) { - NAPI_ASSERT_INDEX(info, index, {}); - return getArgument((napi_env)info.Env(), (napi_value)info[index]); +template<> +inline KStringArray getArgument(const CallbackInfo& info, int index) +{ + NAPI_ASSERT_INDEX(info, index, {}); + return getArgument((napi_env)info.Env(), (napi_value)info[index]); } template<> diff --git a/interop/src/cpp/types/koala-types.h b/interop/src/cpp/types/koala-types.h index ee6784ea28..d9856c2a84 100644 --- a/interop/src/cpp/types/koala-types.h +++ b/interop/src/cpp/types/koala-types.h @@ -18,10 +18,10 @@ #include #include +#include #include #include #include -#include #include "interop-types.h" #include "interop-utils.h" @@ -164,16 +164,8 @@ struct KStringArrayImpl { // Null terminated, [char*, char*, ..., nullptr] using Holder = std::unique_ptr; - KStringArrayImpl() - : KStringArrayImpl({nullptr, nullptr}, 0) - { - } - - KStringArrayImpl(Holder strs, size_t num) - : _holder(std::move(strs)) - , _num(num) - { - } + KStringArrayImpl() : KStringArrayImpl({ nullptr, nullptr }, 0) {} + KStringArrayImpl(Holder strs, size_t num) : _holder(std::move(strs)), _num(num) {} ~KStringArrayImpl() { @@ -182,18 +174,20 @@ struct KStringArrayImpl { } } - const char* const* get() const { + const char* const* get() const + { return _holder.get(); } - char** release() { + char** release() + { _num = 0; return _holder.release(); } - private: - Holder _holder; - size_t _num; +private: + Holder _holder; + size_t _num; }; struct KInteropNumber { diff --git a/ui2abc/libarkts/native/src/bridges.cc b/ui2abc/libarkts/native/src/bridges.cc index 83c4815444..77075af1c1 100644 --- a/ui2abc/libarkts/native/src/bridges.cc +++ b/ui2abc/libarkts/native/src/bridges.cc @@ -219,13 +219,16 @@ KNativePointer impl_CreateCacheContextFromFile( } KOALA_INTEROP_4(CreateCacheContextFromFile, KNativePointer, KNativePointer, KStringPtr, KNativePointer, KBoolean) -KNativePointer impl_CreateGlobalContext(KNativePointer configPtr, KStringArray& externalFileListPtr, KUInt fileNum, KBoolean LspUsage) { +KNativePointer impl_CreateGlobalContext( + KNativePointer configPtr, KStringArray& externalFileListPtr, KUInt fileNum, KBoolean LspUsage) +{ auto config = reinterpret_cast(configPtr); return GetImpl()->CreateGlobalContext(config, getStringArray(externalFileListPtr), fileNum, LspUsage); } KOALA_INTEROP_4(CreateGlobalContext, KNativePointer, KNativePointer, KStringArray, KUInt, KBoolean) -void impl_DestroyGlobalContext(KNativePointer globalContextPtr) { +void impl_DestroyGlobalContext(KNativePointer globalContextPtr) +{ auto globalContext = reinterpret_cast(globalContextPtr); GetImpl()->DestroyGlobalContext(globalContext); } @@ -412,36 +415,37 @@ KNativePointer impl_CreateDiagnosticKind(KNativePointer context, KStringPtr& mes } KOALA_INTEROP_3(CreateDiagnosticKind, KNativePointer, KNativePointer, KStringPtr, KInt) -KNativePointer impl_CreateDiagnosticInfo(KNativePointer context, KNativePointer kind, KStringArray& argsPtr, - KInt argc, KNativePointer pos) +KNativePointer impl_CreateDiagnosticInfo( + KNativePointer context, KNativePointer kind, KStringArray& argsPtr, KInt argc, KNativePointer pos) { const auto _context = reinterpret_cast(context); const auto _kind = reinterpret_cast(kind); - const auto _pos = reinterpret_cast(pos); + const auto _pos = reinterpret_cast(pos); return GetImpl()->CreateDiagnosticInfo(_context, _kind, getStringArray(argsPtr), argc, _pos); } KOALA_INTEROP_5( CreateDiagnosticInfo, KNativePointer, KNativePointer, KNativePointer, KStringArray, KInt, KNativePointer) -KNativePointer impl_CreateSuggestionInfo(KNativePointer context, KNativePointer kind, KStringArray& argsPtr, - KInt argc, KStringPtr& substitutionCode, KStringPtr& title, KNativePointer range) +KNativePointer impl_CreateSuggestionInfo(KNativePointer context, KNativePointer kind, KStringArray& argsPtr, KInt argc, + KStringPtr& substitutionCode, KStringPtr& title, KNativePointer range) { const auto _context = reinterpret_cast(context); const auto _kind = reinterpret_cast(kind); const auto _title = getStringCopy(title); - const auto _range = reinterpret_cast(range); + const auto _range = reinterpret_cast(range); const auto _substitutionCode = getStringCopy(substitutionCode); - return GetImpl()->CreateSuggestionInfo(_context, _kind, getStringArray(argsPtr), argc, _substitutionCode, _title, _range); + return GetImpl()->CreateSuggestionInfo( + _context, _kind, getStringArray(argsPtr), argc, _substitutionCode, _title, _range); } -KOALA_INTEROP_7(CreateSuggestionInfo, KNativePointer, KNativePointer, KNativePointer, KStringArray, KInt, - KStringPtr, KStringPtr, KNativePointer) +KOALA_INTEROP_7(CreateSuggestionInfo, KNativePointer, KNativePointer, KNativePointer, KStringArray, KInt, KStringPtr, + KStringPtr, KNativePointer) -void impl_LogDiagnostic(KNativePointer context, KNativePointer kind, KStringArray& argvPtr, - KInt argc, KNativePointer pos) +void impl_LogDiagnostic( + KNativePointer context, KNativePointer kind, KStringArray& argvPtr, KInt argc, KNativePointer pos) { - auto&& _context_ = reinterpret_cast(context); - auto&& _kind_ = reinterpret_cast(kind); - auto&& _pos_ = reinterpret_cast(pos); + auto&& _context_ = reinterpret_cast(context); + auto&& _kind_ = reinterpret_cast(kind); + auto&& _pos_ = reinterpret_cast(pos); GetImpl()->LogDiagnostic(_context_, _kind_, getStringArray(argvPtr), argc, _pos_); } KOALA_INTEROP_V5(LogDiagnostic, KNativePointer, KNativePointer, KStringArray, KInt, KNativePointer) @@ -469,7 +473,7 @@ KOALA_INTEROP_7(GenerateTsDeclarationsFromContext, KInt, KNativePointer, KString KNativePointer impl_CreateContextGenerateAbcForExternalSourceFiles( KNativePointer configPtr, KInt fileNamesCount, KStringArray& fileNames) { - auto config = reinterpret_cast(configPtr); + auto config = reinterpret_cast(configPtr); return GetImpl()->CreateContextGenerateAbcForExternalSourceFiles(config, fileNamesCount, getStringArray(fileNames)); } KOALA_INTEROP_3(CreateContextGenerateAbcForExternalSourceFiles, KNativePointer, KNativePointer, KInt, KStringArray) diff --git a/ui2abc/libarkts/native/src/common.cc b/ui2abc/libarkts/native/src/common.cc index 24aca82d50..83a6d4ac37 100644 --- a/ui2abc/libarkts/native/src/common.cc +++ b/ui2abc/libarkts/native/src/common.cc @@ -212,7 +212,8 @@ char* getStringCopy(KStringPtr& ptr) return StageArena::strdup(ptr.c_str() ? ptr.c_str() : ""); } -KNativePointer impl_CreateConfig(KInt argc, KStringArray& argvPtr) { +KNativePointer impl_CreateConfig(KInt argc, KStringArray& argvPtr) +{ return GetImpl()->CreateConfig(argc, getStringArray(argvPtr)); } KOALA_INTEROP_2(CreateConfig, KNativePointer, KInt, KStringArray) -- Gitee