Skip to content

Commit aa55912

Browse files
authored
Add create_*_global to function that creates new REManagedObject (#1504)
1 parent 6a38ef8 commit aa55912

File tree

1 file changed

+90
-24
lines changed

1 file changed

+90
-24
lines changed

src/mods/bindings/Sdk.cpp

Lines changed: 90 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -758,7 +758,24 @@ sol::object create_resource(sol::this_state s, std::string type_name, std::strin
758758
return sol::make_object(s, resource_manager->create_resource(t, utility::widen(name)));
759759
}
760760

761-
sol::object create_userdata(sol::this_state s, std::string type_name, std::string name) {
761+
sol::object create_global_object(sol::this_state &s, ::REManagedObject *obj) {
762+
bool is_currently_local = static_cast<std::int32_t>(obj->referenceCount) <= 0;
763+
764+
// Mark object as global so that lua knows
765+
if (is_currently_local) {
766+
utility::re_managed_object::add_ref(obj);
767+
}
768+
769+
auto obj_safe = sol::make_object(s, obj);
770+
771+
if (is_currently_local) {
772+
utility::re_managed_object::release(obj);
773+
}
774+
775+
return obj_safe;
776+
}
777+
778+
sol::object create_userdata_impl(sol::this_state s, std::string type_name, std::string name, bool global) {
762779
auto& types = reframework::get_types();
763780

764781
// NOT a type definition!!
@@ -776,10 +793,24 @@ sol::object create_userdata(sol::this_state s, std::string type_name, std::strin
776793
return sol::make_object(s, sol::nil);
777794
}
778795

779-
return sol::make_object(s, (::REManagedObject*)obj.get());
796+
auto re_obj = (::REManagedObject*)obj.get();
797+
798+
if (global) {
799+
return create_global_object(s, re_obj);
800+
} else {
801+
return sol::make_object(s, re_obj);
802+
}
780803
}
781804

782-
sol::object create_instance(sol::this_state s, const char* name, sol::object simplify_obj) {
805+
sol::object create_userdata(sol::this_state s, std::string type_name, std::string name) {
806+
return create_userdata_impl(s, type_name, name, false);
807+
}
808+
809+
sol::object create_userdata_global(sol::this_state s, std::string type_name, std::string name) {
810+
return create_userdata_impl(s, type_name, name, true);
811+
}
812+
813+
sol::object create_instance_impl(sol::this_state s, const char* name, sol::object simplify_obj, bool global) {
783814
bool simplify = false;
784815

785816
if (simplify_obj.is<bool>()) {
@@ -796,7 +827,53 @@ sol::object create_instance(sol::this_state s, const char* name, sol::object sim
796827
return sol::make_object(s, sol::nil);
797828
}
798829

799-
return sol::make_object(s, type_definition->create_instance_full(simplify));
830+
auto instance_full = type_definition->create_instance_full(simplify);
831+
832+
if (global) {
833+
return create_global_object(s, instance_full);
834+
} else {
835+
return sol::make_object(s, instance_full);
836+
}
837+
}
838+
839+
sol::object create_instance(sol::this_state s, const char* name, sol::object simplify_obj) {
840+
return create_instance_impl(s, name, simplify_obj, false);
841+
}
842+
843+
sol::object create_instance_global(sol::this_state s, const char* name, sol::object simplify_obj) {
844+
return create_instance_impl(s, name, simplify_obj, true);
845+
}
846+
847+
sol::object create_holder_impl(sol::this_state s, ::sdk::Resource* res, const char* tn, bool global) {
848+
if (tn == nullptr) {
849+
return sol::make_object(s, sol::nil);
850+
}
851+
852+
const auto t = sdk::find_type_definition(tn);
853+
854+
if (t == nullptr) {
855+
return sol::make_object(s, sol::nil);
856+
}
857+
858+
auto holder = res->create_holder(t);
859+
860+
if (holder == nullptr) {
861+
return sol::make_object(s, sol::nil);
862+
}
863+
864+
if (global) {
865+
return create_global_object(s, holder);
866+
} else {
867+
return sol::make_object(s, holder);
868+
}
869+
}
870+
871+
sol::object create_holder(sol::this_state s, ::sdk::Resource* res, const char* tn) {
872+
return create_holder_impl(s, res, tn, false);
873+
}
874+
875+
sol::object create_holder_global(sol::this_state s, ::sdk::Resource* res, const char* tn) {
876+
return create_holder_impl(s, res, tn, true);
800877
}
801878

802879
bool copy_to_clipboard(sol::this_state s, const char* text) {
@@ -1474,7 +1551,7 @@ T read_memory(::REManagedObject* obj, int32_t offset) {
14741551

14751552
return *(T*)((uintptr_t)obj + offset);
14761553
}
1477-
}
1554+
}
14781555

14791556
void bindings::open_sdk(ScriptState* s) {
14801557
auto& lua = s->lua();
@@ -1508,7 +1585,9 @@ void bindings::open_sdk(ScriptState* s) {
15081585
sdk["create_double"] = api::sdk::create_double;
15091586
sdk["create_resource"] = api::sdk::create_resource;
15101587
sdk["create_userdata"] = api::sdk::create_userdata;
1588+
sdk["create_userdata_global"] = api::sdk::create_userdata_global;
15111589
sdk["create_instance"] = api::sdk::create_instance;
1590+
sdk["create_instance_global"] = api::sdk::create_instance_global;
15121591
sdk["find_type_definition"] = api::sdk::find_type_definition;
15131592
sdk["typeof"] = api::sdk::typeof;
15141593
sdk["call_native_func"] = api::sdk::call_native_func;
@@ -1670,6 +1749,10 @@ void bindings::open_sdk(ScriptState* s) {
16701749
return false;
16711750
},
16721751
"create_instance", &::sdk::RETypeDefinition::create_instance_full,
1752+
"create_instance_gc_safe", [](sol::this_state s, ::sdk::RETypeDefinition* type_def_obj) {
1753+
auto obj = type_def_obj->create_instance_full();
1754+
return api::sdk::create_global_object(s, obj);
1755+
},
16731756
"get_types_inheriting_from_this", &::sdk::RETypeDefinition::get_types_inherting_from_this
16741757
);
16751758

@@ -1991,25 +2074,8 @@ void bindings::open_sdk(ScriptState* s) {
19912074
"release", [](::sdk::Resource* res) {
19922075
res->release();
19932076
},
1994-
"create_holder", [](sol::this_state s, ::sdk::Resource* res, const char* tn) {
1995-
if (tn == nullptr) {
1996-
return sol::make_object(s, sol::nil);
1997-
}
1998-
1999-
const auto t = sdk::find_type_definition(tn);
2000-
2001-
if (t == nullptr) {
2002-
return sol::make_object(s, sol::nil);
2003-
}
2004-
2005-
auto holder = res->create_holder(t);
2006-
2007-
if (holder == nullptr) {
2008-
return sol::make_object(s, sol::nil);
2009-
}
2010-
2011-
return sol::make_object(s, (::REManagedObject*)holder);
2012-
},
2077+
"create_holder", &::api::sdk::create_holder,
2078+
"create_holder_global", &::api::sdk::create_holder_global,
20132079
"get_address", [](::sdk::Resource* res) { return (uintptr_t)res; }
20142080
);
20152081

0 commit comments

Comments
 (0)