]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Add CodeGenerator.store_local
authorJürg Billeter <j@bitron.ch>
Thu, 21 Oct 2010 11:51:41 +0000 (13:51 +0200)
committerJürg Billeter <j@bitron.ch>
Thu, 28 Oct 2010 09:47:07 +0000 (11:47 +0200)
codegen/valaccodeassignmentmodule.vala
codegen/valaccodememberaccessmodule.vala
codegen/valadovaassignmentmodule.vala
codegen/valadovamemberaccessmodule.vala
vala/valacodegenerator.vala

index f6168006fc42eb85a9551f9af429690a05932442..c3604190d45ad379704983451949578567fe356d 100644 (file)
@@ -234,4 +234,45 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
                        }
                }
        }
+
+       void store_variable (Variable variable, TargetValue lvalue, TargetValue value) {
+               if (requires_destroy (variable.variable_type)) {
+                       /* unref old value */
+                       ccode.add_expression (destroy_value (lvalue));
+               }
+
+               ccode.add_expression (new CCodeAssignment (get_cvalue_ (lvalue), get_cvalue_ (value)));
+
+               var array_type = variable.variable_type as ArrayType;
+               if (array_type != null) {
+                       for (int dim = 1; dim <= array_type.rank; dim++) {
+                               if (get_array_length_cvalue (lvalue, dim) != null) {
+                                       ccode.add_expression (new CCodeAssignment (get_array_length_cvalue (lvalue, dim), get_array_length_cvalue (value, dim)));
+                               }
+                       }
+                       if (array_type.rank == 1) {
+                               if (get_array_size_cvalue (lvalue) != null) {
+                                       if (get_array_size_cvalue (value) != null) {
+                                               ccode.add_expression (new CCodeAssignment (get_array_size_cvalue (lvalue), get_array_size_cvalue (value)));
+                                       } else {
+                                               ccode.add_expression (new CCodeAssignment (get_array_size_cvalue (lvalue), get_array_length_cvalue (value, 1)));
+                                       }
+                               }
+                       }
+               }
+
+               var delegate_type = variable.variable_type as DelegateType;
+               if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
+                       if (get_delegate_target_cvalue (lvalue) != null) {
+                               ccode.add_expression (new CCodeAssignment (get_delegate_target_cvalue (lvalue), get_delegate_target_cvalue (value)));
+                               if (get_delegate_target_destroy_notify_cvalue (lvalue) != null) {
+                                       ccode.add_expression (new CCodeAssignment (get_delegate_target_destroy_notify_cvalue (lvalue), get_delegate_target_destroy_notify_cvalue (value)));
+                               }
+                       }
+               }
+       }
+
+       public override void store_local (LocalVariable local, TargetValue value) {
+               store_variable (local, get_local_cvalue (local), value);
+       }
 }
index b2fd33260cd13b3078b0367a53f365ad1c3dd2e1..36e80e838d7fd1edc77376329ab25c11162e00ee 100644 (file)
@@ -22,7 +22,7 @@
  *     Raffaele Sandrini <raffaele@sandrini.ch>
  */
 
-public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
+public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
        public override void visit_member_access (MemberAccess expr) {
                CCodeExpression pub_inst = null;
        
index f39894c1a8f50c711a905c5f834ad2ebaf4ba1db..69a62412cd5a1cd765dd4386ae583a625ff6c079 100644 (file)
@@ -183,4 +183,17 @@ public class Vala.DovaAssignmentModule : DovaMemberAccessModule {
                        }
                }
        }
+
+       void store_variable (Variable variable, TargetValue lvalue, TargetValue value) {
+               if (requires_destroy (variable.variable_type)) {
+                       /* unref old value */
+                       ccode.add_expression (destroy_value (lvalue));
+               }
+
+               ccode.add_expression (new CCodeAssignment (get_cvalue_ (lvalue), get_cvalue_ (value)));
+       }
+
+       public override void store_local (LocalVariable local, TargetValue value) {
+               store_variable (local, get_local_cvalue (local), value);
+       }
 }
index 758990b5f1e8a3eb6b291e061a63c68dd48a2492..71f03d9fbc5a2cd1e063a3189c33e565496e23b4 100644 (file)
@@ -22,7 +22,7 @@
 
 using GLib;
 
-public class Vala.DovaMemberAccessModule : DovaControlFlowModule {
+public abstract class Vala.DovaMemberAccessModule : DovaControlFlowModule {
        public override void visit_member_access (MemberAccess expr) {
                CCodeExpression pub_inst = null;
                DataType base_type = null;
index b1b8f92cdf54fe5a7b484e112df1bc25834a3a56..9c33fcd08e408a134409f9a11f2420fdb3157d95 100644 (file)
@@ -35,4 +35,6 @@ public abstract class Vala.CodeGenerator : CodeVisitor {
        public abstract LocalVariable create_local (DataType type);
 
        public abstract TargetValue load_local (LocalVariable local);
+
+       public abstract void store_local (LocalVariable local, TargetValue value);
 }