vala r1622 - in trunk: . gobject tests
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r1622 - in trunk: . gobject tests
- Date: Sat, 21 Jun 2008 14:34:57 +0000 (UTC)
Author: juergbi
Date: Sat Jun 21 14:34:56 2008
New Revision: 1622
URL: http://svn.gnome.org/viewvc/vala?rev=1622&view=rev
Log:
2008-06-21 Jared Moore <jaredm svn gnome org>
* gobject/valaccodeclassbinding.vala:
Initialize class fields in class init function
* gobject/valaccodegenerator.vala:
* gobject/valaccodememberaccessbinding.vala:
Fix class field access, fixes bug 530039
* tests/classes-fields.exp:
* tests/classes-fields.vala
Test class field access
Modified:
trunk/ChangeLog
trunk/gobject/valaccodeclassbinding.vala
trunk/gobject/valaccodegenerator.vala
trunk/gobject/valaccodememberaccessbinding.vala
trunk/tests/classes-fields.exp
trunk/tests/classes-fields.vala
Modified: trunk/gobject/valaccodeclassbinding.vala
==============================================================================
--- trunk/gobject/valaccodeclassbinding.vala (original)
+++ trunk/gobject/valaccodeclassbinding.vala Sat Jun 21 14:34:56 2008
@@ -424,6 +424,19 @@
codegen.instance_priv_struct.add_field ("GDestroyNotify", func_name);
}
+ /* initialize class fields */
+ var fields = cl.get_fields ();
+ foreach (Field field in fields) {
+ if (field.binding != MemberBinding.CLASS || field.initializer == null) {
+ continue;
+ }
+ CCodeExpression left = new CCodeMemberAccess (new CCodeIdentifier ("klass"),
+ field.get_cname (), true);
+ CCodeExpression right = (CCodeExpression)field.initializer.ccodenode;
+ CCodeAssignment assign = new CCodeAssignment (left, right);
+ init_block.add_statement (new CCodeExpressionStatement (assign));
+ }
+
/* create properties */
var props = cl.get_properties ();
foreach (Property prop in props) {
Modified: trunk/gobject/valaccodegenerator.vala
==============================================================================
--- trunk/gobject/valaccodegenerator.vala (original)
+++ trunk/gobject/valaccodegenerator.vala Sat Jun 21 14:34:56 2008
@@ -82,6 +82,7 @@
private int next_try_id = 0;
public bool in_creation_method = false;
private bool in_constructor = false;
+ public bool in_static_or_class_ctor = false;
public bool current_method_inner_error = false;
public DataType bool_type;
@@ -949,7 +950,11 @@
current_method_inner_error = false;
in_constructor = true;
+ if (c.binding == MemberBinding.CLASS || c.binding == MemberBinding.STATIC) {
+ in_static_or_class_ctor = true;
+ }
c.accept_children (this);
+ in_static_or_class_ctor = false;
in_constructor = false;
Modified: trunk/gobject/valaccodememberaccessbinding.vala
==============================================================================
--- trunk/gobject/valaccodememberaccessbinding.vala (original)
+++ trunk/gobject/valaccodememberaccessbinding.vala Sat Jun 21 14:34:56 2008
@@ -102,7 +102,25 @@
} else if (f.binding == MemberBinding.CLASS) {
var cl = (Class) f.parent_symbol;
var cast = new CCodeFunctionCall (new CCodeIdentifier (cl.get_upper_case_cname (null) + "_CLASS"));
- cast.add_argument (new CCodeIdentifier ("klass"));
+
+ CCodeExpression klass;
+ if (expr.inner == null) {
+ if (codegen.in_static_or_class_ctor) {
+ // Accessing the field from a static or class constructor
+ klass = new CCodeIdentifier ("klass");
+ } else {
+ // Accessing the field from within an instance method
+ var k = new CCodeFunctionCall (new CCodeIdentifier ("G_OBJECT_GET_CLASS"));
+ k.add_argument (new CCodeIdentifier ("self"));
+ klass = k;
+ }
+ } else {
+ // Accessing the field of an instance
+ var k = new CCodeFunctionCall (new CCodeIdentifier ("G_OBJECT_GET_CLASS"));
+ k.add_argument ((CCodeExpression) expr.inner.ccodenode);
+ klass = k;
+ }
+ cast.add_argument (klass);
expr.ccodenode = new CCodeMemberAccess.pointer (cast, f.get_cname ());
} else {
expr.ccodenode = new CCodeIdentifier (f.get_cname ());
Modified: trunk/tests/classes-fields.exp
==============================================================================
--- trunk/tests/classes-fields.exp (original)
+++ trunk/tests/classes-fields.exp Sat Jun 21 14:34:56 2008
@@ -1 +1 @@
-Field Test: 1 2 3 4 5 6 7 8 9 10 11 12
+Field Test: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
Modified: trunk/tests/classes-fields.vala
==============================================================================
--- trunk/tests/classes-fields.vala (original)
+++ trunk/tests/classes-fields.vala Sat Jun 21 14:34:56 2008
@@ -2,6 +2,7 @@
class Maman.Foo : Object {
public int public_base_field = 2;
+ public class int public_class_field = 23;
}
class Maman.Bar : Foo {
@@ -9,19 +10,30 @@
private int private_field = 4;
private static int private_static_field = 5;
public static int public_static_field = 6;
- public class int public_class_field = 7;
- private class int private_class_field = 8;
+ private class int private_class_field;
+ public class int public_class_field;
+
+ class construct {
+ private_class_field = 7;
+ }
+ static construct {
+ public_class_field = 8;
+ }
void do_action () {
- stdout.printf (" %d %d %d %d %d", public_base_field, public_field,
- private_field, private_static_field, public_static_field);
- public_base_field = 7;
- public_field = 8;
- private_field = 9;
- private_static_field = 10;
- public_static_field = 11;
- stdout.printf (" %d %d %d %d %d", public_base_field, public_field,
- private_field, private_static_field, public_static_field);
+ stdout.printf (" %d %d %d %d %d %d %d", public_base_field, public_field,
+ private_field, private_static_field, public_static_field,
+ private_class_field, public_class_field);
+ public_base_field = 9;
+ public_field = 10;
+ private_field = 11;
+ private_static_field = 12;
+ public_static_field = 13;
+ private_class_field = 14;
+ public_class_field = 15;
+ stdout.printf (" %d %d %d %d %d %d %d", public_base_field, public_field,
+ private_field, private_static_field, public_static_field,
+ private_class_field, public_class_field);
}
static int main (string[] args) {
@@ -29,8 +41,21 @@
var bar = new Bar ();
bar.do_action ();
-
- stdout.printf (" 12\n");
+
+ bar.public_base_field = 16;
+ bar.public_field = 17;
+ bar.private_field = 18;
+ bar.private_static_field = 19;
+ bar.public_static_field = 20;
+ bar.private_class_field = 21;
+ ((Foo)bar).public_class_field = 22;
+ stdout.printf (" %d %d %d %d %d %d %d", bar.public_base_field, bar.public_field,
+ bar.private_field, bar.private_static_field, bar.public_static_field,
+ bar.private_class_field, ((Foo)bar).public_class_field);
+
+ var foo = new Foo ();
+ stdout.printf (" %d", foo.public_class_field);
+ stdout.printf (" 24\n");
return 0;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]