示例#1
0
        CCodeExpression serialize_array_dim(ArrayType array_type, int dim, CCodeExpression array_expr, CCodeExpression array_iter_expr)
        {
            string builder_name = "_tmp%d_".printf(next_temp_var_id++);
            string index_name   = "_tmp%d_".printf(next_temp_var_id++);

            ccode.add_declaration("GVariantBuilder", new CCodeVariableDeclarator(builder_name));
            ccode.add_declaration("int", new CCodeVariableDeclarator(index_name));

            var gvariant_type = new CCodeFunctionCall(new CCodeIdentifier("G_VARIANT_TYPE"));

            gvariant_type.add_argument(new CCodeConstant("\"%s\"".printf(get_type_signature(array_type))));

            var builder_init = new CCodeFunctionCall(new CCodeIdentifier("g_variant_builder_init"));

            builder_init.add_argument(new CCodeUnaryExpression(CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier(builder_name)));
            builder_init.add_argument(gvariant_type);
            ccode.add_expression(builder_init);

            var cforinit = new CCodeAssignment(new CCodeIdentifier(index_name), new CCodeConstant("0"));
            var cforcond = new CCodeBinaryExpression(CCodeBinaryOperator.LESS_THAN, new CCodeIdentifier(index_name), get_array_length(array_expr, dim));
            var cforiter = new CCodeUnaryExpression(CCodeUnaryOperator.POSTFIX_INCREMENT, new CCodeIdentifier(index_name));

            ccode.open_for(cforinit, cforcond, cforiter);

            CCodeExpression element_variant;

            if (dim < array_type.rank)
            {
                element_variant = serialize_array_dim(array_type, dim + 1, array_expr, array_iter_expr);
            }
            else
            {
                var element_expr = new CCodeUnaryExpression(CCodeUnaryOperator.POINTER_INDIRECTION, array_iter_expr);
                element_variant = serialize_expression(array_type.element_type, element_expr);
            }

            var builder_add = new CCodeFunctionCall(new CCodeIdentifier("g_variant_builder_add_value"));

            builder_add.add_argument(new CCodeUnaryExpression(CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier(builder_name)));
            builder_add.add_argument(element_variant);
            ccode.add_expression(builder_add);

            if (dim == array_type.rank)
            {
                var array_iter_incr = new CCodeUnaryExpression(CCodeUnaryOperator.POSTFIX_INCREMENT, array_iter_expr);
                ccode.add_expression(array_iter_incr);
            }

            ccode.close();

            var builder_end = new CCodeFunctionCall(new CCodeIdentifier("g_variant_builder_end"));

            builder_end.add_argument(new CCodeUnaryExpression(CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier(builder_name)));
            return(builder_end);
        }
		TargetValue emit_simple_assignment(Assignment assignment) {
			Variable variable = (Variable)assignment.left.symbol_reference;

			if (requires_destroy(assignment.left.value_type)) {
				/* unref old value */
				ccode.add_expression(destroy_value(assignment.left.target_value));
			}

			if (assignment.Operator == AssignmentOperator.SIMPLE) {
				store_value(assignment.left.target_value, assignment.right.target_value, assignment.source_reference);
			} else {
				CCodeAssignmentOperator cop = (CCodeAssignmentOperator)0;
				if (assignment.Operator == AssignmentOperator.BITWISE_OR) {
					cop = CCodeAssignmentOperator.BITWISE_OR;
				} else if (assignment.Operator == AssignmentOperator.BITWISE_AND) {
					cop = CCodeAssignmentOperator.BITWISE_AND;
				} else if (assignment.Operator == AssignmentOperator.BITWISE_XOR) {
					cop = CCodeAssignmentOperator.BITWISE_XOR;
				} else if (assignment.Operator == AssignmentOperator.ADD) {
					cop = CCodeAssignmentOperator.ADD;
				} else if (assignment.Operator == AssignmentOperator.SUB) {
					cop = CCodeAssignmentOperator.SUB;
				} else if (assignment.Operator == AssignmentOperator.MUL) {
					cop = CCodeAssignmentOperator.MUL;
				} else if (assignment.Operator == AssignmentOperator.DIV) {
					cop = CCodeAssignmentOperator.DIV;
				} else if (assignment.Operator == AssignmentOperator.PERCENT) {
					cop = CCodeAssignmentOperator.PERCENT;
				} else if (assignment.Operator == AssignmentOperator.SHIFT_LEFT) {
					cop = CCodeAssignmentOperator.SHIFT_LEFT;
				} else if (assignment.Operator == AssignmentOperator.SHIFT_RIGHT) {
					cop = CCodeAssignmentOperator.SHIFT_RIGHT;
				} else {
					assert_not_reached();
				}

				CCodeExpression codenode = new CCodeAssignment(get_cvalue(assignment.left), get_cvalue(assignment.right), cop);
				ccode.add_expression(codenode);
			}

			if (assignment.left.value_type is ArrayType && (((ArrayType)assignment.left.value_type).inline_allocated)) {
				return load_variable(variable, assignment.left.target_value);
			} else {
				return store_temp_value(assignment.left.target_value, assignment);
			}
		}
