Skip to content

Commit

Permalink
[unreal]p-api添加pesapi_create_object,并且属性的getter和setter的userdata可以分别设置
Browse files Browse the repository at this point in the history
  • Loading branch information
chexiongsheng committed Sep 12, 2024
1 parent 75034c0 commit e2e21ee
Show file tree
Hide file tree
Showing 9 changed files with 74 additions and 43 deletions.
24 changes: 16 additions & 8 deletions unreal/Puerts/Source/JsEnv/Private/CppObjectMapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -163,13 +163,17 @@ v8::Local<v8::FunctionTemplate> FCppObjectMapper::GetTemplateOfClass(v8::Isolate
v8::PropertyAttribute PropertyAttribute = v8::DontDelete;
if (!PropertyInfo->Setter)
PropertyAttribute = (v8::PropertyAttribute)(PropertyAttribute | v8::ReadOnly);
auto Data = PropertyInfo->Data ? static_cast<v8::Local<v8::Value>>(v8::External::New(Isolate, PropertyInfo->Data))
: v8::Local<v8::Value>();
auto GetterData = PropertyInfo->GetterData
? static_cast<v8::Local<v8::Value>>(v8::External::New(Isolate, PropertyInfo->GetterData))
: v8::Local<v8::Value>();
auto SetterData = PropertyInfo->SetterData
? static_cast<v8::Local<v8::Value>>(v8::External::New(Isolate, PropertyInfo->SetterData))
: v8::Local<v8::Value>();
Template->PrototypeTemplate()->SetAccessorProperty(
v8::String::NewFromUtf8(Isolate, PropertyInfo->Name, v8::NewStringType::kNormal).ToLocalChecked(),
PropertyInfo->Getter ? v8::FunctionTemplate::New(Isolate, PropertyInfo->Getter, Data)
PropertyInfo->Getter ? v8::FunctionTemplate::New(Isolate, PropertyInfo->Getter, GetterData)
: v8::Local<v8::FunctionTemplate>(),
PropertyInfo->Setter ? v8::FunctionTemplate::New(Isolate, PropertyInfo->Setter, Data)
PropertyInfo->Setter ? v8::FunctionTemplate::New(Isolate, PropertyInfo->Setter, SetterData)
: v8::Local<v8::FunctionTemplate>(),
PropertyAttribute);
++PropertyInfo;
Expand All @@ -181,13 +185,17 @@ v8::Local<v8::FunctionTemplate> FCppObjectMapper::GetTemplateOfClass(v8::Isolate
v8::PropertyAttribute PropertyAttribute = v8::DontDelete;
if (!PropertyInfo->Setter)
PropertyAttribute = (v8::PropertyAttribute)(PropertyAttribute | v8::ReadOnly);
auto Data = PropertyInfo->Data ? static_cast<v8::Local<v8::Value>>(v8::External::New(Isolate, PropertyInfo->Data))
: v8::Local<v8::Value>();
auto GetterData = PropertyInfo->GetterData
? static_cast<v8::Local<v8::Value>>(v8::External::New(Isolate, PropertyInfo->GetterData))
: v8::Local<v8::Value>();
auto SetterData = PropertyInfo->SetterData
? static_cast<v8::Local<v8::Value>>(v8::External::New(Isolate, PropertyInfo->SetterData))
: v8::Local<v8::Value>();
Template->SetAccessorProperty(
v8::String::NewFromUtf8(Isolate, PropertyInfo->Name, v8::NewStringType::kNormal).ToLocalChecked(),
PropertyInfo->Getter ? v8::FunctionTemplate::New(Isolate, PropertyInfo->Getter, Data)
PropertyInfo->Getter ? v8::FunctionTemplate::New(Isolate, PropertyInfo->Getter, GetterData)
: v8::Local<v8::FunctionTemplate>(),
PropertyInfo->Setter ? v8::FunctionTemplate::New(Isolate, PropertyInfo->Setter, Data)
PropertyInfo->Setter ? v8::FunctionTemplate::New(Isolate, PropertyInfo->Setter, SetterData)
: v8::Local<v8::FunctionTemplate>(),
PropertyAttribute);
++PropertyInfo;
Expand Down
27 changes: 14 additions & 13 deletions unreal/Puerts/Source/JsEnv/Private/PesapiAddonLoad.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,19 +31,20 @@ 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_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_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_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,
Expand Down
22 changes: 15 additions & 7 deletions unreal/Puerts/Source/JsEnv/Private/PesapiV8Impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,12 @@ pesapi_value pesapi_create_array(pesapi_env env)
return v8impl::PesapiValueFromV8LocalValue(v8::Array::New(context->GetIsolate()));
}

pesapi_value pesapi_create_object(pesapi_env env)
{
auto context = v8impl::V8LocalContextFromPesapiEnv(env);
return v8impl::PesapiValueFromV8LocalValue(v8::Object::New(context->GetIsolate()));
}

bool pesapi_get_value_bool(pesapi_env env, pesapi_value pvalue)
{
auto context = v8impl::V8LocalContextFromPesapiEnv(env);
Expand Down Expand Up @@ -704,7 +710,8 @@ struct pesapi_property_descriptor__
pesapi_callback method;
pesapi_callback getter;
pesapi_callback setter;
void* data;
void* data0;
void* data1;

union
{
Expand Down Expand Up @@ -745,18 +752,19 @@ void pesapi_set_method_info(pesapi_property_descriptor properties, size_t index,
properties[index].name = name;
properties[index].is_static = is_static;
properties[index].method = method;
properties[index].data = data;
properties[index].data0 = data;
properties[index].info.signature_info = signature_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* data, pesapi_type_info type_info)
pesapi_callback getter, pesapi_callback setter, void* getter_userdata, void* setter_userdata, 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].data = data;
properties[index].data0 = getter_userdata;
properties[index].data1 = setter_userdata;
properties[index].info.type_info = type_info;
}

Expand Down Expand Up @@ -838,17 +846,17 @@ void pesapi_define_class(const void* type_id, const void* super_type_id, const c
if (p->is_static)
{
p_variables.push_back({p->name, reinterpret_cast<v8::FunctionCallback>(p->getter),
reinterpret_cast<v8::FunctionCallback>(p->setter), p->data});
reinterpret_cast<v8::FunctionCallback>(p->setter), p->data0, p->data1});
}
else
{
p_properties.push_back({p->name, reinterpret_cast<v8::FunctionCallback>(p->getter),
reinterpret_cast<v8::FunctionCallback>(p->setter), p->data});
reinterpret_cast<v8::FunctionCallback>(p->setter), p->data0, p->data1});
}
}
else if (p->method != nullptr)
{
puerts::JSFunctionInfo finfo{p->name, reinterpret_cast<v8::FunctionCallback>(p->method), p->data};
puerts::JSFunctionInfo finfo{p->name, reinterpret_cast<v8::FunctionCallback>(p->method), p->data0};
if (p->is_static)
{
p_functions.push_back(finfo);
Expand Down
26 changes: 18 additions & 8 deletions unreal/Puerts/Source/JsEnv/Private/StructWrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,13 +93,18 @@ void FStructWrapper::InitTemplateProperties(
v8::PropertyAttribute PropertyAttribute = v8::DontDelete;
if (!PropertyInfo->Setter)
PropertyAttribute = (v8::PropertyAttribute)(PropertyAttribute | v8::ReadOnly);
auto Data = PropertyInfo->Data ? static_cast<v8::Local<v8::Value>>(v8::External::New(Isolate, PropertyInfo->Data))
: v8::Local<v8::Value>();
auto GetterData = PropertyInfo->GetterData
? static_cast<v8::Local<v8::Value>>(v8::External::New(Isolate, PropertyInfo->GetterData))
: v8::Local<v8::Value>();

auto SetterData = PropertyInfo->SetterData
? static_cast<v8::Local<v8::Value>>(v8::External::New(Isolate, PropertyInfo->SetterData))
: v8::Local<v8::Value>();

Template->PrototypeTemplate()->SetAccessorProperty(FV8Utils::InternalString(Isolate, PropertyInfo->Name),
PropertyInfo->Getter ? v8::FunctionTemplate::New(Isolate, PropertyInfo->Getter, Data)
PropertyInfo->Getter ? v8::FunctionTemplate::New(Isolate, PropertyInfo->Getter, GetterData)
: v8::Local<v8::FunctionTemplate>(),
PropertyInfo->Setter ? v8::FunctionTemplate::New(Isolate, PropertyInfo->Setter, Data)
PropertyInfo->Setter ? v8::FunctionTemplate::New(Isolate, PropertyInfo->Setter, SetterData)
: v8::Local<v8::FunctionTemplate>(),
PropertyAttribute);
}
Expand All @@ -114,13 +119,18 @@ void FStructWrapper::InitTemplateProperties(
v8::PropertyAttribute PropertyAttribute = v8::DontDelete;
if (!PropertyInfo->Setter)
PropertyAttribute = (v8::PropertyAttribute)(PropertyAttribute | v8::ReadOnly);
auto Data = PropertyInfo->Data ? static_cast<v8::Local<v8::Value>>(v8::External::New(Isolate, PropertyInfo->Data))
: v8::Local<v8::Value>();
auto GetterData = PropertyInfo->GetterData
? static_cast<v8::Local<v8::Value>>(v8::External::New(Isolate, PropertyInfo->GetterData))
: v8::Local<v8::Value>();

auto SetterData = PropertyInfo->SetterData
? static_cast<v8::Local<v8::Value>>(v8::External::New(Isolate, PropertyInfo->SetterData))
: v8::Local<v8::Value>();

Template->SetAccessorProperty(FV8Utils::InternalString(Isolate, PropertyInfo->Name),
PropertyInfo->Getter ? v8::FunctionTemplate::New(Isolate, PropertyInfo->Getter, Data)
PropertyInfo->Getter ? v8::FunctionTemplate::New(Isolate, PropertyInfo->Getter, GetterData)
: v8::Local<v8::FunctionTemplate>(),
PropertyInfo->Setter ? v8::FunctionTemplate::New(Isolate, PropertyInfo->Setter, Data)
PropertyInfo->Setter ? v8::FunctionTemplate::New(Isolate, PropertyInfo->Setter, SetterData)
: v8::Local<v8::FunctionTemplate>(),
PropertyAttribute);
++PropertyInfo;
Expand Down
2 changes: 2 additions & 0 deletions unreal/Puerts/Source/JsEnv/Private/V8InspectorImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
* which is part of this source code package.
*/

// TODO: 静态库11.8 window调试崩溃

#if defined(UE_GAME) || defined(UE_EDITOR) || defined(UE_SERVER) || defined(USING_IN_UNREAL_ENGINE)
#define USING_UE 1
#else
Expand Down
3 changes: 2 additions & 1 deletion unreal/Puerts/Source/JsEnv/Public/JSClassRegister.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ struct JSENV_API JSPropertyInfo
const char* Name;
v8::FunctionCallback Getter;
v8::FunctionCallback Setter;
void* Data = nullptr;
void* GetterData = nullptr;
void* SetterData = nullptr;
};

typedef void (*FinalizeFunc)(void* Ptr);
Expand Down
4 changes: 2 additions & 2 deletions unreal/Puerts/Source/JsEnv/Public/PesapiBackend.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -181,13 +181,13 @@ struct API
for (const auto& prop : Cdb.properties_)
{
pesapi_set_property_info(properties, pos++, prop.Name, false, reinterpret_cast<FunctionCallbackType>(prop.Getter),
reinterpret_cast<FunctionCallbackType>(prop.Setter), nullptr, nullptr);
reinterpret_cast<FunctionCallbackType>(prop.Setter), nullptr, nullptr, nullptr);
}

for (const auto& prop : Cdb.variables_)
{
pesapi_set_property_info(properties, pos++, prop.Name, true, reinterpret_cast<FunctionCallbackType>(prop.Getter),
reinterpret_cast<FunctionCallbackType>(prop.Setter), nullptr, nullptr);
reinterpret_cast<FunctionCallbackType>(prop.Setter), nullptr, nullptr, nullptr);
}

