@@ -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
802879bool 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
14791556void 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