]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Add CCodeDelegateModule, move more code to GErrorModule
authorJürg Billeter <j@bitron.ch>
Mon, 3 Nov 2008 21:41:39 +0000 (21:41 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Mon, 3 Nov 2008 21:41:39 +0000 (21:41 +0000)
2008-11-03  Jürg Billeter  <j@bitron.ch>

* gobject/Makefile.am:
* gobject/valaccodebasemodule.vala:
* gobject/valaccodedelegatemodule.vala:
* gobject/valaccodedynamicpropertymodule.vala:
* gobject/valaccodegenerator.vala:
* gobject/valagerrormodule.vala:

Add CCodeDelegateModule, move more code to GErrorModule

svn path=/trunk/; revision=1969

ChangeLog
gobject/Makefile.am
gobject/valaccodebasemodule.vala
gobject/valaccodedelegatemodule.vala [new file with mode: 0644]
gobject/valaccodedynamicpropertymodule.vala
gobject/valaccodegenerator.vala
gobject/valagerrormodule.vala

index 95580af9e2a568fa1778d61a3aa0ad85c83eaa15..720426eca4848652a34c1d6faa78c531e3a228d2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2008-11-03  Jürg Billeter  <j@bitron.ch>
+
+       * gobject/Makefile.am:
+       * gobject/valaccodebasemodule.vala:
+       * gobject/valaccodedelegatemodule.vala:
+       * gobject/valaccodedynamicpropertymodule.vala:
+       * gobject/valaccodegenerator.vala:
+       * gobject/valagerrormodule.vala:
+
+       Add CCodeDelegateModule, move more code to GErrorModule
+
 2008-11-03  Jürg Billeter  <j@bitron.ch>
 
        * gobject/valaccodebasemodule.vala:
index ca7f940e9e21738af01f9254a86bbb724fd87164..8e4e6d10ca4e61d3d5dcd946232ef4aeda311a44 100644 (file)
@@ -16,6 +16,7 @@ libvala_la_VALASOURCES = \
        valaccodeassignmentmodule.vala \
        valaccodebasemodule.vala \
        valaccodecompiler.vala \
+       valaccodedelegatemodule.vala \
        valaccodedynamicpropertymodule.vala \
        valaccodedynamicsignalmodule.vala \
        valaccodegenerator.vala \
index 3745c2ae3808d7a1085c2af58eae30f1967fbe59..7b4c75b1b7ade986da4bb9a6dee11229fee1abe1 100644 (file)
@@ -80,7 +80,7 @@ public class Vala.CCodeBaseModule : CCodeModule {
        public int next_temp_var_id = 0;
        private int next_array_dup_id = 0;
        public bool in_creation_method = false;
-       private bool in_constructor = false;
+       public bool in_constructor = false;
        public bool in_static_or_class_ctor = false;
        public bool current_method_inner_error = false;
        public int next_coroutine_state = 1;
@@ -710,80 +710,6 @@ public class Vala.CCodeBaseModule : CCodeModule {
                        cenum.add_value (new CCodeEnumValue (ev.get_cname (), (CCodeExpression) ev.value.ccodenode));
                }
        }
-
-       public override void visit_error_domain (ErrorDomain edomain) {
-               cenum = new CCodeEnum (edomain.get_cname ());
-
-               if (edomain.source_reference.comment != null) {
-                       header_type_definition.append (new CCodeComment (edomain.source_reference.comment));
-               }
-               header_type_definition.append (cenum);
-
-               edomain.accept_children (codegen);
-
-               string quark_fun_name = edomain.get_lower_case_cprefix () + "quark";
-
-               var error_domain_define = new CCodeMacroReplacement (edomain.get_upper_case_cname (), quark_fun_name + " ()");
-               header_type_definition.append (error_domain_define);
-
-               var cquark_fun = new CCodeFunction (quark_fun_name, gquark_type.data_type.get_cname ());
-               var cquark_block = new CCodeBlock ();
-
-               var cquark_call = new CCodeFunctionCall (new CCodeIdentifier ("g_quark_from_static_string"));
-               cquark_call.add_argument (new CCodeConstant ("\"" + edomain.get_lower_case_cname () + "-quark\""));
-
-               cquark_block.add_statement (new CCodeReturnStatement (cquark_call));
-
-               header_type_member_declaration.append (cquark_fun.copy ());
-
-               cquark_fun.block = cquark_block;
-               source_type_member_definition.append (cquark_fun);
-       }
-
-       public override void visit_error_code (ErrorCode ecode) {
-               if (ecode.value == null) {
-                       cenum.add_value (new CCodeEnumValue (ecode.get_cname ()));
-               } else {
-                       ecode.value.accept (codegen);
-                       cenum.add_value (new CCodeEnumValue (ecode.get_cname (), (CCodeExpression) ecode.value.ccodenode));
-               }
-       }
-
-       public override void visit_delegate (Delegate d) {
-               d.accept_children (codegen);
-
-               var cfundecl = new CCodeFunctionDeclarator (d.get_cname ());
-               foreach (FormalParameter param in d.get_parameters ()) {
-                       cfundecl.add_parameter ((CCodeFormalParameter) param.ccodenode);
-
-                       // handle array parameters
-                       if (!param.no_array_length && param.parameter_type is ArrayType) {
-                               var array_type = (ArrayType) param.parameter_type;
-                               
-                               var length_ctype = "int";
-                               if (param.direction != ParameterDirection.IN) {
-                                       length_ctype = "int*";
-                               }
-                               
-                               for (int dim = 1; dim <= array_type.rank; dim++) {
-                                       var cparam = new CCodeFormalParameter (head.get_array_length_cname (param.name, dim), length_ctype);
-                                       cfundecl.add_parameter (cparam);
-                               }
-                       }
-               }
-               if (d.has_target) {
-                       var cparam = new CCodeFormalParameter ("user_data", "void*");
-                       cfundecl.add_parameter (cparam);
-               }
-
-               var ctypedef = new CCodeTypeDefinition (d.return_type.get_cname (), cfundecl);
-
-               if (!d.is_internal_symbol ()) {
-                       header_type_declaration.append (ctypedef);
-               } else {
-                       source_type_declaration.append (ctypedef);
-               }
-       }
        
        public override void visit_member (Member m) {
                /* stuff meant for all lockable members */
@@ -2973,104 +2899,16 @@ public class Vala.CCodeBaseModule : CCodeModule {
                expr.ccodenode = new CCodeParenthesizedExpression ((CCodeExpression) expr.inner.ccodenode);
        }
 
-       public string get_delegate_target_cname (string delegate_cname) {
-               return "%s_target".printf (delegate_cname);
+       public virtual string get_delegate_target_cname (string delegate_cname) {
+               assert_not_reached ();
        }
 
-       public CCodeExpression get_delegate_target_cexpression (Expression delegate_expr) {
-               bool is_out = false;
-       
-               if (delegate_expr is UnaryExpression) {
-                       var unary_expr = (UnaryExpression) delegate_expr;
-                       if (unary_expr.operator == UnaryOperator.OUT || unary_expr.operator == UnaryOperator.REF) {
-                               delegate_expr = unary_expr.inner;
-                               is_out = true;
-                       }
-               }
-               
-               if (delegate_expr is InvocationExpression) {
-                       var invocation_expr = (InvocationExpression) delegate_expr;
-                       return invocation_expr.delegate_target;
-               } else if (delegate_expr is LambdaExpression) {
-                       if ((current_method != null && current_method.binding == MemberBinding.INSTANCE) || in_constructor) {
-                               return new CCodeIdentifier ("self");
-                       } else {
-                               return new CCodeConstant ("NULL");
-                       }
-               } else if (delegate_expr.symbol_reference != null) {
-                       if (delegate_expr.symbol_reference is FormalParameter) {
-                               var param = (FormalParameter) delegate_expr.symbol_reference;
-                               CCodeExpression target_expr = new CCodeIdentifier (get_delegate_target_cname (param.name));
-                               if (param.direction != ParameterDirection.IN) {
-                                       // accessing argument of out/ref param
-                                       target_expr = new CCodeParenthesizedExpression (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, target_expr));
-                               }
-                               if (is_out) {
-                                       // passing array as out/ref
-                                       return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, target_expr);
-                               } else {
-                                       return target_expr;
-                               }
-                       } else if (delegate_expr.symbol_reference is LocalVariable) {
-                               var local = (LocalVariable) delegate_expr.symbol_reference;
-                               var target_expr = new CCodeIdentifier (get_delegate_target_cname (local.name));
-                               if (is_out) {
-                                       return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, target_expr);
-                               } else {
-                                       return target_expr;
-                               }
-                       } else if (delegate_expr.symbol_reference is Field) {
-                               var field = (Field) delegate_expr.symbol_reference;
-                               var target_cname = get_delegate_target_cname (field.name);
-
-                               var ma = (MemberAccess) delegate_expr;
-
-                               var base_type = ma.inner.value_type;
-                               CCodeExpression target_expr = null;
-
-                               var pub_inst = (CCodeExpression) get_ccodenode (ma.inner);
-
-                               if (field.binding == MemberBinding.INSTANCE) {
-                                       var instance_expression_type = base_type;
-                                       var instance_target_type = get_data_type_for_symbol ((TypeSymbol) field.parent_symbol);
-                                       CCodeExpression typed_inst = transform_expression (pub_inst, instance_expression_type, instance_target_type);
-
-                                       CCodeExpression inst;
-                                       if (field.access == SymbolAccessibility.PRIVATE) {
-                                               inst = new CCodeMemberAccess.pointer (typed_inst, "priv");
-                                       } else {
-                                               inst = typed_inst;
-                                       }
-                                       if (((TypeSymbol) field.parent_symbol).is_reference_type ()) {
-                                               target_expr = new CCodeMemberAccess.pointer (inst, target_cname);
-                                       } else {
-                                               target_expr = new CCodeMemberAccess (inst, target_cname);
-                                       }
-                               } else {
-                                       target_expr = new CCodeIdentifier (target_cname);
-                               }
-
-                               if (is_out) {
-                                       return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, target_expr);
-                               } else {
-                                       return target_expr;
-                               }
-                       } else if (delegate_expr.symbol_reference is Method) {
-                               var m = (Method) delegate_expr.symbol_reference;
-                               var ma = (MemberAccess) delegate_expr;
-                               if (m.binding == MemberBinding.STATIC) {
-                                       return new CCodeConstant ("NULL");
-                               } else {
-                                       return (CCodeExpression) get_ccodenode (ma.inner);
-                               }
-                       }
-               }
-
-               return new CCodeConstant ("NULL");
+       public virtual CCodeExpression get_delegate_target_cexpression (Expression delegate_expr) {
+               assert_not_reached ();
        }
 
