- var res = v.new_var(mtype)
- v.add("/* {res} = NOT YET {class_name} */")
- return res
- end
- end
-
- # Try to compile self as a statement
- # Do not call this method directly, use `v.stmt' instead
- private fun stmt(v: GlobalCompilerVisitor)
- do
- var res = expr(v)
- if res != null then v.add("{res};")
- end
-
-end
-
-redef class ABlockExpr
- redef fun stmt(v)
- do
- for e in self.n_expr do
- v.stmt(e)
- end
- end
-end
-
-redef class AVardeclExpr
- redef fun stmt(v)
- do
- var variable = self.variable.as(not null)
- var ne = self.n_expr
- if ne != null then
- var i = v.expr(ne, variable.declared_type)
- v.assign(v.variable(variable), i)
- end
- end
-end
-
-redef class AVarExpr
- redef fun expr(v)
- do
- var res = v.variable(self.variable.as(not null))
- var mtype = self.mtype.as(not null)
- return v.autoadapt(res, mtype)
- end
-end
-
-redef class AVarAssignExpr
- redef fun stmt(v)
- do
- var variable = self.variable.as(not null)
- var i = v.expr(self.n_value, variable.declared_type)
- v.assign(v.variable(variable), i)
- end
-end
-
-redef class AVarReassignExpr
- redef fun stmt(v)
- do
- var variable = self.variable.as(not null)
- var vari = v.variable(variable)
- var value = v.expr(self.n_value, variable.declared_type)
- var res = v.send(reassign_property.mproperty, [vari, value])
- assert res != null
- v.assign(v.variable(variable), res)
- end
-end
-
-redef class ASelfExpr
- redef fun expr(v)
- do
- return v.frame.arguments.first
- end
-end
-
-redef class AContinueExpr
- redef fun stmt(v)
- do
- v.add("goto CONTINUE_{v.escapemark_name(self.escapemark)};")
- end
-end
-
-redef class ABreakExpr
- redef fun stmt(v)
- do
- v.add("goto BREAK_{v.escapemark_name(self.escapemark)};")
- end
-end
-
-redef class AReturnExpr
- redef fun stmt(v)
- do
- var nexpr = self.n_expr
- if nexpr != null then
- var returnvar = v.frame.returnvar.as(not null)
- var i = v.expr(nexpr, returnvar.mtype)
- v.assign(returnvar, i)
- end
- v.add("goto {v.frame.returnlabel.as(not null)};")
- end
-end
-
-redef class AAbortExpr
- redef fun stmt(v)
- do
- v.add_abort("Aborted")
- end
-end
-
-redef class AIfExpr
- redef fun stmt(v)
- do
- var cond = v.expr_bool(self.n_expr)
- v.add("if ({cond})\{")
- v.stmt(self.n_then)
- v.add("\} else \{")
- v.stmt(self.n_else)
- v.add("\}")
- end
-end
-
-redef class AIfexprExpr
- redef fun expr(v)
- do
- var res = v.new_var(self.mtype.as(not null))
- var cond = v.expr_bool(self.n_expr)
- v.add("if ({cond})\{")
- v.assign(res, v.expr(self.n_then, null))
- v.add("\} else \{")
- v.assign(res, v.expr(self.n_else, null))
- v.add("\}")
- return res
- end
-end
-
-redef class ADoExpr
- redef fun stmt(v)
- do
- v.stmt(self.n_block)
- var escapemark = self.escapemark
- if escapemark != null then
- v.add("BREAK_{v.escapemark_name(escapemark)}: (void)0;")
- end
- end
-end
-
-redef class AWhileExpr
- redef fun stmt(v)
- do
- v.add("for(;;) \{")
- var cond = v.expr_bool(self.n_expr)
- v.add("if (!{cond}) break;")
- v.stmt(self.n_block)
- v.add("CONTINUE_{v.escapemark_name(escapemark)}: (void)0;")
- v.add("\}")
- v.add("BREAK_{v.escapemark_name(escapemark)}: (void)0;")
- end
-end
-
-redef class ALoopExpr
- redef fun stmt(v)
- do
- v.add("for(;;) \{")
- v.stmt(self.n_block)
- v.add("CONTINUE_{v.escapemark_name(escapemark)}: (void)0;")
- v.add("\}")
- v.add("BREAK_{v.escapemark_name(escapemark)}: (void)0;")
- end
-end
-
-redef class AForExpr
- redef fun stmt(v)
- do
- var cl = v.expr(self.n_expr, null)
- var it = v.send(v.get_property("iterator", cl.mtype), [cl])
- assert it != null
- v.add("for(;;) \{")
- var ok = v.send(v.get_property("is_ok", it.mtype), [it])
- assert ok != null
- v.add("if(!{ok}) break;")
- if self.variables.length == 1 then
- var i = v.send(v.get_property("item", it.mtype), [it])
- assert i != null
- v.assign(v.variable(variables.first), i)
- else if self.variables.length == 2 then
- var i = v.send(v.get_property("key", it.mtype), [it])
- assert i != null
- v.assign(v.variable(variables[0]), i)
- i = v.send(v.get_property("item", it.mtype), [it])
- assert i != null
- v.assign(v.variable(variables[1]), i)
- else
- abort
- end
- v.stmt(self.n_block)
- v.add("CONTINUE_{v.escapemark_name(escapemark)}: (void)0;")
- v.send(v.get_property("next", it.mtype), [it])
- v.add("\}")
- v.add("BREAK_{v.escapemark_name(escapemark)}: (void)0;")
- end
-end
-
-redef class AAssertExpr
- redef fun stmt(v)
- do
- var cond = v.expr_bool(self.n_expr)
- v.add("if (!{cond}) \{")
- v.stmt(self.n_else)
- var nid = self.n_id
- if nid != null then
- v.add_abort("Assert '{nid.text}' failed")
- else
- v.add_abort("Assert failed")
- end
- v.add("\}")
- end
-end
-
-redef class AOrExpr
- redef fun expr(v)
- do
- var res = v.new_var(self.mtype.as(not null))
- var i1 = v.expr_bool(self.n_expr)
- v.add("if ({i1}) \{")
- v.add("{res} = 1;")
- v.add("\} else \{")
- var i2 = v.expr_bool(self.n_expr2)
- v.add("{res} = {i2};")
- v.add("\}")
- return res
- end
-end
-
-redef class AAndExpr
- redef fun expr(v)
- do
- var res = v.new_var(self.mtype.as(not null))
- var i1 = v.expr_bool(self.n_expr)
- v.add("if (!{i1}) \{")
- v.add("{res} = 0;")
- v.add("\} else \{")
- var i2 = v.expr_bool(self.n_expr2)
- v.add("{res} = {i2};")
- v.add("\}")
- return res
- end
-end
-
-redef class ANotExpr
- redef fun expr(v)
- do
- var cond = v.expr_bool(self.n_expr)
- return v.new_expr("!{cond}", self.mtype.as(not null))
- end
-end
-
-redef class AOrElseExpr
- redef fun expr(v)
- do
- var res = v.new_var(self.mtype.as(not null))
- var i1 = v.expr(self.n_expr, null)
- v.add("if ({i1}!=NULL) \{")
- v.assign(res, i1)
- v.add("\} else \{")
- var i2 = v.expr(self.n_expr2, null)
- v.assign(res, i2)
- v.add("\}")
- return res
- end
-end
-
-redef class AEeExpr
- redef fun expr(v)
- do
- var value1 = v.expr(self.n_expr, null)
- var value2 = v.expr(self.n_expr2, null)
- return v.equal_test(value1, value2)
- end
-end
-
-redef class AIntExpr
- redef fun expr(v)
- do
- return v.new_expr("{self.n_number.text}", self.mtype.as(not null))
- end
-end
-
-redef class AFloatExpr
- redef fun expr(v)
- do
- return v.new_expr("{self.n_float.text}", self.mtype.as(not null))
- end
-end
-
-redef class ACharExpr
- redef fun expr(v)
- do
- return v.new_expr("{self.n_char.text}", self.mtype.as(not null))
- end
-end
-
-redef class AArrayExpr
- redef fun expr(v)
- do
- var mtype = self.mtype.as(MGenericType).arguments.first
- var array = new Array[RuntimeVariable]
- for nexpr in self.n_exprs.n_exprs do
- var i = v.expr(nexpr, mtype)
- array.add(i)
- end
- return v.array_instance(array, mtype)
- end
-end
-
-redef class AStringFormExpr
- redef fun expr(v)
- do
- return v.string_instance(self.value.as(not null))
- end
-end
-
-redef class ASuperstringExpr
- redef fun expr(v)
- do
- var array = new Array[RuntimeVariable]
- for ne in self.n_exprs do
- if ne isa AStringFormExpr and ne.value == "" then continue # skip empty sub-strings
- var i = v.expr(ne, null)
- array.add(i)
- end
- var a = v.array_instance(array, v.object_type)
- var res = v.send(v.get_property("to_s", a.mtype), [a])
- return res
- end
-end
-
-redef class ACrangeExpr
- redef fun expr(v)
- do
- var i1 = v.expr(self.n_expr, null)
- var i2 = v.expr(self.n_expr2, null)
- var res = v.init_instance(self.mtype.as(MClassType))
- var it = v.send(v.get_property("init", res.mtype), [res, i1, i2])
- v.check_init_instance(res)
- return res
- end
-end
-
-redef class AOrangeExpr
- redef fun expr(v)
- do
- var i1 = v.expr(self.n_expr, null)
- var i2 = v.expr(self.n_expr2, null)
- var res = v.init_instance(self.mtype.as(MClassType))
- var it = v.send(v.get_property("without_last", res.mtype), [res, i1, i2])
- v.check_init_instance(res)
- return res
- end
-end
-
-redef class ATrueExpr
- redef fun expr(v)
- do
- return v.new_expr("1", self.mtype.as(not null))
- end
-end
-
-redef class AFalseExpr
- redef fun expr(v)
- do
- return v.new_expr("0", self.mtype.as(not null))
- end
-end
-
-redef class ANullExpr
- redef fun expr(v)
- do
- var res = v.new_expr("NULL", self.mtype.as(not null))
- return res
- end
-end
-
-redef class AIsaExpr
- redef fun expr(v)
- do
- var i = v.expr(self.n_expr, null)
- return v.type_test(i, self.cast_type.as(not null))
- end
-end
-
-redef class AAsCastExpr
- redef fun expr(v)
- do
- var i = v.expr(self.n_expr, null)
- var cond = v.type_test(i, self.mtype.as(not null))
- v.add("if (!{cond}) \{")
- v.add_abort("Cast failed")
- v.add("\}")
- return i
- end
-end
-
-redef class AAsNotnullExpr
- redef fun expr(v)
- do
- var i = v.expr(self.n_expr, null)
- v.add("if ({i} == NULL) \{")
- v.add_abort("Cast failed")
- v.add("\}")
- return i
- end
-end
-
-redef class AParExpr
- redef fun expr(v)
- do
- return v.expr(self.n_expr, null)
- end
-end
-
-redef class AOnceExpr
- redef fun expr(v)
- do
- var mtype = self.mtype.as(not null)
- var name = v.get_name("varonce")
- var guard = v.get_name(name + "_guard")
- v.add_decl("static {mtype.ctype} {name};")
- v.add_decl("static int {guard};")
- var res = v.new_var(mtype)
- v.add("if ({guard}) \{")
- v.add("{res} = {name};")
- v.add("\} else \{")
- var i = v.expr(self.n_expr, mtype)
- v.add("{res} = {i};")
- v.add("{name} = {res};")
- v.add("{guard} = 1;")
- v.add("\}")
- return res
- end
-end
-
-redef class ASendExpr
- redef fun expr(v)
- do
- var recv = v.expr(self.n_expr, null)
- var args = [recv]
- for a in self.raw_arguments.as(not null) do
- args.add(v.expr(a, null))
- end
- var mproperty = self.mproperty.as(not null)
- return v.send(mproperty, args)
- end
-end
-
-redef class ASendReassignFormExpr
- redef fun stmt(v)
- do
- var recv = v.expr(self.n_expr, null)
- var args = [recv]
- for a in self.raw_arguments.as(not null) do
- args.add(v.expr(a, null))
- end
- var value = v.expr(self.n_value, null)
-
- var mproperty = self.mproperty.as(not null)
- var left = v.send(mproperty, args)
- assert left != null
-
- var res = v.send(reassign_property.mproperty, [left, value])
- assert res != null
-
- args.add(res)
- v.send(self.write_mproperty.as(not null), args)
- end
-end
-
-redef class ASuperExpr
- redef fun expr(v)
- do
- var recv = v.frame.arguments.first
- var args = [recv]
- for a in self.n_args.n_exprs do
- args.add(v.expr(a, null))
- end
- if args.length == 1 then
- args = v.frame.arguments
- end
-
- var mproperty = self.mproperty
- if mproperty != null then
- if mproperty.intro.msignature.arity == 0 then
- args = [recv]
- end
- # Super init call
- var res = v.send(mproperty, args)