| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a | 
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. | 
| 4 | 4 | 
| 5 part of serialization; | 5 part of serialization; | 
| 6 | 6 | 
| 7 /** | 7 /** | 
| 8  * This writes out the state of the objects to an external format. It holds | 8  * This writes out the state of the objects to an external format. It holds | 
| 9  * all of the intermediate state needed. The primary API for it is the | 9  * all of the intermediate state needed. The primary API for it is the | 
| 10  * [write] method. | 10  * [write] method. | 
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 219   int _objectNumberFor(object) { | 219   int _objectNumberFor(object) { | 
| 220     var reference = references[object]; | 220     var reference = references[object]; | 
| 221     return (reference == null) ? -1 : reference.objectNumber; | 221     return (reference == null) ? -1 : reference.objectNumber; | 
| 222   } | 222   } | 
| 223 | 223 | 
| 224   /** | 224   /** | 
| 225    * Return the serialized data in string format. Currently hard-coded to | 225    * Return the serialized data in string format. Currently hard-coded to | 
| 226    * our custom JSON format. | 226    * our custom JSON format. | 
| 227    */ | 227    */ | 
| 228   String toStringFormat() { | 228   String toStringFormat() { | 
| 229     return JSON.stringify(toMaps()); | 229     return json.stringify(toMaps()); | 
| 230   } | 230   } | 
| 231 | 231 | 
| 232   /** | 232   /** | 
| 233    * Returns the full serialized structure as nested maps. The top-level | 233    * Returns the full serialized structure as nested maps. The top-level | 
| 234    * has 3 fields, "rules" which may hold a definition of the rules used, | 234    * has 3 fields, "rules" which may hold a definition of the rules used, | 
| 235    * "data" which holds the serialized data, and "roots", which holds | 235    * "data" which holds the serialized data, and "roots", which holds | 
| 236    * [Reference] objects indicating the root objects. Note that roots are | 236    * [Reference] objects indicating the root objects. Note that roots are | 
| 237    * necessary because the data is organized in the same way as the object | 237    * necessary because the data is organized in the same way as the object | 
| 238    * structure, it's a list of lists holding self-contained maps which only | 238    * structure, it's a list of lists holding self-contained maps which only | 
| 239    * refer to other parts via [Reference] objects. | 239    * refer to other parts via [Reference] objects. | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 253     result["data"] = states; | 253     result["data"] = states; | 
| 254     result["roots"] = _rootReferences(trace.roots); | 254     result["roots"] = _rootReferences(trace.roots); | 
| 255     return result; | 255     return result; | 
| 256   } | 256   } | 
| 257 | 257 | 
| 258   /** | 258   /** | 
| 259    * Return a list of [Reference] objects pointing to our roots. This will be | 259    * Return a list of [Reference] objects pointing to our roots. This will be | 
| 260    * stored in the output under "roots" in the default format. | 260    * stored in the output under "roots" in the default format. | 
| 261    */ | 261    */ | 
| 262   _rootReferences(roots) => | 262   _rootReferences(roots) => | 
| 263     roots.map(_referenceFor); | 263     roots.mappedBy(_referenceFor).toList(); | 
| 264 | 264 | 
| 265   /** | 265   /** | 
| 266    * Given an object, return a reference for it if one exists. If there's | 266    * Given an object, return a reference for it if one exists. If there's | 
| 267    * no reference, return null. Once we have finished the tracing step, all | 267    * no reference, return null. Once we have finished the tracing step, all | 
| 268    * objects that should have a reference (roughly speaking, non-primitives) | 268    * objects that should have a reference (roughly speaking, non-primitives) | 
| 269    * can be relied on to have a reference. | 269    * can be relied on to have a reference. | 
| 270    */ | 270    */ | 
| 271   _referenceFor(object) => references[object]; | 271   _referenceFor(object) => references[object]; | 
| 272 | 272 | 
| 273   /** | 273   /** | 
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 362    */ | 362    */ | 
| 363   List<SerializationRule> get rules => serialization._rules; | 363   List<SerializationRule> get rules => serialization._rules; | 
| 364 | 364 | 
| 365   /** | 365   /** | 
| 366    * Internal use only, for testing purposes. Set the data for this reader | 366    * Internal use only, for testing purposes. Set the data for this reader | 
| 367    * to a List of Lists whose size must match the number of rules. | 367    * to a List of Lists whose size must match the number of rules. | 
| 368    */ | 368    */ | 
| 369   // When we set the data, initialize the object storage to a matching size. | 369   // When we set the data, initialize the object storage to a matching size. | 
| 370   void set data(List<List> newData) { | 370   void set data(List<List> newData) { | 
| 371     _data = newData; | 371     _data = newData; | 
| 372     objects = _data.map((x) => new List(x.length)); | 372     objects = _data.mappedBy((x) => new List(x.length)).toList(); | 
| 373   } | 373   } | 
| 374 | 374 | 
| 375   /** | 375   /** | 
| 376    * This is the primary method for a [Reader]. It takes the input data, | 376    * This is the primary method for a [Reader]. It takes the input data, | 
| 377    * currently hard-coded to expect our custom JSON format, and returns | 377    * currently hard-coded to expect our custom JSON format, and returns | 
| 378    * the root object. | 378    * the root object. | 
| 379    */ | 379    */ | 
| 380   read(String input, [Map externals = const {}]) { | 380   read(String input, [Map externals = const {}]) { | 
| 381     namedObjects = externals; | 381     namedObjects = externals; | 
| 382     var topLevel = JSON.parse(input); | 382     var topLevel = json.parse(input); | 
| 383     var ruleString = topLevel["rules"]; | 383     var ruleString = topLevel["rules"]; | 
| 384     readRules(ruleString, externals); | 384     readRules(ruleString, externals); | 
| 385     data = topLevel["data"]; | 385     data = topLevel["data"]; | 
| 386     rules.forEach(inflateForRule); | 386     rules.forEach(inflateForRule); | 
| 387     var roots = topLevel["roots"]; | 387     var roots = topLevel["roots"]; | 
| 388     return inflateReference(roots.first); | 388     return inflateReference(roots.first); | 
| 389   } | 389   } | 
| 390 | 390 | 
| 391   /** | 391   /** | 
| 392    * If the data we are reading from has rules written to it, read them back | 392    * If the data we are reading from has rules written to it, read them back | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 408    * of fixing and generalization. | 408    * of fixing and generalization. | 
| 409    */ | 409    */ | 
| 410   readFlat(List input, [Map externals = const {}]) { | 410   readFlat(List input, [Map externals = const {}]) { | 
| 411     // TODO(alanknight): Way too much code duplication with read. Numerous | 411     // TODO(alanknight): Way too much code duplication with read. Numerous | 
| 412     // code smells. | 412     // code smells. | 
| 413     namedObjects = externals; | 413     namedObjects = externals; | 
| 414     var topLevel = input; | 414     var topLevel = input; | 
| 415     var ruleString = topLevel[0]; | 415     var ruleString = topLevel[0]; | 
| 416     readRules(ruleString, externals); | 416     readRules(ruleString, externals); | 
| 417     var flatData = topLevel[1]; | 417     var flatData = topLevel[1]; | 
| 418     var stream = flatData.iterator(); | 418     var stream = flatData.iterator; | 
| 419     var tempData = new List(rules.length); | 419     var tempData = new List(rules.length); | 
| 420      for (var eachRule in rules) { | 420      for (var eachRule in rules) { | 
| 421        tempData[eachRule.number] = eachRule.pullStateFrom(stream); | 421        tempData[eachRule.number] = eachRule.pullStateFrom(stream); | 
| 422     } | 422     } | 
| 423     data = tempData; | 423     data = tempData; | 
| 424     for (var eachRule in rules) { | 424     for (var eachRule in rules) { | 
| 425       inflateForRule(eachRule); | 425       inflateForRule(eachRule); | 
| 426     } | 426     } | 
| 427     var rootsAsInts = topLevel[2]; | 427     var rootsAsInts = topLevel[2]; | 
| 428     var rootStream = rootsAsInts.iterator(); | 428     var rootStream = rootsAsInts.iterator; | 
| 429     var roots = new List(); | 429     var roots = new List(); | 
| 430     while (rootStream.hasNext) { | 430     while (rootStream.moveNext()) { | 
| 431       roots.add(new Reference(this, rootStream.next(), rootStream.next())); | 431       var first = rootStream.current; | 
|  | 432       rootStream.moveNext(); | 
|  | 433       var second = rootStream.current; | 
|  | 434       roots.add(new Reference(this, first, second)); | 
| 432     } | 435     } | 
| 433     var x = inflateReference(roots[0]); | 436     var x = inflateReference(roots[0]); | 
| 434     return inflateReference(roots.first); | 437     return inflateReference(roots.first); | 
| 435   } | 438   } | 
| 436 | 439 | 
| 437   /** | 440   /** | 
| 438    * Inflate all of the objects for [rule]. Does the essential state for all | 441    * Inflate all of the objects for [rule]. Does the essential state for all | 
| 439    * objects first, then the non-essential state. This avoids cycles in | 442    * objects first, then the non-essential state. This avoids cycles in | 
| 440    * non-essential state, because all the objects will have already been | 443    * non-essential state, because all the objects will have already been | 
| 441    * created. | 444    * created. | 
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 639  * found for it. This normally only makes sense if the object is uniquely | 642  * found for it. This normally only makes sense if the object is uniquely | 
| 640  * referenced, and is a more or less internal collection. See ListRuleEssential | 643  * referenced, and is a more or less internal collection. See ListRuleEssential | 
| 641  * for an example. It knows how to return its object and how to filter. | 644  * for an example. It knows how to return its object and how to filter. | 
| 642  */ | 645  */ | 
| 643 class DesignatedRuleForObject { | 646 class DesignatedRuleForObject { | 
| 644   Function rulePredicate; | 647   Function rulePredicate; | 
| 645   final target; | 648   final target; | 
| 646 | 649 | 
| 647   DesignatedRuleForObject(this.target, this.rulePredicate); | 650   DesignatedRuleForObject(this.target, this.rulePredicate); | 
| 648 | 651 | 
| 649   possibleRules(List rules) => rules.filter(rulePredicate); | 652   possibleRules(List rules) => rules.where(rulePredicate).toList(); | 
| 650 } | 653 } | 
| OLD | NEW | 
|---|