Files
MingSimulator/Plugins/Puerts/Source/JsEnv/Public/JSClassRegister.h
T

176 lines
5.8 KiB
C++

/*
* Tencent is pleased to support the open source community by making Puerts available.
* Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved.
* Puerts is licensed under the BSD 3-Clause License, except for the third-party components listed in the file 'LICENSE' which may
* be subject to their corresponding license terms. This file is subject to the terms and conditions defined in file 'LICENSE',
* which is part of this source code package.
*/
#pragma once
#include "functional"
#if USING_IN_UNREAL_ENGINE
#include "CoreMinimal.h"
PRAGMA_DISABLE_UNDEFINED_IDENTIFIER_WARNINGS
#pragma warning(push, 0)
#include "v8.h"
#pragma warning(pop)
PRAGMA_ENABLE_UNDEFINED_IDENTIFIER_WARNINGS
#else
#define JSENV_API
#define FORCEINLINE V8_INLINE
#define UPTRINT uintptr_t
#endif
#include <string>
#include "PuertsNamespaceDef.h"
#include "pesapi.h"
#include "TypeInfo.hpp"
#if USING_IN_UNREAL_ENGINE
static const FAnsiStringView EditorOnlyPropertySuffix = "_EditorOnly";
#endif
namespace PUERTS_NAMESPACE
{
class CFunctionInfo;
MSVC_PRAGMA(warning(push))
MSVC_PRAGMA(warning(disable : 4191))
struct JSENV_API JSFunctionInfo
{
JSFunctionInfo() : Name(nullptr), Callback(nullptr)
{
}
JSFunctionInfo(
const char* InName, pesapi_callback InCallback, void* InData = nullptr, const CFunctionInfo* InReflectionInfo = nullptr)
: Name(InName), Callback(InCallback), Data(InData), ReflectionInfo(InReflectionInfo)
{
}
template <class CallbackType>
JSFunctionInfo(
const char* InName, CallbackType InCallback, void* InData = nullptr, const CFunctionInfo* InReflectionInfo = nullptr)
: Name(InName), Callback(reinterpret_cast<pesapi_callback>(InCallback)), Data(InData), ReflectionInfo(InReflectionInfo)
{
}
const char* Name;
pesapi_callback Callback;
void* Data = nullptr;
const CFunctionInfo* ReflectionInfo = nullptr;
};
struct JSENV_API JSPropertyInfo
{
JSPropertyInfo() : Name(nullptr), Getter(nullptr), Setter(nullptr)
{
}
JSPropertyInfo(const char* InName, pesapi_callback InGetter, pesapi_callback InSetter, void* InGetterData = nullptr,
void* InSetterData = nullptr)
: Name(InName), Getter(InGetter), Setter(InSetter), GetterData(InGetterData), SetterData(InSetterData)
{
}
template <class CallbackType>
JSPropertyInfo(const char* InName, CallbackType InGetter, CallbackType InSetter, void* InGetterData = nullptr,
void* InSetterData = nullptr)
: Name(InName)
, Getter(reinterpret_cast<pesapi_callback>(InGetter))
, Setter(reinterpret_cast<pesapi_callback>(InSetter))
, GetterData(InGetterData)
, SetterData(InSetterData)
{
}
const char* Name;
pesapi_callback Getter;
pesapi_callback Setter;
void* GetterData = nullptr;
void* SetterData = nullptr;
};
struct NamedFunctionInfo;
struct NamedPropertyInfo;
struct JSENV_API JSClassDefinition
{
const void* TypeId;
const void* SuperTypeId;
const char* ScriptName;
const char* UETypeName;
pesapi_constructor Initialize;
template <class InitializeType>
void SetInitialize(InitializeType InInitialize)
{
Initialize = reinterpret_cast<pesapi_constructor>(InInitialize);
}
JSFunctionInfo* Methods; //成员方法
JSFunctionInfo* Functions; //静态方法
JSPropertyInfo* Properties; //成员属性
JSPropertyInfo* Variables; //静态属性
pesapi_finalize Finalize;
// int InternalFieldCount;
NamedFunctionInfo* ConstructorInfos;
NamedFunctionInfo* MethodInfos;
NamedFunctionInfo* FunctionInfos;
NamedPropertyInfo* PropertyInfos;
NamedPropertyInfo* VariableInfos;
void* Data = nullptr;
pesapi_on_native_object_enter OnEnter = nullptr;
pesapi_on_native_object_exit OnExit = nullptr;
};
MSVC_PRAGMA(warning(pop))
#define JSClassEmptyDefinition \
{ \
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \
}
void JSENV_API RegisterJSClass(const JSClassDefinition& ClassDefinition);
void JSENV_API SetClassTypeInfo(const void* TypeId, const NamedFunctionInfo* ConstructorInfos, const NamedFunctionInfo* MethodInfos,
const NamedFunctionInfo* FunctionInfos, const NamedPropertyInfo* PropertyInfos, const NamedPropertyInfo* VariableInfos);
void JSENV_API ForeachRegisterClass(std::function<void(const JSClassDefinition* ClassDefinition)>);
JSENV_API const JSClassDefinition* FindClassByID(const void* TypeId);
JSENV_API void OnClassNotFound(pesapi_class_not_found_callback Callback);
JSENV_API const JSClassDefinition* LoadClassByID(const void* TypeId);
JSENV_API const JSClassDefinition* FindCppTypeClassByName(const std::string& Name);
JSENV_API bool TraceObjectLifecycle(const void* TypeId, pesapi_on_native_object_enter OnEnter, pesapi_on_native_object_exit OnExit);
#if USING_IN_UNREAL_ENGINE
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);
JSENV_API const JSClassDefinition* FindClassByType(UStruct* Type);
JSENV_API bool IsEditorOnlyUFunction(const UFunction* Func);
#endif
} // namespace PUERTS_NAMESPACE
#define PUERTS_MODULE(Name, RegFunc) \
static struct FAutoRegisterFor##Name \
{ \
FAutoRegisterFor##Name() \
{ \
PUERTS_NAMESPACE::RegisterAddon(#Name, (RegFunc)); \
} \
} _AutoRegisterFor##Name