From d375a575eac05568e0951ea7534401f956adb87f Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Wed, 29 Oct 2014 14:16:49 -0400 Subject: [PATCH] compiler: introduce `AAttrPropdef::evaluate_expr` to factorize the compilation of default values Signed-off-by: Jean Privat --- src/compiler/abstract_compiler.nit | 51 ++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/src/compiler/abstract_compiler.nit b/src/compiler/abstract_compiler.nit index c785dd6..94d5ada 100644 --- a/src/compiler/abstract_compiler.nit +++ b/src/compiler/abstract_compiler.nit @@ -2289,24 +2289,24 @@ redef class AAttrPropdef do if mpropdef == mreadpropdef then assert arguments.length == 1 + var recv = arguments.first var res if is_lazy then - var nexpr = n_expr - assert nexpr != null var set var ret = self.mpropdef.static_mtype var useiset = ret.ctype == "val*" and not ret isa MNullableType var guard = self.mlazypropdef.mproperty if useiset then - set = v.isset_attribute(self.mpropdef.mproperty, arguments.first) + set = v.isset_attribute(self.mpropdef.mproperty, recv) else - set = v.read_attribute(guard, arguments.first) + set = v.read_attribute(guard, recv) end v.add("if(likely({set})) \{") - res = v.read_attribute(self.mpropdef.mproperty, arguments.first) + res = v.read_attribute(self.mpropdef.mproperty, recv) v.add("\} else \{") - var value = v.expr(nexpr, self.mpropdef.static_mtype) - v.write_attribute(self.mpropdef.mproperty, arguments.first, value) + + var value = evaluate_expr(v, recv) + v.assign(res, value) if not useiset then var true_v = v.new_expr("1", v.bool_type) @@ -2334,18 +2334,35 @@ redef class AAttrPropdef fun init_expr(v: AbstractCompilerVisitor, recv: RuntimeVariable) do + if has_value and not is_lazy then evaluate_expr(v, recv) + end + + # Evaluate, store and return the default value of the attribute + private fun evaluate_expr(v: AbstractCompilerVisitor, recv: RuntimeVariable): RuntimeVariable + do + var oldnode = v.current_node + v.current_node = self + var old_frame = v.frame + var frame = new Frame(v, self.mpropdef.as(not null), recv.mcasttype.as(MClassType), [recv]) + v.frame = frame + + var value + var mtype = self.mpropdef.static_mtype + assert mtype != null + var nexpr = self.n_expr - if nexpr != null and not is_lazy then - var oldnode = v.current_node - v.current_node = self - var old_frame = v.frame - var frame = new Frame(v, self.mpropdef.as(not null), recv.mtype.as(MClassType), [recv]) - v.frame = frame - var value = v.expr(nexpr, self.mpropdef.static_mtype) - v.write_attribute(self.mpropdef.mproperty, recv, value) - v.frame = old_frame - v.current_node = oldnode + if nexpr != null then + value = v.expr(nexpr, mtype) + else + abort end + + v.write_attribute(self.mpropdef.mproperty, recv, value) + + v.frame = old_frame + v.current_node = oldnode + + return value end fun check_expr(v: AbstractCompilerVisitor, recv: RuntimeVariable) -- 1.7.9.5