Merge: model: register the implicitly injected Bool class in its hierarchy.
authorJean Privat <jean@pryen.org>
Sat, 13 Dec 2014 07:50:08 +0000 (02:50 -0500)
committerJean Privat <jean@pryen.org>
Sat, 13 Dec 2014 07:50:08 +0000 (02:50 -0500)
The model can inject a primitive a Bool class when required.
It was a hack which was initially introduced by the interpreter that need to manipulate boolean values even if they where not present in the original program.
However, the class was not fully initialized. So fix that.

Maybe a future PR will try to remove this hack (it is not the model's job to inject classes)

Pull-Request: #989
Reviewed-by: Lucas Bajolet <r4pass@hotmail.com>
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>

1  2 
src/interpreter/naive_interpreter.nit

@@@ -21,7 -21,6 +21,7 @@@ import litera
  import semantize
  private import parser::tables
  import mixin
 +import primitive_types
  
  redef class ToolContext
        # --discover-call-trace
@@@ -72,10 -71,12 +72,12 @@@ class NaiveInterprete
  
        init
        do
-               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)
+               if mainmodule.model.get_mclasses_by_name("Bool") != null then
+                       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)
+               end
                self.null_instance = new PrimitiveInstance[nullable Object](mainmodule.model.null_type, null)
        end
  
@@@ -797,12 -798,6 +799,12 @@@ redef class AMethPropde
                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
                        end
                else if cname == "NativeFile" then
                        if pname == "native_stdout" then
 -                              var instance = 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
 -                              var instance = 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
 -                              var instance = 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)
 -                              var instance = 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)
 -                              var instance = 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)
                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