-       public string get_delegate_target_destroy_notify_cname (string delegate_cname) {
-               return "%s_target_destroy_notify".printf (delegate_cname);
+       public virtual string get_delegate_target_destroy_notify_cname (string delegate_cname) {
+               assert_not_reached ();
        }
 
        public override void visit_base_access (BaseAccess expr) {
diff --git a/gobject/valaccodedelegatemodule.vala b/gobject/valaccodedelegatemodule.vala
new file mode 100644 (file)
index 0000000..ffd0c54
--- /dev/null
@@ -0,0 +1,169 @@
+/* valaccodedelegatemodule.vala
+ *
+ * Copyright (C) 2006-2008  Jürg Billeter, Raffaele Sandrini
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+ *
+ * Author:
+ *     Jürg Billeter <j@bitron.ch>
+ *     Raffaele Sandrini <raffaele@sandrini.ch>
+ */
+
+using GLib;
+
+/**
+ * The link between an assignment and generated code.
+ */
+public class Vala.CCodeDelegateModule : CCodeArrayModule {
+       public CCodeDelegateModule (CCodeGenerator codegen, CCodeModule? next) {
+               base (codegen, next);
+       }
+
+       public override void visit_delegate (Delegate d) {
+               d.accept_children (codegen);
+
+               var cfundecl = new CCodeFunctionDeclarator (d.get_cname ());
+               foreach (FormalParameter param in d.get_parameters ()) {
+                       cfundecl.add_parameter ((CCodeFormalParameter) param.ccodenode);
+
+                       // handle array parameters
+                       if (!param.no_array_length && param.parameter_type is ArrayType) {
+                               var array_type = (ArrayType) param.parameter_type;
+                               
+                               var length_ctype = "int";
+                               if (param.direction != ParameterDirection.IN) {
+                                       length_ctype = "int*";
+                               }
+                               
+                               for (int dim = 1; dim <= array_type.rank; dim++) {
+                                       var cparam = new CCodeFormalParameter (head.get_array_length_cname (param.name, dim), length_ctype);
+                                       cfundecl.add_parameter (cparam);
+                               }
+                       }
+               }
+               if (d.has_target) {
+                       var cparam = new CCodeFormalParameter ("user_data", "void*");
+                       cfundecl.add_parameter (cparam);
+               }
+
+               var ctypedef = new CCodeTypeDefinition (d.return_type.get_cname (), cfundecl);
+
+               if (!d.is_internal_symbol ()) {
+                       header_type_declaration.append (ctypedef);
+               } else {
+                       source_type_declaration.append (ctypedef);
+               }
+       }
+
+       public override string get_delegate_target_cname (string delegate_cname) {
+               return "%s_target".printf (delegate_cname);
+       }
+
+       public override CCodeExpression get_delegate_target_cexpression (Expression delegate_expr) {
+               bool is_out = false;
+       
+               if (delegate_expr is UnaryExpression) {
+                       var unary_expr = (UnaryExpression) delegate_expr;
+                       if (unary_expr.operator == UnaryOperator.OUT || unary_expr.operator == UnaryOperator.REF) {
+                               delegate_expr = unary_expr.inner;
+                               is_out = true;
+                       }
+               }
+               
+               if (delegate_expr is InvocationExpression) {
+                       var invocation_expr = (InvocationExpression) delegate_expr;
+                       return invocation_expr.delegate_target;
+               } else if (delegate_expr is LambdaExpression) {
+                       if ((current_method != null && current_method.binding == MemberBinding.INSTANCE) || in_constructor) {
+                               return new CCodeIdentifier ("self");
+                       } else {
+                               return new CCodeConstant ("NULL");
+                       }
+               } else if (delegate_expr.symbol_reference != null) {
+                       if (delegate_expr.symbol_reference is FormalParameter) {
+                               var param = (FormalParameter) delegate_expr.symbol_reference;
+                               CCodeExpression target_expr = new CCodeIdentifier (get_delegate_target_cname (param.name));
+                               if (param.direction != ParameterDirection.IN) {
+                                       // accessing argument of out/ref param
+                                       target_expr = new CCodeParenthesizedExpression (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, target_expr));
+                               }
+                               if (is_out) {
+                                       // passing array as out/ref
+                                       return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, target_expr);
+                               } else {
+                                       return target_expr;
+                               }
+                       } else if (delegate_expr.symbol_reference is LocalVariable) {
+                               var local = (LocalVariable) delegate_expr.symbol_reference;
+                               var target_expr = new CCodeIdentifier (get_delegate_target_cname (local.name));
+                               if (is_out) {
+                                       return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, target_expr);
+                               } else {
+                                       return target_expr;
+                               }
+                       } else if (delegate_expr.symbol_reference is Field) {
+                               var field = (Field) delegate_expr.symbol_reference;
+                               var target_cname = get_delegate_target_cname (field.name);
+
+                               var ma = (MemberAccess) delegate_expr;
+
+                               var base_type = ma.inner.value_type;
+                               CCodeExpression target_expr = null;
+
+                               var pub_inst = (CCodeExpression) get_ccodenode (ma.inner);
+
+                               if (field.binding == MemberBinding.INSTANCE) {
+                                       var instance_expression_type = base_type;
+                                       var instance_target_type = get_data_type_for_symbol ((TypeSymbol) field.parent_symbol);
+                                       CCodeExpression typed_inst = transform_expression (pub_inst, instance_expression_type, instance_target_type);
+
+                                       CCodeExpression inst;
+                                       if (field.access == SymbolAccessibility.PRIVATE) {
+                                               inst = new CCodeMemberAccess.pointer (typed_inst, "priv");
+                                       } else {
+                                               inst = typed_inst;
+                                       }
+                                       if (((TypeSymbol) field.parent_symbol).is_reference_type ()) {
+                                               target_expr = new CCodeMemberAccess.pointer (inst, target_cname);
+                                       } else {
+                                               target_expr = new CCodeMemberAccess (inst, target_cname);
+                                       }
+                               } else {
+                                       target_expr = new CCodeIdentifier (target_cname);
+                               }
+
+                               if (is_out) {
+                                       return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, target_expr);
+                               } else {
+                                       return target_expr;
+                               }
+                       } else if (delegate_expr.symbol_reference is Method) {
+                               var m = (Method) delegate_expr.symbol_reference;
+                               var ma = (MemberAccess) delegate_expr;
+                               if (m.binding == MemberBinding.STATIC) {
+                                       return new CCodeConstant ("NULL");
+                               } else {
+                                       return (CCodeExpression) get_ccodenode (ma.inner);
+                               }
+                       }
+               }
+
+               return new CCodeConstant ("NULL");
+       }
+
+       public override string get_delegate_target_destroy_notify_cname (string delegate_cname) {
+               return "%s_target_destroy_notify".printf (delegate_cname);
+       }
+}
index 00c814930226ec642e19a4421af224eb3da8669f..cad5f3d2788502e83575bfd03c01caf24d50fcd5 100644 (file)
@@ -26,7 +26,7 @@ using Gee;
 /**
  * The link between a dynamic property and generated code.
  */
