public override void visit_element_access(ElementAccess expr) { if (expr.container is MemberAccess && expr.container.symbol_reference is Signal) { if (expr.parent_node is MethodCall) { // detailed signal emission var sig = (Signal)expr.symbol_reference; var ma = (MemberAccess)expr.container; var detail_expr = expr.get_indices()[0]; CCodeFunctionCall ccall; if (!sig.external_package && expr.source_reference.file == sig.source_reference.file) { var detail_cexpr = get_detail_cexpression(detail_expr, expr); ccall = new CCodeFunctionCall(new CCodeIdentifier("g_signal_emit")); ccall.add_argument(get_cvalue(ma.inner)); ccall.add_argument(get_signal_id_cexpression(sig)); if (detail_cexpr != null) { ccall.add_argument(detail_cexpr); } } else { var signal_name_cexpr = get_signal_name_cexpression(sig, detail_expr, expr); ccall = new CCodeFunctionCall(new CCodeIdentifier("g_signal_emit_by_name")); ccall.add_argument(get_cvalue(ma.inner)); if (signal_name_cexpr != null) { ccall.add_argument(signal_name_cexpr); } } set_cvalue(expr, ccall); } else { // signal connect or disconnect } } else { base.visit_element_access(expr); } }
public override void visit_element_access(ElementAccess expr) { List <Expression> indices = expr.get_indices(); int rank = indices.Count; var ccontainer = get_cvalue(expr.container); var cindex = get_cvalue(indices[0]); if (expr.container.symbol_reference is ArrayLengthField) { /* Figure if cindex is a constant expression and calculate dim...*/ var lit = indices[0] as IntegerLiteral; var memberaccess = expr.container as MemberAccess; if (lit != null && memberaccess != null) { int dim = int.Parse(lit.value); set_cvalue(expr, get_array_length_cexpression(memberaccess.inner, dim + 1)); } else { Report.error(expr.source_reference, "only integer literals supported as index"); } } else { // access to element in an array for (int i = 1; i < rank; i++) { var cmul = new CCodeBinaryExpression(CCodeBinaryOperator.MUL, cindex, get_array_length_cexpression(expr.container, i + 1)); cindex = new CCodeBinaryExpression(CCodeBinaryOperator.PLUS, cmul, get_cvalue(indices[i])); } set_cvalue(expr, new CCodeElementAccess(ccontainer, cindex)); } expr.target_value.value_type = expr.value_type.copy(); if (!expr.lvalue) { expr.target_value = store_temp_value(expr.target_value, expr); } ((GLibValue)expr.target_value).lvalue = true; }