public virtual void visit(ISimpleArrayIndexingNode value) { }
private void AddrOfArrayIndexing(ISimpleArrayIndexingNode value) { bool temp_is_addr = is_addr; bool temp_is_dot_expr = is_dot_expr; is_addr = false; is_dot_expr = false; var indices = value.indices; TypeInfo ti = helper.GetTypeReference(value.array.type); value.array.visit(this); il.Emit(OpCodes.Dup); FixPointer(); //посещаем индекс //value.index.visit(this); ISimpleArrayNode arr_type = value.array.type as ISimpleArrayNode; TypeInfo elem_ti = null; Type elem_type = null; if (arr_type != null) { elem_ti = helper.GetTypeReference(arr_type.element_type); elem_type = elem_ti.tp; } else elem_type = ti.tp.GetElementType(); MethodInfo get_meth = null; MethodInfo addr_meth = null; if (indices == null) { value.index.visit(this); } else { if (value.array.type is ICompiledTypeNode) { addr_meth = ti.tp.GetMethod("Address"); } else { List<Type> lst = new List<Type>(); for (int i = 0; i < indices.Length; i++) lst.Add(TypeFactory.Int32Type); addr_meth = mb.GetArrayMethod(ti.tp, "Address", CallingConventions.HasThis, elem_type.MakeByRefType(), lst.ToArray()); } for (int i = 0; i < indices.Length; i++) indices[i].visit(this); } if (value.indices == null) il.Emit(OpCodes.Ldelema, elem_type); else il.Emit(OpCodes.Call, addr_meth); is_addr = temp_is_addr; is_dot_expr = temp_is_dot_expr; }
public void visit(ISimpleArrayIndexingNode value) { string s = value.GetType().Name + "."; //prepare_node(value.array, s + "array"); //prepare_node(value.index, s + "index"); //prepare_node(value.type, s + "type"); }
public void visit(ISimpleArrayIndexingNode value) { value.index.visit(this); value.array.visit(this); ISemanticNodeConverter.SourceTextBuilder.AddNodeInToStack(ISemanticNodeConverter.ConvertPABCNETNodeSimpleArrInd("array_indexing", value)); }