import semantize
private import parser::tables
import mixin
+import primitive_types
redef class ToolContext
# --discover-call-trace
var arguments: Array[String]
# The main Sys instance
- var mainobj: nullable Instance
+ var mainobj: nullable Instance is noinit
- init(modelbuilder: ModelBuilder, mainmodule: MModule, arguments: Array[String])
+ init
do
- self.modelbuilder = modelbuilder
- self.mainmodule = mainmodule
- self.arguments = arguments
self.true_instance = new PrimitiveInstance[Bool](mainmodule.bool_type, true)
+ init_instance_primitive(self.true_instance)
self.false_instance = new PrimitiveInstance[Bool](mainmodule.bool_type, false)
+ init_instance_primitive(self.false_instance)
self.null_instance = new MutableInstance(mainmodule.model.null_type)
end
# Return the integer instance associated with `val`.
fun int_instance(val: Int): Instance
do
- var ic = self.mainmodule.get_primitive_class("Int")
- return new PrimitiveInstance[Int](ic.mclass_type, val)
+ var ic = get_primitive_class("Int")
+ var instance = new PrimitiveInstance[Int](ic.mclass_type, val)
+ init_instance_primitive(instance)
+ return instance
end
# Return the char instance associated with `val`.
fun char_instance(val: Char): Instance
do
- var ic = self.mainmodule.get_primitive_class("Char")
- return new PrimitiveInstance[Char](ic.mclass_type, val)
+ var ic = get_primitive_class("Char")
+ var instance = new PrimitiveInstance[Char](ic.mclass_type, val)
+ init_instance_primitive(instance)
+ return instance
end
# Return the float instance associated with `val`.
fun float_instance(val: Float): Instance
do
- var ic = self.mainmodule.get_primitive_class("Float")
- return new PrimitiveInstance[Float](ic.mclass_type, val)
+ var ic = get_primitive_class("Float")
+ var instance = new PrimitiveInstance[Float](ic.mclass_type, val)
+ init_instance_primitive(instance)
+ return instance
end
# The unique instance of the `true` value.
- var true_instance: Instance
+ var true_instance: Instance is noinit
# The unique instance of the `false` value.
- var false_instance: Instance
+ var false_instance: Instance is noinit
# The unique instance of the `null` value.
- var null_instance: Instance
+ var null_instance: Instance is noinit
# Return a new array made of `values`.
# The dynamic type of the result is Array[elttype].
fun array_instance(values: Array[Instance], elttype: MType): Instance
do
assert not elttype.need_anchor
- var nat = new PrimitiveInstance[Array[Instance]](self.mainmodule.get_primitive_class("NativeArray").get_mtype([elttype]), values)
- var mtype = self.mainmodule.get_primitive_class("Array").get_mtype([elttype])
+ var nat = new PrimitiveInstance[Array[Instance]](get_primitive_class("NativeArray").get_mtype([elttype]), values)
+ init_instance_primitive(nat)
+ var mtype = get_primitive_class("Array").get_mtype([elttype])
var res = new MutableInstance(mtype)
self.init_instance(res)
self.send(self.force_get_primitive_method("with_native", mtype), [res, nat, self.int_instance(values.length)])
do
var val = new FlatBuffer.from(txt)
val.add('\0')
- var ic = self.mainmodule.get_primitive_class("NativeString")
- return new PrimitiveInstance[Buffer](ic.mclass_type, val)
+ var ic = get_primitive_class("NativeString")
+ var instance = new PrimitiveInstance[Buffer](ic.mclass_type, val)
+ init_instance_primitive(instance)
+ return instance
end
# Return a new String instance for `txt`
end
end
+ # A hook to initialize a `PrimitiveInstance`
+ fun init_instance_primitive(recv: Instance) do end
+
+ # Return the primitive `MClass` corresponding to the `name` given in parameter
+ # `name` : name of the primitive class
+ fun get_primitive_class(name: String): MClass
+ do
+ return mainmodule.get_primitive_class(name)
+ end
+
# This function determine the correct type according the reciever of the current definition (self).
fun unanchor_type(mtype: MType): MType
do
# The real value encapsulated
redef var val: E
- init(mtype: MType, val: E)
- do
- super(mtype)
- self.val = val
- end
-
redef fun is_true
do
if val == true then return true
else if pname == "exit" then
exit(args[1].to_i)
abort
+ else if pname == "buffer_mode_full" then
+ return v.int_instance(sys.buffer_mode_full)
+ else if pname == "buffer_mode_line" then
+ return v.int_instance(sys.buffer_mode_line)
+ else if pname == "buffer_mode_none" then
+ return v.int_instance(sys.buffer_mode_none)
else if pname == "sys" then
return v.mainobj
else if cname == "Int" then
else if cname == "NativeArray" then
if pname == "new" then
var val = new Array[Instance].filled_with(v.null_instance, args[1].to_i)
- return new PrimitiveInstance[Array[Instance]](args[0].mtype, val)
+ var instance = new PrimitiveInstance[Array[Instance]](args[0].mtype, val)
+ v.init_instance_primitive(instance)
+ return instance
end
var recvval = args.first.val.as(Array[Instance])
if pname == "[]" then
end
else if cname == "NativeFile" then
if pname == "native_stdout" then
- return new PrimitiveInstance[OStream](mpropdef.mclassdef.mclass.mclass_type, sys.stdout)
+ var inst = new PrimitiveNativeFile.native_stdout
+ var instance = new PrimitiveInstance[PrimitiveNativeFile](mpropdef.mclassdef.mclass.mclass_type, inst)
+ v.init_instance_primitive(instance)
+ return instance
else if pname == "native_stdin" then
- return new PrimitiveInstance[IStream](mpropdef.mclassdef.mclass.mclass_type, sys.stdin)
+ var inst = new PrimitiveNativeFile.native_stdin
+ var instance = new PrimitiveInstance[PrimitiveNativeFile](mpropdef.mclassdef.mclass.mclass_type, inst)
+ v.init_instance_primitive(instance)
+ return instance
else if pname == "native_stderr" then
- return new PrimitiveInstance[OStream](mpropdef.mclassdef.mclass.mclass_type, sys.stderr)
+ var inst = new PrimitiveNativeFile.native_stderr
+ var instance = new PrimitiveInstance[PrimitiveNativeFile](mpropdef.mclassdef.mclass.mclass_type, inst)
+ v.init_instance_primitive(instance)
+ return instance
else if pname == "io_open_read" then
var a1 = args[1].val.as(Buffer)
- return new PrimitiveInstance[IStream](mpropdef.mclassdef.mclass.mclass_type, new IFStream.open(a1.to_s))
+ var inst = new PrimitiveNativeFile.io_open_read(a1.to_s)
+ var instance = new PrimitiveInstance[PrimitiveNativeFile](mpropdef.mclassdef.mclass.mclass_type, inst)
+ v.init_instance_primitive(instance)
+ return instance
else if pname == "io_open_write" then
var a1 = args[1].val.as(Buffer)
- return new PrimitiveInstance[OStream](mpropdef.mclassdef.mclass.mclass_type, new OFStream.open(a1.to_s))
+ var inst = new PrimitiveNativeFile.io_open_write(a1.to_s)
+ var instance = new PrimitiveInstance[PrimitiveNativeFile](mpropdef.mclassdef.mclass.mclass_type, inst)
+ v.init_instance_primitive(instance)
+ return instance
end
var recvval = args.first.val
if pname == "io_write" then
var a1 = args[1].val.as(Buffer)
- recvval.as(OStream).write(a1.substring(0, args[2].to_i).to_s)
- return args[2]
+ return v.int_instance(recvval.as(PrimitiveNativeFile).io_write(a1.to_cstring, args[2].to_i))
else if pname == "io_read" then
- var str = recvval.as(IStream).read(args[2].to_i)
var a1 = args[1].val.as(Buffer)
- new FlatBuffer.from(str).copy(0, str.length, a1.as(FlatBuffer), 0)
- return v.int_instance(str.length)
+ var ns = new NativeString(a1.length)
+ var len = recvval.as(PrimitiveNativeFile).io_read(ns, args[2].to_i)
+ a1.clear
+ a1.append(ns.to_s_with_length(len))
+ return v.int_instance(len)
+ else if pname == "flush" then
+ recvval.as(PrimitiveNativeFile).flush
+ return null
else if pname == "io_close" then
- recvval.as(IOS).close
- return v.int_instance(0)
- else if pname == "address_is_null" then
- return v.false_instance
+ return v.int_instance(recvval.as(PrimitiveNativeFile).io_close)
+ else if pname == "set_buffering_type" then
+ return v.int_instance(recvval.as(PrimitiveNativeFile).set_buffering_type(args[1].to_i, args[2].to_i))
end
else if pname == "calloc_array" then
var recvtype = args.first.mtype.as(MClassType)
var mtype: MType
- mtype = recvtype.supertype_to(v.mainmodule, recvtype, v.mainmodule.get_primitive_class("ArrayCapable"))
+ mtype = recvtype.supertype_to(v.mainmodule, recvtype, v.get_primitive_class("ArrayCapable"))
mtype = mtype.arguments.first
var val = new Array[Instance].filled_with(v.null_instance, args[1].to_i)
- return new PrimitiveInstance[Array[Instance]](v.mainmodule.get_primitive_class("NativeArray").get_mtype([mtype]), val)
+ var instance = new PrimitiveInstance[Array[Instance]](v.get_primitive_class("NativeArray").get_mtype([mtype]), val)
+ v.init_instance_primitive(instance)
+ return instance
else if pname == "native_argc" then
return v.int_instance(v.arguments.length)
else if pname == "native_argv" then
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 == "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
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)
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 i = v.array_instance(array, v.get_primitive_class("Object").mclass_type)
var res = v.send(v.force_get_primitive_method("to_s", i.mtype), [i])
assert res != null
return res
redef class ANewExpr
redef fun expr(v)
do
- var mtype = v.unanchor_type(self.mtype.as(not null))
+ var mtype = v.unanchor_type(self.recvtype.as(not null))
var recv: Instance = new MutableInstance(mtype)
v.init_instance(recv)
var args = v.varargize(callsite.mpropdef, recv, self.n_args.n_exprs)