diff options
-rw-r--r-- | modules/nativescript/nativescript.cpp | 45 | ||||
-rw-r--r-- | modules/nativescript/nativescript.h | 3 |
2 files changed, 45 insertions, 3 deletions
diff --git a/modules/nativescript/nativescript.cpp b/modules/nativescript/nativescript.cpp index 271f5bde1c..cb38768f32 100644 --- a/modules/nativescript/nativescript.cpp +++ b/modules/nativescript/nativescript.cpp @@ -203,7 +203,15 @@ ScriptInstance *NativeScript::instance_create(Object *p_this) { nsi->userdata = script_data->create_func.create_func((godot_object *)p_this, script_data->create_func.method_data); #endif +#ifndef NO_THREADS + owners_lock->lock(); +#endif + instance_owners.insert(p_this); + +#ifndef NO_THREADS + owners_lock->unlock(); +#endif return nsi; } @@ -393,9 +401,6 @@ Variant NativeScript::_new(const Variant **p_args, int p_argcount, Variant::Call ref = REF(r); } - // GDScript does it like this: _create_instance(p_args, p_argcount, owner, r != NULL, r_error); - // TODO(karroffel): support varargs for constructors. - NativeScriptInstance *instance = (NativeScriptInstance *)instance_create(owner); owner->set_script_instance(instance); @@ -407,6 +412,24 @@ Variant NativeScript::_new(const Variant **p_args, int p_argcount, Variant::Call return Variant(); } + call("_init", p_args, p_argcount, r_error); + + if (r_error.error != Variant::CallError::CALL_OK) { + instance->script = Ref<NativeScript>(); + instance->owner->set_script_instance(NULL); + +#ifndef NO_THREADS + owners_lock->lock(); +#endif + instance_owners.erase(owner); + +#ifndef NO_THREADS + owners_lock->unlock(); +#endif + + ERR_FAIL_COND_V(r_error.error != Variant::CallError::CALL_OK, Variant()); + } + if (ref.is_valid()) { return ref; } else { @@ -419,11 +442,18 @@ NativeScript::NativeScript() { library = Ref<GDNative>(); lib_path = ""; class_name = ""; +#ifndef NO_THREADS + owners_lock = Mutex::create(); +#endif } // TODO(karroffel): implement this NativeScript::~NativeScript() { NSL->unregister_script(this); + +#ifndef NO_THREADS + memdelete(owners_lock); +#endif } ////// ScriptInstance stuff @@ -754,7 +784,16 @@ NativeScriptInstance::~NativeScriptInstance() { script_data->destroy_func.destroy_func((godot_object *)owner, script_data->destroy_func.method_data, userdata); if (owner) { + +#ifndef NO_THREADS + script->owners_lock->lock(); +#endif + script->instance_owners.erase(owner); + +#ifndef NO_THREADS + script->owners_lock->lock(); +#endif } } diff --git a/modules/nativescript/nativescript.h b/modules/nativescript/nativescript.h index 05e2d361d3..95b4954171 100644 --- a/modules/nativescript/nativescript.h +++ b/modules/nativescript/nativescript.h @@ -106,6 +106,9 @@ class NativeScript : public Script { String class_name; +#ifndef NO_THREADS + Mutex *owners_lock; +#endif Set<Object *> instance_owners; protected: |