From: Rico Tzschichholz Date: Sun, 29 Sep 2019 13:10:45 +0000 (+0200) Subject: vala: Micro optimizations for MemberAccess X-Git-Tag: 0.47.1~134 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=740b5db0493ce5156423356183a26646ff3731a1;p=thirdparty%2Fvala.git vala: Micro optimizations for MemberAccess --- 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) {