Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(487)

Side by Side Diff: pkg/serialization/lib/src/format.dart

Issue 12210151: Fix modification of map while iterating in SimpleJsonFormat (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Changes from review comments Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « pkg/pkg.status ('k') | pkg/serialization/test/serialization_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 part of serialization; 1 part of serialization;
2 2
3 /** 3 /**
4 * An abstract class for serialization formats. Subclasses define how data 4 * An abstract class for serialization formats. Subclasses define how data
5 * is read or written to a particular output mechanism. 5 * is read or written to a particular output mechanism.
6 */ 6 */
7 abstract class Format { 7 abstract class Format {
8 /** 8 /**
9 * Return true if this format stores primitives in their own area and uses 9 * Return true if this format stores primitives in their own area and uses
10 * references to them (e.g. [SimpleFlatFormat]) and false if primitives 10 * references to them (e.g. [SimpleFlatFormat]) and false if primitives
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 if (storeRoundTripInfo) each[RULE] = rule.number; 147 if (storeRoundTripInfo) each[RULE] = rule.number;
148 } 148 }
149 } 149 }
150 } 150 }
151 151
152 /** 152 /**
153 * For one particular entry, which is either a Map or a List, update it 153 * For one particular entry, which is either a Map or a List, update it
154 * to turn References into a nested List/Map. 154 * to turn References into a nested List/Map.
155 */ 155 */
156 jsonifyEntry(map, Writer w) { 156 jsonifyEntry(map, Writer w) {
157 // Note, if this is a Map, and the key might be a reference, we need to
158 // bend over backwards to avoid concurrent modifications. Non-string keys
159 // won't actually work if we try to write this to json, but might happen
160 // if e.g. sending between isolates.
161 var updates = new Map();
157 keysAndValues(map).forEach((key, value) { 162 keysAndValues(map).forEach((key, value) {
158 if (value is Reference) map[key] = w.stateForReference(value); 163 if (value is Reference) updates[key] = w.stateForReference(value);
159 }); 164 });
165 updates.forEach((k, v) => map[k] = v);
160 } 166 }
161 167
162 /** 168 /**
163 * Read serialized data saved in this format, which should look like 169 * Read serialized data saved in this format, which should look like
164 * either a simple type, a List or a Map and return the Map 170 * either a simple type, a List or a Map and return the Map
165 * representation that the reader expects, with top-level 171 * representation that the reader expects, with top-level
166 * entries for "rules", "data", and "roots". Nested lists/maps will be 172 * entries for "rules", "data", and "roots". Nested lists/maps will be
167 * converted into Reference objects. Note that if the data was not written 173 * converted into Reference objects. Note that if the data was not written
168 * with [storeRoundTripInfo] true this will fail. 174 * with [storeRoundTripInfo] true this will fail.
169 */ 175 */
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 return new Reference(r, a, b); 462 return new Reference(r, a, b);
457 } 463 }
458 } 464 }
459 465
460 /** Return the next element from the input. */ 466 /** Return the next element from the input. */
461 _next(Iterator input) { 467 _next(Iterator input) {
462 input.moveNext(); 468 input.moveNext();
463 return input.current; 469 return input.current;
464 } 470 }
465 } 471 }
OLDNEW
« no previous file with comments | « pkg/pkg.status ('k') | pkg/serialization/test/serialization_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698