]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Add get_parameter_cvalue and load_parameter
authorLuca Bruno <lucabru@src.gnome.org>
Sun, 16 Jan 2011 09:15:59 +0000 (10:15 +0100)
committerJürg Billeter <j@bitron.ch>
Wed, 19 Jan 2011 18:55:13 +0000 (19:55 +0100)
codegen/valaccodebasemodule.vala
codegen/valaccodememberaccessmodule.vala
codegen/valadbusclientmodule.vala
codegen/valadbusservermodule.vala
codegen/valagasyncmodule.vala
codegen/valagdbusclientmodule.vala
codegen/valagdbusservermodule.vala

index 23fa8e5ba99592b3f72c0203e454408874f54b42..fc7df904e7d6699aa0418dc9bdf0be1172494a16 100644 (file)
@@ -1706,11 +1706,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                current_method.coroutine = false;
                        }
 
-                       var ma = new MemberAccess.simple (param.name);
-                       ma.symbol_reference = param;
-                       ma.value_type = param_type.copy ();
-                       visit_member_access (ma);
-                       free_block.add_statement (new CCodeExpressionStatement (get_unref_expression (new CCodeMemberAccess.pointer (new CCodeIdentifier ("_data%d_".printf (block_id)), get_variable_cname (param.name)), param.variable_type, ma)));
+                       free_block.add_statement (new CCodeExpressionStatement (get_unref_expression_ (param)));
 
                        if (old_coroutine) {
                                current_method.coroutine = true;
@@ -1936,11 +1932,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        var m = (Method) b.parent_symbol;
                        foreach (Parameter param in m.get_parameters ()) {
                                if (!param.captured && !param.ellipsis && requires_destroy (param.variable_type) && param.direction == ParameterDirection.IN) {
-                                       var ma = new MemberAccess.simple (param.name);
-                                       ma.symbol_reference = param;
-                                       ma.value_type = param.variable_type.copy ();
-                                       visit_member_access (ma);
-                                       ccode.add_expression (get_unref_expression (get_variable_cexpression (param.name), param.variable_type, ma));
+                                       ccode.add_expression (get_unref_expression_ (param));
                                } else if (param.direction == ParameterDirection.OUT && !m.coroutine) {
                                        return_out_parameter (param);
                                }
@@ -2905,7 +2897,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
        }
 
        public CCodeExpression get_unref_expression (CCodeExpression cvar, DataType type, Expression? expr, bool is_macro_definition = false) {
-               if (expr != null && expr.symbol_reference is LocalVariable) {
+               if (expr != null && (expr.symbol_reference is LocalVariable || expr.symbol_reference is Parameter)) {
                        return get_unref_expression_ ((Variable) expr.symbol_reference);
                }
                var value = new GLibValue (type, cvar);
@@ -3221,11 +3213,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
        private void append_param_free (Method m) {
                foreach (Parameter param in m.get_parameters ()) {
                        if (!param.ellipsis && requires_destroy (param.variable_type) && param.direction == ParameterDirection.IN) {
-                               var ma = new MemberAccess.simple (param.name);
-                               ma.symbol_reference = param;
-                               ma.value_type = param.variable_type.copy ();
-                               visit_member_access (ma);
-                               ccode.add_expression (get_unref_expression (get_variable_cexpression (param.name), param.variable_type, ma));
+                               ccode.add_expression (get_unref_expression_ (param));
                        }
                }
        }
@@ -3265,11 +3253,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 
                if (param.variable_type.is_disposable ()){
                        ccode.add_else ();
-                       var ma = new MemberAccess (null, param.name);
-                       ma.symbol_reference = param;
-                       ma.value_type = param.variable_type.copy ();
-                       visit_member_access (ma);
-                       ccode.add_expression (get_unref_expression (get_variable_cexpression ("_" + param.name), param.variable_type, ma));
+                       ccode.add_expression (get_unref_expression_ (param));
                }
                ccode.close ();
 
index 82108e91a38b207c4b4018e33ea8c49a7bbf6303..1f7a1ff36aa664775a2335ec7318456091c58e58 100644 (file)
@@ -512,108 +512,11 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                local.active = false;
                        }
                } else if (expr.symbol_reference is Parameter) {
-                       var p = (Parameter) expr.symbol_reference;
-                       if (p.name == "this") {
-                               if (current_method != null && current_method.coroutine) {
-                                       // use closure
-                                       set_cvalue (expr, new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "self"));
-                               } else {
-                                       var st = current_type_symbol as Struct;
-                                       if (st != null && !st.is_simple_type ()) {
-                                               set_cvalue (expr, new CCodeIdentifier ("(*self)"));
-                                       } else {
-                                               set_cvalue (expr, new CCodeIdentifier ("self"));
-                                       }
-                               }
+                       var param = (Parameter) expr.symbol_reference;
+                       if (expr.lvalue) {
+                               expr.target_value = get_parameter_cvalue (param);
                        } else {
-                               string name = p.name;
-
-                               if (p.captured) {
-                                       // captured variables are stored on the heap
-                                       var block = p.parent_symbol as Block;
-                                       if (block == null) {
-                                               block = ((Method) p.parent_symbol).body;
-                                       }
-                                       set_cvalue (expr, new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_variable_cname (p.name)));
-                                       if (array_type != null) {
-                                               for (int dim = 1; dim <= array_type.rank; dim++) {
-                                                       append_array_size (expr, new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_parameter_array_length_cname (p, dim)));
-                                               }
-                                       } else if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
-                                               set_delegate_target (expr, new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_delegate_target_cname (get_variable_cname (p.name))));
-                                               set_delegate_target_destroy_notify (expr, new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_delegate_target_destroy_notify_cname (get_variable_cname (p.name))));
-                                       }
-                               } else if (current_method != null && current_method.coroutine) {
-                                       // use closure
-                                       set_cvalue (expr, get_variable_cexpression (p.name));
-                                       if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
-                                               set_delegate_target (expr, new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_cname (get_variable_cname (p.name))));
-                                               set_delegate_target_destroy_notify (expr, new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_destroy_notify_cname (get_variable_cname (p.name))));
-                                       }
-                               } else {
-                                       var type_as_struct = p.variable_type.data_type as Struct;
-
-                                       if (p.direction == ParameterDirection.OUT) {
-                                               name = "_" + name;
-                                       }
-
-                                       if (p.direction == ParameterDirection.REF
-                                           || (p.direction == ParameterDirection.IN && type_as_struct != null && !type_as_struct.is_simple_type () && !p.variable_type.nullable)) {
-                                               set_cvalue (expr, new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier (get_variable_cname (name))));
-                                       } else {
-                                               // Property setters of non simple structs shall replace all occurences
-                                               // of the "value" formal parameter with a dereferencing version of that
-                                               // parameter.
-                                               if (current_property_accessor != null &&
-                                                   current_property_accessor.writable &&
-                                                   current_property_accessor.value_parameter == p &&
-                                                   current_property_accessor.prop.property_type.is_real_struct_type () &&
-                                                   !current_property_accessor.prop.property_type.nullable) {
-                                                       set_cvalue (expr, new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("value")));
-                                               } else {
-                                                       set_cvalue (expr, get_variable_cexpression (name));
-                                               }
-                                       }
-                                       if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
-                                               CCodeExpression target_expr = new CCodeIdentifier (get_delegate_target_cname (get_variable_cname (name)));
-                                               CCodeExpression delegate_target_destroy_notify = new CCodeIdentifier (get_delegate_target_destroy_notify_cname (get_variable_cname (name)));
-                                               if (p.direction == ParameterDirection.REF) {
-                                                       // accessing argument of ref param
-                                                       target_expr = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, target_expr);
-                                                       delegate_target_destroy_notify = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, delegate_target_destroy_notify);
-                                               }
-                                               set_delegate_target (expr, target_expr);
-                                               if (expr.value_type.value_owned) {
-                                                       set_delegate_target_destroy_notify (expr, delegate_target_destroy_notify);
-                                               } else {
-                                                       set_delegate_target_destroy_notify (expr, new CCodeConstant ("NULL"));
-                                               }
-                                       }
-                               }
-                               if (!p.captured && array_type != null) {
-                                       if (p.array_null_terminated) {
-                                               var carray_expr = get_variable_cexpression (name);
-                                               requires_array_length = true;
-                                               var len_call = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_length"));
-                                               len_call.add_argument (carray_expr);
-                                               append_array_size (expr, len_call);
-                                       } else if (!p.no_array_length) {
-                                               for (int dim = 1; dim <= array_type.rank; dim++) {
-                                                       CCodeExpression length_expr = get_variable_cexpression (get_parameter_array_length_cname (p, dim));
-                                                       if (p.direction == ParameterDirection.OUT) {
-                                                               length_expr = get_variable_cexpression (get_array_length_cname (get_variable_cname (name), dim));
-                                                       } else if (p.direction == ParameterDirection.REF) {
-                                                               // accessing argument of ref param
-                                                               length_expr = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, length_expr);
-                                                       }
-                                                       append_array_size (expr, length_expr);
-                                               }
-                                       } else {
-                                               for (int dim = 1; dim <= array_type.rank; dim++) {
-                                                       append_array_size (expr, new CCodeConstant ("-1"));
-                                               }
-                                       }
-                               }
+                               expr.target_value = load_parameter (param);
                        }
                }
        }
