vala r2284 - in trunk: . gobject vala
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r2284 - in trunk: . gobject vala
- Date: Wed, 7 Jan 2009 20:27:57 +0000 (UTC)
Author: juergbi
Date: Wed Jan 7 20:27:57 2009
New Revision: 2284
URL: http://svn.gnome.org/viewvc/vala?rev=2284&view=rev
Log:
2009-01-07 JÃrg Billeter <j bitron ch>
* vala/valaclass.vala:
* vala/valaparser.vala:
* gobject/valaccodebasemodule.vala:
* gobject/valaclassregisterfunction.vala:
* gobject/valagobjectmodule.vala:
* gobject/valainterfaceregisterfunction.vala:
* gobject/valatyperegisterfunction.vala:
Add support for static destructors, patch by Sebastian DrÃge,
fixes bug 564011
Modified:
trunk/ChangeLog
trunk/gobject/valaccodebasemodule.vala
trunk/gobject/valaclassregisterfunction.vala
trunk/gobject/valagobjectmodule.vala
trunk/gobject/valainterfaceregisterfunction.vala
trunk/gobject/valatyperegisterfunction.vala
trunk/vala/valaclass.vala
trunk/vala/valaparser.vala
Modified: trunk/gobject/valaccodebasemodule.vala
==============================================================================
--- trunk/gobject/valaccodebasemodule.vala (original)
+++ trunk/gobject/valaccodebasemodule.vala Wed Jan 7 20:27:57 2009
@@ -54,6 +54,7 @@
public CCodeFragment source_type_member_definition;
public CCodeFragment class_init_fragment;
public CCodeFragment base_init_fragment;
+ public CCodeFragment class_finalize_fragment;
public CCodeFragment base_finalize_fragment;
public CCodeFragment instance_init_fragment;
public CCodeFragment instance_finalize_fragment;
@@ -1290,6 +1291,12 @@
d.accept_children (codegen);
+ if (d.binding == MemberBinding.STATIC && !in_plugin) {
+ Report.error (d.source_reference, "static destructors are only supported for dynamic types");
+ d.error = true;
+ return;
+ }
+
CCodeFragment cfrag = new CCodeFragment ();
if (current_method_inner_error) {
Modified: trunk/gobject/valaclassregisterfunction.vala
==============================================================================
--- trunk/gobject/valaclassregisterfunction.vala (original)
+++ trunk/gobject/valaclassregisterfunction.vala Wed Jan 7 20:27:57 2009
@@ -58,6 +58,14 @@
}
}
+ public override string get_class_finalize_func_name () {
+ if (class_reference.static_destructor != null) {
+ return "%s_class_finalize".printf (class_reference.get_lower_case_cname (null));
+ } else {
+ return "NULL";
+ }
+ }
+
public override string get_base_finalize_func_name () {
if (class_reference.class_destructor != null || class_reference.has_class_private_fields) {
return "%s_base_finalize".printf (class_reference.get_lower_case_cname (null));
Modified: trunk/gobject/valagobjectmodule.vala
==============================================================================
--- trunk/gobject/valagobjectmodule.vala (original)
+++ trunk/gobject/valagobjectmodule.vala Wed Jan 7 20:27:57 2009
@@ -43,6 +43,7 @@
var old_prop_enum = prop_enum;
var old_class_init_fragment = class_init_fragment;
var old_base_init_fragment = base_init_fragment;
+ var old_class_finalize_fragment = class_finalize_fragment;
var old_base_finalize_fragment = base_finalize_fragment;
var old_instance_init_fragment = instance_init_fragment;
var old_instance_finalize_fragment = instance_finalize_fragment;
@@ -69,6 +70,7 @@
prop_enum.add_value (new CCodeEnumValue ("%s_DUMMY_PROPERTY".printf (cl.get_upper_case_cname (null))));
class_init_fragment = new CCodeFragment ();
base_init_fragment = new CCodeFragment ();
+ class_finalize_fragment = new CCodeFragment ();
base_finalize_fragment = new CCodeFragment ();
instance_init_fragment = new CCodeFragment ();
instance_finalize_fragment = new CCodeFragment ();
@@ -215,6 +217,10 @@
add_base_finalize_function (cl);
}
+ if (cl.static_destructor != null) {
+ add_class_finalize_function (cl);
+ }
+
foreach (DataType base_type in cl.get_base_types ()) {
if (base_type.data_type is Interface) {
add_interface_init_function (cl, (Interface) base_type.data_type);
@@ -349,6 +355,7 @@
prop_enum = old_prop_enum;
class_init_fragment = old_class_init_fragment;
base_init_fragment = old_base_init_fragment;
+ class_finalize_fragment = old_class_finalize_fragment;
base_finalize_fragment = old_base_finalize_fragment;
instance_init_fragment = old_instance_init_fragment;
instance_finalize_fragment = old_instance_finalize_fragment;
@@ -1200,6 +1207,25 @@
source_type_member_definition.append (instance_init);
}
+ private void add_class_finalize_function (Class cl) {
+ var function = new CCodeFunction ("%s_class_finalize".printf (cl.get_lower_case_cname (null)), "void");
+ function.modifiers = CCodeModifiers.STATIC;
+
+ function.add_parameter (new CCodeFormalParameter ("klass", cl.get_cname () + "Class *"));
+ source_type_member_declaration.append (function.copy ());
+
+ var cblock = new CCodeBlock ();
+
+ if (cl.class_destructor != null) {
+ cblock.add_statement (cl.class_destructor.ccodenode);
+ }
+
+ cblock.add_statement (class_finalize_fragment);
+
+ function.block = cblock;
+ source_type_member_definition.append (function);
+ }
+
private void add_base_finalize_function (Class cl) {
var function = new CCodeFunction ("%s_base_finalize".printf (cl.get_lower_case_cname (null)), "void");
function.modifiers = CCodeModifiers.STATIC;
Modified: trunk/gobject/valainterfaceregisterfunction.vala
==============================================================================
--- trunk/gobject/valainterfaceregisterfunction.vala (original)
+++ trunk/gobject/valainterfaceregisterfunction.vala Wed Jan 7 20:27:57 2009
@@ -48,7 +48,11 @@
public override string get_base_init_func_name () {
return "%s_base_init".printf (interface_reference.get_lower_case_cname (null));
}
-
+
+ public override string get_class_finalize_func_name () {
+ return "NULL";
+ }
+
public override string get_base_finalize_func_name () {
return "NULL";
}
Modified: trunk/gobject/valatyperegisterfunction.vala
==============================================================================
--- trunk/gobject/valatyperegisterfunction.vala (original)
+++ trunk/gobject/valatyperegisterfunction.vala Wed Jan 7 20:27:57 2009
@@ -108,7 +108,7 @@
if (get_type_declaration () is ObjectTypeSymbol) {
var ctypedecl = new CCodeDeclaration ("const GTypeInfo");
ctypedecl.modifiers = CCodeModifiers.STATIC;
- ctypedecl.add_declarator (new CCodeVariableDeclarator.with_initializer ("g_define_type_info", new CCodeConstant ("{ sizeof (%s), (GBaseInitFunc) %s, (GBaseFinalizeFunc) %s, (GClassInitFunc) %s, (GClassFinalizeFunc) NULL, NULL, %s, 0, (GInstanceInitFunc) %s, %s }".printf (get_type_struct_name (), get_base_init_func_name (), get_base_finalize_func_name (), get_class_init_func_name (), get_instance_struct_size (), get_instance_init_func_name (), type_value_table_decl_name))));
+ ctypedecl.add_declarator (new CCodeVariableDeclarator.with_initializer ("g_define_type_info", new CCodeConstant ("{ sizeof (%s), (GBaseInitFunc) %s, (GBaseFinalizeFunc) %s, (GClassInitFunc) %s, (GClassFinalizeFunc) %s, NULL, %s, 0, (GInstanceInitFunc) %s, %s }".printf (get_type_struct_name (), get_base_init_func_name (), (plugin) ? get_base_finalize_func_name () : "NULL", get_class_init_func_name (), get_class_finalize_func_name (), get_instance_struct_size (), get_instance_init_func_name (), type_value_table_decl_name))));
type_init.add_statement (ctypedecl);
if (fundamental) {
var ctypefundamentaldecl = new CCodeDeclaration ("const GTypeFundamentalInfo");
@@ -232,6 +232,15 @@
}
/**
+ * Returns the name of the class_finalize function in C code.
+ *
+ * @return C function name
+ */
+ public virtual string get_class_finalize_func_name () {
+ assert_not_reached ();
+ }
+
+ /**
* Returns the name of the base_finalize function in C code.
*
* @return C function name
Modified: trunk/vala/valaclass.vala
==============================================================================
--- trunk/vala/valaclass.vala (original)
+++ trunk/vala/valaclass.vala Wed Jan 7 20:27:57 2009
@@ -196,11 +196,16 @@
}
}
}
+
+ /**
+ * Specifies the class destructor.
+ */
+ public Destructor? static_destructor { get; set; }
/**
* Specifies the class destructor.
*/
- public Destructor class_destructor { get; set; }
+ public Destructor? class_destructor { get; set; }
/**
* Specifies whether this class denotes an error base.
@@ -474,6 +479,10 @@
destructor.accept (visitor);
}
+ if (static_destructor != null) {
+ static_destructor.accept (visitor);
+ }
+
if (class_destructor != null) {
class_destructor.accept (visitor);
}
@@ -930,6 +939,10 @@
if (destructor != null) {
destructor.check (analyzer);
}
+
+ if (static_destructor != null) {
+ static_destructor.check (analyzer);
+ }
if (class_destructor != null) {
class_destructor.check (analyzer);
Modified: trunk/vala/valaparser.vala
==============================================================================
--- trunk/vala/valaparser.vala (original)
+++ trunk/vala/valaparser.vala Wed Jan 7 20:27:57 2009
@@ -2018,7 +2018,7 @@
} else if (sym is Destructor) {
var d = (Destructor) sym;
if (d.binding == MemberBinding.STATIC) {
- Report.error (sym.source_reference, "static destructors not supported yet");
+ cl.static_destructor = (Destructor) d;
} else if (d.binding == MemberBinding.CLASS) {
cl.class_destructor = (Destructor) d;
} else {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]