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); } }
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(); }
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(); }
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(); } }