diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2019-10-18 15:41:30 +0200 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2019-10-18 15:42:20 +0200 |
commit | af8fcf8ef745ab9cce20e1ee1806612d515e50de (patch) | |
tree | 621ce766c03b74bd4571e27dd1c6dae8e3c80161 /codegen/valaccodememberaccessmodule.vala | |
parent | 513faa82a511372a25f508ead71722a21dd11cc5 (diff) | |
download | vala-af8fcf8ef745ab9cce20e1ee1806612d515e50de.tar.gz |
codegen: Reduce code duplications when generation base-access
Diffstat (limited to 'codegen/valaccodememberaccessmodule.vala')
-rw-r--r-- | codegen/valaccodememberaccessmodule.vala | 43 |
1 files changed, 16 insertions, 27 deletions
diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala index 2a37ceb5c..3b8933d04 100644 --- a/codegen/valaccodememberaccessmodule.vala +++ b/codegen/valaccodememberaccessmodule.vala @@ -49,17 +49,16 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule { } if (expr.inner is BaseAccess) { + CCodeExpression? vcast = null; if (m.base_method != null) { - var base_class = (Class) m.base_method.parent_symbol; - var vcast = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_class_type_function (base_class))); - vcast.add_argument (new CCodeIdentifier ("%s_parent_class".printf (get_ccode_lower_case_name (current_class, null)))); - - set_cvalue (expr, new CCodeMemberAccess.pointer (vcast, get_ccode_vfunc_name (m))); - return; + unowned Class base_class = (Class) m.base_method.parent_symbol; + vcast = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_class_type_function (base_class))); + ((CCodeFunctionCall) vcast).add_argument (new CCodeIdentifier ("%s_parent_class".printf (get_ccode_lower_case_name (current_class)))); } else if (m.base_interface_method != null) { - var base_iface = (Interface) m.base_interface_method.parent_symbol; - var vcast = get_this_interface_cexpression (base_iface); - + unowned Interface base_iface = (Interface) m.base_interface_method.parent_symbol; + vcast = get_this_interface_cexpression (base_iface); + } + if (vcast != null) { set_cvalue (expr, new CCodeMemberAccess.pointer (vcast, get_ccode_vfunc_name (m))); return; } @@ -201,26 +200,16 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule { } else if (prop.base_interface_property != null) { base_prop = prop.base_interface_property; } + CCodeExpression? vcast = null; if (base_prop.parent_symbol is Class) { - var base_class = (Class) base_prop.parent_symbol; - var vcast = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_class_type_function (base_class))); - vcast.add_argument (new CCodeIdentifier ("%s_parent_class".printf (get_ccode_lower_case_name (current_class, null)))); - - var ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (vcast, "get_%s".printf (prop.name))); - ccall.add_argument (get_cvalue (expr.inner)); - if (prop.property_type.is_real_non_null_struct_type ()) { - var temp_value = (GLibValue) create_temp_value (prop.get_accessor.value_type, false, expr); - expr.target_value = load_temp_value (temp_value); - var ctemp = get_cvalue_ (temp_value); - ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, ctemp)); - ccode.add_expression (ccall); - } else { - set_cvalue (expr, ccall); - } + unowned Class base_class = (Class) base_prop.parent_symbol; + vcast = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_class_type_function (base_class))); + ((CCodeFunctionCall) vcast).add_argument (new CCodeIdentifier ("%s_parent_class".printf (get_ccode_lower_case_name (current_class)))); } else if (base_prop.parent_symbol is Interface) { - var base_iface = (Interface) base_prop.parent_symbol; - var vcast = get_this_interface_cexpression (base_iface); - + unowned Interface base_iface = (Interface) base_prop.parent_symbol; + vcast = get_this_interface_cexpression (base_iface); + } + if (vcast != null) { var ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (vcast, "get_%s".printf (prop.name))); ccall.add_argument (get_cvalue (expr.inner)); if (prop.property_type.is_real_non_null_struct_type ()) { |