@@ -672,6 +575,110 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                return result;
        }
 
+       /* Returns access values to the given parameter */
+       public TargetValue get_parameter_cvalue (Parameter param) {
+               var result = new GLibValue (param.variable_type.copy ());
+               if (param.captured || current_method != null && current_method.coroutine) {
+                       result.value_type.value_owned = true;
+               }
+
+               var array_type = result.value_type as ArrayType;
+               var delegate_type = result.value_type as DelegateType;
+
+               if (param.name == "this") {
+                       if (current_method != null && current_method.coroutine) {
+                               // use closure
+                               result.cvalue = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "self");
+                       } else {
+                               var st = current_type_symbol as Struct;
+                               if (st != null && !st.is_simple_type ()) {
+                                       result.cvalue = new CCodeIdentifier ("(*self)");
+                               } else {
+                                       result.cvalue = new CCodeIdentifier ("self");
+                               }
+                       }
+               } else {
+                       string name = param.name;
+
+                       if (param.captured) {
+                               // captured variables are stored on the heap
+                               var block = param.parent_symbol as Block;
+                               if (block == null) {
+                                       block = ((Method) param.parent_symbol).body;
+                               }
+                               result.cvalue = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_variable_cname (param.name));
+                               if (array_type != null) {
+                                       for (int dim = 1; dim <= array_type.rank; dim++) {
+                                               result.append_array_length_cvalue (new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_parameter_array_length_cname (param, dim)));
+                                       }
+                               } else if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
+                                       result.delegate_target_cvalue = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_delegate_target_cname (get_variable_cname (param.name)));
+                                       result.delegate_target_destroy_notify_cvalue = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_delegate_target_destroy_notify_cname (get_variable_cname (param.name)));
+                               }
+                       } else if (current_method != null && current_method.coroutine) {
+                               // use closure
+                               result.cvalue = get_variable_cexpression (param.name);
+                               if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
+                                       result.delegate_target_cvalue = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_cname (get_variable_cname (param.name)));
+                                       result.delegate_target_destroy_notify_cvalue = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_destroy_notify_cname (get_variable_cname (param.name)));
+                               }
+                       } else {
+                               var type_as_struct = result.value_type.data_type as Struct;
+
+                               if (param.direction == ParameterDirection.OUT) {
+                                       name = "_" + name;
+                               }
+
+                               if (param.direction == ParameterDirection.REF ||
+                                       (param.direction == ParameterDirection.IN && type_as_struct != null && !type_as_struct.is_simple_type () && !result.value_type.nullable)) {
+                                       result.cvalue = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier (get_variable_cname (name)));
+                               } else {
+                                       // Property setters of non simple structs shall replace all occurences
+                                       // of the "value" formal parameter with a dereferencing version of that
+                                       // parameter.
+                                       if (current_property_accessor != null &&
+                                               current_property_accessor.writable &&
+                                               current_property_accessor.value_parameter == param &&
+                                               current_property_accessor.prop.property_type.is_real_struct_type () &&
+                                               !current_property_accessor.prop.property_type.nullable) {
+                                               result.cvalue = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("value"));
+                                       } else {
+                                               result.cvalue = get_variable_cexpression (name);
+                                       }
+                               }
+                               if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
+                                       CCodeExpression target_expr = new CCodeIdentifier (get_delegate_target_cname (get_variable_cname (name)));
+                                       CCodeExpression delegate_target_destroy_notify = new CCodeIdentifier (get_delegate_target_destroy_notify_cname (get_variable_cname (name)));
+                                       if (param.direction == ParameterDirection.REF) {
+                                               // accessing argument of ref param
+                                               target_expr = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, target_expr);
+                                               delegate_target_destroy_notify = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, delegate_target_destroy_notify);
+                                       }
+                                       result.delegate_target_cvalue = target_expr;
+                                       if (result.value_type.value_owned) {
+                                               result.delegate_target_destroy_notify_cvalue = delegate_target_destroy_notify;
+                                       }
+                               }
+                       }
+                       if (!param.captured && array_type != null) {
+                               if (!param.no_array_length && !param.array_null_terminated) {
+                                       for (int dim = 1; dim <= array_type.rank; dim++) {
+                                               CCodeExpression length_expr = get_variable_cexpression (get_parameter_array_length_cname (param, dim));
+                                               if (param.direction == ParameterDirection.OUT) {
+                                                       length_expr = get_variable_cexpression (get_array_length_cname (get_variable_cname (name), dim));
+                                               } else if (param.direction == ParameterDirection.REF) {
+                                                       // accessing argument of ref param
+                                                       length_expr = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, length_expr);
+                                               }
+                                               result.append_array_length_cvalue (length_expr);
+                                       }
+                               }
+                       }
+               }
+
+               return result;
+       }
+
        TargetValue load_variable (Variable variable, TargetValue value) {
                return value;
        }
