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 b06bf7ced4..536f18f32f 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 @@ -150,6 +150,11 @@ static void ValueTypeFree(void* ptr) delete [] (uint8_t*)ptr; } +static void PApiFree(void* class_data, void* env_private, void* ptr) +{ + ValueTypeFree(ptr); //TODO: class_data->IsValueType +} + static Il2CppClass *g_typeofPersistentObjectInfo; static Il2CppClass *g_typeofArrayBuffer; static Il2CppClass *g_typeofTypedValue; @@ -426,7 +431,7 @@ void PLog(const char* Fmt, ...) static void* CtorCallback(pesapi_callback_info info) { - JsClassInfoHeader* classInfo = reinterpret_cast(pesapi_get_constructor_userdata(info)); + JsClassInfoHeader* classInfo = reinterpret_cast(pesapi_get_class_data_in_constructor(info)); // or will crash in macos. if (*(classInfo->CtorWrapDatas) == nullptr) { @@ -568,7 +573,7 @@ static void* DelegateCtorCallback(pesapi_callback_info info) pesapi_throw_by_string(info, "expect a function"); return nullptr; } - JsClassInfoHeader* classInfo = reinterpret_cast(pesapi_get_constructor_userdata(info)); + JsClassInfoHeader* classInfo = reinterpret_cast(pesapi_get_class_data_in_constructor(info)); return FunctionToDelegate(env, jsval, classInfo); } @@ -2187,7 +2192,7 @@ bool RegisterCSharpType(puerts::JsClassInfo* classInfo) } pesapi_define_class(classInfo->TypeId, classInfo->SuperTypeId, classInfo->Name.c_str(), - classInfo->DelegateBridge ? &puerts::DelegateCtorCallback : &puerts::CtorCallback, classInfo->IsValueType ? &puerts::ValueTypeFree : (pesapi_finalize)nullptr, propertiesCount, properties, classInfo); + classInfo->DelegateBridge ? &puerts::DelegateCtorCallback : &puerts::CtorCallback, classInfo->IsValueType ? &puerts::PApiFree : (pesapi_finalize)nullptr, propertiesCount, properties, classInfo); return true; } 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 ec5de519fa..e0dcae13f5 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 @@ -120,7 +120,8 @@ 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_finalize)(void* class_data, void* env_private, void* ptr); +typedef bool (*pesapi_class_not_found_callback)(const void* type_id); typedef void (*pesapi_func_ptr)(void); #ifdef BUILDING_PES_EXTENSION @@ -142,6 +143,7 @@ PESAPI_EXTERN pesapi_value pesapi_create_string_utf8(pesapi_env env, const char* 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 pesapi_value pesapi_create_object(pesapi_env env); +PESAPI_EXTERN pesapi_value pesapi_create_function(pesapi_env env, pesapi_callback native_impl, void* data); 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); @@ -183,7 +185,7 @@ 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_get_class_data_in_constructor(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); @@ -238,14 +240,18 @@ PESAPI_EXTERN pesapi_property_descriptor pesapi_alloc_property_descriptors(size_ // 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_callback method, void* data, 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* getter_userdata, void* setter_userdata, pesapi_type_info type_info); + pesapi_callback getter, pesapi_callback setter, void* getter_data, void* setter_data, 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); + void* data); + +PESAPI_EXTERN void* pesapi_find_class_data(const void* type_id); + +PESAPI_EXTERN void pesapi_on_class_not_found(pesapi_class_not_found_callback callback); 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); 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 01ec5e06d0..608706b1dc 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 @@ -88,6 +88,12 @@ pesapi_value pesapi_create_object (pesapi_env env) { return pesapi_create_object_ptr(env); } +typedef pesapi_value (*pesapi_create_functionType)(pesapi_env env, pesapi_callback native_impl, void* data); +static pesapi_create_functionType pesapi_create_function_ptr; +pesapi_value pesapi_create_function (pesapi_env env, pesapi_callback native_impl, void* data) { + return pesapi_create_function_ptr(env, native_impl, data); +} + 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) { @@ -304,10 +310,10 @@ void* pesapi_get_userdata (pesapi_callback_info info) { return pesapi_get_userdata_ptr(info); } -typedef void* (*pesapi_get_constructor_userdataType)(pesapi_callback_info info); -static pesapi_get_constructor_userdataType pesapi_get_constructor_userdata_ptr; -void* pesapi_get_constructor_userdata (pesapi_callback_info info) { - return pesapi_get_constructor_userdata_ptr(info); +typedef void* (*pesapi_get_class_data_in_constructorType)(pesapi_callback_info info); +static pesapi_get_class_data_in_constructorType pesapi_get_class_data_in_constructor_ptr; +void* pesapi_get_class_data_in_constructor (pesapi_callback_info info) { + return pesapi_get_class_data_in_constructor_ptr(info); } typedef void (*pesapi_add_returnType)(pesapi_callback_info info, pesapi_value value); @@ -514,22 +520,34 @@ pesapi_property_descriptor pesapi_alloc_property_descriptors (size_t count) { return pesapi_alloc_property_descriptors_ptr(count); } -typedef void (*pesapi_set_method_infoType)(pesapi_property_descriptor properties, size_t index, const char* name, bool is_static,pesapi_callback method, void* userdata, pesapi_signature_info signature_info); +typedef void (*pesapi_set_method_infoType)(pesapi_property_descriptor properties, size_t index, const char* name, bool is_static,pesapi_callback method, void* data, pesapi_signature_info signature_info); static pesapi_set_method_infoType pesapi_set_method_info_ptr; -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_set_method_info_ptr(properties, index, name, is_static, method, userdata, signature_info); +void pesapi_set_method_info (pesapi_property_descriptor properties, size_t index, const char* name, bool is_static,pesapi_callback method, void* data, pesapi_signature_info signature_info) { + pesapi_set_method_info_ptr(properties, index, name, is_static, method, data, signature_info); } -typedef void (*pesapi_set_property_infoType)(pesapi_property_descriptor properties, size_t index, const char* name, bool is_static,pesapi_callback getter, pesapi_callback setter, void* getter_userdata, void* setter_userdata, pesapi_type_info type_info); +typedef void (*pesapi_set_property_infoType)(pesapi_property_descriptor properties, size_t index, const char* name, bool is_static,pesapi_callback getter, pesapi_callback setter, void* getter_data, void* setter_data, pesapi_type_info type_info); static pesapi_set_property_infoType pesapi_set_property_info_ptr; -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* getter_userdata, void* setter_userdata, pesapi_type_info type_info) { - pesapi_set_property_info_ptr(properties, index, name, is_static, getter, setter, getter_userdata, setter_userdata, type_info); +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* getter_data, void* setter_data, pesapi_type_info type_info) { + pesapi_set_property_info_ptr(properties, index, name, is_static, getter, setter, getter_data, setter_data, type_info); } -typedef void (*pesapi_define_classType)(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); +typedef void (*pesapi_define_classType)(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* data); static pesapi_define_classType pesapi_define_class_ptr; -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_define_class_ptr(type_id, super_type_id, type_name, constructor, finalize, property_count, properties, userdata); +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* data) { + pesapi_define_class_ptr(type_id, super_type_id, type_name, constructor, finalize, property_count, properties, data); +} + +typedef void* (*pesapi_find_class_dataType)(const void* type_id); +static pesapi_find_class_dataType pesapi_find_class_data_ptr; +void* pesapi_find_class_data (const void* type_id) { + return pesapi_find_class_data_ptr(type_id); +} + +typedef void (*pesapi_on_class_not_foundType)(pesapi_class_not_found_callback callback); +static pesapi_on_class_not_foundType pesapi_on_class_not_found_ptr; +void pesapi_on_class_not_found (pesapi_class_not_found_callback callback) { + pesapi_on_class_not_found_ptr(callback); } 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); @@ -561,82 +579,85 @@ void pesapi_init(pesapi_func_ptr* func_array){ pesapi_create_binary_ptr = (pesapi_create_binaryType)func_array[9]; pesapi_create_array_ptr = (pesapi_create_arrayType)func_array[10]; pesapi_create_object_ptr = (pesapi_create_objectType)func_array[11]; - pesapi_get_value_bool_ptr = (pesapi_get_value_boolType)func_array[12]; - pesapi_get_value_int32_ptr = (pesapi_get_value_int32Type)func_array[13]; - pesapi_get_value_uint32_ptr = (pesapi_get_value_uint32Type)func_array[14]; - pesapi_get_value_int64_ptr = (pesapi_get_value_int64Type)func_array[15]; - pesapi_get_value_uint64_ptr = (pesapi_get_value_uint64Type)func_array[16]; - pesapi_get_value_double_ptr = (pesapi_get_value_doubleType)func_array[17]; - pesapi_get_value_string_utf8_ptr = (pesapi_get_value_string_utf8Type)func_array[18]; - pesapi_get_value_binary_ptr = (pesapi_get_value_binaryType)func_array[19]; - pesapi_get_array_length_ptr = (pesapi_get_array_lengthType)func_array[20]; - pesapi_is_null_ptr = (pesapi_is_nullType)func_array[21]; - pesapi_is_undefined_ptr = (pesapi_is_undefinedType)func_array[22]; - pesapi_is_boolean_ptr = (pesapi_is_booleanType)func_array[23]; - pesapi_is_int32_ptr = (pesapi_is_int32Type)func_array[24]; - pesapi_is_uint32_ptr = (pesapi_is_uint32Type)func_array[25]; - pesapi_is_int64_ptr = (pesapi_is_int64Type)func_array[26]; - pesapi_is_uint64_ptr = (pesapi_is_uint64Type)func_array[27]; - pesapi_is_double_ptr = (pesapi_is_doubleType)func_array[28]; - pesapi_is_string_ptr = (pesapi_is_stringType)func_array[29]; - pesapi_is_object_ptr = (pesapi_is_objectType)func_array[30]; - pesapi_is_function_ptr = (pesapi_is_functionType)func_array[31]; - pesapi_is_binary_ptr = (pesapi_is_binaryType)func_array[32]; - pesapi_is_array_ptr = (pesapi_is_arrayType)func_array[33]; - pesapi_native_object_to_value_ptr = (pesapi_native_object_to_valueType)func_array[34]; - pesapi_get_native_object_ptr_ptr = (pesapi_get_native_object_ptrType)func_array[35]; - pesapi_get_native_object_typeid_ptr = (pesapi_get_native_object_typeidType)func_array[36]; - pesapi_is_instance_of_ptr = (pesapi_is_instance_ofType)func_array[37]; - pesapi_boxing_ptr = (pesapi_boxingType)func_array[38]; - pesapi_unboxing_ptr = (pesapi_unboxingType)func_array[39]; - pesapi_update_boxed_value_ptr = (pesapi_update_boxed_valueType)func_array[40]; - pesapi_is_boxed_value_ptr = (pesapi_is_boxed_valueType)func_array[41]; - pesapi_get_args_len_ptr = (pesapi_get_args_lenType)func_array[42]; - pesapi_get_arg_ptr = (pesapi_get_argType)func_array[43]; - pesapi_get_env_ptr = (pesapi_get_envType)func_array[44]; - pesapi_get_this_ptr = (pesapi_get_thisType)func_array[45]; - pesapi_get_holder_ptr = (pesapi_get_holderType)func_array[46]; - pesapi_get_userdata_ptr = (pesapi_get_userdataType)func_array[47]; - pesapi_get_constructor_userdata_ptr = (pesapi_get_constructor_userdataType)func_array[48]; - pesapi_add_return_ptr = (pesapi_add_returnType)func_array[49]; - pesapi_throw_by_string_ptr = (pesapi_throw_by_stringType)func_array[50]; - pesapi_create_env_ref_ptr = (pesapi_create_env_refType)func_array[51]; - pesapi_env_ref_is_valid_ptr = (pesapi_env_ref_is_validType)func_array[52]; - pesapi_get_env_from_ref_ptr = (pesapi_get_env_from_refType)func_array[53]; - pesapi_duplicate_env_ref_ptr = (pesapi_duplicate_env_refType)func_array[54]; - pesapi_release_env_ref_ptr = (pesapi_release_env_refType)func_array[55]; - pesapi_open_scope_ptr = (pesapi_open_scopeType)func_array[56]; - pesapi_has_caught_ptr = (pesapi_has_caughtType)func_array[57]; - pesapi_get_exception_as_string_ptr = (pesapi_get_exception_as_stringType)func_array[58]; - pesapi_close_scope_ptr = (pesapi_close_scopeType)func_array[59]; - pesapi_create_value_ref_ptr = (pesapi_create_value_refType)func_array[60]; - pesapi_duplicate_value_ref_ptr = (pesapi_duplicate_value_refType)func_array[61]; - pesapi_release_value_ref_ptr = (pesapi_release_value_refType)func_array[62]; - pesapi_get_value_from_ref_ptr = (pesapi_get_value_from_refType)func_array[63]; - pesapi_set_ref_weak_ptr = (pesapi_set_ref_weakType)func_array[64]; - pesapi_set_owner_ptr = (pesapi_set_ownerType)func_array[65]; - pesapi_get_ref_associated_env_ptr = (pesapi_get_ref_associated_envType)func_array[66]; - pesapi_get_ref_internal_fields_ptr = (pesapi_get_ref_internal_fieldsType)func_array[67]; - pesapi_get_property_ptr = (pesapi_get_propertyType)func_array[68]; - pesapi_set_property_ptr = (pesapi_set_propertyType)func_array[69]; - pesapi_get_private_ptr = (pesapi_get_privateType)func_array[70]; - pesapi_set_private_ptr = (pesapi_set_privateType)func_array[71]; - pesapi_get_property_uint32_ptr = (pesapi_get_property_uint32Type)func_array[72]; - pesapi_set_property_uint32_ptr = (pesapi_set_property_uint32Type)func_array[73]; - pesapi_call_function_ptr = (pesapi_call_functionType)func_array[74]; - pesapi_eval_ptr = (pesapi_evalType)func_array[75]; - pesapi_global_ptr = (pesapi_globalType)func_array[76]; - pesapi_get_env_private_ptr = (pesapi_get_env_privateType)func_array[77]; - pesapi_set_env_private_ptr = (pesapi_set_env_privateType)func_array[78]; - pesapi_alloc_type_infos_ptr = (pesapi_alloc_type_infosType)func_array[79]; - pesapi_set_type_info_ptr = (pesapi_set_type_infoType)func_array[80]; - pesapi_create_signature_info_ptr = (pesapi_create_signature_infoType)func_array[81]; - pesapi_alloc_property_descriptors_ptr = (pesapi_alloc_property_descriptorsType)func_array[82]; - pesapi_set_method_info_ptr = (pesapi_set_method_infoType)func_array[83]; - pesapi_set_property_info_ptr = (pesapi_set_property_infoType)func_array[84]; - pesapi_define_class_ptr = (pesapi_define_classType)func_array[85]; - pesapi_class_type_info_ptr = (pesapi_class_type_infoType)func_array[86]; - pesapi_find_type_id_ptr = (pesapi_find_type_idType)func_array[87]; + pesapi_create_function_ptr = (pesapi_create_functionType)func_array[12]; + pesapi_get_value_bool_ptr = (pesapi_get_value_boolType)func_array[13]; + pesapi_get_value_int32_ptr = (pesapi_get_value_int32Type)func_array[14]; + pesapi_get_value_uint32_ptr = (pesapi_get_value_uint32Type)func_array[15]; + pesapi_get_value_int64_ptr = (pesapi_get_value_int64Type)func_array[16]; + pesapi_get_value_uint64_ptr = (pesapi_get_value_uint64Type)func_array[17]; + pesapi_get_value_double_ptr = (pesapi_get_value_doubleType)func_array[18]; + pesapi_get_value_string_utf8_ptr = (pesapi_get_value_string_utf8Type)func_array[19]; + pesapi_get_value_binary_ptr = (pesapi_get_value_binaryType)func_array[20]; + pesapi_get_array_length_ptr = (pesapi_get_array_lengthType)func_array[21]; + pesapi_is_null_ptr = (pesapi_is_nullType)func_array[22]; + pesapi_is_undefined_ptr = (pesapi_is_undefinedType)func_array[23]; + pesapi_is_boolean_ptr = (pesapi_is_booleanType)func_array[24]; + pesapi_is_int32_ptr = (pesapi_is_int32Type)func_array[25]; + pesapi_is_uint32_ptr = (pesapi_is_uint32Type)func_array[26]; + pesapi_is_int64_ptr = (pesapi_is_int64Type)func_array[27]; + pesapi_is_uint64_ptr = (pesapi_is_uint64Type)func_array[28]; + pesapi_is_double_ptr = (pesapi_is_doubleType)func_array[29]; + pesapi_is_string_ptr = (pesapi_is_stringType)func_array[30]; + pesapi_is_object_ptr = (pesapi_is_objectType)func_array[31]; + pesapi_is_function_ptr = (pesapi_is_functionType)func_array[32]; + pesapi_is_binary_ptr = (pesapi_is_binaryType)func_array[33]; + pesapi_is_array_ptr = (pesapi_is_arrayType)func_array[34]; + pesapi_native_object_to_value_ptr = (pesapi_native_object_to_valueType)func_array[35]; + pesapi_get_native_object_ptr_ptr = (pesapi_get_native_object_ptrType)func_array[36]; + pesapi_get_native_object_typeid_ptr = (pesapi_get_native_object_typeidType)func_array[37]; + pesapi_is_instance_of_ptr = (pesapi_is_instance_ofType)func_array[38]; + pesapi_boxing_ptr = (pesapi_boxingType)func_array[39]; + pesapi_unboxing_ptr = (pesapi_unboxingType)func_array[40]; + pesapi_update_boxed_value_ptr = (pesapi_update_boxed_valueType)func_array[41]; + pesapi_is_boxed_value_ptr = (pesapi_is_boxed_valueType)func_array[42]; + pesapi_get_args_len_ptr = (pesapi_get_args_lenType)func_array[43]; + pesapi_get_arg_ptr = (pesapi_get_argType)func_array[44]; + pesapi_get_env_ptr = (pesapi_get_envType)func_array[45]; + pesapi_get_this_ptr = (pesapi_get_thisType)func_array[46]; + pesapi_get_holder_ptr = (pesapi_get_holderType)func_array[47]; + pesapi_get_userdata_ptr = (pesapi_get_userdataType)func_array[48]; + pesapi_get_class_data_in_constructor_ptr = (pesapi_get_class_data_in_constructorType)func_array[49]; + pesapi_add_return_ptr = (pesapi_add_returnType)func_array[50]; + pesapi_throw_by_string_ptr = (pesapi_throw_by_stringType)func_array[51]; + pesapi_create_env_ref_ptr = (pesapi_create_env_refType)func_array[52]; + pesapi_env_ref_is_valid_ptr = (pesapi_env_ref_is_validType)func_array[53]; + pesapi_get_env_from_ref_ptr = (pesapi_get_env_from_refType)func_array[54]; + pesapi_duplicate_env_ref_ptr = (pesapi_duplicate_env_refType)func_array[55]; + pesapi_release_env_ref_ptr = (pesapi_release_env_refType)func_array[56]; + pesapi_open_scope_ptr = (pesapi_open_scopeType)func_array[57]; + pesapi_has_caught_ptr = (pesapi_has_caughtType)func_array[58]; + pesapi_get_exception_as_string_ptr = (pesapi_get_exception_as_stringType)func_array[59]; + pesapi_close_scope_ptr = (pesapi_close_scopeType)func_array[60]; + pesapi_create_value_ref_ptr = (pesapi_create_value_refType)func_array[61]; + pesapi_duplicate_value_ref_ptr = (pesapi_duplicate_value_refType)func_array[62]; + pesapi_release_value_ref_ptr = (pesapi_release_value_refType)func_array[63]; + pesapi_get_value_from_ref_ptr = (pesapi_get_value_from_refType)func_array[64]; + pesapi_set_ref_weak_ptr = (pesapi_set_ref_weakType)func_array[65]; + pesapi_set_owner_ptr = (pesapi_set_ownerType)func_array[66]; + pesapi_get_ref_associated_env_ptr = (pesapi_get_ref_associated_envType)func_array[67]; + pesapi_get_ref_internal_fields_ptr = (pesapi_get_ref_internal_fieldsType)func_array[68]; + pesapi_get_property_ptr = (pesapi_get_propertyType)func_array[69]; + pesapi_set_property_ptr = (pesapi_set_propertyType)func_array[70]; + pesapi_get_private_ptr = (pesapi_get_privateType)func_array[71]; + pesapi_set_private_ptr = (pesapi_set_privateType)func_array[72]; + pesapi_get_property_uint32_ptr = (pesapi_get_property_uint32Type)func_array[73]; + pesapi_set_property_uint32_ptr = (pesapi_set_property_uint32Type)func_array[74]; + pesapi_call_function_ptr = (pesapi_call_functionType)func_array[75]; + pesapi_eval_ptr = (pesapi_evalType)func_array[76]; + pesapi_global_ptr = (pesapi_globalType)func_array[77]; + pesapi_get_env_private_ptr = (pesapi_get_env_privateType)func_array[78]; + pesapi_set_env_private_ptr = (pesapi_set_env_privateType)func_array[79]; + pesapi_alloc_type_infos_ptr = (pesapi_alloc_type_infosType)func_array[80]; + pesapi_set_type_info_ptr = (pesapi_set_type_infoType)func_array[81]; + pesapi_create_signature_info_ptr = (pesapi_create_signature_infoType)func_array[82]; + pesapi_alloc_property_descriptors_ptr = (pesapi_alloc_property_descriptorsType)func_array[83]; + pesapi_set_method_info_ptr = (pesapi_set_method_infoType)func_array[84]; + pesapi_set_property_info_ptr = (pesapi_set_property_infoType)func_array[85]; + pesapi_define_class_ptr = (pesapi_define_classType)func_array[86]; + pesapi_find_class_data_ptr = (pesapi_find_class_dataType)func_array[87]; + pesapi_on_class_not_found_ptr = (pesapi_on_class_not_foundType)func_array[88]; + pesapi_class_type_info_ptr = (pesapi_class_type_infoType)func_array[89]; + pesapi_find_type_id_ptr = (pesapi_find_type_idType)func_array[90]; #endif } diff --git a/unity/native_src_il2cpp/Inc/CppObjectMapper.h b/unity/native_src_il2cpp/Inc/CppObjectMapper.h index 8ff4084fca..5e32ba9c7e 100644 --- a/unity/native_src_il2cpp/Inc/CppObjectMapper.h +++ b/unity/native_src_il2cpp/Inc/CppObjectMapper.h @@ -34,7 +34,7 @@ class FCppObjectMapper final : public ICppObjectMapper void LoadCppType(const v8::FunctionCallbackInfo& Info); - virtual bool IsInstanceOfCppObject(const void* TypeId, v8::Local JsObject) override; + virtual bool IsInstanceOfCppObject(v8::Isolate* Isolate, const void* TypeId, v8::Local JsObject) override; virtual std::weak_ptr GetJsEnvLifeCycleTracker() override; @@ -73,7 +73,12 @@ class FCppObjectMapper final : public ICppObjectMapper v8::Global PrivateKey; - std::unordered_map CDataFinalizeMap; + struct FinalizeInfo + { + void* ClassData; + FinalizeFunc Finalize; + }; + std::unordered_map CDataFinalizeMap; std::shared_ptr Ref = std::make_shared(0); }; diff --git a/unity/native_src_il2cpp/Inc/DataTransfer.h b/unity/native_src_il2cpp/Inc/DataTransfer.h index 8e9601929b..72ee9c6485 100644 --- a/unity/native_src_il2cpp/Inc/DataTransfer.h +++ b/unity/native_src_il2cpp/Inc/DataTransfer.h @@ -306,6 +306,16 @@ class JSENV_API DataTransfer return static_cast(Isolate->GetData(MAPPER_ISOLATE_DATA_POS)); } + FORCEINLINE static void* GetIsolatePrivateData(v8::Isolate* Isolate) + { + return Isolate->GetData(PESAPI_PRIVATE_DATA_POS_IN_ISOLATE); + } + + FORCEINLINE static void SetIsolatePrivateData(v8::Isolate* Isolate, void* PrivateData) + { + Isolate->SetData(PESAPI_PRIVATE_DATA_POS_IN_ISOLATE, PrivateData); + } + static v8::Local FindOrAddCData( v8::Isolate* Isolate, v8::Local Context, const void* TypeId, const void* Ptr, bool PassByPointer); diff --git a/unity/native_src_il2cpp/Inc/JSClassRegister.h b/unity/native_src_il2cpp/Inc/JSClassRegister.h index 09391c09ba..17caa1543e 100644 --- a/unity/native_src_il2cpp/Inc/JSClassRegister.h +++ b/unity/native_src_il2cpp/Inc/JSClassRegister.h @@ -56,10 +56,12 @@ struct JSENV_API JSPropertyInfo void* SetterData = nullptr; }; -typedef void (*FinalizeFunc)(void* Ptr); +typedef void (*FinalizeFunc)(void* ClassData, void* EnvData, void* Ptr); typedef void* (*InitializeFunc)(const v8::FunctionCallbackInfo& Info); +typedef bool (*ClassNotFoundCallback)(const void* type_id); + struct NamedFunctionInfo; struct NamedPropertyInfo; @@ -103,6 +105,10 @@ JSENV_API const JSClassDefinition* FindClassByID(const void* TypeId, bool TryLaz typedef void (*LoadTypeFunc) (const void* typeId); JSENV_API void SetLazyLoadCallback(LoadTypeFunc Callback); +JSENV_API void OnClassNotFound(ClassNotFoundCallback Callback); + +JSENV_API const JSClassDefinition* LoadClassByID(const void* TypeId); + JSENV_API const JSClassDefinition* FindCppTypeClassByName(const std::string& Name); #if USING_IN_UNREAL_ENGINE diff --git a/unity/native_src_il2cpp/Inc/ObjectMapper.h b/unity/native_src_il2cpp/Inc/ObjectMapper.h index 291ce4f88f..5d39347dde 100644 --- a/unity/native_src_il2cpp/Inc/ObjectMapper.h +++ b/unity/native_src_il2cpp/Inc/ObjectMapper.h @@ -15,13 +15,17 @@ #endif #include "JSClassRegister.h" +#include "NamespaceDef.h" + +PRAGMA_DISABLE_UNDEFINED_IDENTIFIER_WARNINGS #pragma warning(push, 0) #include "v8.h" #pragma warning(pop) +PRAGMA_ENABLE_UNDEFINED_IDENTIFIER_WARNINGS #include -namespace puerts +namespace PUERTS_NAMESPACE { class ICppObjectMapper { @@ -34,8 +38,8 @@ class ICppObjectMapper virtual v8::Local FindOrAddCppObject( v8::Isolate* Isolate, v8::Local& Context, const void* TypeId, void* Ptr, bool PassByPointer) = 0; - virtual bool IsInstanceOfCppObject(const void* TypeId, v8::Local JsObject) = 0; - + virtual bool IsInstanceOfCppObject(v8::Isolate* Isolate, const void* TypeId, v8::Local JsObject) = 0; + virtual void* GetPrivateData(v8::Local Context, v8::Local JSObject) = 0; virtual void SetPrivateData(v8::Local Context, v8::Local JSObject, void* Ptr) = 0; @@ -51,7 +55,7 @@ class ICppObjectMapper class IObjectMapper : public ICppObjectMapper { public: - virtual void Bind(UClass* Class, UObject* UEObject, v8::Local JSObject) = 0; + virtual void Bind(FClassWrapper* ClassWrapper, UObject* UEObject, v8::Local JSObject) = 0; virtual void UnBind(UClass* Class, UObject* UEObject) = 0; @@ -71,9 +75,6 @@ class IObjectMapper : public ICppObjectMapper virtual void Merge( v8::Isolate* Isolate, v8::Local Context, v8::Local Src, UStruct* DesType, void* Des) = 0; - virtual void BindContainer( - void* Ptr, v8::Local JSObject, void (*Callback)(const v8::WeakCallbackInfo& data)) = 0; - virtual void UnBindContainer(void* Ptr) = 0; virtual v8::Local FindOrAddContainer( @@ -93,7 +94,7 @@ class IObjectMapper : public ICppObjectMapper virtual PropertyMacro* FindDelegateProperty(void* DelegatePtr) = 0; - virtual FScriptDelegate NewManualReleaseDelegate(v8::Isolate* Isolate, v8::Local& Context, + virtual FScriptDelegate NewDelegate(v8::Isolate* Isolate, v8::Local& Context, UObject* Owner, v8::Local JsFunction, UFunction* SignatureFunction) = 0; virtual bool RemoveFromDelegate( @@ -114,4 +115,4 @@ class IObjectMapper : public ICppObjectMapper }; #endif -} // namespace puerts +} // namespace PUERTS_NAMESPACE diff --git a/unity/native_src_il2cpp/Inc/pesapi.h b/unity/native_src_il2cpp/Inc/pesapi.h index ec5de519fa..e0dcae13f5 100644 --- a/unity/native_src_il2cpp/Inc/pesapi.h +++ b/unity/native_src_il2cpp/Inc/pesapi.h @@ -120,7 +120,8 @@ 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_finalize)(void* class_data, void* env_private, void* ptr); +typedef bool (*pesapi_class_not_found_callback)(const void* type_id); typedef void (*pesapi_func_ptr)(void); #ifdef BUILDING_PES_EXTENSION @@ -142,6 +143,7 @@ PESAPI_EXTERN pesapi_value pesapi_create_string_utf8(pesapi_env env, const char* 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 pesapi_value pesapi_create_object(pesapi_env env); +PESAPI_EXTERN pesapi_value pesapi_create_function(pesapi_env env, pesapi_callback native_impl, void* data); 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); @@ -183,7 +185,7 @@ 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_get_class_data_in_constructor(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); @@ -238,14 +240,18 @@ PESAPI_EXTERN pesapi_property_descriptor pesapi_alloc_property_descriptors(size_ // 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_callback method, void* data, 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* getter_userdata, void* setter_userdata, pesapi_type_info type_info); + pesapi_callback getter, pesapi_callback setter, void* getter_data, void* setter_data, 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); + void* data); + +PESAPI_EXTERN void* pesapi_find_class_data(const void* type_id); + +PESAPI_EXTERN void pesapi_on_class_not_found(pesapi_class_not_found_callback callback); 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); diff --git a/unity/native_src_il2cpp/Src/CppObjectMapper.cpp b/unity/native_src_il2cpp/Src/CppObjectMapper.cpp index 923db9a145..07947d0f9b 100644 --- a/unity/native_src_il2cpp/Src/CppObjectMapper.cpp +++ b/unity/native_src_il2cpp/Src/CppObjectMapper.cpp @@ -137,7 +137,7 @@ v8::Local FCppObjectMapper::FindOrAddCppObject( } } -bool FCppObjectMapper::IsInstanceOfCppObject(const void* TypeId, v8::Local JsObject) +bool FCppObjectMapper::IsInstanceOfCppObject(v8::Isolate* Isolate, const void* TypeId, v8::Local JsObject) { return DataTransfer::GetPointerFast(JsObject, 1) == TypeId; } @@ -286,7 +286,7 @@ static void CDataGarbageCollectedWithFree(const v8::WeakCallbackInfoFinalize) - ClassDefinition->Finalize(Ptr); + ClassDefinition->Finalize(ClassDefinition->Data, DataTransfer::GetIsolatePrivateData(Data.GetIsolate()), Ptr); DataTransfer::IsolateData(Data.GetIsolate())->UnBindCppObject(ClassDefinition, Ptr); } @@ -321,7 +321,7 @@ void FCppObjectMapper::BindCppObject( { if (ClassDefinition->Finalize) { - CDataFinalizeMap[Ptr] = ClassDefinition->Finalize; + CDataFinalizeMap[Ptr] = {ClassDefinition->Data, ClassDefinition->Finalize}; } CacheNodePtr->Value.SetWeak( ClassDefinition, CDataGarbageCollectedWithFree, v8::WeakCallbackType::kInternalFields); @@ -385,10 +385,11 @@ void FCppObjectMapper::UnBindCppObject(JSClassDefinition* ClassDefinition, void* void FCppObjectMapper::UnInitialize(v8::Isolate* InIsolate) { Ref.reset();// let c# do not callback + auto PData = DataTransfer::GetIsolatePrivateData(InIsolate); for (auto Iter = CDataFinalizeMap.begin(); Iter != CDataFinalizeMap.end(); Iter++) { - if (Iter->second) - Iter->second(Iter->first); + if (Iter->second.Finalize) + Iter->second.Finalize(Iter->second.ClassData, PData, Iter->first); } CDataCache.clear(); CDataFinalizeMap.clear(); diff --git a/unity/native_src_il2cpp/Src/DataTransfer.cpp b/unity/native_src_il2cpp/Src/DataTransfer.cpp index b0312f1fe7..b16f15c821 100644 --- a/unity/native_src_il2cpp/Src/DataTransfer.cpp +++ b/unity/native_src_il2cpp/Src/DataTransfer.cpp @@ -23,7 +23,7 @@ v8::Local DataTransfer::FindOrAddCData( bool DataTransfer::IsInstanceOf(v8::Isolate* Isolate, const void* TypeId, v8::Local JsObject) { - return IsolateData(Isolate)->IsInstanceOfCppObject(TypeId, JsObject); + return IsolateData(Isolate)->IsInstanceOfCppObject(Isolate, TypeId, JsObject); } v8::Local DataTransfer::UnRef(v8::Isolate* Isolate, const v8::Local& Value) diff --git a/unity/native_src_il2cpp/Src/JSClassRegister.cpp b/unity/native_src_il2cpp/Src/JSClassRegister.cpp index 74403b1497..27e32cdefd 100644 --- a/unity/native_src_il2cpp/Src/JSClassRegister.cpp +++ b/unity/native_src_il2cpp/Src/JSClassRegister.cpp @@ -83,6 +83,25 @@ class JSClassRegister const JSClassDefinition* FindClassByID(const void* TypeId, bool TryLazyLoad = false); + void OnClassNotFound(ClassNotFoundCallback InCallback) + { + ClassNotFoundCallback = InCallback; + } + + const JSClassDefinition* LoadClassByID(const void* TypeId) + { + auto clsDef = FindClassByID(TypeId); + if (!clsDef && ClassNotFoundCallback) + { + if (!ClassNotFoundCallback(TypeId)) + { + return nullptr; + } + clsDef = FindClassByID(TypeId); + } + return clsDef; + } + void SetLazyLoadCallback(LoadTypeFunc InCallback) { LazyLoad = InCallback; @@ -103,6 +122,7 @@ class JSClassRegister std::map CDataNameToClassDefinition; LoadTypeFunc LazyLoad = nullptr; std::recursive_mutex RegInfoMutex; + ClassNotFoundCallback ClassNotFoundCallback = nullptr; #if USING_IN_UNREAL_ENGINE std::map AddonRegisterInfos; std::map StructNameToClassDefinition; @@ -319,6 +339,15 @@ const JSClassDefinition* FindClassByID(const void* TypeId, bool TryLazyLoad) return GetJSClassRegister()->FindClassByID(TypeId, TryLazyLoad); } +void OnClassNotFound(ClassNotFoundCallback Callback) +{ + GetJSClassRegister()->OnClassNotFound(Callback); +} +const JSClassDefinition* LoadClassByID(const void* TypeId) +{ + return GetJSClassRegister()->LoadClassByID(TypeId); +} + void SetLazyLoadCallback(LoadTypeFunc Callback) { GetJSClassRegister()->SetLazyLoadCallback(Callback); diff --git a/unity/native_src_il2cpp/Src/PesapiAddonLoad.cpp b/unity/native_src_il2cpp/Src/PesapiAddonLoad.cpp index 00995567d6..78ba637e9f 100644 --- a/unity/native_src_il2cpp/Src/PesapiAddonLoad.cpp +++ b/unity/native_src_il2cpp/Src/PesapiAddonLoad.cpp @@ -40,21 +40,21 @@ static pesapi_func_ptr funcs[] = {(pesapi_func_ptr) &pesapi_create_null, (pesapi (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_create_array, - (pesapi_func_ptr) &pesapi_create_object, (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_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_create_object, (pesapi_func_ptr) &pesapi_create_function, (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_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_class_data_in_constructor, (pesapi_func_ptr) &pesapi_add_return, (pesapi_func_ptr) &pesapi_throw_by_string, (pesapi_func_ptr) &pesapi_create_env_ref, (pesapi_func_ptr) &pesapi_env_ref_is_valid, (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, @@ -70,6 +70,7 @@ static pesapi_func_ptr funcs[] = {(pesapi_func_ptr) &pesapi_create_null, (pesapi (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_find_class_data, (pesapi_func_ptr) &pesapi_on_class_not_found, (pesapi_func_ptr) &pesapi_class_type_info, (pesapi_func_ptr) &pesapi_find_type_id}; MSVC_PRAGMA(warning(pop)) diff --git a/unity/native_src_il2cpp/Src/PesapiV8Impl.cpp b/unity/native_src_il2cpp/Src/PesapiV8Impl.cpp index a3828baead..1bbd888435 100644 --- a/unity/native_src_il2cpp/Src/PesapiV8Impl.cpp +++ b/unity/native_src_il2cpp/Src/PesapiV8Impl.cpp @@ -18,6 +18,14 @@ #include #include +#ifndef MSVC_PRAGMA +#if !defined(__clang__) && defined(_MSC_VER) +#define MSVC_PRAGMA(Pragma) __pragma(Pragma) +#else +#define MSVC_PRAGMA(...) +#endif +#endif + struct pesapi_env_ref__ { explicit pesapi_env_ref__(v8::Local context) @@ -163,6 +171,21 @@ pesapi_value pesapi_create_object(pesapi_env env) return v8impl::PesapiValueFromV8LocalValue(v8::Object::New(context->GetIsolate())); } +MSVC_PRAGMA(warning(push)) +MSVC_PRAGMA(warning(disable : 4191)) +pesapi_value pesapi_create_function(pesapi_env env, pesapi_callback native_impl, void* data) +{ + auto context = v8impl::V8LocalContextFromPesapiEnv(env); + auto v8_data = + data ? static_cast>(v8::External::New(context->GetIsolate(), data)) : v8::Local(); + auto func = v8::FunctionTemplate::New(context->GetIsolate(), reinterpret_cast(native_impl), v8_data) + ->GetFunction(context); + if (func.IsEmpty()) + return nullptr; + return v8impl::PesapiValueFromV8LocalValue(func.ToLocalChecked()); +} +MSVC_PRAGMA(warning(pop)) + bool pesapi_get_value_bool(pesapi_env env, pesapi_value pvalue) { auto context = v8impl::V8LocalContextFromPesapiEnv(env); @@ -439,7 +462,7 @@ void* pesapi_get_userdata(pesapi_callback_info pinfo) return v8::Local::Cast((*info).Data())->Value(); } -void* pesapi_get_constructor_userdata(pesapi_callback_info pinfo) +void* pesapi_get_class_data_in_constructor(pesapi_callback_info pinfo) { auto info = reinterpret_cast*>(pinfo); if (!(*info).IsConstructCall()) @@ -782,20 +805,16 @@ pesapi_value pesapi_global(pesapi_env env) return v8impl::PesapiValueFromV8LocalValue(global); } -#ifndef PESAPI_PRIVATE_DATA_POS_IN_ISOLATE -#define PESAPI_PRIVATE_DATA_POS_IN_ISOLATE (MAPPER_ISOLATE_DATA_POS + 1) -#endif - const void* pesapi_get_env_private(pesapi_env env) { auto context = v8impl::V8LocalContextFromPesapiEnv(env); - return context->GetIsolate()->GetData(PESAPI_PRIVATE_DATA_POS_IN_ISOLATE); + return puerts::DataTransfer::GetIsolatePrivateData(context->GetIsolate()); } void pesapi_set_env_private(pesapi_env env, const void* ptr) { auto context = v8impl::V8LocalContextFromPesapiEnv(env); - context->GetIsolate()->SetData(PESAPI_PRIVATE_DATA_POS_IN_ISOLATE, const_cast(ptr)); + puerts::DataTransfer::SetIsolatePrivateData(context->GetIsolate(), const_cast(ptr)); } struct pesapi_type_info__ @@ -868,14 +887,14 @@ void pesapi_set_method_info(pesapi_property_descriptor properties, size_t index, } 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* getter_userdata, void* setter_userdata, pesapi_type_info type_info) + pesapi_callback getter, pesapi_callback setter, void* getter_data, void* setter_data, pesapi_type_info type_info) { properties[index].name = name; properties[index].is_static = is_static; properties[index].getter = getter; properties[index].setter = setter; - properties[index].data0 = getter_userdata; - properties[index].data1 = setter_userdata; + properties[index].data0 = getter_data; + properties[index].data1 = setter_data; properties[index].info.type_info = type_info; } @@ -909,21 +928,13 @@ static void free_property_descriptor(pesapi_property_descriptor properties, size } } -#ifndef MSVC_PRAGMA -#if !defined(__clang__) && defined(_MSC_VER) -#define MSVC_PRAGMA(Pragma) __pragma(Pragma) -#else -#define MSVC_PRAGMA(...) -#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, - pesapi_finalize finalize, size_t property_count, pesapi_property_descriptor properties, void* userdata) + pesapi_finalize finalize, size_t property_count, pesapi_property_descriptor properties, void* data) { puerts::JSClassDefinition classDef = JSClassEmptyDefinition; classDef.TypeId = type_id; @@ -939,7 +950,7 @@ void pesapi_define_class(const void* type_id, const void* super_type_id, const c { classDef.ScriptName = type_name; } - classDef.Data = userdata; + classDef.Data = data; classDef.Initialize = reinterpret_cast(constructor); classDef.Finalize = finalize; @@ -995,6 +1006,17 @@ void pesapi_define_class(const void* type_id, const void* super_type_id, const c } MSVC_PRAGMA(warning(pop)) +void* pesapi_find_class_data(const void* type_id) +{ + auto clsDef = puerts::FindClassByID(type_id); + return clsDef ? clsDef->Data : nullptr; +} + +void pesapi_on_class_not_found(pesapi_class_not_found_callback callback) +{ + puerts::OnClassNotFound(callback); +} + 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) {