|
@@ -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;
|
|
|
|