示例#3
0
        void append_struct_array_free_loop(Struct st)
        {
            var cforinit = new CCodeAssignment(new CCodeIdentifier("i"), new CCodeConstant("0"));
            var cforcond = new CCodeBinaryExpression(CCodeBinaryOperator.LESS_THAN, new CCodeIdentifier("i"), new CCodeIdentifier("array_length"));
            var cforiter = new CCodeAssignment(new CCodeIdentifier("i"), new CCodeBinaryExpression(CCodeBinaryOperator.PLUS, new CCodeIdentifier("i"), new CCodeConstant("1")));

            ccode.open_for(cforinit, cforcond, cforiter);

            var cptrarray = new CCodeIdentifier("array");
            var cea       = new CCodeElementAccess(cptrarray, new CCodeIdentifier("i"));

            var cfreecall = new CCodeFunctionCall(get_destroy_func_expression(new StructValueType(st)));

            cfreecall.add_argument(new CCodeUnaryExpression(CCodeUnaryOperator.ADDRESS_OF, cea));
            ccode.add_expression(cfreecall);

            ccode.close();
        }
示例#4
0
        void append_vala_array_free_loop()
        {
            var cforinit = new CCodeAssignment(new CCodeIdentifier("i"), new CCodeConstant("0"));
            var cforcond = new CCodeBinaryExpression(CCodeBinaryOperator.LESS_THAN, new CCodeIdentifier("i"), new CCodeIdentifier("array_length"));
            var cforiter = new CCodeAssignment(new CCodeIdentifier("i"), new CCodeBinaryExpression(CCodeBinaryOperator.PLUS, new CCodeIdentifier("i"), new CCodeConstant("1")));

            ccode.open_for(cforinit, cforcond, cforiter);

            var cptrarray = new CCodeCastExpression(new CCodeIdentifier("array"), "gpointer*");
            var cea       = new CCodeElementAccess(cptrarray, new CCodeIdentifier("i"));

            var cfreecond = new CCodeBinaryExpression(CCodeBinaryOperator.INEQUALITY, cea, new CCodeConstant("NULL"));

            ccode.open_if(cfreecond);

            var cfreecall = new CCodeFunctionCall(new CCodeIdentifier("destroy_func"));

            cfreecall.add_argument(cea);
            ccode.add_expression(cfreecall);

            ccode.close();
        }
