assert mtype != null
var nexpr = self.n_expr
+ var nblock = self.n_block
if nexpr != null then
value = v.expr(nexpr, mtype)
+ else if nblock != null then
+ value = v.new_var(mtype)
+ frame.returnvar = value
+ frame.returnlabel = v.get_name("RET_LABEL")
+ v.add("\{")
+ v.stmt(nblock)
+ v.add("{frame.returnlabel.as(not null)}:(void)0;")
+ v.add("\}")
else
abort
end
private fun init_expr(v: NaiveInterpreter, recv: Instance)
do
if is_lazy then return
- var nexpr = self.n_expr
- if nexpr != null then
+ if has_value then
evaluate_expr(v, recv)
return
end
private fun evaluate_expr(v: NaiveInterpreter, recv: Instance): Instance
do
assert recv isa MutableInstance
- var nexpr = self.n_expr
- assert nexpr != null
var f = new Frame(self, self.mpropdef.as(not null), [recv])
v.frames.unshift(f)
- var val = v.expr(nexpr)
+
+ var val
+
+ var nexpr = self.n_expr
+ var nblock = self.n_block
+ if nexpr != null then
+ val = v.expr(nexpr)
+ else if nblock != null then
+ v.stmt(nblock)
+ assert v.returnmark == f
+ val = v.escapevalue
+ v.returnmark = null
+ v.escapevalue = null
+ else
+ abort
+ end
assert val != null
+
v.frames.shift
assert not v.is_escaping
v.write_attribute(self.mpropdef.mproperty, recv, val)
var nclassdef = self.modelbuilder.mclassdef2nclassdef[cd]
for npropdef in nclassdef.n_propdefs do
if not npropdef isa AAttrPropdef then continue
- var nexpr = npropdef.n_expr
- if nexpr == null then continue
+ if not npropdef.has_value then continue
+
var mpropdef = npropdef.mpropdef.as(not null)
var v = new RapidTypeVisitor(self, bound_mtype, mpropdef)
- v.enter_visit(nexpr)
+ v.enter_visit(npropdef.n_expr)
+ v.enter_visit(npropdef.n_block)
end
end
var mtype = self.mpropdef.static_mtype
v.visit_expr_subtype(nexpr, mtype)
end
+ var nblock = self.n_block
+ if nblock != null then
+ v.visit_stmt(nblock)
+ end
end
end
redef fun accept_typing(v)
do
var nexpr = self.n_expr
- var ret_type = v.mpropdef.as(MMethodDef).msignature.return_mtype
+ var ret_type
+ var mpropdef = v.mpropdef
+ if mpropdef isa MMethodDef then
+ ret_type = mpropdef.msignature.return_mtype
+ else if mpropdef isa MAttributeDef then
+ ret_type = mpropdef.static_mtype
+ else
+ abort
+ end
if nexpr != null then
if ret_type != null then
v.visit_expr_subtype(nexpr, ret_type)