X-Git-Url: http://nitlanguage.org diff --git a/src/interpreter/naive_interpreter.nit b/src/interpreter/naive_interpreter.nit index aba779a..7d7cab9 100644 --- a/src/interpreter/naive_interpreter.nit +++ b/src/interpreter/naive_interpreter.nit @@ -833,6 +833,8 @@ redef class AMethPropdef var recvval = args[0].to_i if pname == "unary -" then return v.int_instance(-args[0].to_i) + else if pname == "unary +" then + return args[0] else if pname == "+" then return v.int_instance(args[0].to_i + args[1].to_i) else if pname == "-" then @@ -907,6 +909,8 @@ redef class AMethPropdef var recv = args[0].to_f if pname == "unary -" then return v.float_instance(-recv) + else if pname == "unary +" then + return args[0] else if pname == "+" then return v.float_instance(recv + args[1].to_f) else if pname == "-" then @@ -1001,11 +1005,11 @@ redef class AMethPropdef else if pname == "file_exists" then return v.bool_instance(recvval.to_s.file_exists) else if pname == "file_mkdir" then - recvval.to_s.mkdir - return null + var res = recvval.to_s.mkdir + return v.bool_instance(res == null) else if pname == "file_chdir" then - recvval.to_s.chdir - return null + var res = recvval.to_s.chdir + return v.bool_instance(res == null) else if pname == "file_realpath" then return v.native_string_instance(recvval.to_s.realpath) else if pname == "get_environ" then @@ -1016,6 +1020,9 @@ redef class AMethPropdef return v.int_instance(res) else if pname == "atof" then return v.float_instance(recvval.to_f) + else if pname == "fast_cstring" then + var ns = recvval.to_cstring.to_s.substring_from(args[1].to_i) + return v.native_string_instance(ns) end else if cname == "String" then var cs = v.send(v.force_get_primitive_method("to_cstring", args.first.mtype), [args.first]) @@ -1270,14 +1277,16 @@ redef class ABlockExpr end redef class AVardeclExpr - redef fun stmt(v) + redef fun expr(v) do var ne = self.n_expr if ne != null then var i = v.expr(ne) - if i == null then return + if i == null then return null v.write_variable(self.variable.as(not null), i) + return i end + return null end end @@ -1318,6 +1327,14 @@ redef class ASelfExpr end end +redef class AImplicitSelfExpr + redef fun expr(v) + do + if not is_sys then return super + return v.mainobj + end +end + redef class AEscapeExpr redef fun stmt(v) do @@ -1462,6 +1479,19 @@ redef class AForExpr end end +redef class AWithExpr + redef fun stmt(v) + do + var expr = v.expr(self.n_expr) + if expr == null then return + + v.callsite(method_start, [expr]) + v.stmt(self.n_block) + v.is_escape(self.break_mark) # Clear the break + v.callsite(method_finish, [expr]) + end +end + redef class AAssertExpr redef fun stmt(v) do @@ -1781,6 +1811,9 @@ redef class ANewExpr var mtype = v.unanchor_type(self.recvtype.as(not null)) var recv: Instance = new MutableInstance(mtype) v.init_instance(recv) + var callsite = self.callsite + if callsite == null then return recv + var args = v.varargize(callsite.mpropdef, recv, self.n_args.n_exprs) if args == null then return null var res2 = v.callsite(callsite, args)