diff options
author | Thomas Herzog <thomas.herzog@mail.com> | 2017-07-27 13:03:10 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-27 13:03:10 +0200 |
commit | 3c53b3560fe1ae6b476cf6941ca0d7c79e0093a7 (patch) | |
tree | 87dc648f137a9d0d47766b281427766f621ad48f /modules/nativescript | |
parent | 411f09a512d5847fc9c6270439308d1e3093f211 (diff) | |
parent | 135c2112ad87265d35899dede34c3a7e06ec2f54 (diff) |
Merge pull request #9907 from karroffel/nativescript-init-call
NativeScript changes and OS symbol lookup optional error handling
Diffstat (limited to 'modules/nativescript')
-rw-r--r-- | modules/nativescript/nativescript.cpp | 45 | ||||
-rw-r--r-- | modules/nativescript/nativescript.h | 3 | ||||
-rw-r--r-- | modules/nativescript/register_types.cpp | 6 |
3 files changed, 49 insertions, 5 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: diff --git a/modules/nativescript/register_types.cpp b/modules/nativescript/register_types.cpp index a8a931343b..dfa16d8a2a 100644 --- a/modules/nativescript/register_types.cpp +++ b/modules/nativescript/register_types.cpp @@ -50,7 +50,8 @@ void init_call_cb(void *p_handle, godot_string *p_proc_name, void *p_data, int p Error err = OS::get_singleton()->get_dynamic_library_symbol_handle( p_handle, *(String *)p_proc_name, - library_proc); + library_proc, + true); // we print our own message if (err != OK) { ERR_PRINT((String("GDNative procedure \"" + *(String *)p_proc_name) + "\" does not exists and can't be called").utf8().get_data()); return; @@ -75,7 +76,8 @@ void thread_call_cb(void *p_handle, godot_string *p_proc_name, void *p_data, int Error err = OS::get_singleton()->get_dynamic_library_symbol_handle( p_handle, *(String *)p_proc_name, - library_proc); + library_proc, + true); if (err != OK) { // it's fine if thread callbacks are not present in the library. return; |