Skip to content

Commit

Permalink
Merge pull request #72056 from resistor/master
Browse files Browse the repository at this point in the history
[GDScript] Perform update-and-assign operations in place when possible.
  • Loading branch information
YuriSizov authored Mar 20, 2023
2 parents 215893e + 22a0c20 commit a008a06
Showing 1 changed file with 11 additions and 1 deletion.
12 changes: 11 additions & 1 deletion modules/gdscript/gdscript_compiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1165,8 +1165,18 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
bool has_operation = assignment->operation != GDScriptParser::AssignmentNode::OP_NONE;
if (has_operation) {
// Perform operation.
GDScriptCodeGenerator::Address op_result = codegen.add_temporary(_gdtype_from_datatype(assignment->get_datatype(), codegen.script));
GDScriptCodeGenerator::Address og_value = _parse_expression(codegen, r_error, assignment->assignee);

if (!has_setter && !assignment->use_conversion_assign) {
// If there's nothing special about the assignment, perform the assignment as part of the operator
gen->write_binary_operator(target, assignment->variant_op, og_value, assigned_value);
if (assigned_value.mode == GDScriptCodeGenerator::Address::TEMPORARY) {
gen->pop_temporary(); // Pop assigned value if not done before.
}
return GDScriptCodeGenerator::Address();
}

GDScriptCodeGenerator::Address op_result = codegen.add_temporary(_gdtype_from_datatype(assignment->get_datatype(), codegen.script));
gen->write_binary_operator(op_result, assignment->variant_op, og_value, assigned_value);
to_assign = op_result;

Expand Down

0 comments on commit a008a06

Please sign in to comment.