Merge pull request #41773 from ThakeeNathees/default-argument-override-buf-fix

GDScript default argument override bug fix
This commit is contained in:
George Marques 2020-12-02 09:54:47 -03:00 committed by GitHub
commit 0019aa940e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 15 additions and 7 deletions

View File

@ -40,10 +40,6 @@ uint32_t GDScriptByteCodeGenerator::add_parameter(const StringName &p_name, bool
function->_argument_count++; function->_argument_count++;
function->argument_types.push_back(p_type); function->argument_types.push_back(p_type);
if (p_is_optional) { 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++; function->_default_arg_count++;
} }
@ -96,7 +92,12 @@ void GDScriptByteCodeGenerator::pop_temporary() {
current_temporaries--; 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() { void GDScriptByteCodeGenerator::end_parameters() {
function->default_arguments.invert(); function->default_arguments.invert();
@ -167,7 +168,7 @@ GDScriptFunction *GDScriptByteCodeGenerator::write_end() {
} }
if (function->default_arguments.size()) { 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]; function->_default_arg_ptr = &function->default_arguments[0];
} else { } else {
function->_default_arg_count = 0; function->_default_arg_count = 0;
@ -633,6 +634,11 @@ void GDScriptByteCodeGenerator::write_assign_false(const Address &p_target) {
append(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) { void GDScriptByteCodeGenerator::write_cast(const Address &p_target, const Address &p_source, const GDScriptDataType &p_type) {
int index = 0; int index = 0;

View File

@ -401,6 +401,7 @@ public:
virtual void write_assign(const Address &p_target, const Address &p_source) override; 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_true(const Address &p_target) override;
virtual void write_assign_false(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_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_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; virtual void write_super_call(const Address &p_target, const StringName &p_function_name, const Vector<Address> &p_arguments) override;

View File

@ -122,6 +122,7 @@ public:
virtual void write_assign(const Address &p_target, const Address &p_source) = 0; 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_true(const Address &p_target) = 0;
virtual void write_assign_false(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_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_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; virtual void write_super_call(const Address &p_target, const StringName &p_function_name, const Vector<Address> &p_arguments) = 0;

View File

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