Merge: introduce plain_to_s
authorJean Privat <jean@pryen.org>
Fri, 29 May 2015 01:49:02 +0000 (21:49 -0400)
committerJean Privat <jean@pryen.org>
Fri, 29 May 2015 01:49:02 +0000 (21:49 -0400)
In order to have a more POLA `to_s` on collections, it is required that a new method with the old behavior is provided for clients that need it (especially the interpreter that use it for superstrings).

the compiler use `native_to_s` for superstrings but `c_src/nitg` still use `to_s` on array, so a regeneration of the bootstrap is required before changing the behavior of `to_s` on collections.

Pull-Request: #1385
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>
Reviewed-by: Alexandre Blondin Massé <alexandre.blondin.masse@gmail.com>
Reviewed-by: Romain Chanoir <chanoir.romain@courrier.uqam.ca>
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>

1  2 
lib/standard/file.nit
lib/standard/string.nit
tests/sav/nitserial_args1.res

diff --combined lib/standard/file.nit
@@@ -113,29 -113,30 +113,29 @@@ class FileReade
                        return
                end
                end_reached = false
 -              _buffer_pos = 0
 -              _buffer.clear
 +              buffer_reset
        end
  
        redef fun close
        do
                super
 -              _buffer.clear
 +              buffer_reset
                end_reached = true
        end
  
        redef fun fill_buffer
        do
 -              var nb = _file.io_read(_buffer.items, _buffer.capacity)
 +              var nb = _file.io_read(_buffer, _buffer_capacity)
                if nb <= 0 then
                        end_reached = true
                        nb = 0
                end
 -              _buffer.length = nb
 +              _buffer_length = nb
                _buffer_pos = 0
        end
  
        # End of file?
 -      redef var end_reached: Bool = false
 +      redef var end_reached = false
  
        # Open the file at `path` for reading.
        #
@@@ -178,23 -179,18 +178,23 @@@ class FileWrite
        super FileStream
        super Writer
  
 +      redef fun write_bytes(s) do
 +              if last_error != null then return
 +              if not _is_writable then
 +                      last_error = new IOError("cannot write to non-writable stream")
 +                      return
 +              end
 +              write_native(s.items, s.length)
 +      end
 +
        redef fun write(s)
        do
                if last_error != null then return
                if not _is_writable then
 -                      last_error = new IOError("Cannot write to non-writable stream")
 +                      last_error = new IOError("cannot write to non-writable stream")
                        return
                end
 -              if s isa FlatText then
 -                      write_native(s.to_cstring, s.length)
 -              else
 -                      for i in s.substrings do write_native(i.to_cstring, i.length)
 -              end
 +              for i in s.substrings do write_native(i.to_cstring, i.length)
        end
  
        redef fun write_byte(value)
@@@ -299,7 -295,7 +299,7 @@@ class Stdi
                prepare_buffer(1)
        end
  
 -      redef fun poll_in: Bool is extern "file_stdin_poll_in"
 +      redef fun poll_in is extern "file_stdin_poll_in"
  end
  
  # Standard output stream.
@@@ -439,12 -435,10 +439,12 @@@ class Pat
        # ~~~
        #
        # See `Reader::read_all` for details.
 -      fun read_all: String
 +      fun read_all: String do return read_all_bytes.to_s
 +
 +      fun read_all_bytes: Bytes
        do
                var s = open_ro
 -              var res = s.read_all
 +              var res = s.read_all_bytes
                s.close
                return res
        end
