예제 #1
0
        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);
            }
        }
예제 #2
0
        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;
        }