Skip to content

Commit

Permalink
[unity]升级p-api到最新版本
Browse files Browse the repository at this point in the history
  • Loading branch information
chexiongsheng committed Sep 11, 2024
1 parent b11d781 commit 0bcec80
Show file tree
Hide file tree
Showing 9 changed files with 716 additions and 492 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -562,7 +562,7 @@ pesapi_value TranslateValueType(pesapi_env env, Il2CppClass* targetClass, Il2Cpp

auto buff = new uint8_t[len];
memcpy(buff, Object::Unbox(obj), len);
return pesapi_create_native_object(env, targetClass, buff, true);
return pesapi_native_object_to_value(env, targetClass, buff, true);
}

pesapi_value TryTranslateValueType(pesapi_env env, Il2CppObject* obj)
Expand Down Expand Up @@ -732,7 +732,7 @@ handle_underlying:
void* data;
size_t length;
data = pesapi_get_value_binary(env, jsval, &length);
((NativeCtorPtr)ctor->methodPointer)(ret, data, length, 0, ctor);
((NativeCtorPtr)ctor->methodPointer)(ret, data, (int)length, 0, ctor);
return ret;
}
if ((klass == g_typeofPersistentObjectInfo || klass == il2cpp_defaults.object_class) && pesapi_is_object(env, jsval))
Expand Down Expand Up @@ -895,7 +895,7 @@ pesapi_value CSRefToJsValue(pesapi_env env, Il2CppClass *targetClass, Il2CppObje
}

auto objClass = obj && obj->klass ? obj->klass : targetClass;
return pesapi_create_native_object(env, objClass, obj, false);
return pesapi_native_object_to_value(env, objClass, obj, false);
}

