From 0bcec803c64d9a69b0ac827912355abe2376008c Mon Sep 17 00:00:00 2001 From: johnche Date: Wed, 11 Sep 2024 20:06:52 +0800 Subject: [PATCH] =?UTF-8?q?[unity]=E5=8D=87=E7=BA=A7p-api=E5=88=B0?= =?UTF-8?q?=E6=9C=80=E6=96=B0=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../puerts/xil2cpp/Puerts_il2cpp.cpp.txt | 20 +- .../Resources/puerts/xil2cpp/pesapi.h.txt | 464 ++++++++++-------- .../puerts/xil2cpp/pesapi_adpt.c.txt | 293 ++++++----- unity/native_src_il2cpp/Inc/JSClassRegister.h | 51 +- unity/native_src_il2cpp/Inc/pesapi.h | 80 ++- .../native_src_il2cpp/Src/JSClassRegister.cpp | 46 +- .../native_src_il2cpp/Src/PesapiAddonLoad.cpp | 40 +- unity/native_src_il2cpp/Src/PesapiV8Impl.cpp | 210 +++++--- unity/native_src_il2cpp/Src/Puerts.cpp | 4 +- 9 files changed, 716 insertions(+), 492 deletions(-) diff --git a/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/Puerts_il2cpp.cpp.txt b/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/Puerts_il2cpp.cpp.txt index 57669b092a..7cfb5e6300 100644 --- a/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/Puerts_il2cpp.cpp.txt +++ b/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/Puerts_il2cpp.cpp.txt @@ -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) @@ -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)) @@ -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) @@ -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); } } @@ -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); } @@ -1671,10 +1671,10 @@ public: Il2CppObject* EvalInternal(intptr_t ptr, Il2CppArray * __code, Il2CppString* __path, Il2CppReflectionType *__type) { - pesapi_env_holder env_holder = reinterpret_cast(ptr); + pesapi_env_ref env_holder = reinterpret_cast(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); @@ -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(ptr); + pesapi_env_ref env_holder = reinterpret_cast(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)) diff --git a/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/pesapi.h.txt b/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/pesapi.h.txt index 4509b77f62..da7899da92 100644 --- a/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/pesapi.h.txt +++ b/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/pesapi.h.txt @@ -1,218 +1,246 @@ -/* - * 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. - */ - -#ifndef PS_API_H_ -#define PS_API_H_ - -#include -#include -#include - -// Portable Embedded Scripting API - -#define PESAPI_VERSION 5 - -#define PESAPI_EXTERN - -#if defined(__APPLE__) && defined(BUILDING_PES_EXTENSION) && !defined(PESAPI_ADPT_C) -#include "TargetConditionals.h" -#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR -#define USING_OBJC_REFLECTION -#endif -#endif - -#ifdef USING_OBJC_REFLECTION -#import -#endif - -#ifdef _WIN32 -#define PESAPI_MODULE_EXPORT __declspec(dllexport) -#else -#define PESAPI_MODULE_EXPORT __attribute__((visibility("default"))) -#endif - -#if defined(__GNUC__) -#define PESAPI_NO_RETURN __attribute__((noreturn)) -#elif defined(_WIN32) -#define PESAPI_NO_RETURN __declspec(noreturn) -#else -#define PESAPI_NO_RETURN -#endif - -#ifdef __cplusplus -#define EXTERN_C_START \ - extern "C" \ - { -#define EXTERN_C_END } -#else -#define EXTERN_C_START -#define EXTERN_C_END -#endif - -#define PESAPI_MODULE_INITIALIZER_X(base, module, version) PESAPI_MODULE_INITIALIZER_X_HELPER(base, module, version) - -#define PESAPI_MODULE_INITIALIZER_X_HELPER(base, module, version) base##module##_v##version - -#define PESAPI_MODULE_INITIALIZER_BASE pesapi_register_ - -#define PESAPI_MODULE_INITIALIZER(modname) PESAPI_MODULE_INITIALIZER_X(PESAPI_MODULE_INITIALIZER_BASE, modname, PESAPI_VERSION) - -#ifdef USING_OBJC_REFLECTION - -#define PESAPI_MODULE(modname, initfunc) \ - @interface PESAPI_MODULE_INITIALIZER (modname) : NSObject \ -@end \ - @implementation PESAPI_MODULE_INITIALIZER (modname) \ - +(void) initlib : (pesapi_func_ptr*) func_ptr_array \ - { \ - pesapi_init(func_ptr_array); \ - initfunc(); \ - } \ - @end - -#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(); \ - } - -#endif - -EXTERN_C_START - -typedef struct pesapi_env__* pesapi_env; -typedef struct pesapi_env_holder__* pesapi_env_holder; -typedef struct pesapi_value__* pesapi_value; -typedef struct pesapi_value_holder__* pesapi_value_holder; -typedef struct pesapi_callback_info__* pesapi_callback_info; -typedef struct pesapi_scope__* pesapi_scope; -typedef struct pesapi_type_info__* pesapi_type_info; -typedef struct pesapi_signature_info__* pesapi_signature_info; -typedef struct pesapi_property_descriptor__* pesapi_property_descriptor; - -typedef void (*pesapi_callback)(pesapi_callback_info info); -typedef void* (*pesapi_constructor)(pesapi_callback_info info); -typedef void (*pesapi_finalize)(void* Ptr); -typedef void (*pesapi_func_ptr)(void); - -#ifdef BUILDING_PES_EXTENSION -PESAPI_EXTERN void pesapi_init(pesapi_func_ptr* func_array); -#else -PESAPI_MODULE_EXPORT int pesapi_load_addon(const char* path, const char* module_name); -#endif - -// value process -PESAPI_EXTERN pesapi_value pesapi_create_null(pesapi_env env); -PESAPI_EXTERN pesapi_value pesapi_create_undefined(pesapi_env env); -PESAPI_EXTERN pesapi_value pesapi_create_boolean(pesapi_env env, bool value); -PESAPI_EXTERN pesapi_value pesapi_create_int32(pesapi_env env, int32_t value); -PESAPI_EXTERN pesapi_value pesapi_create_uint32(pesapi_env env, uint32_t value); -PESAPI_EXTERN pesapi_value pesapi_create_int64(pesapi_env env, int64_t value); -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 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); -PESAPI_EXTERN uint32_t pesapi_get_value_uint32(pesapi_env env, pesapi_value value); -PESAPI_EXTERN int64_t pesapi_get_value_int64(pesapi_env env, pesapi_value value); -PESAPI_EXTERN uint64_t pesapi_get_value_uint64(pesapi_env env, pesapi_value value); -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 bool pesapi_is_null(pesapi_env env, pesapi_value value); -PESAPI_EXTERN bool pesapi_is_undefined(pesapi_env env, pesapi_value value); -PESAPI_EXTERN bool pesapi_is_boolean(pesapi_env env, pesapi_value value); -PESAPI_EXTERN bool pesapi_is_int32(pesapi_env env, pesapi_value value); -PESAPI_EXTERN bool pesapi_is_uint32(pesapi_env env, pesapi_value value); -PESAPI_EXTERN bool pesapi_is_int64(pesapi_env env, pesapi_value value); -PESAPI_EXTERN bool pesapi_is_uint64(pesapi_env env, pesapi_value value); -PESAPI_EXTERN bool pesapi_is_double(pesapi_env env, pesapi_value value); -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 pesapi_value pesapi_create_native_object(pesapi_env env, const void* class_id, void* object_ptr, bool copy); -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 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 int pesapi_get_args_len(pesapi_callback_info info); -PESAPI_EXTERN pesapi_value pesapi_get_arg(pesapi_callback_info info, int index); -PESAPI_EXTERN pesapi_env pesapi_get_env(pesapi_callback_info info); -PESAPI_EXTERN pesapi_value pesapi_get_this(pesapi_callback_info info); -PESAPI_EXTERN pesapi_value pesapi_get_holder(pesapi_callback_info info); -PESAPI_EXTERN void* pesapi_get_userdata(pesapi_callback_info info); -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_scope pesapi_open_scope(pesapi_env_holder env_holder); -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 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); - -PESAPI_EXTERN pesapi_value pesapi_get_property_uint32(pesapi_env env, pesapi_value object, uint32_t key); -PESAPI_EXTERN void pesapi_set_property_uint32(pesapi_env env, pesapi_value object, uint32_t key, pesapi_value value); - -PESAPI_EXTERN pesapi_value pesapi_call_function( - pesapi_env env, pesapi_value func, pesapi_value this_object, int argc, const pesapi_value argv[]); - -PESAPI_EXTERN pesapi_value pesapi_eval(pesapi_env env, const uint8_t* code, size_t code_size, const char* path); - -PESAPI_EXTERN pesapi_type_info pesapi_alloc_type_infos(size_t count); - -PESAPI_EXTERN void pesapi_set_type_info( - pesapi_type_info type_infos, size_t index, const char* name, bool is_pointer, bool is_const, bool is_ref, bool is_primitive); - -PESAPI_EXTERN pesapi_signature_info pesapi_create_signature_info( - pesapi_type_info return_type, size_t parameter_count, pesapi_type_info parameter_types); - -PESAPI_EXTERN pesapi_property_descriptor pesapi_alloc_property_descriptors(size_t count); - -// using pesapi_get_userdata obtain userdata in callback -PESAPI_EXTERN void pesapi_set_method_info(pesapi_property_descriptor properties, size_t index, const char* name, bool is_static, - pesapi_callback method, void* userdata, pesapi_signature_info signature_info); - -PESAPI_EXTERN void pesapi_set_property_info(pesapi_property_descriptor properties, size_t index, const char* name, bool is_static, - pesapi_callback getter, pesapi_callback setter, void* userdata, pesapi_type_info type_info); - -PESAPI_EXTERN void pesapi_define_class(const void* type_id, const void* super_type_id, const char* type_name, - pesapi_constructor constructor, pesapi_finalize finalize, size_t property_count, pesapi_property_descriptor properties, - void* userdata); - -EXTERN_C_END - -#endif \ No newline at end of file +/* + * 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. + */ + +#ifndef PS_API_H_ +#define PS_API_H_ + +#include +#include +#include + +// Portable Embedded Scripting API + +#define PESAPI_VERSION 10 + +#define PESAPI_EXTERN + +#if defined(__APPLE__) && defined(BUILDING_PES_EXTENSION) && !defined(PESAPI_ADPT_C) +#include "TargetConditionals.h" +#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR +#define USING_OBJC_REFLECTION +#endif +#endif + +#ifdef USING_OBJC_REFLECTION +#import +#endif + +#ifdef _WIN32 +#define PESAPI_MODULE_EXPORT __declspec(dllexport) +#else +#define PESAPI_MODULE_EXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__GNUC__) +#define PESAPI_NO_RETURN __attribute__((noreturn)) +#elif defined(_WIN32) +#define PESAPI_NO_RETURN __declspec(noreturn) +#else +#define PESAPI_NO_RETURN +#endif + +#ifdef __cplusplus +#define EXTERN_C_START \ + extern "C" \ + { +#define EXTERN_C_END } +#else +#define EXTERN_C_START +#define EXTERN_C_END +#endif + +#define PESAPI_MODULE_INITIALIZER_X(base, module, version) PESAPI_MODULE_INITIALIZER_X_HELPER(base, module, version) + +#define PESAPI_MODULE_INITIALIZER_X_HELPER(base, module, version) base##module##_v##version + +#define PESAPI_MODULE_INITIALIZER_BASE pesapi_register_ + +#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) \ + @interface PESAPI_MODULE_INITIALIZER (modname) : NSObject \ +@end \ + @implementation PESAPI_MODULE_INITIALIZER (modname) \ + +(void) initlib : (pesapi_func_ptr*) func_ptr_array \ + { \ + pesapi_init(func_ptr_array); \ + initfunc(); \ + } \ + @end + +#else + +#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_ref__* pesapi_env_ref; +typedef struct pesapi_value__* pesapi_value; +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; +typedef struct pesapi_signature_info__* pesapi_signature_info; +typedef struct pesapi_property_descriptor__* pesapi_property_descriptor; + +typedef void (*pesapi_callback)(pesapi_callback_info info); +typedef void* (*pesapi_constructor)(pesapi_callback_info info); +typedef void (*pesapi_finalize)(void* Ptr); +typedef void (*pesapi_func_ptr)(void); + +#ifdef BUILDING_PES_EXTENSION +PESAPI_EXTERN void pesapi_init(pesapi_func_ptr* func_array); +#else +PESAPI_MODULE_EXPORT int pesapi_load_addon(const char* path, const char* module_name); +#endif + +// value process +PESAPI_EXTERN pesapi_value pesapi_create_null(pesapi_env env); +PESAPI_EXTERN pesapi_value pesapi_create_undefined(pesapi_env env); +PESAPI_EXTERN pesapi_value pesapi_create_boolean(pesapi_env env, bool value); +PESAPI_EXTERN pesapi_value pesapi_create_int32(pesapi_env env, int32_t value); +PESAPI_EXTERN pesapi_value pesapi_create_uint32(pesapi_env env, uint32_t value); +PESAPI_EXTERN pesapi_value pesapi_create_int64(pesapi_env env, int64_t value); +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); +PESAPI_EXTERN uint32_t pesapi_get_value_uint32(pesapi_env env, pesapi_value value); +PESAPI_EXTERN int64_t pesapi_get_value_int64(pesapi_env env, pesapi_value value); +PESAPI_EXTERN uint64_t pesapi_get_value_uint64(pesapi_env env, pesapi_value value); +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); +PESAPI_EXTERN bool pesapi_is_boolean(pesapi_env env, pesapi_value value); +PESAPI_EXTERN bool pesapi_is_int32(pesapi_env env, pesapi_value value); +PESAPI_EXTERN bool pesapi_is_uint32(pesapi_env env, pesapi_value value); +PESAPI_EXTERN bool pesapi_is_int64(pesapi_env env, pesapi_value value); +PESAPI_EXTERN bool pesapi_is_uint64(pesapi_env env, pesapi_value value); +PESAPI_EXTERN bool pesapi_is_double(pesapi_env env, pesapi_value value); +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_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_instance_of(pesapi_env env, const void* type_id, 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); +PESAPI_EXTERN pesapi_env pesapi_get_env(pesapi_callback_info info); +PESAPI_EXTERN pesapi_value pesapi_get_this(pesapi_callback_info info); +PESAPI_EXTERN pesapi_value pesapi_get_holder(pesapi_callback_info info); +PESAPI_EXTERN void* pesapi_get_userdata(pesapi_callback_info info); +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_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_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_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); + +PESAPI_EXTERN pesapi_value pesapi_get_property_uint32(pesapi_env env, pesapi_value object, uint32_t key); +PESAPI_EXTERN void pesapi_set_property_uint32(pesapi_env env, pesapi_value object, uint32_t key, pesapi_value value); + +PESAPI_EXTERN pesapi_value pesapi_call_function( + pesapi_env env, pesapi_value func, pesapi_value this_object, int argc, const pesapi_value argv[]); + +PESAPI_EXTERN pesapi_value pesapi_eval(pesapi_env env, const uint8_t* code, size_t code_size, const char* path); + +PESAPI_EXTERN pesapi_type_info pesapi_alloc_type_infos(size_t count); + +PESAPI_EXTERN void pesapi_set_type_info( + pesapi_type_info type_infos, size_t index, const char* name, bool is_pointer, bool is_const, bool is_ref, bool is_primitive); + +PESAPI_EXTERN pesapi_signature_info pesapi_create_signature_info( + pesapi_type_info return_type, size_t parameter_count, pesapi_type_info parameter_types); + +PESAPI_EXTERN pesapi_property_descriptor pesapi_alloc_property_descriptors(size_t count); + +// using pesapi_get_userdata obtain userdata in callback +PESAPI_EXTERN void pesapi_set_method_info(pesapi_property_descriptor properties, size_t index, const char* name, bool is_static, + pesapi_callback method, void* userdata, pesapi_signature_info signature_info); + +PESAPI_EXTERN void pesapi_set_property_info(pesapi_property_descriptor properties, size_t index, const char* name, bool is_static, + pesapi_callback getter, pesapi_callback setter, void* userdata, pesapi_type_info type_info); + +PESAPI_EXTERN void pesapi_define_class(const void* type_id, const void* super_type_id, const char* type_name, + 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 diff --git a/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/pesapi_adpt.c.txt b/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/pesapi_adpt.c.txt index aba8c01643..a7e4ad999b 100644 --- a/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/pesapi_adpt.c.txt +++ b/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/pesapi_adpt.c.txt @@ -76,6 +76,12 @@ pesapi_value pesapi_create_binary (pesapi_env env, void* str, size_t length) { return pesapi_create_binary_ptr(env, str, length); } +typedef pesapi_value (*pesapi_create_arrayType)(pesapi_env env); +static pesapi_create_arrayType pesapi_create_array_ptr; +pesapi_value pesapi_create_array (pesapi_env env) { + return pesapi_create_array_ptr(env); +} + typedef bool (*pesapi_get_value_boolType)(pesapi_env env, pesapi_value value); static pesapi_get_value_boolType pesapi_get_value_bool_ptr; bool pesapi_get_value_bool (pesapi_env env, pesapi_value value) { @@ -124,6 +130,12 @@ void* pesapi_get_value_binary (pesapi_env env, pesapi_value pvalue, size_t* bufs return pesapi_get_value_binary_ptr(env, pvalue, bufsize); } +typedef uint32_t (*pesapi_get_array_lengthType)(pesapi_env env, pesapi_value value); +static pesapi_get_array_lengthType pesapi_get_array_length_ptr; +uint32_t pesapi_get_array_length (pesapi_env env, pesapi_value value) { + return pesapi_get_array_length_ptr(env, value); +} + typedef bool (*pesapi_is_nullType)(pesapi_env env, pesapi_value value); static pesapi_is_nullType pesapi_is_null_ptr; bool pesapi_is_null (pesapi_env env, pesapi_value value) { @@ -196,10 +208,16 @@ bool pesapi_is_binary (pesapi_env env, pesapi_value value) { return pesapi_is_binary_ptr(env, value); } -typedef pesapi_value (*pesapi_create_native_objectType)(pesapi_env env, const void* class_id, void* object_ptr, bool copy); -static pesapi_create_native_objectType pesapi_create_native_object_ptr; -pesapi_value pesapi_create_native_object (pesapi_env env, const void* class_id, void* object_ptr, bool copy) { - return pesapi_create_native_object_ptr(env, class_id, object_ptr, copy); +typedef bool (*pesapi_is_arrayType)(pesapi_env env, pesapi_value value); +static pesapi_is_arrayType pesapi_is_array_ptr; +bool pesapi_is_array (pesapi_env env, pesapi_value value) { + return pesapi_is_array_ptr(env, value); +} + +typedef pesapi_value (*pesapi_native_object_to_valueType)(pesapi_env env, const void* type_id, void* object_ptr, bool call_finalize); +static pesapi_native_object_to_valueType pesapi_native_object_to_value_ptr; +pesapi_value pesapi_native_object_to_value (pesapi_env env, const void* type_id, void* object_ptr, bool call_finalize) { + return pesapi_native_object_to_value_ptr(env, type_id, object_ptr, call_finalize); } typedef void* (*pesapi_get_native_object_ptrType)(pesapi_env env, pesapi_value value); @@ -214,34 +232,34 @@ const void* pesapi_get_native_object_typeid (pesapi_env env, pesapi_value value) return pesapi_get_native_object_typeid_ptr(env, value); } -typedef bool (*pesapi_is_native_objectType)(pesapi_env env, const void* class_id, pesapi_value value); -static pesapi_is_native_objectType pesapi_is_native_object_ptr; -bool pesapi_is_native_object (pesapi_env env, const void* class_id, pesapi_value value) { - return pesapi_is_native_object_ptr(env, class_id, value); +typedef bool (*pesapi_is_instance_ofType)(pesapi_env env, const void* type_id, pesapi_value value); +static pesapi_is_instance_ofType pesapi_is_instance_of_ptr; +bool pesapi_is_instance_of (pesapi_env env, const void* type_id, pesapi_value value) { + return pesapi_is_instance_of_ptr(env, type_id, value); } -typedef pesapi_value (*pesapi_create_refType)(pesapi_env env, pesapi_value value); -static pesapi_create_refType pesapi_create_ref_ptr; -pesapi_value pesapi_create_ref (pesapi_env env, pesapi_value value) { - return pesapi_create_ref_ptr(env, value); +typedef pesapi_value (*pesapi_boxingType)(pesapi_env env, pesapi_value value); +static pesapi_boxingType pesapi_boxing_ptr; +pesapi_value pesapi_boxing (pesapi_env env, pesapi_value value) { + return pesapi_boxing_ptr(env, value); } -typedef pesapi_value (*pesapi_get_value_refType)(pesapi_env env, pesapi_value value); -static pesapi_get_value_refType pesapi_get_value_ref_ptr; -pesapi_value pesapi_get_value_ref (pesapi_env env, pesapi_value value) { - return pesapi_get_value_ref_ptr(env, value); +typedef pesapi_value (*pesapi_unboxingType)(pesapi_env env, pesapi_value value); +static pesapi_unboxingType pesapi_unboxing_ptr; +pesapi_value pesapi_unboxing (pesapi_env env, pesapi_value value) { + return pesapi_unboxing_ptr(env, value); } -typedef void (*pesapi_update_value_refType)(pesapi_env env, pesapi_value ref, pesapi_value value); -static pesapi_update_value_refType pesapi_update_value_ref_ptr; -void pesapi_update_value_ref (pesapi_env env, pesapi_value ref, pesapi_value value) { - pesapi_update_value_ref_ptr(env, ref, value); +typedef void (*pesapi_update_boxed_valueType)(pesapi_env env, pesapi_value boxed_value, pesapi_value value); +static pesapi_update_boxed_valueType pesapi_update_boxed_value_ptr; +void pesapi_update_boxed_value (pesapi_env env, pesapi_value boxed_value, pesapi_value value) { + pesapi_update_boxed_value_ptr(env, boxed_value, value); } -typedef bool (*pesapi_is_refType)(pesapi_env env, pesapi_value value); -static pesapi_is_refType pesapi_is_ref_ptr; -bool pesapi_is_ref (pesapi_env env, pesapi_value value) { - return pesapi_is_ref_ptr(env, value); +typedef bool (*pesapi_is_boxed_valueType)(pesapi_env env, pesapi_value value); +static pesapi_is_boxed_valueType pesapi_is_boxed_value_ptr; +bool pesapi_is_boxed_value (pesapi_env env, pesapi_value value) { + return pesapi_is_boxed_value_ptr(env, value); } typedef int (*pesapi_get_args_lenType)(pesapi_callback_info info); @@ -298,34 +316,34 @@ void pesapi_throw_by_string (pesapi_callback_info pinfo, const char* msg) { pesapi_throw_by_string_ptr(pinfo, msg); } -typedef pesapi_env_holder (*pesapi_hold_envType)(pesapi_env env); -static pesapi_hold_envType pesapi_hold_env_ptr; -pesapi_env_holder pesapi_hold_env (pesapi_env env) { - return pesapi_hold_env_ptr(env); +typedef pesapi_env_ref (*pesapi_create_env_refType)(pesapi_env env); +static pesapi_create_env_refType pesapi_create_env_ref_ptr; +pesapi_env_ref pesapi_create_env_ref (pesapi_env env) { + return pesapi_create_env_ref_ptr(env); } -typedef pesapi_env (*pesapi_get_env_from_holderType)(pesapi_env_holder env_holder); -static pesapi_get_env_from_holderType pesapi_get_env_from_holder_ptr; -pesapi_env pesapi_get_env_from_holder (pesapi_env_holder env_holder) { - return pesapi_get_env_from_holder_ptr(env_holder); +typedef pesapi_env (*pesapi_get_env_from_refType)(pesapi_env_ref env_ref); +static pesapi_get_env_from_refType pesapi_get_env_from_ref_ptr; +pesapi_env pesapi_get_env_from_ref (pesapi_env_ref env_ref) { + return pesapi_get_env_from_ref_ptr(env_ref); } -typedef pesapi_env_holder (*pesapi_duplicate_env_holderType)(pesapi_env_holder env_holder); -static pesapi_duplicate_env_holderType pesapi_duplicate_env_holder_ptr; -pesapi_env_holder pesapi_duplicate_env_holder (pesapi_env_holder env_holder) { - return pesapi_duplicate_env_holder_ptr(env_holder); +typedef pesapi_env_ref (*pesapi_duplicate_env_refType)(pesapi_env_ref env_ref); +static pesapi_duplicate_env_refType pesapi_duplicate_env_ref_ptr; +pesapi_env_ref pesapi_duplicate_env_ref (pesapi_env_ref env_ref) { + return pesapi_duplicate_env_ref_ptr(env_ref); } -typedef void (*pesapi_release_env_holderType)(pesapi_env_holder env_holder); -static pesapi_release_env_holderType pesapi_release_env_holder_ptr; -void pesapi_release_env_holder (pesapi_env_holder env_holder) { - pesapi_release_env_holder_ptr(env_holder); +typedef void (*pesapi_release_env_refType)(pesapi_env_ref env_ref); +static pesapi_release_env_refType pesapi_release_env_ref_ptr; +void pesapi_release_env_ref (pesapi_env_ref env_ref) { + pesapi_release_env_ref_ptr(env_ref); } -typedef pesapi_scope (*pesapi_open_scopeType)(pesapi_env_holder env_holder); +typedef pesapi_scope (*pesapi_open_scopeType)(pesapi_env_ref env_ref); static pesapi_open_scopeType pesapi_open_scope_ptr; -pesapi_scope pesapi_open_scope (pesapi_env_holder env_holder) { - return pesapi_open_scope_ptr(env_holder); +pesapi_scope pesapi_open_scope (pesapi_env_ref env_ref) { + return pesapi_open_scope_ptr(env_ref); } typedef bool (*pesapi_has_caughtType)(pesapi_scope scope); @@ -346,28 +364,40 @@ void pesapi_close_scope (pesapi_scope scope) { pesapi_close_scope_ptr(scope); } -typedef pesapi_value_holder (*pesapi_hold_valueType)(pesapi_env env, pesapi_value value); -static pesapi_hold_valueType pesapi_hold_value_ptr; -pesapi_value_holder pesapi_hold_value (pesapi_env env, pesapi_value value) { - return pesapi_hold_value_ptr(env, value); +typedef pesapi_value_ref (*pesapi_create_value_refType)(pesapi_env env, pesapi_value value); +static pesapi_create_value_refType pesapi_create_value_ref_ptr; +pesapi_value_ref pesapi_create_value_ref (pesapi_env env, pesapi_value value) { + return pesapi_create_value_ref_ptr(env, value); +} + +typedef pesapi_value_ref (*pesapi_duplicate_value_refType)(pesapi_value_ref value_ref); +static pesapi_duplicate_value_refType pesapi_duplicate_value_ref_ptr; +pesapi_value_ref pesapi_duplicate_value_ref (pesapi_value_ref value_ref) { + return pesapi_duplicate_value_ref_ptr(value_ref); +} + +typedef void (*pesapi_release_value_refType)(pesapi_value_ref value_ref); +static pesapi_release_value_refType pesapi_release_value_ref_ptr; +void pesapi_release_value_ref (pesapi_value_ref value_ref) { + pesapi_release_value_ref_ptr(value_ref); } -typedef pesapi_value_holder (*pesapi_duplicate_value_holderType)(pesapi_value_holder value_holder); -static pesapi_duplicate_value_holderType pesapi_duplicate_value_holder_ptr; -pesapi_value_holder pesapi_duplicate_value_holder (pesapi_value_holder value_holder) { - return pesapi_duplicate_value_holder_ptr(value_holder); +typedef pesapi_value (*pesapi_get_value_from_refType)(pesapi_env env, pesapi_value_ref value_ref); +static pesapi_get_value_from_refType pesapi_get_value_from_ref_ptr; +pesapi_value pesapi_get_value_from_ref (pesapi_env env, pesapi_value_ref value_ref) { + return pesapi_get_value_from_ref_ptr(env, value_ref); } -typedef void (*pesapi_release_value_holderType)(pesapi_value_holder value_holder); -static pesapi_release_value_holderType pesapi_release_value_holder_ptr; -void pesapi_release_value_holder (pesapi_value_holder value_holder) { - pesapi_release_value_holder_ptr(value_holder); +typedef void (*pesapi_set_ref_weakType)(pesapi_env env, pesapi_value_ref value_ref); +static pesapi_set_ref_weakType pesapi_set_ref_weak_ptr; +void pesapi_set_ref_weak (pesapi_env env, pesapi_value_ref value_ref) { + pesapi_set_ref_weak_ptr(env, value_ref); } -typedef pesapi_value (*pesapi_get_value_from_holderType)(pesapi_env env, pesapi_value_holder value_holder); -static pesapi_get_value_from_holderType pesapi_get_value_from_holder_ptr; -pesapi_value pesapi_get_value_from_holder (pesapi_env env, pesapi_value_holder value_holder) { - return pesapi_get_value_from_holder_ptr(env, value_holder); +typedef bool (*pesapi_set_ownerType)(pesapi_env env, pesapi_value value, pesapi_value owner); +static pesapi_set_ownerType pesapi_set_owner_ptr; +bool pesapi_set_owner (pesapi_env env, pesapi_value value, pesapi_value owner) { + return pesapi_set_owner_ptr(env, value, owner); } typedef pesapi_value (*pesapi_get_propertyType)(pesapi_env env, pesapi_value object, const char* key); @@ -448,6 +478,18 @@ void pesapi_define_class (const void* type_id, const void* super_type_id, const pesapi_define_class_ptr(type_id, super_type_id, type_name, constructor, finalize, property_count, properties, userdata); } +typedef void (*pesapi_class_type_infoType)(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); +static pesapi_class_type_infoType pesapi_class_type_info_ptr; +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_class_type_info_ptr(proto_magic_id, type_id, constructor_info, methods_info, functions_info, properties_info, variables_info); +} + +typedef const void* (*pesapi_find_type_idType)(const char* module_name, const char* type_name); +static pesapi_find_type_idType pesapi_find_type_id_ptr; +const void* pesapi_find_type_id (const char* module_name, const char* type_name) { + return pesapi_find_type_id_ptr(module_name, type_name); +} + #endif @@ -463,70 +505,77 @@ void pesapi_init(pesapi_func_ptr* func_array){ pesapi_create_double_ptr = (pesapi_create_doubleType)func_array[7]; pesapi_create_string_utf8_ptr = (pesapi_create_string_utf8Type)func_array[8]; pesapi_create_binary_ptr = (pesapi_create_binaryType)func_array[9]; - pesapi_get_value_bool_ptr = (pesapi_get_value_boolType)func_array[10]; - pesapi_get_value_int32_ptr = (pesapi_get_value_int32Type)func_array[11]; - pesapi_get_value_uint32_ptr = (pesapi_get_value_uint32Type)func_array[12]; - pesapi_get_value_int64_ptr = (pesapi_get_value_int64Type)func_array[13]; - pesapi_get_value_uint64_ptr = (pesapi_get_value_uint64Type)func_array[14]; - pesapi_get_value_double_ptr = (pesapi_get_value_doubleType)func_array[15]; - pesapi_get_value_string_utf8_ptr = (pesapi_get_value_string_utf8Type)func_array[16]; - pesapi_get_value_binary_ptr = (pesapi_get_value_binaryType)func_array[17]; - pesapi_is_null_ptr = (pesapi_is_nullType)func_array[18]; - pesapi_is_undefined_ptr = (pesapi_is_undefinedType)func_array[19]; - pesapi_is_boolean_ptr = (pesapi_is_booleanType)func_array[20]; - pesapi_is_int32_ptr = (pesapi_is_int32Type)func_array[21]; - pesapi_is_uint32_ptr = (pesapi_is_uint32Type)func_array[22]; - pesapi_is_int64_ptr = (pesapi_is_int64Type)func_array[23]; - pesapi_is_uint64_ptr = (pesapi_is_uint64Type)func_array[24]; - pesapi_is_double_ptr = (pesapi_is_doubleType)func_array[25]; - pesapi_is_string_ptr = (pesapi_is_stringType)func_array[26]; - pesapi_is_object_ptr = (pesapi_is_objectType)func_array[27]; - pesapi_is_function_ptr = (pesapi_is_functionType)func_array[28]; - pesapi_is_binary_ptr = (pesapi_is_binaryType)func_array[29]; - pesapi_create_native_object_ptr = (pesapi_create_native_objectType)func_array[30]; - pesapi_get_native_object_ptr_ptr = (pesapi_get_native_object_ptrType)func_array[31]; - pesapi_get_native_object_typeid_ptr = (pesapi_get_native_object_typeidType)func_array[32]; - pesapi_is_native_object_ptr = (pesapi_is_native_objectType)func_array[33]; - pesapi_create_ref_ptr = (pesapi_create_refType)func_array[34]; - pesapi_get_value_ref_ptr = (pesapi_get_value_refType)func_array[35]; - pesapi_update_value_ref_ptr = (pesapi_update_value_refType)func_array[36]; - pesapi_is_ref_ptr = (pesapi_is_refType)func_array[37]; - pesapi_get_args_len_ptr = (pesapi_get_args_lenType)func_array[38]; - pesapi_get_arg_ptr = (pesapi_get_argType)func_array[39]; - pesapi_get_env_ptr = (pesapi_get_envType)func_array[40]; - pesapi_get_this_ptr = (pesapi_get_thisType)func_array[41]; - pesapi_get_holder_ptr = (pesapi_get_holderType)func_array[42]; - pesapi_get_userdata_ptr = (pesapi_get_userdataType)func_array[43]; - pesapi_get_constructor_userdata_ptr = (pesapi_get_constructor_userdataType)func_array[44]; - pesapi_add_return_ptr = (pesapi_add_returnType)func_array[45]; - pesapi_throw_by_string_ptr = (pesapi_throw_by_stringType)func_array[46]; - pesapi_hold_env_ptr = (pesapi_hold_envType)func_array[47]; - pesapi_get_env_from_holder_ptr = (pesapi_get_env_from_holderType)func_array[48]; - pesapi_duplicate_env_holder_ptr = (pesapi_duplicate_env_holderType)func_array[49]; - pesapi_release_env_holder_ptr = (pesapi_release_env_holderType)func_array[50]; - pesapi_open_scope_ptr = (pesapi_open_scopeType)func_array[51]; - pesapi_has_caught_ptr = (pesapi_has_caughtType)func_array[52]; - pesapi_get_exception_as_string_ptr = (pesapi_get_exception_as_stringType)func_array[53]; - pesapi_close_scope_ptr = (pesapi_close_scopeType)func_array[54]; - pesapi_hold_value_ptr = (pesapi_hold_valueType)func_array[55]; - pesapi_duplicate_value_holder_ptr = (pesapi_duplicate_value_holderType)func_array[56]; - pesapi_release_value_holder_ptr = (pesapi_release_value_holderType)func_array[57]; - pesapi_get_value_from_holder_ptr = (pesapi_get_value_from_holderType)func_array[58]; - pesapi_get_property_ptr = (pesapi_get_propertyType)func_array[59]; - pesapi_set_property_ptr = (pesapi_set_propertyType)func_array[60]; - pesapi_get_property_uint32_ptr = (pesapi_get_property_uint32Type)func_array[61]; - pesapi_set_property_uint32_ptr = (pesapi_set_property_uint32Type)func_array[62]; - pesapi_call_function_ptr = (pesapi_call_functionType)func_array[63]; - pesapi_eval_ptr = (pesapi_evalType)func_array[64]; - pesapi_alloc_type_infos_ptr = (pesapi_alloc_type_infosType)func_array[65]; - pesapi_set_type_info_ptr = (pesapi_set_type_infoType)func_array[66]; - pesapi_create_signature_info_ptr = (pesapi_create_signature_infoType)func_array[67]; - pesapi_alloc_property_descriptors_ptr = (pesapi_alloc_property_descriptorsType)func_array[68]; - pesapi_set_method_info_ptr = (pesapi_set_method_infoType)func_array[69]; - pesapi_set_property_info_ptr = (pesapi_set_property_infoType)func_array[70]; - pesapi_define_class_ptr = (pesapi_define_classType)func_array[71]; + pesapi_create_array_ptr = (pesapi_create_arrayType)func_array[10]; + pesapi_get_value_bool_ptr = (pesapi_get_value_boolType)func_array[11]; + pesapi_get_value_int32_ptr = (pesapi_get_value_int32Type)func_array[12]; + pesapi_get_value_uint32_ptr = (pesapi_get_value_uint32Type)func_array[13]; + pesapi_get_value_int64_ptr = (pesapi_get_value_int64Type)func_array[14]; + pesapi_get_value_uint64_ptr = (pesapi_get_value_uint64Type)func_array[15]; + pesapi_get_value_double_ptr = (pesapi_get_value_doubleType)func_array[16]; + pesapi_get_value_string_utf8_ptr = (pesapi_get_value_string_utf8Type)func_array[17]; + pesapi_get_value_binary_ptr = (pesapi_get_value_binaryType)func_array[18]; + pesapi_get_array_length_ptr = (pesapi_get_array_lengthType)func_array[19]; + pesapi_is_null_ptr = (pesapi_is_nullType)func_array[20]; + pesapi_is_undefined_ptr = (pesapi_is_undefinedType)func_array[21]; + pesapi_is_boolean_ptr = (pesapi_is_booleanType)func_array[22]; + pesapi_is_int32_ptr = (pesapi_is_int32Type)func_array[23]; + pesapi_is_uint32_ptr = (pesapi_is_uint32Type)func_array[24]; + pesapi_is_int64_ptr = (pesapi_is_int64Type)func_array[25]; + pesapi_is_uint64_ptr = (pesapi_is_uint64Type)func_array[26]; + pesapi_is_double_ptr = (pesapi_is_doubleType)func_array[27]; + pesapi_is_string_ptr = (pesapi_is_stringType)func_array[28]; + pesapi_is_object_ptr = (pesapi_is_objectType)func_array[29]; + pesapi_is_function_ptr = (pesapi_is_functionType)func_array[30]; + pesapi_is_binary_ptr = (pesapi_is_binaryType)func_array[31]; + pesapi_is_array_ptr = (pesapi_is_arrayType)func_array[32]; + pesapi_native_object_to_value_ptr = (pesapi_native_object_to_valueType)func_array[33]; + pesapi_get_native_object_ptr_ptr = (pesapi_get_native_object_ptrType)func_array[34]; + pesapi_get_native_object_typeid_ptr = (pesapi_get_native_object_typeidType)func_array[35]; + pesapi_is_instance_of_ptr = (pesapi_is_instance_ofType)func_array[36]; + pesapi_boxing_ptr = (pesapi_boxingType)func_array[37]; + pesapi_unboxing_ptr = (pesapi_unboxingType)func_array[38]; + pesapi_update_boxed_value_ptr = (pesapi_update_boxed_valueType)func_array[39]; + pesapi_is_boxed_value_ptr = (pesapi_is_boxed_valueType)func_array[40]; + pesapi_get_args_len_ptr = (pesapi_get_args_lenType)func_array[41]; + pesapi_get_arg_ptr = (pesapi_get_argType)func_array[42]; + pesapi_get_env_ptr = (pesapi_get_envType)func_array[43]; + pesapi_get_this_ptr = (pesapi_get_thisType)func_array[44]; + pesapi_get_holder_ptr = (pesapi_get_holderType)func_array[45]; + pesapi_get_userdata_ptr = (pesapi_get_userdataType)func_array[46]; + pesapi_get_constructor_userdata_ptr = (pesapi_get_constructor_userdataType)func_array[47]; + pesapi_add_return_ptr = (pesapi_add_returnType)func_array[48]; + pesapi_throw_by_string_ptr = (pesapi_throw_by_stringType)func_array[49]; + pesapi_create_env_ref_ptr = (pesapi_create_env_refType)func_array[50]; + pesapi_get_env_from_ref_ptr = (pesapi_get_env_from_refType)func_array[51]; + pesapi_duplicate_env_ref_ptr = (pesapi_duplicate_env_refType)func_array[52]; + pesapi_release_env_ref_ptr = (pesapi_release_env_refType)func_array[53]; + pesapi_open_scope_ptr = (pesapi_open_scopeType)func_array[54]; + pesapi_has_caught_ptr = (pesapi_has_caughtType)func_array[55]; + pesapi_get_exception_as_string_ptr = (pesapi_get_exception_as_stringType)func_array[56]; + pesapi_close_scope_ptr = (pesapi_close_scopeType)func_array[57]; + pesapi_create_value_ref_ptr = (pesapi_create_value_refType)func_array[58]; + pesapi_duplicate_value_ref_ptr = (pesapi_duplicate_value_refType)func_array[59]; + pesapi_release_value_ref_ptr = (pesapi_release_value_refType)func_array[60]; + pesapi_get_value_from_ref_ptr = (pesapi_get_value_from_refType)func_array[61]; + pesapi_set_ref_weak_ptr = (pesapi_set_ref_weakType)func_array[62]; + pesapi_set_owner_ptr = (pesapi_set_ownerType)func_array[63]; + pesapi_get_property_ptr = (pesapi_get_propertyType)func_array[64]; + pesapi_set_property_ptr = (pesapi_set_propertyType)func_array[65]; + pesapi_get_property_uint32_ptr = (pesapi_get_property_uint32Type)func_array[66]; + pesapi_set_property_uint32_ptr = (pesapi_set_property_uint32Type)func_array[67]; + pesapi_call_function_ptr = (pesapi_call_functionType)func_array[68]; + pesapi_eval_ptr = (pesapi_evalType)func_array[69]; + pesapi_alloc_type_infos_ptr = (pesapi_alloc_type_infosType)func_array[70]; + pesapi_set_type_info_ptr = (pesapi_set_type_infoType)func_array[71]; + pesapi_create_signature_info_ptr = (pesapi_create_signature_infoType)func_array[72]; + pesapi_alloc_property_descriptors_ptr = (pesapi_alloc_property_descriptorsType)func_array[73]; + pesapi_set_method_info_ptr = (pesapi_set_method_infoType)func_array[74]; + pesapi_set_property_info_ptr = (pesapi_set_property_infoType)func_array[75]; + pesapi_define_class_ptr = (pesapi_define_classType)func_array[76]; + pesapi_class_type_info_ptr = (pesapi_class_type_infoType)func_array[77]; + pesapi_find_type_id_ptr = (pesapi_find_type_idType)func_array[78]; #endif } -EXTERN_C_END \ No newline at end of file +EXTERN_C_END diff --git a/unity/native_src_il2cpp/Inc/JSClassRegister.h b/unity/native_src_il2cpp/Inc/JSClassRegister.h index cc4f7b347a..cdcf77795c 100644 --- a/unity/native_src_il2cpp/Inc/JSClassRegister.h +++ b/unity/native_src_il2cpp/Inc/JSClassRegister.h @@ -20,23 +20,31 @@ #include +#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 -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 @@ -52,19 +60,8 @@ typedef void (*FinalizeFunc)(void* Ptr); typedef void* (*InitializeFunc)(const v8::FunctionCallbackInfo& 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 { @@ -105,6 +102,9 @@ 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); JSENV_API const JSClassDefinition* FindClassByID(const void* TypeId, bool TryLazyLoad = false); @@ -112,25 +112,28 @@ JSENV_API const JSClassDefinition* FindClassByID(const void* TypeId, bool TryLaz 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 Context, v8::Local 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 diff --git a/unity/native_src_il2cpp/Inc/pesapi.h b/unity/native_src_il2cpp/Inc/pesapi.h index 745834ffce..da7899da92 100644 --- a/unity/native_src_il2cpp/Inc/pesapi.h +++ b/unity/native_src_il2cpp/Inc/pesapi.h @@ -15,7 +15,7 @@ // Portable Embedded Scripting API -#define PESAPI_VERSION 5 +#define PESAPI_VERSION 10 #define PESAPI_EXTERN @@ -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) \ @@ -77,14 +79,29 @@ #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 @@ -92,9 +109,9 @@ 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; @@ -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); @@ -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); @@ -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); @@ -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); @@ -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 diff --git a/unity/native_src_il2cpp/Src/JSClassRegister.cpp b/unity/native_src_il2cpp/Src/JSClassRegister.cpp index 1a1c3e7b91..a0a7156243 100644 --- a/unity/native_src_il2cpp/Src/JSClassRegister.cpp +++ b/unity/native_src_il2cpp/Src/JSClassRegister.cpp @@ -11,8 +11,9 @@ #include "UObject/Class.h" #endif #include +#include -namespace puerts +namespace PUERTS_NAMESPACE { template static T* PropertyInfoDuplicate(T* Arr) @@ -79,6 +80,9 @@ class JSClassRegister return RegInfoMutex; } + void SetClassTypeInfo(const void* TypeId, const NamedFunctionInfo* ConstructorInfos, const NamedFunctionInfo* MethodInfos, + const NamedFunctionInfo* FunctionInfos, const NamedPropertyInfo* PropertyInfos, const NamedPropertyInfo* VariableInfos); + void ForeachRegisterClass(std::function); const JSClassDefinition* FindClassByID(const void* TypeId, bool TryLazyLoad); @@ -90,21 +94,21 @@ class JSClassRegister const JSClassDefinition* FindCppTypeClassByName(const std::string& Name); +#if USING_IN_UNREAL_ENGINE void RegisterAddon(const std::string& Name, AddonRegisterFunc RegisterFunc); AddonRegisterFunc FindAddonRegisterFunc(const std::string& Name); -#if USING_IN_UNREAL_ENGINE const JSClassDefinition* FindClassByType(UStruct* Type); #endif private: std::map CDataIdToClassDefinition; std::map CDataNameToClassDefinition; - std::map AddonRegisterInfos; LoadTypeFunc LazyLoad = nullptr; std::recursive_mutex RegInfoMutex; #if USING_IN_UNREAL_ENGINE + std::map AddonRegisterInfos; std::map StructNameToClassDefinition; #endif }; @@ -191,15 +195,14 @@ const JSClassDefinition* JSClassRegister::FindCppTypeClassByName(const std::stri } } +#if USING_IN_UNREAL_ENGINE void JSClassRegister::RegisterAddon(const std::string& Name, AddonRegisterFunc RegisterFunc) { - std::lock_guard guard(RegInfoMutex); AddonRegisterInfos[Name] = RegisterFunc; } AddonRegisterFunc JSClassRegister::FindAddonRegisterFunc(const std::string& Name) { - std::lock_guard guard(RegInfoMutex); auto Iter = AddonRegisterInfos.find(Name); if (Iter == AddonRegisterInfos.end()) { @@ -211,10 +214,8 @@ AddonRegisterFunc JSClassRegister::FindAddonRegisterFunc(const std::string& Name } } -#if USING_IN_UNREAL_ENGINE const JSClassDefinition* JSClassRegister::FindClassByType(UStruct* Type) { - std::lock_guard guard(RegInfoMutex); auto Iter = StructNameToClassDefinition.find(Type->GetName()); if (Iter == StructNameToClassDefinition.end()) { @@ -278,6 +279,34 @@ const JSClassDefinition* FindCppTypeClassByName(const std::string& Name) return GetJSClassRegister()->FindCppTypeClassByName(Name); } +#if USING_IN_UNREAL_ENGINE + +bool IsEditorOnlyUFunction(const UFunction* Func) +{ + // a simplified version of IsEditorOnlyObject(), sadly it's a EditorOnly Function so I have to reimplement a toy one + if (!Func) + { + return false; + } + if (Func->HasAnyFunctionFlags(FUNC_EditorOnly)) + { + return true; + } + auto InObject = Func; + if (InObject->HasAnyMarks(OBJECTMARK_EditorOnly) || InObject->IsEditorOnly()) + { + return true; + } + + auto Package = Func->GetPackage(); + if (Package && Package->HasAnyPackageFlags(PKG_EditorOnly)) + { + return true; + } + + return false; +} + void RegisterAddon(const char* Name, AddonRegisterFunc RegisterFunc) { GetJSClassRegister()->RegisterAddon(Name, RegisterFunc); @@ -288,11 +317,10 @@ AddonRegisterFunc FindAddonRegisterFunc(const std::string& Name) return GetJSClassRegister()->FindAddonRegisterFunc(Name); } -#if USING_IN_UNREAL_ENGINE const JSClassDefinition* FindClassByType(UStruct* Type) { return GetJSClassRegister()->FindClassByType(Type); } #endif -} // namespace puerts +} // namespace PUERTS_NAMESPACE diff --git a/unity/native_src_il2cpp/Src/PesapiAddonLoad.cpp b/unity/native_src_il2cpp/Src/PesapiAddonLoad.cpp index 749daa8641..2aff8937d2 100644 --- a/unity/native_src_il2cpp/Src/PesapiAddonLoad.cpp +++ b/unity/native_src_il2cpp/Src/PesapiAddonLoad.cpp @@ -39,31 +39,33 @@ MSVC_PRAGMA(warning(disable : 4191)) static pesapi_func_ptr funcs[] = {(pesapi_func_ptr) &pesapi_create_null, (pesapi_func_ptr) &pesapi_create_undefined, (pesapi_func_ptr) &pesapi_create_boolean, (pesapi_func_ptr) &pesapi_create_int32, (pesapi_func_ptr) &pesapi_create_uint32, (pesapi_func_ptr) &pesapi_create_int64, (pesapi_func_ptr) &pesapi_create_uint64, (pesapi_func_ptr) &pesapi_create_double, - (pesapi_func_ptr) &pesapi_create_string_utf8, (pesapi_func_ptr) &pesapi_create_binary, (pesapi_func_ptr) &pesapi_get_value_bool, - (pesapi_func_ptr) &pesapi_get_value_int32, (pesapi_func_ptr) &pesapi_get_value_uint32, + (pesapi_func_ptr) &pesapi_create_string_utf8, (pesapi_func_ptr) &pesapi_create_binary, (pesapi_func_ptr) &pesapi_create_array, + (pesapi_func_ptr) &pesapi_get_value_bool, (pesapi_func_ptr) &pesapi_get_value_int32, (pesapi_func_ptr) &pesapi_get_value_uint32, (pesapi_func_ptr) &pesapi_get_value_int64, (pesapi_func_ptr) &pesapi_get_value_uint64, (pesapi_func_ptr) &pesapi_get_value_double, (pesapi_func_ptr) &pesapi_get_value_string_utf8, - (pesapi_func_ptr) &pesapi_get_value_binary, (pesapi_func_ptr) &pesapi_is_null, (pesapi_func_ptr) &pesapi_is_undefined, - (pesapi_func_ptr) &pesapi_is_boolean, (pesapi_func_ptr) &pesapi_is_int32, (pesapi_func_ptr) &pesapi_is_uint32, - (pesapi_func_ptr) &pesapi_is_int64, (pesapi_func_ptr) &pesapi_is_uint64, (pesapi_func_ptr) &pesapi_is_double, - (pesapi_func_ptr) &pesapi_is_string, (pesapi_func_ptr) &pesapi_is_object, (pesapi_func_ptr) &pesapi_is_function, - (pesapi_func_ptr) &pesapi_is_binary, (pesapi_func_ptr) &pesapi_create_native_object, - (pesapi_func_ptr) &pesapi_get_native_object_ptr, (pesapi_func_ptr) &pesapi_get_native_object_typeid, - (pesapi_func_ptr) &pesapi_is_native_object, (pesapi_func_ptr) &pesapi_create_ref, (pesapi_func_ptr) &pesapi_get_value_ref, - (pesapi_func_ptr) &pesapi_update_value_ref, (pesapi_func_ptr) &pesapi_is_ref, (pesapi_func_ptr) &pesapi_get_args_len, - (pesapi_func_ptr) &pesapi_get_arg, (pesapi_func_ptr) &pesapi_get_env, (pesapi_func_ptr) &pesapi_get_this, - (pesapi_func_ptr) &pesapi_get_holder, (pesapi_func_ptr) &pesapi_get_userdata, + (pesapi_func_ptr) &pesapi_get_value_binary, (pesapi_func_ptr) &pesapi_get_array_length, (pesapi_func_ptr) &pesapi_is_null, + (pesapi_func_ptr) &pesapi_is_undefined, (pesapi_func_ptr) &pesapi_is_boolean, (pesapi_func_ptr) &pesapi_is_int32, + (pesapi_func_ptr) &pesapi_is_uint32, (pesapi_func_ptr) &pesapi_is_int64, (pesapi_func_ptr) &pesapi_is_uint64, + (pesapi_func_ptr) &pesapi_is_double, (pesapi_func_ptr) &pesapi_is_string, (pesapi_func_ptr) &pesapi_is_object, + (pesapi_func_ptr) &pesapi_is_function, (pesapi_func_ptr) &pesapi_is_binary, (pesapi_func_ptr) &pesapi_is_array, + (pesapi_func_ptr) &pesapi_native_object_to_value, (pesapi_func_ptr) &pesapi_get_native_object_ptr, + (pesapi_func_ptr) &pesapi_get_native_object_typeid, (pesapi_func_ptr) &pesapi_is_instance_of, (pesapi_func_ptr) &pesapi_boxing, + (pesapi_func_ptr) &pesapi_unboxing, (pesapi_func_ptr) &pesapi_update_boxed_value, (pesapi_func_ptr) &pesapi_is_boxed_value, + (pesapi_func_ptr) &pesapi_get_args_len, (pesapi_func_ptr) &pesapi_get_arg, (pesapi_func_ptr) &pesapi_get_env, + (pesapi_func_ptr) &pesapi_get_this, (pesapi_func_ptr) &pesapi_get_holder, (pesapi_func_ptr) &pesapi_get_userdata, (pesapi_func_ptr) &pesapi_get_constructor_userdata, (pesapi_func_ptr) &pesapi_add_return, - (pesapi_func_ptr) &pesapi_throw_by_string, (pesapi_func_ptr) &pesapi_hold_env, (pesapi_func_ptr) &pesapi_get_env_from_holder, - (pesapi_func_ptr) &pesapi_duplicate_env_holder, (pesapi_func_ptr) &pesapi_release_env_holder, - (pesapi_func_ptr) &pesapi_open_scope, (pesapi_func_ptr) &pesapi_has_caught, (pesapi_func_ptr) &pesapi_get_exception_as_string, - (pesapi_func_ptr) &pesapi_close_scope, (pesapi_func_ptr) &pesapi_hold_value, (pesapi_func_ptr) &pesapi_duplicate_value_holder, - (pesapi_func_ptr) &pesapi_release_value_holder, (pesapi_func_ptr) &pesapi_get_value_from_holder, - (pesapi_func_ptr) &pesapi_get_property, (pesapi_func_ptr) &pesapi_set_property, (pesapi_func_ptr) &pesapi_get_property_uint32, + (pesapi_func_ptr) &pesapi_throw_by_string, (pesapi_func_ptr) &pesapi_create_env_ref, (pesapi_func_ptr) &pesapi_get_env_from_ref, + (pesapi_func_ptr) &pesapi_duplicate_env_ref, (pesapi_func_ptr) &pesapi_release_env_ref, (pesapi_func_ptr) &pesapi_open_scope, + (pesapi_func_ptr) &pesapi_has_caught, (pesapi_func_ptr) &pesapi_get_exception_as_string, (pesapi_func_ptr) &pesapi_close_scope, + (pesapi_func_ptr) &pesapi_create_value_ref, (pesapi_func_ptr) &pesapi_duplicate_value_ref, + (pesapi_func_ptr) &pesapi_release_value_ref, (pesapi_func_ptr) &pesapi_get_value_from_ref, + (pesapi_func_ptr) &pesapi_set_ref_weak, (pesapi_func_ptr) &pesapi_set_owner, (pesapi_func_ptr) &pesapi_get_property, + (pesapi_func_ptr) &pesapi_set_property, (pesapi_func_ptr) &pesapi_get_property_uint32, (pesapi_func_ptr) &pesapi_set_property_uint32, (pesapi_func_ptr) &pesapi_call_function, (pesapi_func_ptr) &pesapi_eval, (pesapi_func_ptr) &pesapi_alloc_type_infos, (pesapi_func_ptr) &pesapi_set_type_info, (pesapi_func_ptr) &pesapi_create_signature_info, (pesapi_func_ptr) &pesapi_alloc_property_descriptors, - (pesapi_func_ptr) &pesapi_set_method_info, (pesapi_func_ptr) &pesapi_set_property_info, (pesapi_func_ptr) &pesapi_define_class}; + (pesapi_func_ptr) &pesapi_set_method_info, (pesapi_func_ptr) &pesapi_set_property_info, (pesapi_func_ptr) &pesapi_define_class, + (pesapi_func_ptr) &pesapi_class_type_info, (pesapi_func_ptr) &pesapi_find_type_id}; MSVC_PRAGMA(warning(pop)) static int LoadAddon(const char* path, const char* module_name) diff --git a/unity/native_src_il2cpp/Src/PesapiV8Impl.cpp b/unity/native_src_il2cpp/Src/PesapiV8Impl.cpp index 774dd3121e..000c43ceb3 100644 --- a/unity/native_src_il2cpp/Src/PesapiV8Impl.cpp +++ b/unity/native_src_il2cpp/Src/PesapiV8Impl.cpp @@ -15,14 +15,11 @@ #include #include #include +#include -#pragma warning(push, 0) -#include "v8.h" -#pragma warning(pop) - -struct pesapi_env_holder__ +struct pesapi_env_ref__ { - explicit pesapi_env_holder__(v8::Local context) + explicit pesapi_env_ref__(v8::Local context) : isolate(context->GetIsolate()), context_persistent(isolate, context), ref_count(1) { } @@ -31,9 +28,9 @@ struct pesapi_env_holder__ int ref_count; }; -struct pesapi_value_holder__ +struct pesapi_value_ref__ { - explicit pesapi_value_holder__(v8::Local context, v8::Local value) + explicit pesapi_value_ref__(v8::Local context, v8::Local value) : isolate(context->GetIsolate()), value_persistent(isolate, value), ref_count(1) { } @@ -144,11 +141,13 @@ pesapi_value pesapi_create_string_utf8(pesapi_env env, const char* str, size_t l pesapi_value pesapi_create_binary(pesapi_env env, void* bin, size_t length) { auto context = v8impl::V8LocalContextFromPesapiEnv(env); -#if defined(HAS_ARRAYBUFFER_NEW_WITHOUT_STL) - return v8impl::PesapiValueFromV8LocalValue(v8::ArrayBuffer_New_Without_Stl(context->GetIsolate(), bin, length)); -#else - return v8impl::PesapiValueFromV8LocalValue(v8::ArrayBuffer::New(context->GetIsolate(), bin, length)); -#endif + return v8impl::PesapiValueFromV8LocalValue(puerts::DataTransfer::NewArrayBuffer(context, bin, length)); +} + +pesapi_value pesapi_create_array(pesapi_env env) +{ + auto context = v8impl::V8LocalContextFromPesapiEnv(env); + return v8impl::PesapiValueFromV8LocalValue(v8::Array::New(context->GetIsolate())); } bool pesapi_get_value_bool(pesapi_env env, pesapi_value pvalue) @@ -176,14 +175,14 @@ int64_t pesapi_get_value_int64(pesapi_env env, pesapi_value pvalue) { auto context = v8impl::V8LocalContextFromPesapiEnv(env); auto value = v8impl::V8LocalValueFromPesapiValue(pvalue); - return value->ToBigInt(context).ToLocalChecked()->Int64Value(); + return value->IsBigInt() ? value->ToBigInt(context).ToLocalChecked()->Int64Value() : 0; } uint64_t pesapi_get_value_uint64(pesapi_env env, pesapi_value pvalue) { auto context = v8impl::V8LocalContextFromPesapiEnv(env); auto value = v8impl::V8LocalValueFromPesapiValue(pvalue); - return value->ToBigInt(context).ToLocalChecked()->Uint64Value(); + return value->IsBigInt() ? value->ToBigInt(context).ToLocalChecked()->Uint64Value() : 0; } double pesapi_get_value_double(pesapi_env env, pesapi_value pvalue) @@ -221,24 +220,27 @@ void* pesapi_get_value_binary(pesapi_env env, pesapi_value pvalue, size_t* bufsi v8::Local buffView = value.As(); *bufsize = buffView->ByteLength(); auto Ab = buffView->Buffer(); -#if defined(HAS_ARRAYBUFFER_NEW_WITHOUT_STL) - return static_cast(v8::ArrayBuffer_Get_Data(Ab)) + buffView->ByteOffset(); -#else - return static_cast(Ab->GetContents().Data()) + buffView->ByteOffset(); -#endif + return static_cast(puerts::DataTransfer::GetArrayBufferData(Ab)) + buffView->ByteOffset(); } if (value->IsArrayBuffer()) { auto ab = v8::Local::Cast(value); -#if defined(HAS_ARRAYBUFFER_NEW_WITHOUT_STL) - return v8::ArrayBuffer_Get_Data(ab, *bufsize); -#else - return ab->GetContents().Data(); -#endif + return puerts::DataTransfer::GetArrayBufferData(ab, *bufsize); } return nullptr; } +uint32_t pesapi_get_array_length(pesapi_env env, pesapi_value pvalue) +{ + auto context = v8impl::V8LocalContextFromPesapiEnv(env); + auto value = v8impl::V8LocalValueFromPesapiValue(pvalue); + if (value->IsArray()) + { + return value.As()->Length(); + } + return 0; +} + bool pesapi_is_null(pesapi_env env, pesapi_value pvalue) { auto value = v8impl::V8LocalValueFromPesapiValue(pvalue); @@ -311,11 +313,17 @@ bool pesapi_is_binary(pesapi_env env, pesapi_value pvalue) return value->IsArrayBuffer() || value->IsArrayBufferView(); } -pesapi_value pesapi_create_native_object(pesapi_env env, const void* class_id, void* object_ptr, bool copy) +bool pesapi_is_array(pesapi_env env, pesapi_value pvalue) +{ + auto value = v8impl::V8LocalValueFromPesapiValue(pvalue); + return value->IsArray(); +} + +pesapi_value pesapi_native_object_to_value(pesapi_env env, const void* type_id, void* object_ptr, bool call_finalize) { auto context = v8impl::V8LocalContextFromPesapiEnv(env); return v8impl::PesapiValueFromV8LocalValue( - ::puerts::DataTransfer::FindOrAddCData(context->GetIsolate(), context, class_id, object_ptr, !copy)); + ::puerts::DataTransfer::FindOrAddCData(context->GetIsolate(), context, type_id, object_ptr, !call_finalize)); } void* pesapi_get_native_object_ptr(pesapi_env env, pesapi_value pvalue) @@ -336,14 +344,14 @@ const void* pesapi_get_native_object_typeid(pesapi_env env, pesapi_value pvalue) return puerts::DataTransfer::GetPointerFast(value.As(), 1); } -bool pesapi_is_native_object(pesapi_env env, const void* class_id, pesapi_value pvalue) +bool pesapi_is_instance_of(pesapi_env env, const void* type_id, pesapi_value pvalue) { auto context = v8impl::V8LocalContextFromPesapiEnv(env); auto value = v8impl::V8LocalValueFromPesapiValue(pvalue); - return ::puerts::DataTransfer::IsInstanceOf(context->GetIsolate(), static_cast(class_id), value.As()); + return ::puerts::DataTransfer::IsInstanceOf(context->GetIsolate(), static_cast(type_id), value.As()); } -pesapi_value pesapi_create_ref(pesapi_env env, pesapi_value pvalue) +pesapi_value pesapi_boxing(pesapi_env env, pesapi_value pvalue) { auto context = v8impl::V8LocalContextFromPesapiEnv(env); auto value = v8impl::V8LocalValueFromPesapiValue(pvalue); @@ -353,7 +361,7 @@ pesapi_value pesapi_create_ref(pesapi_env env, pesapi_value pvalue) return v8impl::PesapiValueFromV8LocalValue(result); } -pesapi_value pesapi_get_value_ref(pesapi_env env, pesapi_value pvalue) +pesapi_value pesapi_unboxing(pesapi_env env, pesapi_value pvalue) { auto context = v8impl::V8LocalContextFromPesapiEnv(env); auto value = v8impl::V8LocalValueFromPesapiValue(pvalue); @@ -363,10 +371,10 @@ pesapi_value pesapi_get_value_ref(pesapi_env env, pesapi_value pvalue) return v8impl::PesapiValueFromV8LocalValue(realvalue); } -void pesapi_update_value_ref(pesapi_env env, pesapi_value ref, pesapi_value pvalue) +void pesapi_update_boxed_value(pesapi_env env, pesapi_value boxed_value, pesapi_value pvalue) { auto context = v8impl::V8LocalContextFromPesapiEnv(env); - auto holder = v8impl::V8LocalValueFromPesapiValue(ref); + auto holder = v8impl::V8LocalValueFromPesapiValue(boxed_value); auto value = v8impl::V8LocalValueFromPesapiValue(pvalue); if (holder->IsObject()) { @@ -375,7 +383,7 @@ void pesapi_update_value_ref(pesapi_env env, pesapi_value ref, pesapi_value pval } } -bool pesapi_is_ref(pesapi_env env, pesapi_value value) +bool pesapi_is_boxed_value(pesapi_env env, pesapi_value value) { return pesapi_is_object(env, value); } @@ -441,36 +449,36 @@ void pesapi_throw_by_string(pesapi_callback_info pinfo, const char* msg) v8::Exception::Error(v8::String::NewFromUtf8(isolate, msg, v8::NewStringType::kNormal).ToLocalChecked())); } -pesapi_env_holder pesapi_hold_env(pesapi_env env) +pesapi_env_ref pesapi_create_env_ref(pesapi_env env) { auto context = v8impl::V8LocalContextFromPesapiEnv(env); - return new pesapi_env_holder__(context); + return new pesapi_env_ref__(context); } -pesapi_env pesapi_get_env_from_holder(pesapi_env_holder env_holder) +pesapi_env pesapi_get_env_from_ref(pesapi_env_ref env_ref) { - return v8impl::PesapiEnvFromV8LocalContext(env_holder->context_persistent.Get(env_holder->isolate)); + return v8impl::PesapiEnvFromV8LocalContext(env_ref->context_persistent.Get(env_ref->isolate)); } -pesapi_env_holder pesapi_duplicate_env_holder(pesapi_env_holder env_holder) +pesapi_env_ref pesapi_duplicate_env_ref(pesapi_env_ref env_ref) { - ++env_holder->ref_count; - return env_holder; + ++env_ref->ref_count; + return env_ref; } -void pesapi_release_env_holder(pesapi_env_holder env_holder) +void pesapi_release_env_ref(pesapi_env_ref env_ref) { - if (--env_holder->ref_count == 0) + if (--env_ref->ref_count == 0) { - delete env_holder; + delete env_ref; } } -pesapi_scope pesapi_open_scope(pesapi_env_holder env_holder) +pesapi_scope pesapi_open_scope(pesapi_env_ref env_ref) { - env_holder->isolate->Enter(); - auto scope = new pesapi_scope__(env_holder->isolate); - env_holder->context_persistent.Get(env_holder->isolate)->Enter(); + env_ref->isolate->Enter(); + auto scope = new pesapi_scope__(env_ref->isolate); + env_ref->context_persistent.Get(env_ref->isolate)->Enter(); return scope; } @@ -516,30 +524,55 @@ void pesapi_close_scope(pesapi_scope scope) isolate->Exit(); } -pesapi_value_holder pesapi_hold_value(pesapi_env env, pesapi_value pvalue) +pesapi_value_ref pesapi_create_value_ref(pesapi_env env, pesapi_value pvalue) { auto context = v8impl::V8LocalContextFromPesapiEnv(env); auto value = v8impl::V8LocalValueFromPesapiValue(pvalue); - return new pesapi_value_holder__(context, value); + return new pesapi_value_ref__(context, value); } -pesapi_value_holder pesapi_duplicate_value_holder(pesapi_value_holder value_holder) +pesapi_value_ref pesapi_duplicate_value_ref(pesapi_value_ref value_ref) { - ++value_holder->ref_count; - return value_holder; + ++value_ref->ref_count; + return value_ref; } -void pesapi_release_value_holder(pesapi_value_holder value_holder) +void pesapi_release_value_ref(pesapi_value_ref value_ref) { - if (--value_holder->ref_count == 0) + if (--value_ref->ref_count == 0) { - delete value_holder; + delete value_ref; } } -pesapi_value pesapi_get_value_from_holder(pesapi_env env, pesapi_value_holder value_holder) +pesapi_value pesapi_get_value_from_ref(pesapi_env env, pesapi_value_ref value_ref) { - return v8impl::PesapiValueFromV8LocalValue(value_holder->value_persistent.Get(value_holder->isolate)); + return v8impl::PesapiValueFromV8LocalValue(value_ref->value_persistent.Get(value_ref->isolate)); +} + +void pesapi_set_ref_weak(pesapi_env env, pesapi_value_ref value_ref) +{ + auto context = v8impl::V8LocalContextFromPesapiEnv(env); + value_ref->value_persistent.SetWeak(); +} + +bool pesapi_set_owner(pesapi_env env, pesapi_value pvalue, pesapi_value powner) +{ + auto context = v8impl::V8LocalContextFromPesapiEnv(env); + auto value = v8impl::V8LocalValueFromPesapiValue(pvalue); + auto owner = v8impl::V8LocalValueFromPesapiValue(powner); + + if (owner->IsObject()) + { + auto jsObj = owner.template As(); +#if V8_MAJOR_VERSION < 8 + jsObj->Set(context, v8::String::NewFromUtf8(context->GetIsolate(), "_p_i_only_one_child").ToLocalChecked(), value).Check(); +#else + jsObj->Set(context, v8::String::NewFromUtf8Literal(context->GetIsolate(), "_p_i_only_one_child"), value).Check(); +#endif + return true; + } + return false; } pesapi_value pesapi_get_property(pesapi_env env, pesapi_value pobject, const char* key) @@ -625,11 +658,15 @@ pesapi_value pesapi_eval(pesapi_env env, const uint8_t* code, size_t code_size, v8::Local url = v8::String::NewFromUtf8(isolate, path == nullptr ? "" : path, v8::NewStringType::kNormal).ToLocalChecked(); std::vector buff; - buff.resize(code_size + 1); + buff.reserve(code_size + 1); memcpy(buff.data(), code, code_size); buff[code_size] = '\0'; v8::Local source = v8::String::NewFromUtf8(isolate, buff.data(), v8::NewStringType::kNormal).ToLocalChecked(); +#if V8_MAJOR_VERSION > 8 + v8::ScriptOrigin origin(isolate, url); +#else v8::ScriptOrigin origin(url); +#endif auto CompiledScript = v8::Script::Compile(context, source, &origin); if (CompiledScript.IsEmpty()) @@ -761,6 +798,9 @@ static void free_property_descriptor(pesapi_property_descriptor properties, size #endif #endif +// set module name here during loading, set nullptr after module loaded +const char* GPesapiModuleName = nullptr; + MSVC_PRAGMA(warning(push)) MSVC_PRAGMA(warning(disable : 4191)) void pesapi_define_class(const void* type_id, const void* super_type_id, const char* type_name, pesapi_constructor constructor, @@ -769,7 +809,17 @@ void pesapi_define_class(const void* type_id, const void* super_type_id, const c puerts::JSClassDefinition classDef = JSClassEmptyDefinition; classDef.TypeId = type_id; classDef.SuperTypeId = super_type_id; - classDef.ScriptName = type_name; + std::string ScriptNameWithModuleName = GPesapiModuleName == nullptr ? std::string() : GPesapiModuleName; + if (GPesapiModuleName) + { + ScriptNameWithModuleName += "."; + ScriptNameWithModuleName += type_name; + classDef.ScriptName = ScriptNameWithModuleName.c_str(); + } + else + { + classDef.ScriptName = type_name; + } classDef.Data = userdata; classDef.Initialize = reinterpret_cast(constructor); @@ -778,14 +828,23 @@ void pesapi_define_class(const void* type_id, const void* super_type_id, const c std::vector p_methods; std::vector p_functions; std::vector p_properties; + std::vector p_variables; for (int i = 0; i < property_count; i++) { pesapi_property_descriptor p = properties + i; if (p->getter != nullptr || p->setter != nullptr) { - p_properties.push_back({p->name, reinterpret_cast(p->getter), - reinterpret_cast(p->setter), p->data, p->data}); + if (p->is_static) + { + p_variables.push_back({p->name, reinterpret_cast(p->getter), + reinterpret_cast(p->setter), p->data}); + } + else + { + p_properties.push_back({p->name, reinterpret_cast(p->getter), + reinterpret_cast(p->setter), p->data}); + } } else if (p->method != nullptr) { @@ -806,15 +865,42 @@ void pesapi_define_class(const void* type_id, const void* super_type_id, const c p_methods.push_back({nullptr, nullptr, nullptr}); p_functions.push_back({nullptr, nullptr, nullptr}); p_properties.push_back({nullptr, nullptr, nullptr, nullptr}); + p_variables.push_back({nullptr, nullptr, nullptr, nullptr}); classDef.Methods = p_methods.data(); classDef.Functions = p_functions.data(); classDef.Properties = p_properties.data(); + classDef.Variables = p_variables.data(); puerts::RegisterJSClass(classDef); } MSVC_PRAGMA(warning(pop)) +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) +{ +#if USING_IN_UNREAL_ENGINE + if (strcmp(proto_magic_id, PUERTS_BINDING_PROTO_ID()) != 0) + { + return; + } + + puerts::SetClassTypeInfo(type_id, static_cast(constructor_info), + static_cast(methods_info), static_cast(functions_info), + static_cast(properties_info), + static_cast(variables_info)); +#endif +} + +const void* pesapi_find_type_id(const char* module_name, const char* type_name) +{ + std::string fullname = module_name; + fullname += "."; + fullname += type_name; + const auto class_def = puerts::FindCppTypeClassByName(fullname); + return class_def ? class_def->TypeId : nullptr; +} + EXTERN_C_END #endif diff --git a/unity/native_src_il2cpp/Src/Puerts.cpp b/unity/native_src_il2cpp/Src/Puerts.cpp index 3cc58c6b30..1cbde19124 100644 --- a/unity/native_src_il2cpp/Src/Puerts.cpp +++ b/unity/native_src_il2cpp/Src/Puerts.cpp @@ -833,7 +833,7 @@ V8_EXPORT v8::Isolate* GetIsolate(puerts::JSEnv* jsEnv) return jsEnv->MainIsolate; } -V8_EXPORT pesapi_env_holder GetPesapiEnvHolder(puerts::JSEnv* jsEnv) +V8_EXPORT pesapi_env_ref GetPesapiEnvHolder(puerts::JSEnv* jsEnv) { v8::Isolate* Isolate = jsEnv->MainIsolate; v8::Isolate::Scope IsolateScope(Isolate); @@ -842,7 +842,7 @@ V8_EXPORT pesapi_env_holder GetPesapiEnvHolder(puerts::JSEnv* jsEnv) v8::Context::Scope ContextScope(Context); auto env = reinterpret_cast(*Context); - return pesapi_hold_env(env); + return pesapi_create_env_ref(env); } V8_EXPORT puerts::JsClassInfo* CreateCSharpTypeInfo(const char* name, const void* type_id, const void* super_type_id, void* klass, bool isValueType, bool isDelegate, const char* delegateSignature)