From fcb4bd760d20e3a478dbe975bd4b81535bcb8a10 Mon Sep 17 00:00:00 2001 From: Juerg Billeter Date: Sat, 8 Mar 2008 16:55:29 +0000 Subject: [PATCH] optimize access to automatic properties, patch by Rob Taylor 2008-03-08 Juerg Billeter * vala/valaclass.vala, vala/valaproperty.vala, vala/valapropertyaccessor.vala, vala/valasemanticanalyzer.vala, gobject/valaccodegeneratormemberaccess.vala: optimize access to automatic properties, patch by Rob Taylor svn path=/trunk/; revision=1110 --- ChangeLog | 7 +++++++ gobject/valaccodegeneratormemberaccess.vala | 8 +++++++- vala/valaclass.vala | 1 + vala/valaproperty.vala | 5 +++++ vala/valapropertyaccessor.vala | 5 +++++ vala/valasemanticanalyzer.vala | 2 +- 6 files changed, 26 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index b5115b4..7b271d3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2008-03-08 Jürg Billeter + * vala/valaclass.vala, vala/valaproperty.vala, + vala/valapropertyaccessor.vala, vala/valasemanticanalyzer.vala, + gobject/valaccodegeneratormemberaccess.vala: optimize access to + automatic properties, patch by Rob Taylor + +2008-03-08 Jürg Billeter + * gobject/valaccodegenerator.vala: support foreach over multi-dimensional arrays diff --git a/gobject/valaccodegeneratormemberaccess.vala b/gobject/valaccodegeneratormemberaccess.vala index 89e0ed2..4c1a709 100644 --- a/gobject/valaccodegeneratormemberaccess.vala +++ b/gobject/valaccodegeneratormemberaccess.vala @@ -105,7 +105,13 @@ public class Vala.CCodeGenerator { } else if (expr.symbol_reference is Property) { var prop = (Property) expr.symbol_reference; - if (!prop.no_accessor_method) { + if (prop.get_accessor != null && + prop.get_accessor.automatic_body && + current_type_symbol == prop.parent_symbol) { + CCodeExpression inst; + inst = new CCodeMemberAccess.pointer (pub_inst, "priv"); + expr.ccodenode = new CCodeMemberAccess.pointer (inst, prop.field.get_cname()); + } else if (!prop.no_accessor_method) { var base_property = prop; if (prop.base_property != null) { base_property = prop.base_property; diff --git a/vala/valaclass.vala b/vala/valaclass.vala index 516d81e..8e0eacc 100644 --- a/vala/valaclass.vala +++ b/vala/valaclass.vala @@ -263,6 +263,7 @@ public class Vala.Class : Typesymbol { var field_type = prop.type_reference.copy (); var f = new Field ("_%s".printf (prop.name), field_type, prop.default_expression, prop.source_reference); f.access = SymbolAccessibility.PRIVATE; + prop.field = f; add_field (f); } } diff --git a/vala/valaproperty.vala b/vala/valaproperty.vala index dbf0079..f52486f 100644 --- a/vala/valaproperty.vala +++ b/vala/valaproperty.vala @@ -90,6 +90,11 @@ public class Vala.Property : Member, Lockable { public bool overrides { get; set; } /** + * Reference the the Field that holds this property + */ + public Field field { get; set; } + + /** * Specifies whether this field may only be accessed with an instance of * the contained type. */ diff --git a/vala/valapropertyaccessor.vala b/vala/valapropertyaccessor.vala index cd0857d..0b0d4bf 100644 --- a/vala/valapropertyaccessor.vala +++ b/vala/valapropertyaccessor.vala @@ -62,6 +62,11 @@ public class Vala.PropertyAccessor : CodeNode { public BasicBlock exit_block { get; set; } /** + * True if the body was automatically generated + */ + public bool automatic_body { get; set; } + + /** * Represents the generated value parameter in a set accessor. */ public FormalParameter value_parameter { get; set; } diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala index ce5eb66..8155341 100644 --- a/vala/valasemanticanalyzer.vala +++ b/vala/valasemanticanalyzer.vala @@ -650,7 +650,7 @@ public class Vala.SemanticAnalyzer : CodeVisitor { Report.error (acc.source_reference, "Automatic properties can't be used in interfaces"); return; } - + acc.automatic_body = true; acc.body = new Block (); if (acc.readable) { acc.body.add_statement (new ReturnStatement (new MemberAccess.simple ("_%s".printf (acc.prop.name)), acc.source_reference)); -- 2.7.4