return instance
end
+ # Return the byte instance associated with `val`.
+ fun byte_instance(val: Byte): Instance
+ do
+ var t = mainmodule.byte_type
+ var instance = new PrimitiveInstance[Byte](t, val)
+ init_instance_primitive(instance)
+ return instance
+ end
+
# Return the char instance associated with `val`.
fun char_instance(val: Char): Instance
do
# else aborts
fun to_f: Float do abort
+ # Return the integer value if the instance is a byte.
+ # else aborts
+ fun to_b: Byte do abort
+
# The real value encapsulated if the instance is primitive.
# Else aborts.
fun val: nullable Object do abort
redef fun to_i do return val.as(Int)
redef fun to_f do return val.as(Float)
+
+ redef fun to_b do return val.as(Byte)
end
# Information about local variables in a running method
if mpropdef.is_intern then
fatal(v, "NOT YET IMPLEMENTED intern {mpropdef}")
else if mpropdef.is_extern then
- fatal(v, "NOT YET IMPLEMENTED extern {mpropdef}")
+ var res = call_extern(v, mpropdef, arguments, f)
+ if res != v.error_instance then return res
else
fatal(v, "NOT YET IMPLEMENTED <wat?> {mpropdef}")
end
abort
end
+ # Call this extern method
+ protected fun call_extern(v: NaiveInterpreter, mpropdef: MMethodDef, arguments: Array[Instance], f: Frame): nullable Instance
+ do
+ fatal(v, "NOT YET IMPLEMENTED extern {mpropdef}")
+ return v.error_instance
+ end
+
# Interprets a intern or a shortcut extern method.
# Returns the result for a function, `null` for a procedure, or `error_instance` if the method is unknown.
private fun intern_call(v: NaiveInterpreter, mpropdef: MMethodDef, args: Array[Instance]): nullable Instance
return v.char_instance(args[0].to_i.ascii)
else if pname == "to_f" then
return v.float_instance(args[0].to_i.to_f)
+ else if pname == "to_b" then
+ return v.byte_instance(args[0].to_i.to_b)
else if pname == "lshift" then
return v.int_instance(args[0].to_i.lshift(args[1].to_i))
else if pname == "rshift" then
return v.int_instance(args[0].to_i.bin_xor(args[1].to_i))
else if pname == "bin_not" then
return v.int_instance(args[0].to_i.bin_not)
- else if pname == "int_to_s_len" then
+ end
+ else if cname == "Byte" then
+ var recvval = args[0].to_b
+ if pname == "unary -" then
+ return v.byte_instance(-args[0].to_b)
+ else if pname == "unary +" then
+ return args[0]
+ else if pname == "+" then
+ return v.byte_instance(args[0].to_b + args[1].to_b)
+ else if pname == "-" then
+ return v.byte_instance(args[0].to_b - args[1].to_b)
+ else if pname == "*" then
+ return v.byte_instance(args[0].to_b * args[1].to_b)
+ else if pname == "%" then
+ return v.byte_instance(args[0].to_b % args[1].to_b)
+ else if pname == "/" then
+ return v.byte_instance(args[0].to_b / args[1].to_b)
+ else if pname == "<" then
+ return v.bool_instance(args[0].to_b < args[1].to_b)
+ else if pname == ">" then
+ return v.bool_instance(args[0].to_b > args[1].to_b)
+ else if pname == "<=" then
+ return v.bool_instance(args[0].to_b <= args[1].to_b)
+ else if pname == ">=" then
+ return v.bool_instance(args[0].to_b >= args[1].to_b)
+ else if pname == "<=>" then
+ return v.int_instance(args[0].to_b <=> args[1].to_b)
+ else if pname == "to_f" then
+ return v.float_instance(args[0].to_b.to_f)
+ else if pname == "to_i" then
+ return v.int_instance(args[0].to_b.to_i)
+ else if pname == "lshift" then
+ return v.byte_instance(args[0].to_b.lshift(args[1].to_i))
+ else if pname == "rshift" then
+ return v.byte_instance(args[0].to_b.rshift(args[1].to_i))
+ else if pname == "byte_to_s_len" then
return v.int_instance(recvval.to_s.length)
- else if pname == "native_int_to_s" then
- var s = recvval.to_s
- var srecv = args[1].val.as(Buffer)
- srecv.clear
- srecv.append(s)
- srecv.add('\0')
- return null
- else if pname == "strerror_ext" then
- return v.native_string_instance(recvval.strerror)
end
else if cname == "Char" then
var recv = args[0].val.as(Char)
return v.bool_instance(recv >= args[1].to_f)
else if pname == "to_i" then
return v.int_instance(recv.to_i)
+ else if pname == "to_b" then
+ return v.byte_instance(recv.to_b)
else if pname == "cos" then
return v.float_instance(args[0].to_f.cos)
else if pname == "sin" then
return null
else if pname == "atoi" then
return v.int_instance(recvval.to_i)
- else if pname == "file_exists" then
- return v.bool_instance(recvval.to_s.file_exists)
- else if pname == "file_mkdir" then
- var res = recvval.to_s.mkdir
- return v.bool_instance(res == null)
- else if pname == "file_chdir" then
- 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
- var txt = recvval.to_s.environ
- return v.native_string_instance(txt)
- else if pname == "system" then
- var res = sys.system(recvval.to_s)
- 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])
- var str = cs.val.to_s
- if pname == "files" then
- var res = new Array[Instance]
- for f in str.files do res.add v.string_instance(f)
- return v.array_instance(res, v.mainmodule.string_type)
- end
else if pname == "calloc_string" then
return v.native_string_instance("!" * args[1].to_i)
else if cname == "NativeArray" then
else if pname == "native_argv" then
var txt = v.arguments[args[1].to_i]
return v.native_string_instance(txt)
- else if pname == "get_time" then
- return v.int_instance(get_time)
- else if pname == "srand" then
- srand
- return null
- else if pname == "srand_from" then
- srand_from(args[1].to_i)
- return null
- else if pname == "atan2" then
- return v.float_instance(atan2(args[1].to_f, args[2].to_f))
- else if pname == "pi" then
- return v.float_instance(pi)
else if pname == "lexer_goto" then
return v.int_instance(lexer_goto(args[1].to_i, args[2].to_i))
else if pname == "lexer_accept" then
return v.int_instance(parser_goto(args[1].to_i, args[2].to_i))
else if pname == "parser_action" then
return v.int_instance(parser_action(args[1].to_i, args[2].to_i))
- else if pname == "file_getcwd" then
- return v.native_string_instance(getcwd)
- else if pname == "errno" then
- return v.int_instance(sys.errno)
- else if pname == "address_is_null" then
- var recv = args[0]
- if recv isa PrimitiveInstance[PrimitiveNativeFile] then
- return v.bool_instance(recv.val.address_is_null)
- end
- return v.false_instance
end
return v.error_instance
end
do
if is_lazy then return
if has_value then
- var f = v.new_frame(self, mpropdef.as(not null), [recv])
+ var f = v.new_frame(self, mreadpropdef.as(not null), [recv])
evaluate_expr(v, recv, f)
return
end
var mpropdef = self.mpropdef
if mpropdef == null then return
- var mtype = mpropdef.static_mtype.as(not null)
+ var mtype = self.mtype.as(not null)
mtype = mtype.anchor_to(v.mainmodule, recv.mtype.as(MClassType))
if mtype isa MNullableType then
v.write_attribute(self.mpropdef.mproperty, recv, v.null_instance)
end
end
+redef class AByteExpr
+ redef fun expr(v)
+ do
+ return v.byte_instance(self.value.as(not null))
+ end
+end
+
redef class AFloatExpr
redef fun expr(v)
do