Bläddra i källkod

Make `dict2inst` to work with arbitrary `_init` parameters

This is achieved by skipping initializer call while creating an instance
of a GDScript. This is implemented by passing -1 as an argument count
to `_new` and interpreting any value below 0 to mean that the initializer
should not be called during instantiation, because internal members of
an instance are going to be overridden afterwards.
Andrii Doroshenko (Xrayez) 6 år sedan
förälder
incheckning
accdd575f6
2 ändrade filer med 5 tillägg och 4 borttagningar
  1. 4 2
      modules/gdscript/gdscript.cpp
  2. 1 2
      modules/gdscript/gdscript_functions.cpp

+ 4 - 2
modules/gdscript/gdscript.cpp

@@ -110,6 +110,9 @@ GDScriptInstance *GDScript::_create_instance(const Variant **p_args, int p_argco
 	instances.insert(instance->owner);
 	instances.insert(instance->owner);
 	GDScriptLanguage::singleton->lock.unlock();
 	GDScriptLanguage::singleton->lock.unlock();
 
 
+	if (p_argcount < 0) {
+		return instance;
+	}
 	initializer->call(instance, p_args, p_argcount, r_error);
 	initializer->call(instance, p_args, p_argcount, r_error);
 
 
 	if (r_error.error != Variant::CallError::CALL_OK) {
 	if (r_error.error != Variant::CallError::CALL_OK) {
@@ -123,9 +126,8 @@ GDScriptInstance *GDScript::_create_instance(const Variant **p_args, int p_argco
 		GDScriptLanguage::singleton->lock.unlock();
 		GDScriptLanguage::singleton->lock.unlock();
 #endif
 #endif
 
 
-		ERR_FAIL_COND_V(r_error.error != Variant::CallError::CALL_OK, nullptr); //error constructing
+		ERR_FAIL_V_MSG(nullptr, "Error constructing a GDScriptInstance.");
 	}
 	}
-
 	//@TODO make thread safe
 	//@TODO make thread safe
 	return instance;
 	return instance;
 }
 }

+ 1 - 2
modules/gdscript/gdscript_functions.cpp

@@ -1153,8 +1153,7 @@ void GDScriptFunctions::call(Function p_func, const Variant **p_args, int p_arg_
 					return;
 					return;
 				}
 				}
 			}
 			}
-
-			r_ret = gdscr->_new(nullptr, 0, r_error);
+			r_ret = gdscr->_new(nullptr, -1 /*skip initializer*/, r_error);
 
 
 			if (r_error.error != Variant::CallError::CALL_OK) {
 			if (r_error.error != Variant::CallError::CALL_OK) {
 				r_ret = Variant();
 				r_ret = Variant();