Browse Source

GDScript default argument override bug fix

Fix: #41766
Thakee Nathees 5 years ago
parent
commit
d42b305377

+ 12 - 6
modules/gdscript/gdscript_byte_codegen.cpp

@@ -40,10 +40,6 @@ uint32_t GDScriptByteCodeGenerator::add_parameter(const StringName &p_name, bool
 	function->_argument_count++;
 	function->argument_types.push_back(p_type);
 	if (p_is_optional) {
-		if (function->_default_arg_count == 0) {
-			append(GDScriptFunction::OPCODE_JUMP_TO_DEF_ARGUMENT);
-		}
-		function->default_arguments.push_back(opcodes.size());
 		function->_default_arg_count++;
 	}
 
@@ -85,7 +81,12 @@ void GDScriptByteCodeGenerator::pop_temporary() {
 	current_temporaries--;
 }
 
-void GDScriptByteCodeGenerator::start_parameters() {}
+void GDScriptByteCodeGenerator::start_parameters() {
+	if (function->_default_arg_count > 0) {
+		append(GDScriptFunction::OPCODE_JUMP_TO_DEF_ARGUMENT);
+		function->default_arguments.push_back(opcodes.size());
+	}
+}
 
 void GDScriptByteCodeGenerator::end_parameters() {
 	function->default_arguments.invert();
@@ -151,7 +152,7 @@ GDScriptFunction *GDScriptByteCodeGenerator::write_end() {
 	}
 
 	if (function->default_arguments.size()) {
-		function->_default_arg_count = function->default_arguments.size();
+		function->_default_arg_count = function->default_arguments.size() - 1;
 		function->_default_arg_ptr = &function->default_arguments[0];
 	} else {
 		function->_default_arg_count = 0;
@@ -398,6 +399,11 @@ void GDScriptByteCodeGenerator::write_assign_false(const Address &p_target) {
 	append(p_target);
 }
 
+void GDScriptByteCodeGenerator::write_assign_default_parameter(const Address &p_dst, const Address &p_src) {
+	write_assign(p_dst, p_src);
+	function->default_arguments.push_back(opcodes.size());
+}
+
 void GDScriptByteCodeGenerator::write_cast(const Address &p_target, const Address &p_source, const GDScriptDataType &p_type) {
 	switch (p_type.kind) {
 		case GDScriptDataType::BUILTIN: {

+ 1 - 0
modules/gdscript/gdscript_byte_codegen.h

@@ -239,6 +239,7 @@ public:
 	virtual void write_assign(const Address &p_target, const Address &p_source) override;
 	virtual void write_assign_true(const Address &p_target) override;
 	virtual void write_assign_false(const Address &p_target) override;
+	virtual void write_assign_default_parameter(const Address &p_dst, const Address &p_src) override;
 	virtual void write_cast(const Address &p_target, const Address &p_source, const GDScriptDataType &p_type) override;
 	virtual void write_call(const Address &p_target, const Address &p_base, const StringName &p_function_name, const Vector<Address> &p_arguments) override;
 	virtual void write_super_call(const Address &p_target, const StringName &p_function_name, const Vector<Address> &p_arguments) override;

+ 1 - 0
modules/gdscript/gdscript_codegen.h

@@ -121,6 +121,7 @@ public:
 	virtual void write_assign(const Address &p_target, const Address &p_source) = 0;
 	virtual void write_assign_true(const Address &p_target) = 0;
 	virtual void write_assign_false(const Address &p_target) = 0;
+	virtual void write_assign_default_parameter(const Address &dst, const Address &src) = 0;
 	virtual void write_cast(const Address &p_target, const Address &p_source, const GDScriptDataType &p_type) = 0;
 	virtual void write_call(const Address &p_target, const Address &p_base, const StringName &p_function_name, const Vector<Address> &p_arguments) = 0;
 	virtual void write_super_call(const Address &p_target, const StringName &p_function_name, const Vector<Address> &p_arguments) = 0;

+ 1 - 1
modules/gdscript/gdscript_compiler.cpp

@@ -1749,7 +1749,7 @@ Error GDScriptCompiler::_parse_function(GDScript *p_script, const GDScriptParser
 					return error;
 				}
 				GDScriptCodeGenerator::Address dst_addr = codegen.parameters[parameter->identifier->name];
-				codegen.generator->write_assign(dst_addr, src_addr);
+				codegen.generator->write_assign_default_parameter(dst_addr, src_addr);
 				if (src_addr.mode == GDScriptCodeGenerator::Address::TEMPORARY) {
 					codegen.generator->pop_temporary();
 				}