@@ -680,6 +687,8 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
        public override TargetValue get_variable_cvalue (Variable variable, CCodeExpression? inner = null) {
                if (variable is LocalVariable) {
                        return get_local_cvalue ((LocalVariable) variable);
+               } else if (variable is Parameter) {
+                       return get_parameter_cvalue ((Parameter) variable);
                } else {
                        assert_not_reached ();
                }
@@ -694,4 +703,30 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                result.value_type.value_owned = false;
                return load_variable (local, result);
        }
+
+       public TargetValue load_parameter (Parameter param) {
+               var result = (GLibValue) get_parameter_cvalue (param);
+               if (result.value_type is DelegateType) {
+                       result.delegate_target_destroy_notify_cvalue = new CCodeConstant ("NULL");
+               }
+               if (result.value_type is ArrayType) {
+                       if (param.array_null_terminated) {
+                               string name = param.name;
+                               if (param.direction == ParameterDirection.OUT) {
+                                       name = "_" + name;
+                               }
+                               var carray_expr = get_variable_cexpression (name);
+                               requires_array_length = true;
+                               var len_call = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_length"));
+                               len_call.add_argument (carray_expr);
+                               result.append_array_length_cvalue (len_call);
+                       } else if (param.no_array_length) {
+                               for (int dim = 1; dim <= ((ArrayType) result.value_type).rank; dim++) {
+                                       result.append_array_length_cvalue (new CCodeConstant ("-1"));
+                               }
+                       }
+               }
+               result.value_type.value_owned = false;
+               return load_variable (param, result);
+       }
 }
