Merge: Nitsmell : Adding new code smells and print console updated
[nit.git] / lib / binary / serialization.nit
index a530ebf..ddb87ad 100644 (file)
@@ -25,7 +25,7 @@
 #        | 0x06 utf8 byte sequence # Char
 #        | 0x07 double(64 bits)    # Float
 #        | 0x08 block              # String
-#        | 0x09 block              # NativeString
+#        | 0x09 block              # CString
 #        | 0x0A flat_array;        # Array[nullable Object]
 #
 # block = int64 int8*;
@@ -53,7 +53,7 @@ private fun kind_bool: Byte do return 0x05u8
 private fun kind_char: Byte do return 0x06u8
 private fun kind_float: Byte do return 0x07u8
 private fun kind_string: Byte do return 0x08u8
-private fun kind_native_string: Byte do return 0x09u8
+private fun kind_c_string: Byte do return 0x09u8
 private fun kind_flat_array: Byte do return 0x0Au8
 
 private fun new_object_end: Byte do return 0x00u8
@@ -70,6 +70,8 @@ class BinarySerializer
        # Target writing stream
        var stream: Writer is writable
 
+       redef var current_object = null
+
        redef fun serialize(object)
        do
                if object == null then
@@ -92,7 +94,10 @@ class BinarySerializer
                        stream.write_int64 id
                else
                        # serialize here
+                       var last_object = current_object
+                       current_object = object
                        object.serialize_to_binary self
+                       current_object = last_object
                end
        end
 
@@ -129,7 +134,7 @@ class BinaryDeserializer
        private var unclaimed_attributes = new UnrolledList[HashMap[String, nullable Object]]
 
        # Buffer for one char
-       private var char_buf: NativeString is lazy do return new NativeString(4)
+       private var char_buf: CString is lazy do return new CString(4)
 
        # Read and deserialize the next attribute name and value
        #
@@ -153,7 +158,7 @@ class BinaryDeserializer
                return new Couple[String, nullable Object](next_attribute_name, next_object)
        end
 
-       redef fun deserialize_attribute(name)
+       redef fun deserialize_attribute(name, static_type)
        do
                if unclaimed_attributes.last.keys.has(name) then
                        # Pick in already deserialized attributes
@@ -178,7 +183,7 @@ class BinaryDeserializer
 
                        # An invalid attribute name is an heuristic for invalid data.
                        # Hitting an object end marker will result in an empty string.
-                       assert next_attribute_name.is_valid_id else
+                       if not next_attribute_name.is_valid_id then
 
                                var error
                                if next_attribute_name.is_empty then
@@ -230,10 +235,10 @@ class BinaryDeserializer
                                if b == null then return '�'
                                bf[i] = b
                        end
-                       return bf.to_s_with_length(ln)[0]
+                       return bf.to_s_unsafe(ln, copy=false)[0]
                end
                if kind == kind_string then return stream.read_block
-               if kind == kind_native_string then return stream.read_block.to_cstring
+               if kind == kind_c_string then return stream.read_block.to_cstring
 
                if kind == kind_flat_array then
                        # An array
@@ -304,7 +309,7 @@ class BinaryDeserializer
                return null
        end
 
-       redef fun deserialize
+       redef fun deserialize(static_type)
        do
                errors.clear
 
@@ -366,7 +371,7 @@ redef class Serializable
        private fun serialize_to_binary(v: BinarySerializer)
        do
                serialize_header_to_binary v
-               core_serialize_to v
+               v.serialize_core self
                v.stream.write_byte new_object_end
        end
 end
@@ -403,10 +408,10 @@ redef class Char
        end
 end
 
-redef class NativeString
+redef class CString
        redef fun serialize_to_binary(v)
        do
-               v.stream.write_byte kind_native_string
+               v.stream.write_byte kind_c_string
                v.stream.write_block to_s
        end
 end
@@ -454,7 +459,7 @@ redef class Map[K, V]
        do
                serialize_header_to_binary v
 
-               core_serialize_to v
+               v.serialize_core self
 
                v.stream.write_string "keys"
                v.serialize_flat_array keys