diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 96539a336..fcdd7ae42 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -151,6 +151,7 @@ namespace PascalABCCompiler.NETGenerator private Dictionary marked_with_extension_attribute = new Dictionary(); + private LocalBuilder current_index_lb; private bool has_dereferences = false; private bool safe_block = false; private int cur_line = 0; @@ -7890,18 +7891,21 @@ namespace PascalABCCompiler.NETGenerator else elem_type = ti.tp.GetElementType(); value.array.visit(this); - if (elem_ti != null) - { - //il.Emit(OpCodes.Ldarg_0); - //il.Emit(OpCodes.Ldfld, ti.arr_fld); - } - //else MethodInfo get_meth = null; MethodInfo addr_meth = null; MethodInfo set_meth = null; + LocalBuilder index_lb = null; if (value.indices == null) { value.index.visit(this); + if (from is IBasicFunctionCallNode && (from as IBasicFunctionCallNode).real_parameters[0] == to) + { + index_lb = il.DeclareLocal(helper.GetTypeReference(value.index.type).tp); + il.Emit(OpCodes.Stloc, index_lb); + il.Emit(OpCodes.Ldloc, index_lb); + current_index_lb = index_lb; + + } } else { @@ -9055,7 +9059,13 @@ namespace PascalABCCompiler.NETGenerator elem_type = ti.tp.GetElementType(); if (indices == null) { - value.index.visit(this); + if (current_index_lb == null) + value.index.visit(this); + else + { + il.Emit(OpCodes.Ldloc, current_index_lb); + current_index_lb = null; + } if (string_getter) { Label except_lbl = il.DefineLabel(); diff --git a/TestSuite/arrays9.pas b/TestSuite/arrays9.pas new file mode 100644 index 000000000..a2b5cfeef --- /dev/null +++ b/TestSuite/arrays9.pas @@ -0,0 +1,19 @@ +var + i: integer; + +function test: integer; +begin + Result := 2; + i += 1; +end; + +begin + var a: array[1..13] of integer; + a[test] += 1; + assert(i = 1); + var a2 := Arr(0, 0, 0); + a2[test] += 1; + assert(i = 2); + a2[test] += a2[test]; + assert(i = 4); +end. \ No newline at end of file