# Evaluate `n' as an expression in the current context.
# Return the value of the expression.
# If `n' cannot be evaluated, then aborts.
- fun expr(n: AExpr): Instance
+ fun expr(n: AExpr): nullable Instance
do
var old = self.frame.current_node
self.frame.current_node = n
#n.debug("IN Execute expr")
- var i = n.expr(self).as(not null)
+ var i = n.expr(self)
+ if i == null and not self.is_escaping then
+ n.debug("inconsitance: no value and not escaping.")
+ end
#n.debug("OUT Execute expr: value is {i}")
#if not is_subtype(i.mtype, n.mtype.as(not null)) then n.debug("Expected {n.mtype.as(not null)} got {i}")
self.frame.current_node = old
var f = new Frame(self, self.mpropdef.as(not null), [recv])
v.frames.unshift(f)
var val = v.expr(nexpr)
+ assert val != null
v.frames.shift
assert not v.is_escaping
recv.attributes[self.mpropdef.mproperty] = val
var ne = self.n_expr
if ne != null then
var i = v.expr(ne)
+ if i == null then return
v.frame.map[self.variable.as(not null)] = i
end
end
redef fun stmt(v)
do
var i = v.expr(self.n_value)
+ if i == null then return
v.frame.map[self.variable.as(not null)] = i
end
end
do
var vari = v.frame.map[self.variable.as(not null)]
var value = v.expr(self.n_value)
+ if value == null then return
var res = v.send(reassign_property.mproperty, [vari, value])
assert res != null
v.frame.map[self.variable.as(not null)] = res
redef class AContinueExpr
redef fun stmt(v)
do
+ var ne = self.n_expr
+ if ne != null then
+ var i = v.expr(ne)
+ if i == null then return
+ v.escapevalue = i
+ end
v.continuemark = self.escapemark
end
end
redef class ABreakExpr
redef fun stmt(v)
do
+ var ne = self.n_expr
+ if ne != null then
+ var i = v.expr(ne)
+ if i == null then return
+ v.escapevalue = i
+ end
v.breakmark = self.escapemark
end
end
var ne = self.n_expr
if ne != null then
var i = v.expr(ne)
+ if i == null then return
v.escapevalue = i
end
v.returnmark = v.frame
redef fun stmt(v)
do
var cond = v.expr(self.n_expr)
+ if cond == null then return
if cond.is_true then
v.stmt(self.n_then)
else
redef fun expr(v)
do
var cond = v.expr(self.n_expr)
+ if cond == null then return null
if cond.is_true then
return v.expr(self.n_then)
else
do
loop
var cond = v.expr(self.n_expr)
+ if cond == null then return
if not cond.is_true then return
v.stmt(self.n_block)
if v.is_break(self.escapemark) then return
redef fun stmt(v)
do
var col = v.expr(self.n_expr)
+ if col == null then return
#self.debug("col {col}")
var iter = v.send(v.mainmodule.force_get_primitive_method("iterator", col.mtype), [col]).as(not null)
#self.debug("iter {iter}")
redef fun stmt(v)
do
var cond = v.expr(self.n_expr)
+ if cond == null then return
if not cond.is_true then
v.stmt(self.n_else)
if v.is_escaping then return
redef fun expr(v)
do
var cond = v.expr(self.n_expr)
+ if cond == null then return null
if cond.is_true then return cond
return v.expr(self.n_expr2)
end
redef fun expr(v)
do
var cond = v.expr(self.n_expr)
+ if cond == null then return null
if not cond.is_true then return cond
return v.expr(self.n_expr2)
end
redef fun expr(v)
do
var cond = v.expr(self.n_expr)
+ if cond == null then return null
return v.bool_instance(not cond.is_true)
end
end
redef fun expr(v)
do
var i = v.expr(self.n_expr)
+ if i == null then return null
if i != v.null_instance then return i
return v.expr(self.n_expr2)
end
redef fun expr(v)
do
var i = v.expr(self.n_expr)
+ if i == null then return null
var i2 = v.expr(self.n_expr2)
+ if i2 == null then return null
return v.bool_instance(i.eq_is(i2))
end
end
do
var val = new Array[Instance]
for nexpr in self.n_exprs.n_exprs do
- val.add(v.expr(nexpr))
+ var i = v.expr(nexpr)
+ if i == null then return null
+ val.add(i)
end
var mtype = v.unanchor_type(self.mtype.as(not null)).as(MGenericType)
var elttype = mtype.arguments.first
do
var array = new Array[Instance]
for nexpr in n_exprs do
- array.add(v.expr(nexpr))
+ var i = v.expr(nexpr)
+ if i == null then return null
+ array.add(i)
end
var i = v.array_instance(array, v.mainmodule.get_primitive_class("Object").mclass_type)
var res = v.send(v.mainmodule.force_get_primitive_method("to_s", i.mtype), [i])
redef fun expr(v)
do
var e1 = v.expr(self.n_expr)
+ if e1 == null then return null
var e2 = v.expr(self.n_expr2)
+ if e2 == null then return null
var mtype = v.unanchor_type(self.mtype.as(not null))
var res = new Instance(mtype)
v.init_instance(res)
redef fun expr(v)
do
var e1 = v.expr(self.n_expr)
+ if e1 == null then return null
var e2 = v.expr(self.n_expr2)
+ if e2 == null then return null
var mtype = v.unanchor_type(self.mtype.as(not null))
var res = new Instance(mtype)
v.init_instance(res)
redef fun expr(v)
do
var i = v.expr(self.n_expr)
+ if i == null then return null
var mtype = v.unanchor_type(self.cast_type.as(not null))
return v.bool_instance(v.is_subtype(i.mtype, mtype))
end
redef fun expr(v)
do
var i = v.expr(self.n_expr)
+ if i == null then return null
var mtype = v.unanchor_type(self.mtype.as(not null))
if not v.is_subtype(i.mtype, mtype) then
#fatal(v, "Cast failed expected {mtype}, got {i}")
redef fun expr(v)
do
var i = v.expr(self.n_expr)
+ if i == null then return null
var mtype = v.unanchor_type(self.mtype.as(not null))
if i.mtype isa MNullType then
fatal(v, "Cast failed")
return v.onces[self]
else
var res = v.expr(self.n_expr)
+ if res == null then return null
v.onces[self] = res
return res
end
redef fun expr(v)
do
var recv = v.expr(self.n_expr)
+ if recv == null then return null
var args = [recv]
for a in compute_raw_arguments do
- args.add(v.expr(a))
+ var i = v.expr(a)
+ if i == null then return null
+ args.add(i)
end
var mproperty = self.mproperty.as(not null)
return v.send(mproperty, args)
redef fun stmt(v)
do
var recv = v.expr(self.n_expr)
+ if recv == null then return
var args = [recv]
for a in compute_raw_arguments do
- args.add(v.expr(a))
+ var i = v.expr(a)
+ if i == null then return
+ args.add(i)
end
var value = v.expr(self.n_value)
+ if value == null then return
var mproperty = self.mproperty.as(not null)
var read = v.send(mproperty, args)
var recv = v.frame.arguments.first
var args = [recv]
for a in self.n_args.n_exprs do
- args.add(v.expr(a))
+ var i = v.expr(a)
+ if i == null then return null
+ args.add(i)
end
if args.length == 1 then
args = v.frame.arguments
v.init_instance(recv)
var args = [recv]
for a in self.n_args.n_exprs do
- args.add(v.expr(a))
+ var i = v.expr(a)
+ if i == null then return null
+ args.add(i)
end
var mproperty = self.mproperty.as(not null)
var res2 = v.send(mproperty, args)
redef fun expr(v)
do
var recv = v.expr(self.n_expr)
+ if recv == null then return null
var mproperty = self.mproperty.as(not null)
return v.read_attribute(mproperty, recv)
end
redef fun stmt(v)
do
var recv = v.expr(self.n_expr)
+ if recv == null then return
var i = v.expr(self.n_value)
+ if i == null then return
var mproperty = self.mproperty.as(not null)
recv.attributes[mproperty] = i
end
redef fun stmt(v)
do
var recv = v.expr(self.n_expr)
+ if recv == null then return
var value = v.expr(self.n_value)
+ if value == null then return
var mproperty = self.mproperty.as(not null)
var attr = v.read_attribute(mproperty, recv)
var res = v.send(reassign_property.mproperty, [attr, value])
redef fun expr(v)
do
var recv = v.expr(self.n_expr)
+ if recv == null then return null
var mproperty = self.mproperty.as(not null)
return v.bool_instance(recv.attributes.has_key(mproperty))
end