Added adapter code generation to scipt

This commit is contained in:
Asethone
2023-06-01 17:03:57 +04:00
parent f40b6f849d
commit a29605e1b7
8 changed files with 54 additions and 23 deletions

View File

@ -73,11 +73,23 @@ def generateV8InternalCode(class_name, methods, header_file):
code += " }\n"
code += "}\n"
code += "\n"
code += "void* " + class_name + "::GetDataForEmbedObject(void* data)\n"
adapter_name = class_name + "Adapter"
code += "class " + adapter_name + " : public CJSEmbedObjectAdapterV8\n"
code += "{\n"
code += " v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(data);\n"
code += " v8::Local<v8::ObjectTemplate>* internalTemplate = new v8::Local<v8::ObjectTemplate>(" + namespace_name + "::CreateTemplate(isolate));\n"
code += " return reinterpret_cast<void*>(internalTemplate);\n"
code += "public:\n"
code += " virtual v8::Local<v8::ObjectTemplate> getTemplate(v8::Isolate* isolate) override\n"
code += " {\n"
code += " v8::EscapableHandleScope handle_scope(isolate);\n"
code += " v8::Local<v8::ObjectTemplate> templ = " + namespace_name + "::CreateTemplate(isolate);\n"
code += " return handle_scope.Escape(templ);\n"
code += " }\n"
code += "};\n"
code += "\n"
code += "CJSEmbedObjectAdapterBase* " + class_name + "::getAdapter()\n"
code += "{\n"
code += " if (m_pAdapter == nullptr)\n"
code += " m_pAdapter = new " + adapter_name + "();\n"
code += " return m_pAdapter;\n"
code += "}\n"
code += "\n"
code += "std::vector<std::string> " + class_name + "::getMethodNames()\n"
@ -117,11 +129,21 @@ def generateJSCInternalCode(class_name, methods, header_file):
code += "FUNCTION_WRAPPER_JS_" + str(len(method.args)) + "(" + method.name + ", " + method.name + ")\n"
code += "@end\n"
code += "\n"
code += "void* " + class_name + "::GetDataForEmbedObject(void* data)\n"
adapter_name = class_name + "Adapter"
code += "class " + adapter_name + " : public CJSEmbedObjectAdapterJSC\n"
code += "{\n"
code += " " + class_name + "* pNativeObj = reinterpret_cast<" + class_name + "*>(data);\n"
code += " " + objc_class_name + "* pEmbedObj = [[" + objc_class_name + " alloc] init:pNativeObj];\n"
code += " return (void*)CFBridgingRetain(pEmbedObj);\n"
code += "public:\n"
code += " virtual id getExportedObject(CJSEmbedObject* pNative) override\n"
code += " {\n"
code += " return [[" + objc_class_name + " alloc] init:(" + class_name + "*)pNative];\n"
code += " }\n"
code += "};\n"
code += "\n"
code += "CJSEmbedObjectAdapterBase* " + class_name + "::getAdapter()\n"
code += "{\n"
code += " if (m_pAdapter == nullptr)\n"
code += " m_pAdapter = new " + adapter_name + "();\n"
code += " return m_pAdapter;\n"
code += "}\n\n"
return code
@ -155,7 +177,7 @@ def generateV8ExternalCode(class_name, methods, header_file):
code += "\n"
code += " };\n"
code += "}\n\n"
code += "void* " + class_name + "::GetDataForEmbedObject(void* data) { return nullptr; }\n\n"
code += "CJSEmbedObjectAdapterBase* " + class_name + "::getAdapter() { return nullptr; }\n\n"
return code
def generateJSCExternalCode(class_name, methods, header_file):
@ -190,18 +212,28 @@ def generateJSCExternalCode(class_name, methods, header_file):
code += "\n{\n"
code += " JSSmart<CJSValue> ret = m_internal->" + method.name + "("
for arg in method.args:
code += "NSJSBase::Native2Value((__bridge void*)" + arg + ")"
code += "CJSEmbedObjectAdapterJSC::Native2Value(" + arg + ")"
if arg != method.args[-1]:
code += ", "
code += ");\n"
code += " return (__bridge JSValue*)NSJSBase::Value2Native(ret);\n"
code += " return CJSEmbedObjectAdapterJSC::Value2Native(ret);\n"
code += "}\n\n"
code += "@end\n\n"
code += "void* " + class_name + "::GetDataForEmbedObject(void* data)\n"
adapter_name = class_name + "Adapter"
code += "class " + adapter_name + " : public CJSEmbedObjectAdapterJSC\n"
code += "{\n"
code += " " + class_name + "* pNativeObj = reinterpret_cast<" + class_name + "*>(data);\n"
code += " " + objc_class_name + "* pEmbedObj = [[" + objc_class_name + " alloc] init:pNativeObj];\n"
code += " return (void*)CFBridgingRetain(pEmbedObj);\n"
code += "public:\n"
code += " virtual id getExportedObject(CJSEmbedObject* pNative) override\n"
code += " {\n"
code += " return [[" + objc_class_name + " alloc] init:(" + class_name + "*)pNative];\n"
code += " }\n"
code += "};\n"
code += "\n"
code += "CJSEmbedObjectAdapterBase* " + class_name + "::getAdapter()\n"
code += "{\n"
code += " if (m_pAdapter == nullptr)\n"
code += " m_pAdapter = new " + adapter_name + "();\n"
code += " return m_pAdapter;\n"
code += "}\n\n"
return code