示例#5
0
        void visit_string_switch_statement(SwitchStatement stmt)
        {
            // we need a temporary variable to save the property value
            var temp_value = create_temp_value(stmt.expression.value_type, false, stmt);
            var ctemp      = get_cvalue_(temp_value);

            var cinit = new CCodeAssignment(ctemp, get_cvalue(stmt.expression));
            var czero = new CCodeConstant("0");

            var free_call = new CCodeFunctionCall(new CCodeIdentifier("g_free"));

            free_call.add_argument(ctemp);

            var cisnull = new CCodeBinaryExpression(CCodeBinaryOperator.EQUALITY, new CCodeConstant("NULL"), ctemp);
            var cquark  = new CCodeFunctionCall(new CCodeIdentifier("g_quark_from_string"));

            cquark.add_argument(ctemp);

            var ccond = new CCodeConditionalExpression(cisnull, new CCodeConstant("0"), cquark);

            int label_temp_id = next_temp_var_id++;

            temp_value = create_temp_value(gquark_type, true, stmt);

            int label_count = 0;

            foreach (SwitchSection section in stmt.get_sections())
            {
                if (section.has_default_label())
                {
                    continue;
                }

                foreach (SwitchLabel label in section.get_labels())
                {
                    label.expression.emit(this);
                    var cexpr = get_cvalue(label.expression);

                    if (is_constant_ccode_expression(cexpr))
                    {
                        var cname = "_tmp%d_label%d".printf(label_temp_id, label_count++);

                        ccode.add_declaration(get_ccode_name(gquark_type), new CCodeVariableDeclarator(cname, czero), CCodeModifiers.STATIC);
                    }
                }
            }

            ccode.add_expression(cinit);

            ctemp = get_cvalue_(temp_value);
            cinit = new CCodeAssignment(ctemp, ccond);

            ccode.add_expression(cinit);

            if (stmt.expression.value_type.value_owned)
            {
                // free owned string
                ccode.add_expression(free_call);
            }

            SwitchSection default_section = null;

            label_count = 0;

            int n = 0;

            foreach (SwitchSection section in stmt.get_sections())
            {
                if (section.has_default_label())
                {
                    default_section = section;
                    continue;
                }

                CCodeBinaryExpression cor = null;
                foreach (SwitchLabel label in section.get_labels())
                {
                    label.expression.emit(this);
                    var cexpr = get_cvalue(label.expression);

                    if (is_constant_ccode_expression(cexpr))
                    {
                        var cname      = new CCodeIdentifier("_tmp%d_label%d".printf(label_temp_id, label_count++));
                        var ccondition = new CCodeBinaryExpression(CCodeBinaryOperator.INEQUALITY, czero, cname);
                        var ccall      = new CCodeFunctionCall(new CCodeIdentifier("g_quark_from_static_string"));
                        cinit = new CCodeAssignment(cname, ccall);

                        ccall.add_argument(cexpr);

                        cexpr = new CCodeConditionalExpression(ccondition, cname, cinit);
                    }
                    else
                    {
                        var ccall = new CCodeFunctionCall(new CCodeIdentifier("g_quark_from_string"));
                        ccall.add_argument(cexpr);
                        cexpr = ccall;
                    }

                    var ccmp = new CCodeBinaryExpression(CCodeBinaryOperator.EQUALITY, ctemp, cexpr);

                    if (cor == null)
                    {
                        cor = ccmp;
                    }
                    else
                    {
                        cor = new CCodeBinaryExpression(CCodeBinaryOperator.OR, cor, ccmp);
                    }
                }

                if (n > 0)
                {
                    ccode.else_if(cor);
                }
                else
                {
                    ccode.open_if(cor);
                }

                ccode.open_switch(new CCodeConstant("0"));
                ccode.add_default();

                section.emit(this);

                ccode.close();

                n++;
            }

            if (default_section != null)
            {
                if (n > 0)
                {
                    ccode.add_else();
                }

                ccode.open_switch(new CCodeConstant("0"));
                ccode.add_default();

                default_section.emit(this);

                ccode.close();
            }

            if (n > 0)
            {
                ccode.close();
            }
        }