[vala/staging] vala: Micro optimizations for MemberAccess
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/staging] vala: Micro optimizations for MemberAccess
- Date: Mon, 30 Sep 2019 14:22:09 +0000 (UTC)
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]