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 |