Merge pull request #34953 from vnen/gdscript-index-double-eval
GDScript: Don't re-evaluate index on assigment with operation
This commit is contained in:
commit
9fa8d42dd5
2 changed files with 12 additions and 10 deletions
|
@ -90,11 +90,11 @@ bool GDScriptCompiler::_create_unary_operator(CodeGen &codegen, const GDScriptPa
|
|||
return true;
|
||||
}
|
||||
|
||||
bool GDScriptCompiler::_create_binary_operator(CodeGen &codegen, const GDScriptParser::OperatorNode *on, Variant::Operator op, int p_stack_level, bool p_initializer) {
|
||||
bool GDScriptCompiler::_create_binary_operator(CodeGen &codegen, const GDScriptParser::OperatorNode *on, Variant::Operator op, int p_stack_level, bool p_initializer, int p_index_addr) {
|
||||
|
||||
ERR_FAIL_COND_V(on->arguments.size() != 2, false);
|
||||
|
||||
int src_address_a = _parse_expression(codegen, on->arguments[0], p_stack_level, false, p_initializer);
|
||||
int src_address_a = _parse_expression(codegen, on->arguments[0], p_stack_level, false, p_initializer, p_index_addr);
|
||||
if (src_address_a < 0)
|
||||
return false;
|
||||
if (src_address_a & GDScriptFunction::ADDR_TYPE_STACK << GDScriptFunction::ADDR_BITS)
|
||||
|
@ -171,7 +171,7 @@ GDScriptDataType GDScriptCompiler::_gdtype_from_datatype(const GDScriptParser::D
|
|||
return result;
|
||||
}
|
||||
|
||||
int GDScriptCompiler::_parse_assign_right_expression(CodeGen &codegen, const GDScriptParser::OperatorNode *p_expression, int p_stack_level) {
|
||||
int GDScriptCompiler::_parse_assign_right_expression(CodeGen &codegen, const GDScriptParser::OperatorNode *p_expression, int p_stack_level, int p_index_addr) {
|
||||
|
||||
Variant::Operator var_op = Variant::OP_MAX;
|
||||
|
||||
|
@ -205,7 +205,7 @@ int GDScriptCompiler::_parse_assign_right_expression(CodeGen &codegen, const GDS
|
|||
return _parse_expression(codegen, p_expression->arguments[1], p_stack_level, false, initializer);
|
||||
}
|
||||
|
||||
if (!_create_binary_operator(codegen, p_expression, var_op, p_stack_level, initializer))
|
||||
if (!_create_binary_operator(codegen, p_expression, var_op, p_stack_level, initializer, p_index_addr))
|
||||
return -1;
|
||||
|
||||
int dst_addr = (p_stack_level) | (GDScriptFunction::ADDR_TYPE_STACK << GDScriptFunction::ADDR_BITS);
|
||||
|
@ -214,7 +214,7 @@ int GDScriptCompiler::_parse_assign_right_expression(CodeGen &codegen, const GDS
|
|||
return dst_addr;
|
||||
}
|
||||
|
||||
int GDScriptCompiler::_parse_expression(CodeGen &codegen, const GDScriptParser::Node *p_expression, int p_stack_level, bool p_root, bool p_initializer) {
|
||||
int GDScriptCompiler::_parse_expression(CodeGen &codegen, const GDScriptParser::Node *p_expression, int p_stack_level, bool p_root, bool p_initializer, int p_index_addr) {
|
||||
|
||||
switch (p_expression->type) {
|
||||
//should parse variable declaration and adjust stack accordingly...
|
||||
|
@ -704,7 +704,9 @@ int GDScriptCompiler::_parse_expression(CodeGen &codegen, const GDScriptParser::
|
|||
return from;
|
||||
|
||||
int index;
|
||||
if (named) {
|
||||
if (p_index_addr != 0) {
|
||||
index = p_index_addr;
|
||||
} else if (named) {
|
||||
if (on->arguments[0]->type == GDScriptParser::Node::TYPE_SELF && codegen.script && codegen.function_node && !codegen.function_node->_static) {
|
||||
|
||||
GDScriptParser::IdentifierNode *identifier = static_cast<GDScriptParser::IdentifierNode *>(on->arguments[1]);
|
||||
|
@ -1091,7 +1093,7 @@ int GDScriptCompiler::_parse_expression(CodeGen &codegen, const GDScriptParser::
|
|||
codegen.alloc_stack(slevel);
|
||||
}
|
||||
|
||||
int set_value = _parse_assign_right_expression(codegen, on, slevel + 1);
|
||||
int set_value = _parse_assign_right_expression(codegen, on, slevel + 1, named ? 0 : set_index);
|
||||
if (set_value < 0) //error
|
||||
return set_value;
|
||||
|
||||
|
|
|
@ -140,12 +140,12 @@ class GDScriptCompiler {
|
|||
void _set_error(const String &p_error, const GDScriptParser::Node *p_node);
|
||||
|
||||
bool _create_unary_operator(CodeGen &codegen, const GDScriptParser::OperatorNode *on, Variant::Operator op, int p_stack_level);
|
||||
bool _create_binary_operator(CodeGen &codegen, const GDScriptParser::OperatorNode *on, Variant::Operator op, int p_stack_level, bool p_initializer = false);
|
||||
bool _create_binary_operator(CodeGen &codegen, const GDScriptParser::OperatorNode *on, Variant::Operator op, int p_stack_level, bool p_initializer = false, int p_index_addr = 0);
|
||||
|
||||
GDScriptDataType _gdtype_from_datatype(const GDScriptParser::DataType &p_datatype) const;
|
||||
|
||||
int _parse_assign_right_expression(CodeGen &codegen, const GDScriptParser::OperatorNode *p_expression, int p_stack_level);
|
||||
int _parse_expression(CodeGen &codegen, const GDScriptParser::Node *p_expression, int p_stack_level, bool p_root = false, bool p_initializer = false);
|
||||
int _parse_assign_right_expression(CodeGen &codegen, const GDScriptParser::OperatorNode *p_expression, int p_stack_level, int p_index_addr = 0);
|
||||
int _parse_expression(CodeGen &codegen, const GDScriptParser::Node *p_expression, int p_stack_level, bool p_root = false, bool p_initializer = false, int p_index_addr = 0);
|
||||
Error _parse_block(CodeGen &codegen, const GDScriptParser::BlockNode *p_block, int p_stack_level = 0, int p_break_addr = -1, int p_continue_addr = -1);
|
||||
Error _parse_function(GDScript *p_script, const GDScriptParser::ClassNode *p_class, const GDScriptParser::FunctionNode *p_func, bool p_for_ready = false);
|
||||
Error _parse_class_level(GDScript *p_script, const GDScriptParser::ClassNode *p_class, bool p_keep_state);
|
||||
|
|
Loading…
Reference in a new issue