@@@ -1056,12 -1050,12 +1056,12 @@@ redef class NativeStrin
                struct stat* stat_element;
                int res;
                stat_element = malloc(sizeof(struct stat));
 -              res = lstat(recv, stat_element);
 +              res = lstat(self, stat_element);
                if (res == -1) return NULL;
                return stat_element;
        `}
        private fun file_mkdir: Bool is extern "string_NativeString_NativeString_file_mkdir_0"
 -      private fun rmdir: Bool `{ return !rmdir(recv); `}
 +      private fun rmdir: Bool `{ return !rmdir(self); `}
        private fun file_delete: Bool is extern "string_NativeString_NativeString_file_delete_0"
        private fun file_chdir: Bool is extern "string_NativeString_NativeString_file_chdir_0"
        private fun file_realpath: NativeString is extern "file_NativeString_realpath"
@@@ -1081,19 -1075,19 +1081,19 @@@ private extern class NativeFileStat `{ 
        fun size: Int is extern "file_FileStat_FileStat_size_0"
  
        # Returns true if it is a regular file (not a device file, pipe, sockect, ...)
 -      fun is_reg: Bool `{ return S_ISREG(recv->st_mode); `}
 +      fun is_reg: Bool `{ return S_ISREG(self->st_mode); `}
        # Returns true if it is a directory
 -      fun is_dir: Bool `{ return S_ISDIR(recv->st_mode); `}
 +      fun is_dir: Bool `{ return S_ISDIR(self->st_mode); `}
        # Returns true if it is a character device
 -      fun is_chr: Bool `{ return S_ISCHR(recv->st_mode); `}
 +      fun is_chr: Bool `{ return S_ISCHR(self->st_mode); `}
        # Returns true if it is a block device
 -      fun is_blk: Bool `{ return S_ISBLK(recv->st_mode); `}
 +      fun is_blk: Bool `{ return S_ISBLK(self->st_mode); `}
        # Returns true if the type is fifo
 -      fun is_fifo: Bool `{ return S_ISFIFO(recv->st_mode); `}
 +      fun is_fifo: Bool `{ return S_ISFIFO(self->st_mode); `}
        # Returns true if the type is a link
 -      fun is_lnk: Bool `{ return S_ISLNK(recv->st_mode); `}
 +      fun is_lnk: Bool `{ return S_ISLNK(self->st_mode); `}
        # Returns true if the type is a socket
 -      fun is_sock: Bool `{ return S_ISSOCK(recv->st_mode); `}
 +      fun is_sock: Bool `{ return S_ISSOCK(self->st_mode); `}
  end
  
  # Instance of this class are standard FILE * pointers
@@@ -1102,11 -1096,11 +1102,11 @@@ private extern class NativeFile `{ FILE
        fun io_write(buf: NativeString, len: Int): Int is extern "file_NativeFile_NativeFile_io_write_2"
        fun write_byte(value: Int): Int `{
                unsigned char b = (unsigned char)value;
 -              return fwrite(&b, 1, 1, recv);
 +              return fwrite(&b, 1, 1, self);
        `}
        fun io_close: Int is extern "file_NativeFile_NativeFile_io_close_0"
        fun file_stat: NativeFileStat is extern "file_NativeFile_NativeFile_file_stat_0"
 -      fun fileno: Int `{ return fileno(recv); `}
 +      fun fileno: Int `{ return fileno(self); `}
        # Flushes the buffer, forcing the write operation
        fun flush: Int is extern "fflush"
        # Used to specify how the buffering will be handled for the current stream.
@@@ -1126,12 -1120,12 +1126,12 @@@ private extern class NativeDir `{ DIR* 
        new opendir(path: NativeString) `{ return opendir(path); `}
  
        # Close a directory
 -      fun closedir `{ closedir(recv); `}
 +      fun closedir `{ closedir(self); `}
  
        # Read the next directory entry
        fun readdir: NativeString `{
                struct dirent *de;
 -              de = readdir(recv);
 +              de = readdir(self);
                if (!de) return NULL;
                return de->d_name;
        `}
@@@ -1236,7 -1230,7 +1236,7 @@@ en
  # Print `objects` on the standard output (`stdout`).
  fun printn(objects: Object...)
  do
-       sys.stdout.write(objects.to_s)
+       sys.stdout.write(objects.plain_to_s)
  end
  
  # Print an `object` on the standard output (`stdout`) and add a newline.