index 04004df16e1fc29f6df02d5e33b728a38fa964a0..7428ac2bdf8390b3f1ba11094e9af09a15622c4c 100644 (file)
@@ -1577,11 +1577,7 @@ public class Vala.DBusClientModule : DBusModule {
                        if (requires_destroy (owned_type)) {
                                // keep local alive (symbol_reference is weak)
                                var local = new LocalVariable (owned_type, param.name);
-                               var ma = new MemberAccess.simple (param.name);
-                               ma.symbol_reference = local;
-                               ma.value_type = owned_type.copy ();
-                               visit_member_access (ma);
-                               var stmt = new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier (param.name), owned_type, ma));
+                               var stmt = new CCodeExpressionStatement (get_unref_expression_ (local));
                                postfragment.append (stmt);
                        }
                }
index c938489a18012a4fc3bb5b0529cbc1dab35c6f01..3cc1c89fe5731194594fde5294147870b4e17fb9 100644 (file)
@@ -252,11 +252,7 @@ public class Vala.DBusServerModule : DBusClientModule {
                        if (requires_destroy (owned_type)) {
                                // keep local alive (symbol_reference is weak)
                                var local = new LocalVariable (owned_type, param.name);
-                               var ma = new MemberAccess.simple (param.name);
-                               ma.symbol_reference = local;
-                               ma.value_type = owned_type.copy ();
-                               visit_member_access (ma);
-                               var stmt = new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier (param.name), owned_type, ma));
+                               var stmt = new CCodeExpressionStatement (get_unref_expression_ (local));
                                if (param.direction == ParameterDirection.IN) {
                                        in_postfragment.append (stmt);
                                } else {
index 12d6b1dad9c6b1d1efc26374eb7f038c54bbf373..0e3ae10662247640c6284ebda93eb85d3a60e30c 100644 (file)
@@ -107,11 +107,7 @@ public class Vala.GAsyncModule : GSignalModule {
                                param_type.value_owned = true;
 
                                if (requires_destroy (param_type) && !is_unowned_delegate) {
-                                       var ma = new MemberAccess.simple (param.name);
-                                       ma.symbol_reference = param;
-                                       ma.value_type = param.variable_type.copy ();
-                                       visit_member_access (ma);
-                                       freeblock.add_statement (new CCodeExpressionStatement (get_unref_expression (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_variable_cname (param.name)), param.variable_type, ma)));
+                                       freeblock.add_statement (new CCodeExpressionStatement (get_unref_expression_ (param)));
                                }
                        }
                }