pesapi_finalize finalize = Finalize;
Expand Down
4 changes: 2 additions & 2 deletions unreal/Puerts/Source/JsEnv/Public/V8Backend.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -187,11 +187,11 @@ struct API
ClassDef.Methods = s_methods_.data();

s_properties_ = std::move(Cdb.properties_);
s_properties_.push_back(JSPropertyInfo{nullptr, nullptr, nullptr, nullptr});
s_properties_.push_back(JSPropertyInfo{nullptr, nullptr, nullptr, nullptr, nullptr});
ClassDef.Properties = s_properties_.data();

s_variables_ = std::move(Cdb.variables_);
s_variables_.push_back(JSPropertyInfo{nullptr, nullptr, nullptr, nullptr});
s_variables_.push_back(JSPropertyInfo{nullptr, nullptr, nullptr, nullptr, nullptr});
ClassDef.Variables = s_variables_.data();

s_constructorInfos_ = std::move(Cdb.constructorInfos_);
Expand Down
5 changes: 3 additions & 2 deletions unreal/Puerts/Source/JsEnv/Public/pesapi.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

// Portable Embedded Scripting API

#define PESAPI_VERSION 10
#define PESAPI_VERSION 11

#define PESAPI_EXTERN

Expand Down Expand Up @@ -141,6 +141,7 @@ 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 pesapi_value pesapi_create_object(pesapi_env env);

PESAPI_EXTERN bool pesapi_get_value_bool(pesapi_env env, pesapi_value value);
PESAPI_EXTERN int32_t pesapi_get_value_int32(pesapi_env env, pesapi_value value);
Expand Down Expand Up @@ -230,7 +231,7 @@ PESAPI_EXTERN void pesapi_set_method_info(pesapi_property_descriptor properties,
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_callback getter, pesapi_callback setter, void* getter_userdata, void* setter_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,
Expand Down

0 comments on commit e2e21ee

Please sign in to comment.