diff --combined lib/standard/string.nit
@@@ -249,16 -249,6 +249,16 @@@ abstract class Tex
        #     assert "ff".to_hex == 255
        fun to_hex: Int do return a_to(16)
  
 +      # If `self` contains only digits <= '7', return the corresponding integer.
 +      #
 +      #     assert "714".to_oct == 460
 +      fun to_oct: Int do return a_to(8)
 +
 +      # If `self` contains only '0' et '1', return the corresponding integer.
 +      #
 +      #     assert "101101".to_bin == 45
 +      fun to_bin: Int do return a_to(2)
 +
        # If `self` contains only digits and letters, return the corresponding integer in a given base
        #
        #     assert "120".a_to(3)     == 15
        #
        # REQUIRE: `n` must be large enough to contain `len` bytes
        #
 -      #       var ns = new NativeString(8)
 -      #       "Text is String".copy_to_native(ns, 8, 2, 0)
 +      #       var ns = new NativeString(8)
 +      #       "Text is String".copy_to_native(ns, 8, 2, 0)
        #       assert ns.to_s_with_length(8) == "xt is St"
        #
        fun copy_to_native(dest: NativeString, n, src_offset, dest_offset: Int) do
@@@ -945,7 -935,7 +945,7 @@@ abstract class FlatTex
        # copy locally the char* as Nit Strings are immutable.
        private fun fast_cstring: NativeString is abstract
  
 -      redef var length: Int = 0
 +      redef var length = 0
  
        redef fun output
        do
@@@ -1194,7 -1184,7 +1194,7 @@@ class FlatStrin
        # Indes in _items of the last item of the string
        private var index_to: Int is noinit
  
 -      redef var chars: SequenceRead[Char] = new FlatStringCharView(self) is lazy
 +      redef var chars = new FlatStringCharView(self) is lazy
  
        redef fun [](index)
        do
                index_to = to
        end
  
 -      redef fun to_cstring: NativeString
 -      do
 +      redef fun to_cstring do
                if real_items != null then
                        return real_items.as(not null)
                else
@@@ -1737,7 -1728,8 +1737,7 @@@ class FlatBuffe
                capacity = c
        end
  
 -      redef fun to_s: String
 -      do
 +      redef fun to_s do
                written = true
                if length == 0 then items = new NativeString(1)
                return new FlatString.with_infos(items, length, 0, length - 1)
@@@ -2228,6 -2220,12 +2228,12 @@@ redef class Collection[E
        # Concatenate elements.
        redef fun to_s
        do
+               return plain_to_s
+       end
+       # Concatenate element without separators
+       fun plain_to_s: String
+       do
                var s = new FlatBuffer
                for e in self do if e != null then s.append(e.to_s)
                return s.to_s
@@@ -2263,7 -2261,7 +2269,7 @@@ en
  redef class Array[E]
  
        # Fast implementation
-       redef fun to_s
+       redef fun plain_to_s
        do
                var l = length
                if l == 0 then return ""
@@@ -9,10 -9,12 +9,10 @@@ redef class Deserialize
        redef fun deserialize_class(name)
        do
                # Module: test_serialization
-               if name == "Array[Object]" then return new Array[Object].from_deserializer(self)
+               if name == "Array[String]" then return new Array[String].from_deserializer(self)
                if name == "Array[nullable Object]" then return new Array[nullable Object].from_deserializer(self)
                if name == "Array[Serializable]" then return new Array[Serializable].from_deserializer(self)
-               if name == "Array[String]" then return new Array[String].from_deserializer(self)
+               if name == "Array[Object]" then return new Array[Object].from_deserializer(self)
 -              if name == "HashMap[Serializable, Array[Couple[Serializable, Int]]]" then return new HashMap[Serializable, Array[Couple[Serializable, Int]]].from_deserializer(self)
 -              if name == "Array[Couple[Serializable, Int]]" then return new Array[Couple[Serializable, Int]].from_deserializer(self)
                return super
        end
  end