-public class Vala.CCodeDynamicPropertyModule : CCodeArrayModule {
+public class Vala.CCodeDynamicPropertyModule : CCodeDelegateModule {
        int dynamic_property_id;
 
        public CCodeDynamicPropertyModule (CCodeGenerator codegen, CCodeModule? next) {
index c75b2c8a2ba52f644e909f8eda7d5f717cbd354e..eca06bd1c4b38f444e884d4582d487c867512554 100644 (file)
@@ -39,6 +39,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
                head = new CCodeAssignmentModule (this, head);
                head = new CCodeInvocationExpressionModule (this, head);
                head = new CCodeArrayModule (this, head);
+               head = new CCodeDelegateModule (this, head);
                head = new CCodeDynamicPropertyModule (this, head);
                head = new CCodeDynamicSignalModule (this, head);
                head = new GErrorModule (this, head);
index 77fe51a69413f4c55f9e4f9c785d78322d7885bb..d7956d44e87b53c7e02a470517bf0b956892c8ee 100644 (file)
@@ -31,6 +31,44 @@ public class Vala.GErrorModule : CCodeDynamicSignalModule {
                base (codegen, next);
        }
 
+       public override void visit_error_domain (ErrorDomain edomain) {
+               cenum = new CCodeEnum (edomain.get_cname ());
+
+               if (edomain.source_reference.comment != null) {
+                       header_type_definition.append (new CCodeComment (edomain.source_reference.comment));
+               }
+               header_type_definition.append (cenum);
+
+               edomain.accept_children (codegen);
+
+               string quark_fun_name = edomain.get_lower_case_cprefix () + "quark";
+
+               var error_domain_define = new CCodeMacroReplacement (edomain.get_upper_case_cname (), quark_fun_name + " ()");
+               header_type_definition.append (error_domain_define);
+
+               var cquark_fun = new CCodeFunction (quark_fun_name, gquark_type.data_type.get_cname ());
+               var cquark_block = new CCodeBlock ();
+
+               var cquark_call = new CCodeFunctionCall (new CCodeIdentifier ("g_quark_from_static_string"));
+               cquark_call.add_argument (new CCodeConstant ("\"" + edomain.get_lower_case_cname () + "-quark\""));
+
+               cquark_block.add_statement (new CCodeReturnStatement (cquark_call));
+
+               header_type_member_declaration.append (cquark_fun.copy ());
+
+               cquark_fun.block = cquark_block;
+               source_type_member_definition.append (cquark_fun);
+       }
+
+       public override void visit_error_code (ErrorCode ecode) {
+               if (ecode.value == null) {
+                       cenum.add_value (new CCodeEnumValue (ecode.get_cname ()));
+               } else {
+                       ecode.value.accept (codegen);
+                       cenum.add_value (new CCodeEnumValue (ecode.get_cname (), (CCodeExpression) ecode.value.ccodenode));
+               }
+       }
+
        public override void visit_throw_statement (ThrowStatement stmt) {
                stmt.accept_children (codegen);