All pastes #910222 Raw Edit

Stuff

public c v1 · immutable
·published 2008-02-19 20:36 UTC
rendered paste body
diff --git a/gobject/valaccodegenerator.vala b/gobject/valaccodegenerator.valaindex 3eb4339..b5ec59d 100644--- a/gobject/valaccodegenerator.vala+++ b/gobject/valaccodegenerator.vala@@ -273,9 +273,89 @@ public class Vala.CCodeGenerator : CodeGenerator {                if (en.source_reference.comment != null) {                        header_type_definition.append (new CCodeComment (en.source_reference.comment));                }+               // FIXME: should be privat-izable?                header_type_definition.append (cenum); +               CCodeFragment decl_frag;+               CCodeFragment def_frag = source_type_member_definition;+               if (en.access != SymbolAccessibility.PRIVATE) {+                       decl_frag = header_type_definition;+               } else {+                       decl_frag = source_type_member_declaration;+               }++               decl_frag.append (new CCodeNewline ());++               var macro = "(%s_get_type ())".printf (en.get_lower_case_cname (null));+               decl_frag.append (new CCodeMacroReplacement (en.get_upper_case_cname ("TYPE_"), macro));+                en.accept_children (this);++               var clist = new CCodeInitializerList (); /* or during visit time? */+               CCodeInitializerList clist_ev = null;+               foreach (EnumValue ev in en.get_values ()) {+                       clist_ev = new CCodeInitializerList ();+                       clist_ev.append (new CCodeConstant (ev.get_cname ()));+                       clist_ev.append (new CCodeIdentifier ("\"%s\"".printf (ev.get_cname ())));+                       clist_ev.append (ev.get_canonical_cconstant ());+                       clist.append (clist_ev);+               }++               clist_ev = new CCodeInitializerList ();+               clist_ev.append (new CCodeConstant ("0"));+               clist_ev.append (new CCodeConstant ("NULL"));+               clist_ev.append (new CCodeConstant ("NULL"));+               clist.append (clist_ev);++               var enum_decl = new CCodeVariableDeclarator.with_initializer ("_%s[]".printf (en.get_cname ()), clist);++               CCodeDeclaration cdecl = null;+               if (en.is_flags) {+                       cdecl = new CCodeDeclaration ("const GFlagsValue");+               } else {+                       cdecl = new CCodeDeclaration ("const GEnumValue");+               }++               cdecl.add_declarator (enum_decl);+               cdecl.modifiers = CCodeModifiers.STATIC;++               def_frag.append (cdecl);++               var fun_name = "%s_get_type".printf (en.get_lower_case_cname (null));+               var regfun = new CCodeFunction (fun_name, "GType");+               var regblock = new CCodeBlock ();++               cdecl = new CCodeDeclaration ("GType");+               string type_id_name = "%s_type_id".printf (en.get_lower_case_cname (null));+               cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (type_id_name, new CCodeConstant ("0")));+               cdecl.modifiers = CCodeModifiers.STATIC;+               regblock.add_statement (cdecl);++               var type_init = new CCodeBlock ();++               CCodeFunctionCall reg_call;+               if (en.is_flags) {+                       reg_call = new CCodeFunctionCall (new CCodeIdentifier ("g_flags_register_static"));+               } else {+                       reg_call = new CCodeFunctionCall (new CCodeIdentifier ("g_enum_register_static"));+               }++               reg_call.add_argument (new CCodeConstant ("\"%s\"".printf (en.get_cname())));+               reg_call.add_argument (new CCodeIdentifier ("_%s".printf (en.get_cname ())));++               type_init.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier (type_id_name), reg_call)));++               var cond = new CCodeFunctionCall (new CCodeIdentifier ("G_UNLIKELY"));+               cond.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, new CCodeIdentifier (type_id_name), new CCodeConstant ("0")));+               var cif = new CCodeIfStatement (cond, type_init);+               regblock.add_statement (cif);++               regblock.add_statement (new CCodeReturnStatement (new CCodeConstant (type_id_name)));++               decl_frag.append (regfun.copy ());+               regfun.block = regblock;+               def_frag.append (regfun);+        }         public override void visit_enum_value (EnumValue! ev) {diff --git a/gobject/valaccodegeneratorinterface.vala b/gobject/valaccodegeneratorinterface.valaindex 89d33db..e358e47 100644--- a/gobject/valaccodegeneratorinterface.vala+++ b/gobject/valaccodegeneratorinterface.vala@@ -104,8 +104,19 @@ public class Vala.CCodeGenerator {                } else if (prop.type_reference.data_type == string_type.data_type) {                        cspec.call = new CCodeIdentifier ("g_param_spec_string");                        cspec.add_argument (new CCodeConstant ("NULL"));-               } else if (prop.type_reference.data_type == int_type.data_type-                          || prop.type_reference.data_type is Enum) {+               } else if (prop.type_reference.data_type is Enum) {+                       if ((prop.type_reference.data_type as Enum).is_flags) {+                               cspec.call = new CCodeIdentifier ("g_param_spec_flags");+                       } else {+                               cspec.call = new CCodeIdentifier ("g_param_spec_enum");+                       }+                       cspec.add_argument (new CCodeIdentifier (prop.type_reference.data_type.get_upper_case_cname ("TYPE_")));+                       if (prop.default_expression != null) {+                               cspec.add_argument ((CCodeExpression) prop.default_expression.ccodenode);+                       } else {+                         cspec.add_argument (new CCodeConstant (prop.type_reference.data_type.get_default_value ()));+                       }+               } else if (prop.type_reference.data_type == int_type.data_type) {                        cspec.call = new CCodeIdentifier ("g_param_spec_int");                        cspec.add_argument (new CCodeConstant ("G_MININT"));                        cspec.add_argument (new CCodeConstant ("G_MAXINT"));diff --git a/vala/valaenum.vala b/vala/valaenum.valaindex d70a52b..5ca9b04 100644--- a/vala/valaenum.vala+++ b/vala/valaenum.vala@@ -38,6 +38,9 @@ public class Vala.Enum : Typesymbol {        private string cprefix;        private string lower_case_cprefix;        private string lower_case_csuffix;+       private bool with_type = true;+       private bool has_type_id;+       private string type_id;         /**         * Creates a new enum.@@ -140,8 +143,8 @@ public class Vala.Enum : Typesymbol {                return "%s%s%s".printf (parent_symbol.get_lower_case_cprefix (), infix, get_lower_case_csuffix ());        } -       public override string get_upper_case_cname (string infix) {-               return get_lower_case_cname (null).up ();+       public override string get_upper_case_cname (string infix = null) {+               return get_lower_case_cname (infix).up ();        }         public override bool is_reference_type () {@@ -160,7 +163,7 @@ public class Vala.Enum : Typesymbol {         */        public string! get_cprefix () {                if (cprefix == null) {-                       cprefix = "%s_".printf (get_upper_case_cname (null));+                       cprefix = "%s_".printf (get_upper_case_cname ());                }                return cprefix;        }@@ -191,6 +194,12 @@ public class Vala.Enum : Typesymbol {                                add_cheader_filename (filename);                        }                }+               if (a.has_argument ("has_type_id")) {+                       has_type_id = a.get_bool ("has_type_id");+               }+               if (a.has_argument ("type_id")) {+                       type_id = a.get_string ("type_id");+               }        }                /**@@ -202,31 +211,76 @@ public class Vala.Enum : Typesymbol {                                process_ccode_attribute (a);                        } else if (a.name == "Flags") {                                is_flags = true;+                       } else if (a.name == "NoType") {+                               with_type = false;                        }                }        } +       private bool get_has_type_id () {+               return has_type_id || with_type;+       }+        public override string get_type_id () {-               // FIXME: use GType-registered enums-               return "G_TYPE_INT";+               if (type_id == null) {+                       if (get_has_type_id ()) {+                               type_id = get_upper_case_cname ("TYPE_");+                       } else {+                               type_id = "G_TYPE_INT";+                       }+               }++               return type_id;        }                public override string get_marshaller_type_name () {-               // FIXME: use GType-registered enums+               if (get_has_type_id ()) {+                       if (is_flags) {+                               return "FLAGS";+                       } else {+                               return "ENUM";+                       }+               } else {                return "INT";        }+       }         public override string get_get_value_function () {-               // FIXME: use GType-registered enums+               if (get_has_type_id ()) {+                       if (is_flags) {+                               return "g_value_get_flags";+                       } else {+                               return "g_value_get_enum";+                       }+               } else {                return "g_value_get_int";        }+       }                public override string get_set_value_function () {-               // FIXME: use GType-registered enums+               if (get_has_type_id ()) {+                       if (is_flags) {+                               return "g_value_set_flags";+                       } else {+                               return "g_value_set_enum";+                       }+               } else {                return "g_value_set_int";        }+       }         public override string get_default_value () {+               if (values.size > 0) {+                       return values.get (0).get_cname ();+               } else {                return "0";        }+       }++       public override bool is_subtype_of (Typesymbol! t) {+               // FIXME: have genum...+               if (this == t) {+                       return true;+               }+       } }diff --git a/vala/valaenumvalue.vala b/vala/valaenumvalue.valaindex fde0561..a83539c 100644--- a/vala/valaenumvalue.vala+++ b/vala/valaenumvalue.vala@@ -52,6 +52,33 @@ public class Vala.EnumValue : Symbol {        public EnumValue.with_value (construct string! name, construct Expression value) {        }        +       /**+        * Returns the string literal of this signal to be used in C code.+        * (FIXME: from vlaasignal.vala)+        *+        * @return string literal to be used in C code+        */+       public CCodeConstant! get_canonical_cconstant () {+               var str = new String ("\"");++               string i = name;++               while (i.len () > 0) {+                       unichar c = i.get_char ();+                       if (c == '_') {+                               str.append_c ('-');+                       } else {+                               str.append_unichar (c.tolower ());+                       }++                       i = i.next_char ();+               }++               str.append_c ('"');++               return new CCodeConstant (str.str);+       }+        public override void accept (CodeVisitor! visitor) {                visitor.visit_enum_value (this);