static bool GetValueTypeFromJs(pesapi_env env, pesapi_value jsValue, Il2CppClass* klass, void* storage)
Expand Down Expand Up @@ -1509,14 +1509,14 @@ static void ReflectionGetFieldWrapper(pesapi_callback_info info, FieldInfo* fiel
{
if (isFieldPtr)
{
jsVal = pesapi_create_native_object(env, expectType, storage, false);
jsVal = pesapi_native_object_to_value(env, expectType, storage, false);
}
else
{
auto valueSize = expectType->instance_size - sizeof(Il2CppObject);
auto buff = new uint8_t[valueSize];
memcpy(buff, storage, valueSize);
jsVal = pesapi_create_native_object(env, expectType, buff, true);
jsVal = pesapi_native_object_to_value(env, expectType, buff, true);
}
}

Expand Down Expand Up @@ -1655,7 +1655,7 @@ namespace internal
class AutoValueScope
{
public:
AutoValueScope(pesapi_env_holder env_holder)
AutoValueScope(pesapi_env_ref env_holder)
{
scope = pesapi_open_scope(env_holder);
}
Expand All @@ -1671,10 +1671,10 @@ public:

Il2CppObject* EvalInternal(intptr_t ptr, Il2CppArray * __code, Il2CppString* __path, Il2CppReflectionType *__type)
{
pesapi_env_holder env_holder = reinterpret_cast<pesapi_env_holder>(ptr);
pesapi_env_ref env_holder = reinterpret_cast<pesapi_env_ref>(ptr);

internal::AutoValueScope ValueScope(env_holder);
auto env = pesapi_get_env_from_holder(env_holder);
auto env = pesapi_get_env_from_ref(env_holder);

const Il2CppChar* utf16 = il2cpp::utils::StringUtils::GetChars(__path);
std::string path = il2cpp::utils::StringUtils::Utf16ToUtf8(utf16);
Expand Down Expand Up @@ -1703,10 +1703,10 @@ Il2CppObject* EvalInternal(intptr_t ptr, Il2CppArray * __code, Il2CppString* __p
}
Il2CppObject* GetModuleExecutor(intptr_t ptr, Il2CppReflectionType* rtype)
{
pesapi_env_holder env_holder = reinterpret_cast<pesapi_env_holder>(ptr);
pesapi_env_ref env_holder = reinterpret_cast<pesapi_env_ref>(ptr);

internal::AutoValueScope ValueScope(env_holder);
auto env = pesapi_get_env_from_holder(env_holder);
auto env = pesapi_get_env_from_ref(env_holder);

pesapi_value func = g_unityExports.GetModuleExecutor(env);
if (pesapi_has_caught(ValueScope.scope))
Expand Down
464 changes: 246 additions & 218 deletions unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/pesapi.h.txt

Large diffs are not rendered by default.

293 changes: 171 additions & 122 deletions unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/pesapi_adpt.c.txt

Large diffs are not rendered by default.

51 changes: 27 additions & 24 deletions unity/native_src_il2cpp/Inc/JSClassRegister.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,23 +20,31 @@

#include <string>

#include "NamespaceDef.h"

PRAGMA_DISABLE_UNDEFINED_IDENTIFIER_WARNINGS
#pragma warning(push, 0)
#include "v8.h"
#pragma warning(pop)
PRAGMA_ENABLE_UNDEFINED_IDENTIFIER_WARNINGS

#if USING_IN_UNREAL_ENGINE
#include "TypeInfo.hpp"

static const FAnsiStringView EditorOnlyPropertySuffix = "_EditorOnly";
#endif

#include <mutex>

namespace puerts
namespace PUERTS_NAMESPACE
{
class CFunctionInfo;
struct JSENV_API JSFunctionInfo
{
const char* Name;
v8::FunctionCallback Callback;
void* Data = nullptr;
const CFunctionInfo* ReflectionInfo = nullptr;
};

struct JSENV_API JSPropertyInfo
Expand All @@ -52,19 +60,8 @@ typedef void (*FinalizeFunc)(void* Ptr);

typedef void* (*InitializeFunc)(const v8::FunctionCallbackInfo<v8::Value>& Info);

#if USING_IN_UNREAL_ENGINE
struct NamedFunctionInfo
{
const char* Name;
const CFunctionInfo* Type;
};

struct NamedPropertyInfo
{
const char* Name;
const CTypeInfo* Type;
};
#endif
struct NamedFunctionInfo;
struct NamedPropertyInfo;

struct JSENV_API JSClassDefinition
{
Expand Down Expand Up @@ -105,32 +102,38 @@ void JSENV_API RegisterJSClass(const JSClassDefinition& ClassDefinition);

std::recursive_mutex& JSENV_API RegisterMutex();

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, bool TryLazyLoad = false);

typedef void (*LoadTypeFunc) (const void* typeId);
JSENV_API void SetLazyLoadCallback(LoadTypeFunc Callback);

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

#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);

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

JSENV_API bool IsEditorOnlyUFunction(const UFunction* Func);

#endif

} // namespace puerts
} // namespace PUERTS_NAMESPACE

#define PUERTS_MODULE(Name, RegFunc) \
static struct FAutoRegisterFor##Name \
{ \
FAutoRegisterFor##Name() \
{ \
puerts::RegisterAddon(#Name, (RegFunc)); \
} \
#define PUERTS_MODULE(Name, RegFunc) \
static struct FAutoRegisterFor##Name \
{ \
FAutoRegisterFor##Name() \
{ \
PUERTS_NAMESPACE::RegisterAddon(#Name, (RegFunc)); \
} \
} _AutoRegisterFor##Name
80 changes: 54 additions & 26 deletions unity/native_src_il2cpp/Inc/pesapi.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

// Portable Embedded Scripting API

#define PESAPI_VERSION 5
#define PESAPI_VERSION 10

#define PESAPI_EXTERN

Expand Down Expand Up @@ -62,6 +62,8 @@

#define PESAPI_MODULE_INITIALIZER(modname) PESAPI_MODULE_INITIALIZER_X(PESAPI_MODULE_INITIALIZER_BASE, modname, PESAPI_VERSION)

#define PESAPI_MODULE_VERSION() PESAPI_MODULE_INITIALIZER_X(PESAPI_MODULE_INITIALIZER_BASE, version, 0)

#ifdef USING_OBJC_REFLECTION

#define PESAPI_MODULE(modname, initfunc) \
Expand All @@ -77,24 +79,39 @@

#else

#define PESAPI_MODULE(modname, initfunc) \
EXTERN_C_START \
PESAPI_MODULE_EXPORT void PESAPI_MODULE_INITIALIZER(modname)(pesapi_func_ptr * func_ptr_array); \
EXTERN_C_END \
PESAPI_MODULE_EXPORT void PESAPI_MODULE_INITIALIZER(modname)(pesapi_func_ptr * func_ptr_array) \
{ \
pesapi_init(func_ptr_array); \
initfunc(); \
#define PESAPI_MODULE(modname, initfunc) \
EXTERN_C_START \
PESAPI_MODULE_EXPORT void PESAPI_MODULE_INITIALIZER(modname)(pesapi_func_ptr * func_ptr_array); \
PESAPI_MODULE_EXPORT const char* PESAPI_MODULE_INITIALIZER(dynamic)(pesapi_func_ptr * func_ptr_array); \
PESAPI_MODULE_EXPORT int PESAPI_MODULE_VERSION()(); \
EXTERN_C_END \
PESAPI_MODULE_EXPORT void PESAPI_MODULE_INITIALIZER(modname)(pesapi_func_ptr * func_ptr_array) \
{ \
pesapi_init(func_ptr_array); \
initfunc(); \
} \
PESAPI_MODULE_EXPORT const char* PESAPI_MODULE_INITIALIZER(dynamic)(pesapi_func_ptr * func_ptr_array) \
{ \
if (func_ptr_array) \
{ \
pesapi_init(func_ptr_array); \
initfunc(); \
} \
return #modname; \
} \
PESAPI_MODULE_EXPORT int PESAPI_MODULE_VERSION()() \
{ \
return PESAPI_VERSION; \
}

#endif

EXTERN_C_START

typedef struct pesapi_env__* pesapi_env;
typedef struct pesapi_env_holder__* pesapi_env_holder;
typedef struct pesapi_env_ref__* pesapi_env_ref;
typedef struct pesapi_value__* pesapi_value;
typedef struct pesapi_value_holder__* pesapi_value_holder;
typedef struct pesapi_value_ref__* pesapi_value_ref;
typedef struct pesapi_callback_info__* pesapi_callback_info;
typedef struct pesapi_scope__* pesapi_scope;
typedef struct pesapi_type_info__* pesapi_type_info;
Expand Down Expand Up @@ -123,6 +140,7 @@ PESAPI_EXTERN pesapi_value pesapi_create_uint64(pesapi_env env, uint64_t value);
PESAPI_EXTERN pesapi_value pesapi_create_double(pesapi_env env, double value);
PESAPI_EXTERN pesapi_value pesapi_create_string_utf8(pesapi_env env, const char* str, size_t length);
PESAPI_EXTERN pesapi_value pesapi_create_binary(pesapi_env env, void* str, size_t length);
PESAPI_EXTERN pesapi_value pesapi_create_array(pesapi_env env);

PESAPI_EXTERN bool pesapi_get_value_bool(pesapi_env env, pesapi_value value);
PESAPI_EXTERN int32_t pesapi_get_value_int32(pesapi_env env, pesapi_value value);
Expand All @@ -132,6 +150,7 @@ PESAPI_EXTERN uint64_t pesapi_get_value_uint64(pesapi_env env, pesapi_value valu
PESAPI_EXTERN double pesapi_get_value_double(pesapi_env env, pesapi_value value);
PESAPI_EXTERN const char* pesapi_get_value_string_utf8(pesapi_env env, pesapi_value value, char* buf, size_t* bufsize);
PESAPI_EXTERN void* pesapi_get_value_binary(pesapi_env env, pesapi_value pvalue, size_t* bufsize);
PESAPI_EXTERN uint32_t pesapi_get_array_length(pesapi_env env, pesapi_value value);

PESAPI_EXTERN bool pesapi_is_null(pesapi_env env, pesapi_value value);
PESAPI_EXTERN bool pesapi_is_undefined(pesapi_env env, pesapi_value value);
Expand All @@ -145,16 +164,17 @@ PESAPI_EXTERN bool pesapi_is_string(pesapi_env env, pesapi_value value);
PESAPI_EXTERN bool pesapi_is_object(pesapi_env env, pesapi_value value);
PESAPI_EXTERN bool pesapi_is_function(pesapi_env env, pesapi_value value);
PESAPI_EXTERN bool pesapi_is_binary(pesapi_env env, pesapi_value value);
PESAPI_EXTERN bool pesapi_is_array(pesapi_env env, pesapi_value value);

PESAPI_EXTERN pesapi_value pesapi_create_native_object(pesapi_env env, const void* class_id, void* object_ptr, bool copy);
PESAPI_EXTERN pesapi_value pesapi_native_object_to_value(pesapi_env env, const void* type_id, void* object_ptr, bool call_finalize);
PESAPI_EXTERN void* pesapi_get_native_object_ptr(pesapi_env env, pesapi_value value);
PESAPI_EXTERN const void* pesapi_get_native_object_typeid(pesapi_env env, pesapi_value value);
PESAPI_EXTERN bool pesapi_is_native_object(pesapi_env env, const void* class_id, pesapi_value value);
PESAPI_EXTERN bool pesapi_is_instance_of(pesapi_env env, const void* type_id, pesapi_value value);

PESAPI_EXTERN pesapi_value pesapi_create_ref(pesapi_env env, pesapi_value value);
PESAPI_EXTERN pesapi_value pesapi_get_value_ref(pesapi_env env, pesapi_value value);
PESAPI_EXTERN void pesapi_update_value_ref(pesapi_env env, pesapi_value ref, pesapi_value value);
PESAPI_EXTERN bool pesapi_is_ref(pesapi_env env, pesapi_value value);
PESAPI_EXTERN pesapi_value pesapi_boxing(pesapi_env env, pesapi_value value);
PESAPI_EXTERN pesapi_value pesapi_unboxing(pesapi_env env, pesapi_value value);
PESAPI_EXTERN void pesapi_update_boxed_value(pesapi_env env, pesapi_value boxed_value, pesapi_value value);
PESAPI_EXTERN bool pesapi_is_boxed_value(pesapi_env env, pesapi_value value);

PESAPI_EXTERN int pesapi_get_args_len(pesapi_callback_info info);
PESAPI_EXTERN pesapi_value pesapi_get_arg(pesapi_callback_info info, int index);
Expand All @@ -166,20 +186,23 @@ PESAPI_EXTERN void* pesapi_get_constructor_userdata(pesapi_callback_info info);
PESAPI_EXTERN void pesapi_add_return(pesapi_callback_info info, pesapi_value value);
PESAPI_EXTERN void pesapi_throw_by_string(pesapi_callback_info pinfo, const char* msg);

PESAPI_EXTERN pesapi_env_holder pesapi_hold_env(pesapi_env env);
PESAPI_EXTERN pesapi_env pesapi_get_env_from_holder(pesapi_env_holder env_holder);
PESAPI_EXTERN pesapi_env_holder pesapi_duplicate_env_holder(pesapi_env_holder env_holder);
PESAPI_EXTERN void pesapi_release_env_holder(pesapi_env_holder env_holder);
PESAPI_EXTERN pesapi_env_ref pesapi_create_env_ref(pesapi_env env);
PESAPI_EXTERN pesapi_env pesapi_get_env_from_ref(pesapi_env_ref env_ref);
PESAPI_EXTERN pesapi_env_ref pesapi_duplicate_env_ref(pesapi_env_ref env_ref);
PESAPI_EXTERN void pesapi_release_env_ref(pesapi_env_ref env_ref);

PESAPI_EXTERN pesapi_scope pesapi_open_scope(pesapi_env_holder env_holder);
PESAPI_EXTERN pesapi_scope pesapi_open_scope(pesapi_env_ref env_ref);
PESAPI_EXTERN bool pesapi_has_caught(pesapi_scope scope);
PESAPI_EXTERN const char* pesapi_get_exception_as_string(pesapi_scope scope, bool with_stack);
PESAPI_EXTERN void pesapi_close_scope(pesapi_scope scope);

PESAPI_EXTERN pesapi_value_holder pesapi_hold_value(pesapi_env env, pesapi_value value);
PESAPI_EXTERN pesapi_value_holder pesapi_duplicate_value_holder(pesapi_value_holder value_holder);
PESAPI_EXTERN void pesapi_release_value_holder(pesapi_value_holder value_holder);
PESAPI_EXTERN pesapi_value pesapi_get_value_from_holder(pesapi_env env, pesapi_value_holder value_holder);
PESAPI_EXTERN pesapi_value_ref pesapi_create_value_ref(pesapi_env env, pesapi_value value);
PESAPI_EXTERN pesapi_value_ref pesapi_duplicate_value_ref(pesapi_value_ref value_ref);
PESAPI_EXTERN void pesapi_release_value_ref(pesapi_value_ref value_ref);
PESAPI_EXTERN pesapi_value pesapi_get_value_from_ref(pesapi_env env, pesapi_value_ref value_ref);
PESAPI_EXTERN void pesapi_set_ref_weak(pesapi_env env, pesapi_value_ref value_ref);
// Optional api: return false if can not fulfill
PESAPI_EXTERN bool pesapi_set_owner(pesapi_env env, pesapi_value value, pesapi_value owner);

PESAPI_EXTERN pesapi_value pesapi_get_property(pesapi_env env, pesapi_value object, const char* key);
PESAPI_EXTERN void pesapi_set_property(pesapi_env env, pesapi_value object, const char* key, pesapi_value value);
Expand Down Expand Up @@ -213,6 +236,11 @@ PESAPI_EXTERN void pesapi_define_class(const void* type_id, const void* super_ty
pesapi_constructor constructor, pesapi_finalize finalize, size_t property_count, pesapi_property_descriptor properties,
void* userdata);

PESAPI_EXTERN void pesapi_class_type_info(const char* proto_magic_id, const void* type_id, const void* constructor_info,
const void* methods_info, const void* functions_info, const void* properties_info, const void* variables_info);

PESAPI_EXTERN const void* pesapi_find_type_id(const char* module_name, const char* type_name);

EXTERN_C_END

#endif
Loading

0 comments on commit 0bcec80

Please sign in to comment.