Merge: serialization: safe formal types, fix warnings in generated code and more
authorJean Privat <jean@pryen.org>
Wed, 2 Aug 2017 18:17:06 +0000 (14:17 -0400)
committerJean Privat <jean@pryen.org>
Wed, 2 Aug 2017 18:17:06 +0000 (14:17 -0400)
* Use `GetName` to better restrict the accepted static type for attributes with formal types. This should complete the protection against the injection of unexpected types through deserialization (reported by @ppepos).
* Update `nitserial` to intrude import modules with private serializable classes, instead of skipping them. Serializing private classes from the lib should probably be avoided, but at least now we support them and we can see them.
* Fix the deserialization of maps from JSON with metadata and cycles. A difference in the deserialization order could cause a reference to be read before the referenced object. This issue may still be caused by versionning, so a foolproof solution should probably be added to the JSON deserializer.
* Fix a warning in generated code, it was generated for each `serialize` class (quite a lot). It caused 25 warnings just in lib/github/api.nit.
* Implement serialization for the private classes of `core::queue` and don't crash on deserialization errors in `a_star`.

Pull-Request: #2531
Reviewed-by: Jean Privat <jean@pryen.org>

1  2 
lib/a_star.nit

diff --combined lib/a_star.nit
@@@ -90,7 -90,7 +90,7 @@@ class Nod
        # lifetime limited to evocation of `path_to`
        private var open: Bool = false
  
 -      # Main functionnality, returns path from `self` to `dest`
 +      # Main functionality, returns path from `self` to `dest`
        fun path_to(dest: N, max_cost: Int, context: PathContext): nullable AStarPath[N]
        do
                return path_to_alts(dest, max_cost, context, null)
        do
                deserializer.notify_of_creation self
  
-               var graph = deserializer.deserialize_attribute("graph")
-               assert graph isa Graph[N, Link]
+               var graph = deserializer.deserialize_attribute("graph", (new GetName[Graph[N, Link]]).to_s)
+               if not graph isa Graph[N, Link] then graph = new Graph[N, Link]
                self.graph = graph
        end
  end
@@@ -247,10 -247,10 +247,10 @@@ class Graph[N: Node, L: Link
        super Serializable
  
        # Nodes in this graph
-       var nodes: Set[N] = new HashSet[N]
+       var nodes = new Set[N]
  
        # Links in this graph
-       var links: Set[L] = new HashSet[L]
+       var links = new Set[L]
  
        # Add a `node` to this graph
        fun add_node(node: N): N
        do
                deserializer.notify_of_creation self
  
-               var nodes = deserializer.deserialize_attribute("nodes")
-               assert nodes isa HashSet[N]
-               self.nodes = nodes
+               var nodes = deserializer.deserialize_attribute("nodes", (new GetName[Set[N]]).to_s)
+               if deserializer.deserialize_attribute_missing then
+                       deserializer.errors.add new AttributeMissingError(self, "nodes")
+               end
+               if nodes isa Set[N] then self.nodes = nodes
  
-               var links = deserializer.deserialize_attribute("links")
-               assert links isa HashSet[L]
-               for link in links do add_link link
+               var links = deserializer.deserialize_attribute("links", (new GetName[Set[L]]).to_s)
+               if deserializer.deserialize_attribute_missing then
+                       deserializer.errors.add new AttributeMissingError(self, "links")
+               end
+               if links isa Set[L] then for link in links do add_link link
        end
  end