Skip to content

Commit

Permalink
[unreal]重构,调整Addon的注册接口
Browse files Browse the repository at this point in the history
  • Loading branch information
chexiongsheng committed Aug 19, 2021
1 parent 82d3205 commit 846450c
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 30 deletions.
4 changes: 3 additions & 1 deletion unreal/Puerts/Source/JsEnv/Private/FFIBinding.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -462,8 +462,10 @@ static void UTF8Length(const v8::FunctionCallbackInfo<v8::Value>& Info)
Info.GetReturnValue().Set(utf8Str.length());
}

static void Init(v8::Isolate* Isolate, v8::Local<v8::Context> Context, v8::Local<v8::Object> Exports)
static void Init(v8::Local<v8::Context> Context, v8::Local<v8::Object> Exports)
{
v8::Isolate* Isolate = Context->GetIsolate();

Exports->Set(Context, puerts::FV8Utils::ToV8String(Isolate, "ffi_prep_cif"), v8::FunctionTemplate::New(Isolate, FFIPrepCif)->GetFunction(Context).ToLocalChecked()).Check();

Exports->Set(Context, puerts::FV8Utils::ToV8String(Isolate, "ffi_prep_cif_var"), v8::FunctionTemplate::New(Isolate, FFIPrepCifVar)->GetFunction(Context).ToLocalChecked()).Check();
Expand Down
46 changes: 23 additions & 23 deletions unreal/Puerts/Source/JsEnv/Private/JSClassRegister.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,19 +27,20 @@ class JSClassRegister

const JSClassDefinition* FindCppTypeClassByName(const std::string& Name);

#if USING_IN_UNREAL_ENGINE
void RegisterAddon(const FString&Name, AddonRegisterFunc RegisterFunc);
void RegisterAddon(const std::string&Name, AddonRegisterFunc RegisterFunc);

AddonRegisterFunc FindAddonRegisterFunc(const std::string& Name);

#if USING_IN_UNREAL_ENGINE
const JSClassDefinition* FindClassByType(UStruct* Type);

AddonRegisterFunc FindAddonRegisterFunc(const FString& Name);
#endif

private:
std::map<const void*, JSClassDefinition*> NameToClassDefinition;
std::map<std::string, JSClassDefinition*> CDataNameToClassDefinition;
std::map<std::string, AddonRegisterFunc> AddonRegisterInfos;
#if USING_IN_UNREAL_ENGINE
std::map<FString, JSClassDefinition*> StructNameToClassDefinition;
std::map<FString, AddonRegisterFunc> AddonRegisterInfos;
#endif
};

Expand Down Expand Up @@ -109,17 +110,15 @@ const JSClassDefinition* JSClassRegister::FindCppTypeClassByName(const std::stri
}
}

#if USING_IN_UNREAL_ENGINE
void JSClassRegister::RegisterAddon(const FString& Name, AddonRegisterFunc RegisterFunc)
void JSClassRegister::RegisterAddon(const std::string& Name, AddonRegisterFunc RegisterFunc)
{
AddonRegisterInfos[Name] = RegisterFunc;
}

const JSClassDefinition* JSClassRegister::FindClassByType(UStruct* Type)
AddonRegisterFunc JSClassRegister::FindAddonRegisterFunc(const std::string& Name)
{
FString Name = FString::Printf(TEXT("%s%s"), Type->GetPrefixCPP(), *Type->GetName());
auto Iter = StructNameToClassDefinition.find(Name);
if (Iter == StructNameToClassDefinition.end())
auto Iter = AddonRegisterInfos.find(Name);
if (Iter == AddonRegisterInfos.end())
{
return nullptr;
}
Expand All @@ -129,10 +128,12 @@ const JSClassDefinition* JSClassRegister::FindClassByType(UStruct* Type)
}
}

AddonRegisterFunc JSClassRegister::FindAddonRegisterFunc(const FString& Name)
#if USING_IN_UNREAL_ENGINE
const JSClassDefinition* JSClassRegister::FindClassByType(UStruct* Type)
{
auto Iter = AddonRegisterInfos.find(Name);
if (Iter == AddonRegisterInfos.end())
FString Name = FString::Printf(TEXT("%s%s"), Type->GetPrefixCPP(), *Type->GetName());
auto Iter = StructNameToClassDefinition.find(Name);
if (Iter == StructNameToClassDefinition.end())
{
return nullptr;
}
Expand Down Expand Up @@ -182,22 +183,21 @@ const JSClassDefinition* FindCppTypeClassByName(const std::string& Name)
{
return GetJSClassRegister()->FindCppTypeClassByName(Name);
}

#if USING_IN_UNREAL_ENGINE

void RegisterAddon(const char* Name, AddonRegisterFunc RegisterFunc)
{
FString SN = UTF8_TO_TCHAR(Name);
GetJSClassRegister()->RegisterAddon(SN, RegisterFunc);
GetJSClassRegister()->RegisterAddon(Name, RegisterFunc);
}

const JSClassDefinition* FindClassByType(UStruct* Type)
AddonRegisterFunc FindAddonRegisterFunc(const std::string& Name)
{
return GetJSClassRegister()->FindClassByType(Type);
return GetJSClassRegister()->FindAddonRegisterFunc(Name);
}

AddonRegisterFunc FindAddonRegisterFunc(const FString& Name)
#if USING_IN_UNREAL_ENGINE
const JSClassDefinition* FindClassByType(UStruct* Type)
{
return GetJSClassRegister()->FindAddonRegisterFunc(Name);
return GetJSClassRegister()->FindClassByType(Type);
}
#endif

Expand Down
4 changes: 2 additions & 2 deletions unreal/Puerts/Source/JsEnv/Private/JsEnvImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2626,14 +2626,14 @@ void FJsEnvImpl::FindModule(const v8::FunctionCallbackInfo<v8::Value>& Info)

CHECK_V8_ARGS(String);

auto Name = FV8Utils::ToFString(Isolate, Info[0]);
std::string Name = *(v8::String::Utf8Value(Isolate, Info[0]));

auto Func = FindAddonRegisterFunc(Name);

if (Func)
{
auto Exports = v8::Object::New(Isolate);
Func(Isolate, Context, Exports);
Func(Context, Exports);
Info.GetReturnValue().Set(Exports);
}
}
Expand Down
8 changes: 4 additions & 4 deletions unreal/Puerts/Source/JsEnv/Public/JSClassRegister.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,14 +102,14 @@ const JSClassDefinition* FindClassByID(const char* Name);

const JSClassDefinition* FindCppTypeClassByName(const std::string& Name);

#if USING_IN_UNREAL_ENGINE
typedef void(*AddonRegisterFunc)(v8::Isolate* Isolate, v8::Local<v8::Context> Context, v8::Local<v8::Object> Exports);
typedef void(*AddonRegisterFunc)(v8::Local<v8::Context> Context, v8::Local<v8::Object> Exports);

AddonRegisterFunc FindAddonRegisterFunc(const std::string& Name);

void RegisterAddon(const char* Name, AddonRegisterFunc RegisterFunc);

#if USING_IN_UNREAL_ENGINE
JSENV_API const JSClassDefinition* FindClassByType(UStruct* Type);

AddonRegisterFunc FindAddonRegisterFunc(const FString& Name);
#endif

}
Expand Down

0 comments on commit 846450c

Please sign in to comment.