summaryrefslogtreecommitdiff
path: root/modules/nativescript
diff options
context:
space:
mode:
authorThomas Herzog <thomas.herzog@mail.com>2017-07-27 13:03:10 +0200
committerGitHub <noreply@github.com>2017-07-27 13:03:10 +0200
commit3c53b3560fe1ae6b476cf6941ca0d7c79e0093a7 (patch)
tree87dc648f137a9d0d47766b281427766f621ad48f /modules/nativescript
parent411f09a512d5847fc9c6270439308d1e3093f211 (diff)
parent135c2112ad87265d35899dede34c3a7e06ec2f54 (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.cpp45
-rw-r--r--modules/nativescript/nativescript.h3
-rw-r--r--modules/nativescript/register_types.cpp6
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;