[vala/staging] vala: Micro optimizations for MemberAccess



commit 740b5db0493ce5156423356183a26646ff3731a1
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Sun Sep 29 15:10:45 2019 +0200

    vala: Micro optimizations for MemberAccess

 vala/valamemberaccess.vala | 114 ++++++++++++++++++++++-----------------------
 vala/valamethod.vala       |   4 +-
 2 files changed, 58 insertions(+), 60 deletions(-)
---
diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala
index 274d228f6..0c1094301 100644
--- a/vala/valamemberaccess.vala
+++ b/vala/valamemberaccess.vala
@@ -85,6 +85,7 @@ public class Vala.MemberAccess : Expression {
        }
 
        public MemberAccess.simple (string member_name, SourceReference? source_reference = null) {
+               this.inner = null;
                this.member_name = member_name;
                this.source_reference = source_reference;
        }
@@ -170,7 +171,7 @@ public class Vala.MemberAccess : Expression {
        }
 
        public override bool is_constant () {
-               var method = symbol_reference as Method;
+               unowned Method? method = symbol_reference as Method;
                if (symbol_reference is Constant) {
                        return true;
                } else if (symbol_reference is ArrayLengthField && inner != null && inner.symbol_reference is 
Constant) {
@@ -185,7 +186,7 @@ public class Vala.MemberAccess : Expression {
        }
 
        public override bool is_non_null () {
-               var c = symbol_reference as Constant;
+               unowned Constant? c = symbol_reference as Constant;
                if (c != null) {
                        return (c is EnumValue || !c.type_reference.nullable);
                } else {
@@ -214,8 +215,8 @@ public class Vala.MemberAccess : Expression {
                        type_arg.check (context);
                }
 
-               Symbol base_symbol = null;
-               Parameter this_parameter = null;
+               unowned Symbol? base_symbol = null;
+               unowned Parameter? this_parameter = null;
                bool may_access_instance_members = false;
                bool may_access_klass_members = false;
 
@@ -239,35 +240,35 @@ public class Vala.MemberAccess : Expression {
                        // to instance member is denied from within static lambda expressions
                        bool method_found = false;
 
-                       var sym = context.analyzer.current_symbol;
+                       unowned Symbol? sym = context.analyzer.current_symbol;
                        while (sym != null && symbol_reference == null) {
                                if (!method_found) {
                                        if (sym is CreationMethod) {
-                                               var cm = (CreationMethod) sym;
+                                               unowned CreationMethod cm = (CreationMethod) sym;
                                                this_parameter = cm.this_parameter;
                                                may_access_instance_members = true;
                                                may_access_klass_members = true;
                                                method_found = true;
                                        } else if (sym is Property) {
-                                               var prop = (Property) sym;
+                                               unowned Property prop = (Property) sym;
                                                this_parameter = prop.this_parameter;
                                                may_access_instance_members = (prop.binding == 
MemberBinding.INSTANCE);
                                                may_access_klass_members = (prop.binding != 
MemberBinding.STATIC);
                                                method_found = true;
                                        } else if (sym is Constructor) {
-                                               var c = (Constructor) sym;
+                                               unowned Constructor c = (Constructor) sym;
                                                this_parameter = c.this_parameter;
                                                may_access_instance_members = (c.binding == 
MemberBinding.INSTANCE);
                                                may_access_klass_members = true;
                                                method_found = true;
                                        } else if (sym is Destructor) {
-                                               var d = (Destructor) sym;
+                                               unowned Destructor d = (Destructor) sym;
                                                this_parameter = d.this_parameter;
                                                may_access_instance_members = (d.binding == 
MemberBinding.INSTANCE);
                                                may_access_klass_members = true;
                                                method_found = true;
                                        } else if (sym is Method) {
-                                               var m = (Method) sym;
+                                               unowned Method m = (Method) sym;
                                                this_parameter = m.this_parameter;
                                                may_access_instance_members = (m.binding == 
MemberBinding.INSTANCE);
                                                may_access_klass_members = (m.binding != 
MemberBinding.STATIC);
@@ -325,7 +326,7 @@ public class Vala.MemberAccess : Expression {
                        }
 
                        if (inner.value_type is PointerType) {
-                               var pointer_type = inner.value_type as PointerType;
+                               unowned PointerType? pointer_type = inner.value_type as PointerType;
                                if (pointer_type != null && pointer_type.base_type is ValueType) {
                                        // transform foo->bar to (*foo).bar
                                        inner = new PointerIndirection (inner, source_reference);
@@ -335,7 +336,7 @@ public class Vala.MemberAccess : Expression {
                        }
 
                        if (inner is MemberAccess) {
-                               var ma = (MemberAccess) inner;
+                               unowned MemberAccess ma = (MemberAccess) inner;
                                if (ma.prototype_access) {
                                        error = true;
                                        Report.error (source_reference, "Access to instance member `%s' 
denied".printf (inner.symbol_reference.get_full_name ()));
@@ -382,7 +383,7 @@ public class Vala.MemberAccess : Expression {
                                // allow late bound members for dynamic types
                                var dynamic_object_type = (ObjectType) inner.value_type;
                                if (parent_node is MethodCall) {
-                                       var invoc = (MethodCall) parent_node;
+                                       unowned MethodCall invoc = (MethodCall) parent_node;
                                        if (invoc.call == this) {
                                                // dynamic method
                                                DataType ret_type;
@@ -406,7 +407,7 @@ public class Vala.MemberAccess : Expression {
                                                symbol_reference = m;
                                        }
                                } else if (parent_node is Assignment) {
-                                       var a = (Assignment) parent_node;
+                                       unowned Assignment a = (Assignment) parent_node;
                                        if (a.left == this) {
                                                // dynamic property assignment
                                                var prop = new DynamicProperty (inner.value_type, 
member_name, source_reference);
@@ -417,7 +418,7 @@ public class Vala.MemberAccess : Expression {
                                                symbol_reference = prop;
                                        }
                                } else if (parent_node is MemberAccess && inner is MemberAccess && 
parent_node.parent_node is MethodCall) {
-                                       var ma = (MemberAccess) parent_node;
+                                       unowned MemberAccess ma = (MemberAccess) parent_node;
                                        if (ma.member_name == "connect" || ma.member_name == "connect_after") 
{
                                                // dynamic signal
                                                var s = new DynamicSignal (inner.value_type, member_name, new 
VoidType (), source_reference);
@@ -455,7 +456,7 @@ public class Vala.MemberAccess : Expression {
 
                // enum-type inference
                if (inner == null && symbol_reference == null && target_type != null && 
target_type.type_symbol is Enum) {
-                       var enum_type = (Enum) target_type.type_symbol;
+                       unowned Enum enum_type = (Enum) target_type.type_symbol;
                        foreach (var val in enum_type.get_values ()) {
                                if (member_name == val.name) {
                                        symbol_reference = val;
@@ -489,7 +490,7 @@ public class Vala.MemberAccess : Expression {
                        return false;
                }
 
-               var member = symbol_reference;
+               unowned Symbol? member = symbol_reference;
                var access = SymbolAccessibility.PUBLIC;
                bool instance = false;
                bool klass = false;
@@ -500,14 +501,14 @@ public class Vala.MemberAccess : Expression {
                }
 
                if (member is LocalVariable) {
-                       var local = (LocalVariable) member;
-                       var block = local.parent_symbol as Block;
+                       unowned LocalVariable local = (LocalVariable) member;
+                       unowned Block? block = local.parent_symbol as Block;
                        if (block != null && SemanticAnalyzer.find_parent_method_or_property_accessor (block) 
!= context.analyzer.current_method_or_property_accessor) {
                                // mark all methods between current method and the captured
                                // block as closures (to support nested closures)
-                               Symbol sym = context.analyzer.current_method_or_property_accessor;
+                               unowned Symbol? sym = context.analyzer.current_method_or_property_accessor;
                                while (sym != block) {
-                                       var method = sym as Method;
+                                       unowned Method? method = sym as Method;
                                        if (method != null) {
                                                method.closure = true;
                                                // consider captured variables as used
@@ -521,14 +522,14 @@ public class Vala.MemberAccess : Expression {
                                block.captured = true;
                        }
                } else if (member is Parameter) {
-                       var param = (Parameter) member;
-                       var m = param.parent_symbol as Method;
+                       unowned Parameter param = (Parameter) member;
+                       unowned Method? m = param.parent_symbol as Method;
                        if (m != null && m != context.analyzer.current_method_or_property_accessor && param 
!= m.this_parameter) {
                                // mark all methods between current method and the captured
                                // parameter as closures (to support nested closures)
-                               Symbol sym = context.analyzer.current_method_or_property_accessor;
+                               unowned Symbol? sym = context.analyzer.current_method_or_property_accessor;
                                while (sym != m) {
-                                       var method = sym as Method;
+                                       unowned Method? method = sym as Method;
                                        if (method != null) {
                                                method.closure = true;
                                        }
@@ -543,13 +544,13 @@ public class Vala.MemberAccess : Expression {
                                        Report.error (source_reference, "Cannot capture reference or output 
parameter `%s'".printf (param.get_full_name ()));
                                }
                        } else {
-                               var acc = param.parent_symbol.parent_symbol as PropertyAccessor;
+                               unowned PropertyAccessor? acc = param.parent_symbol.parent_symbol as 
PropertyAccessor;
                                if (acc != null && acc != 
context.analyzer.current_method_or_property_accessor && param != acc.prop.this_parameter) {
                                        // mark all methods between current method and the captured
                                        // parameter as closures (to support nested closures)
-                                       Symbol sym = context.analyzer.current_method_or_property_accessor;
+                                       unowned Symbol? sym = 
context.analyzer.current_method_or_property_accessor;
                                        while (sym != m) {
-                                               var method = sym as Method;
+                                               unowned Method? method = sym as Method;
                                                if (method != null) {
                                                        method.closure = true;
                                                }
@@ -561,7 +562,7 @@ public class Vala.MemberAccess : Expression {
                                }
                        }
                } else if (member is Field) {
-                       var f = (Field) member;
+                       unowned Field f = (Field) member;
                        access = f.access;
                        instance = (f.binding == MemberBinding.INSTANCE);
                        klass = (f.binding == MemberBinding.CLASS);
@@ -572,21 +573,21 @@ public class Vala.MemberAccess : Expression {
                                generics = true;
                        }
                } else if (member is Constant) {
-                       var c = (Constant) member;
+                       unowned Constant c = (Constant) member;
                        access = c.access;
 
-                       var block = c.parent_symbol as Block;
+                       unowned Block? block = c.parent_symbol as Block;
                        if (block != null && SemanticAnalyzer.find_parent_method_or_property_accessor (block) 
!= context.analyzer.current_method_or_property_accessor) {
                                error = true;
                                Report.error (source_reference, "internal error: accessing local constants of 
outer methods is not supported yet");
                                return false;
                        }
                } else if (member is Method) {
-                       var m = (Method) member;
+                       unowned Method m = (Method) member;
                        if (m.is_async_callback) {
                                // ensure to use right callback method for virtual/abstract async methods
                                // and also for lambda expressions within async methods
-                               var async_method = context.analyzer.current_async_method;
+                               unowned Method? async_method = context.analyzer.current_async_method;
 
                                bool is_valid_access = false;
                                if (async_method != null) {
@@ -605,9 +606,9 @@ public class Vala.MemberAccess : Expression {
                                }
 
                                if (async_method != context.analyzer.current_method) {
-                                       Symbol sym = context.analyzer.current_method;
+                                       unowned Symbol? sym = context.analyzer.current_method;
                                        while (sym != async_method) {
-                                               var method = sym as Method;
+                                               unowned Method? method = sym as Method;
                                                if (method != null) {
                                                        method.closure = true;
                                                }
@@ -655,18 +656,18 @@ public class Vala.MemberAccess : Expression {
                        // do not allow access to methods using generic type parameters
                        // if instance type does not specify type arguments
                        foreach (var param in m.get_parameters ()) {
-                               var generic_type = param.variable_type as GenericType;
+                               unowned GenericType? generic_type = param.variable_type as GenericType;
                                if (generic_type != null && generic_type.type_parameter.parent_symbol is 
TypeSymbol) {
                                        generics = true;
                                        break;
                                }
                        }
-                       var generic_type = m.return_type as GenericType;
+                       unowned GenericType? generic_type = m.return_type as GenericType;
                        if (generic_type != null && generic_type.type_parameter.parent_symbol is TypeSymbol) {
                                generics = true;
                        }
                } else if (member is Property) {
-                       var prop = (Property) member;
+                       unowned Property prop = (Property) member;
                        if (!prop.check (context)) {
                                error = true;
                                return false;
@@ -727,7 +728,7 @@ public class Vala.MemberAccess : Expression {
                member.version.check (source_reference);
 
                if (access == SymbolAccessibility.PROTECTED && member.parent_symbol is TypeSymbol) {
-                       var target_type = (TypeSymbol) member.parent_symbol;
+                       unowned TypeSymbol target_type = (TypeSymbol) member.parent_symbol;
 
                        bool in_subtype = false;
                        for (Symbol this_symbol = context.analyzer.current_symbol; this_symbol != null; 
this_symbol = this_symbol.parent_symbol) {
@@ -738,7 +739,7 @@ public class Vala.MemberAccess : Expression {
                                        break;
                                }
 
-                               var cl = this_symbol as Class;
+                               unowned Class? cl = this_symbol as Class;
                                if (cl != null && cl.is_subtype_of (target_type)) {
                                        in_subtype = true;
                                        break;
@@ -751,7 +752,7 @@ public class Vala.MemberAccess : Expression {
                                return false;
                        }
                } else if (access == SymbolAccessibility.PRIVATE) {
-                       var target_type = member.parent_symbol;
+                       unowned Symbol? target_type = member.parent_symbol;
 
                        bool in_target_type = false;
                        for (Symbol this_symbol = context.analyzer.current_symbol; this_symbol != null; 
this_symbol = this_symbol.parent_symbol) {
@@ -769,15 +770,15 @@ public class Vala.MemberAccess : Expression {
                }
 
                if (generics && inner != null) {
-                       var instance_type = inner.value_type;
-                       var pointer_type = inner.value_type as PointerType;
+                       unowned DataType instance_type = inner.value_type;
+                       unowned PointerType? pointer_type = inner.value_type as PointerType;
                        if (pointer_type != null) {
                                instance_type = pointer_type.base_type;
                        }
 
                        // instance type might be a subtype of the parent symbol of the member
                        // that subtype might not be generic, so do not report an error in that case
-                       var object_type = instance_type as ObjectType;
+                       unowned ObjectType? object_type = instance_type as ObjectType;
                        if (object_type != null && object_type.object_type_symbol.has_type_parameters ()
                            && !instance_type.has_type_arguments ()) {
                                error = true;
@@ -831,8 +832,8 @@ public class Vala.MemberAccess : Expression {
                                Report.error (source_reference, "Access to instance member `%s' from nullable 
reference denied".printf (symbol_reference.get_full_name ()));
                        }
 
-                       var m = symbol_reference as Method;
-                       var inner_ma = inner as MemberAccess;
+                       unowned Method? m = symbol_reference as Method;
+                       unowned MemberAccess? inner_ma = inner as MemberAccess;
                        if (m != null && m.binding == MemberBinding.STATIC && m.parent_symbol is 
ObjectTypeSymbol &&
                            inner != null && inner.value_type == null && inner_ma.type_argument_list.size > 
0) {
                                // support static methods in generic classes
@@ -851,7 +852,7 @@ public class Vala.MemberAccess : Expression {
                        }
 
                        if (symbol_reference is Method) {
-                               var method = (Method) symbol_reference;
+                               unowned Method method = (Method) symbol_reference;
                                if (target_type != null) {
                                        value_type.value_owned = target_type.value_owned;
                                }
@@ -859,14 +860,11 @@ public class Vala.MemberAccess : Expression {
                                        inner.target_type = SemanticAnalyzer.get_data_type_for_symbol 
(method.parent_symbol);
                                        inner.target_type.value_owned = 
method.this_parameter.variable_type.value_owned;
                                }
-                       } else if (symbol_reference is Property) {
-                               var prop = (Property) symbol_reference;
-                               if (instance && prop.parent_symbol != null) {
-                                       inner.target_type = SemanticAnalyzer.get_data_type_for_symbol 
(prop.parent_symbol);
-                               }
-                       } else if ((symbol_reference is Field
-                                   || symbol_reference is Signal)
-                                  && instance && symbol_reference.parent_symbol != null) {
+                       } else if (symbol_reference is Property
+                           && instance && symbol_reference.parent_symbol != null) {
+                               inner.target_type = SemanticAnalyzer.get_data_type_for_symbol 
(symbol_reference.parent_symbol);
+                       } else if ((symbol_reference is Field || symbol_reference is Signal)
+                           && instance && symbol_reference.parent_symbol != null) {
                                var parent_type = SemanticAnalyzer.get_data_type_for_symbol 
(symbol_reference.parent_symbol);
                                inner.target_type = parent_type.get_actual_type (inner.value_type, null, 
this);
                        }
@@ -908,7 +906,7 @@ public class Vala.MemberAccess : Expression {
                var this_access = inner.symbol_reference is Parameter && inner.symbol_reference.name == 
"this";
                var struct_or_array = (inner.value_type is StructValueType && !inner.value_type.nullable) || 
(CodeContext.get ().profile == Profile.GOBJECT && inner.value_type is ArrayType);
 
-               var ma = inner as MemberAccess;
+               unowned MemberAccess? ma = inner as MemberAccess;
                if (ma == null && struct_or_array && inner is PointerIndirection) {
                        // (*struct)->method()
                        ma = ((PointerIndirection) inner).inner as MemberAccess;
@@ -950,8 +948,8 @@ public class Vala.MemberAccess : Expression {
                if (inner != null) {
                        inner.get_used_variables (collection);
                }
-               var local = symbol_reference as LocalVariable;
-               var param = symbol_reference as Parameter;
+               unowned LocalVariable? local = symbol_reference as LocalVariable;
+               unowned Parameter? param = symbol_reference as Parameter;
                if (local != null) {
                        collection.add (local);
                } else if (param != null && param.direction == ParameterDirection.OUT) {
diff --git a/vala/valamethod.vala b/vala/valamethod.vala
index 4cca286a3..d118fb50e 100644
--- a/vala/valamethod.vala
+++ b/vala/valamethod.vala
@@ -1101,7 +1101,7 @@ public class Vala.Method : Subroutine, Callable {
                return n;
        }
 
-       public Method get_end_method () {
+       public unowned Method get_end_method () {
                assert (this.coroutine);
 
                if (end_method == null) {
@@ -1120,7 +1120,7 @@ public class Vala.Method : Subroutine, Callable {
                return end_method;
        }
 
-       public Method get_callback_method () {
+       public unowned Method get_callback_method () {
                assert (this.coroutine);
 
                if (callback_method == null) {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]