index acba1fc3596897c8909bbe715868488047e01b24..314033966fd8ff94c8296290d18937020b754a5a 100644 (file)
@@ -395,11 +395,7 @@ public class Vala.GDBusClientModule : GDBusModule {
                        if (requires_destroy (owned_type)) {
                                // keep local alive (symbol_reference is weak)
                                var local = new LocalVariable (owned_type, param.name);
-                               var ma = new MemberAccess.simple (param.name);
-                               ma.symbol_reference = local;
-                               ma.value_type = local.variable_type.copy ();
-                               visit_member_access (ma);
-                               ccode.add_expression (get_unref_expression (new CCodeIdentifier (param.name), owned_type, ma));
+                               ccode.add_expression (get_unref_expression_ (local));
                        }
                }
 
index c121728b0499bd3d8fb9c20ba4dfd465c718d61a..a32100f3cb223bfb9b168befd1c9e71a01b93aaf 100644 (file)
@@ -389,11 +389,7 @@ public class Vala.GDBusServerModule : GDBusClientModule {
                                if (requires_destroy (owned_type)) {
                                        // keep local alive (symbol_reference is weak)
                                        var local = new LocalVariable (owned_type, param.name);
-                                       var ma = new MemberAccess.simple (param.name);
-                                       ma.symbol_reference = local;
-                                       ma.value_type = local.variable_type.copy ();
-                                       visit_member_access (ma);
-                                       ccode.add_expression (get_unref_expression (new CCodeIdentifier (param.name), owned_type, ma));
+                                       ccode.add_expression (get_unref_expression_ (local));
                                }
                        }
                }