View File

@ -26,7 +26,7 @@ FUNCTION_WRAPPER_JS_4(hash2, hash2)
class CHashEmbedAdapter : public CJSEmbedObjectAdapterJSC
{
public:
id getExportedObject(CJSEmbedObject* pNative)
virtual id getExportedObject(CJSEmbedObject* pNative) override
{
return [[CJSCHashEmbed alloc] init:(CHashEmbed*)pNative];
}

View File

@ -46,7 +46,7 @@ FUNCTION_WRAPPER_JS_1(getImageType, getImageType)
class CZipEmbedAdapter : public CJSEmbedObjectAdapterJSC
{
public:
id getExportedObject(CJSEmbedObject* pNative)
virtual id getExportedObject(CJSEmbedObject* pNative) override
{
return [[CJSCZipEmbed alloc] init:(CZipEmbed*)pNative];
}

View File

@ -10,6 +10,7 @@ namespace NSHashEmbed
FUNCTION_WRAPPER_V8_3(_hash, hash)
FUNCTION_WRAPPER_V8_4(_hash2, hash2)
v8::Handle<v8::ObjectTemplate> CreateTemplate(v8::Isolate* isolate)
{
v8::EscapableHandleScope handle_scope(isolate);

View File

@ -20,6 +20,7 @@ namespace NSZipEmbed
FUNCTION_WRAPPER_V8_6(_encodeImageData, encodeImageData)
FUNCTION_WRAPPER_V8_2(_encodeImage, encodeImage)
FUNCTION_WRAPPER_V8_1(_getImageType, getImageType)
v8::Handle<v8::ObjectTemplate> CreateTemplate(v8::Isolate* isolate)
{
v8::EscapableHandleScope handle_scope(isolate);

View File

@ -555,7 +555,7 @@ namespace NSJSBase
CJSEmbedObject* pNativeObj = oInfo.m_creator();
v8::Local<v8::ObjectTemplate> oCurTemplate;
CJSEmbedObjectAdapterV8* pAdapter = dynamic_cast<CJSEmbedObjectAdapterV8*>(pNativeObj->getAdapter());
CJSEmbedObjectAdapterV8* pAdapter = static_cast<CJSEmbedObjectAdapterV8*>(pNativeObj->getAdapter());
if (pAdapter)
{
oCurTemplate = pAdapter->getTemplate(isolate);

View File

@ -50,7 +50,7 @@ EMBED_OBJECT_WRAPPER_METHODS(CTestEmbed);
class CTestEmbedAdapter : public CJSEmbedObjectAdapterJSC
{
public:
id getExportedObject(CJSEmbedObject* pNative)
virtual id getExportedObject(CJSEmbedObject* pNative) override
{
return [[CJSCTestEmbed alloc] init:(CTestEmbed*)pNative];
}

View File

@ -23,10 +23,7 @@ void CTestEmbed::initFunctions()
};
}
CJSEmbedObjectAdapterBase* CTestEmbed::getAdapter()
{
return nullptr;
}
CJSEmbedObjectAdapterBase* CTestEmbed::getAdapter() { return nullptr; }
std::string CTestEmbed::getName() { return "CTestEmbed"; }