From f40b6f849dad15a26acf6f8d992bb92975a75db7 Mon Sep 17 00:00:00 2001 From: Asethone Date: Thu, 1 Jun 2023 16:27:16 +0400 Subject: [PATCH] [JSC] Implemented adapter. Removed Native2Value and Value2Native from js_base.h --- .../doctrenderer/embed/jsc/jsc_HashEmbed.mm | 17 +++++++--- .../doctrenderer/embed/jsc/jsc_ZipEmbed.mm | 17 +++++++--- .../doctrenderer/js_internal/js_base.h | 7 +---- .../js_internal/js_base_embed.pri | 4 --- .../doctrenderer/js_internal/js_embed.h | 15 +++++++++ .../doctrenderer/js_internal/jsc/jsc_base.mm | 12 ++++--- .../test/internal/jsc/jsc_Embed.mm | 31 ++++++++++++------- 7 files changed, 69 insertions(+), 34 deletions(-) diff --git a/DesktopEditor/doctrenderer/embed/jsc/jsc_HashEmbed.mm b/DesktopEditor/doctrenderer/embed/jsc/jsc_HashEmbed.mm index fcb512ed47..35b7aee2b8 100644 --- a/DesktopEditor/doctrenderer/embed/jsc/jsc_HashEmbed.mm +++ b/DesktopEditor/doctrenderer/embed/jsc/jsc_HashEmbed.mm @@ -23,11 +23,20 @@ FUNCTION_WRAPPER_JS_3(hash, hash) FUNCTION_WRAPPER_JS_4(hash2, hash2) @end -void* CHashEmbed::GetDataForEmbedObject(void* data) +class CHashEmbedAdapter : public CJSEmbedObjectAdapterJSC { - CHashEmbed* pNativeObj = reinterpret_cast(data); - CJSCHashEmbed* pEmbedObj = [[CJSCHashEmbed alloc] init:pNativeObj]; - return (void*)CFBridgingRetain(pEmbedObj); +public: + id getExportedObject(CJSEmbedObject* pNative) + { + return [[CJSCHashEmbed alloc] init:(CHashEmbed*)pNative]; + } +}; + +CJSEmbedObjectAdapterBase* CHashEmbed::getAdapter() +{ + if (m_pAdapter == nullptr) + m_pAdapter = new CHashEmbedAdapter(); + return m_pAdapter; } std::string CHashEmbed::getName() { return "CHashEmbed"; } diff --git a/DesktopEditor/doctrenderer/embed/jsc/jsc_ZipEmbed.mm b/DesktopEditor/doctrenderer/embed/jsc/jsc_ZipEmbed.mm index 49f854cf0f..72a3d0b77f 100644 --- a/DesktopEditor/doctrenderer/embed/jsc/jsc_ZipEmbed.mm +++ b/DesktopEditor/doctrenderer/embed/jsc/jsc_ZipEmbed.mm @@ -43,11 +43,20 @@ FUNCTION_WRAPPER_JS_2(encodeImage, encodeImage) FUNCTION_WRAPPER_JS_1(getImageType, getImageType) @end -void* CZipEmbed::GetDataForEmbedObject(void* data) +class CZipEmbedAdapter : public CJSEmbedObjectAdapterJSC { - CZipEmbed* pNativeObj = reinterpret_cast(data); - CJSCZipEmbed* pEmbedObj = [[CJSCZipEmbed alloc] init:pNativeObj]; - return (void*)CFBridgingRetain(pEmbedObj); +public: + id getExportedObject(CJSEmbedObject* pNative) + { + return [[CJSCZipEmbed alloc] init:(CZipEmbed*)pNative]; + } +}; + +CJSEmbedObjectAdapterBase* CZipEmbed::getAdapter() +{ + if (m_pAdapter == nullptr) + m_pAdapter = new CZipEmbedAdapter(); + return m_pAdapter; } std::string CZipEmbed::getName() { return "CZipEmbed"; } diff --git a/DesktopEditor/doctrenderer/js_internal/js_base.h b/DesktopEditor/doctrenderer/js_internal/js_base.h index 69c3a102f1..5d38bf07a1 100644 --- a/DesktopEditor/doctrenderer/js_internal/js_base.h +++ b/DesktopEditor/doctrenderer/js_internal/js_base.h @@ -237,7 +237,7 @@ namespace NSJSBase void Enter(); void Exit(); - // Use this method for embedding external objects + // Use this method for embedding objects into JS context template static void Embed(const IsolateAdditionalDataType& type = iadtUndefined) { @@ -299,11 +299,6 @@ namespace NSJSBase CJSContextScope(JSSmart context); ~CJSContextScope(); }; - -#ifdef JS_ENGINE_JAVASCRIPTCORE - JS_DECL JSSmart Native2Value(void* jsValue); - JS_DECL void* Value2Native(JSSmart smartValue); -#endif } // defines for embed diff --git a/DesktopEditor/doctrenderer/js_internal/js_base_embed.pri b/DesktopEditor/doctrenderer/js_internal/js_base_embed.pri index ebf8571205..543c10899f 100644 --- a/DesktopEditor/doctrenderer/js_internal/js_base_embed.pri +++ b/DesktopEditor/doctrenderer/js_internal/js_base_embed.pri @@ -18,14 +18,10 @@ use_javascript_core { defineTest(ADD_FILES_FOR_EMBEDDED_CLASS_HEADER) { header_path = $$absolute_path($$ARGS) -# message(header_path: $$header_path) header_basename = $$basename(ARGS) -# message(header_basename: $$header_basename) header_dir = $$dirname(header_path) -# message(header_dir: $$header_dir) header_name_splitted = $$split(header_basename, .) header_basename_no_extension = $$first(header_name_splitted) -# message(header_basename_no_extension: $$header_basename_no_extension) use_javascript_core { OBJECTIVE_SOURCES += $$header_dir/$$join(header_basename_no_extension,, jsc/jsc_, .mm) } else { diff --git a/DesktopEditor/doctrenderer/js_internal/js_embed.h b/DesktopEditor/doctrenderer/js_internal/js_embed.h index 180e1b2b6d..806cddc3a4 100644 --- a/DesktopEditor/doctrenderer/js_internal/js_embed.h +++ b/DesktopEditor/doctrenderer/js_internal/js_embed.h @@ -43,6 +43,21 @@ return m_internal; \ } +namespace NSJSBase +{ + class JS_DECL CJSEmbedObjectAdapterJSC : public CJSEmbedObjectAdapterBase + { + public: + CJSEmbedObjectAdapterJSC() = default; + virtual ~CJSEmbedObjectAdapterJSC() = default; + + virtual id getExportedObject(CJSEmbedObject* pNative) = 0; + + static JSSmart Native2Value(JSValue* value); + static JSValue* Value2Native(JSSmart value); + }; +} + #endif #endif // _BUILD_NATIVE_CONTROL_JS_EMBED_H_ diff --git a/DesktopEditor/doctrenderer/js_internal/jsc/jsc_base.mm b/DesktopEditor/doctrenderer/js_internal/jsc/jsc_base.mm index 8953e2c945..6f0a76b510 100644 --- a/DesktopEditor/doctrenderer/js_internal/jsc/jsc_base.mm +++ b/DesktopEditor/doctrenderer/js_internal/jsc/jsc_base.mm @@ -456,17 +456,19 @@ namespace NSJSBase // TODO: singleton check ? CJSEmbedObject* pNativeObj = oInfo.m_creator(); - id pEmbedObj = (id)CFBridgingRelease(pNativeObj->GetDataForEmbedObject(pNativeObj)); + CJSEmbedObjectAdapterJSC* pAdapter = static_cast(pNativeObj->getAdapter()); + id pEmbedObj = pAdapter->getExportedObject(pNativeObj); return pEmbedObj; } - JSSmart Native2Value(void* jsValue) + JSSmart CJSEmbedObjectAdapterJSC::Native2Value(JSValue* value) { - return js_value((__bridge JSValue*)jsValue); + return js_value(value); } - void* Value2Native(JSSmart smartValue) + + JSValue* CJSEmbedObjectAdapterJSC::Value2Native(JSSmart value) { - return (__bridge void*)js_return(smartValue); + return js_return(value); } } diff --git a/DesktopEditor/doctrenderer/test/internal/jsc/jsc_Embed.mm b/DesktopEditor/doctrenderer/test/internal/jsc/jsc_Embed.mm index 618244b2fd..b4f401e432 100644 --- a/DesktopEditor/doctrenderer/test/internal/jsc/jsc_Embed.mm +++ b/DesktopEditor/doctrenderer/test/internal/jsc/jsc_Embed.mm @@ -23,35 +23,44 @@ EMBED_OBJECT_WRAPPER_METHODS(CTestEmbed); -(JSValue*) FunctionSum : (JSValue*)param1 : (JSValue*)param2 { - JSSmart ret = m_internal->FunctionSum(NSJSBase::Native2Value((__bridge void*)param1), NSJSBase::Native2Value((__bridge void*)param2)); - return (__bridge JSValue*)NSJSBase::Value2Native(ret); + JSSmart ret = m_internal->FunctionSum(CJSEmbedObjectAdapterJSC::Native2Value(param1), CJSEmbedObjectAdapterJSC::Native2Value(param2)); + return CJSEmbedObjectAdapterJSC::Value2Native(ret); } -(JSValue*) FunctionSquare : (JSValue*)param { - JSSmart ret = m_internal->FunctionSquare(NSJSBase::Native2Value((__bridge void*)param)); - return (__bridge JSValue*)NSJSBase::Value2Native(ret); + JSSmart ret = m_internal->FunctionSquare(CJSEmbedObjectAdapterJSC::Native2Value(param)); + return CJSEmbedObjectAdapterJSC::Value2Native(ret); } -(JSValue*) FunctionDel : (JSValue*)param1 : (JSValue*)param2 { - JSSmart ret = m_internal->FunctionDel(NSJSBase::Native2Value((__bridge void*)param1), NSJSBase::Native2Value((__bridge void*)param2)); - return (__bridge JSValue*)NSJSBase::Value2Native(ret); + JSSmart ret = m_internal->FunctionDel(CJSEmbedObjectAdapterJSC::Native2Value(param1), CJSEmbedObjectAdapterJSC::Native2Value(param2)); + return CJSEmbedObjectAdapterJSC::Value2Native(ret); } -(JSValue*) FunctionGet { JSSmart ret = m_internal->FunctionGet(); - return (__bridge JSValue*)NSJSBase::Value2Native(ret); + return CJSEmbedObjectAdapterJSC::Value2Native(ret); } @end -void* CTestEmbed::GetDataForEmbedObject(void* data) +class CTestEmbedAdapter : public CJSEmbedObjectAdapterJSC { - CTestEmbed* pNativeObj = reinterpret_cast(data); - CJSCTestEmbed* pEmbedObj = [[CJSCTestEmbed alloc] init:pNativeObj]; - return (void*)CFBridgingRetain(pEmbedObj); +public: + id getExportedObject(CJSEmbedObject* pNative) + { + return [[CJSCTestEmbed alloc] init:(CTestEmbed*)pNative]; + } +}; + +CJSEmbedObjectAdapterBase* CTestEmbed::getAdapter() +{ + if (m_pAdapter == nullptr) + m_pAdapter = new CTestEmbedAdapter(); + return m_pAdapter; } std::string CTestEmbed::getName() { return "CTestEmbed"; }