Index: sdk/lib/convert/json.dart |
diff --git a/sdk/lib/convert/json.dart b/sdk/lib/convert/json.dart |
index fa0886d7f3b535a654ac7b02fc43bee83c73137f..7d5f929fdda5c49a8986b761637d88cd852c11a9 100644 |
--- a/sdk/lib/convert/json.dart |
+++ b/sdk/lib/convert/json.dart |
@@ -693,9 +693,10 @@ abstract class _JsonStringifier { |
return true; |
} else if (object is Map) { |
_checkCycle(object); |
- writeMap(object); |
+ // writeMap can fail if keys are not all strings. |
+ var result = writeMap(object); |
Søren Gjesse
2015/05/26 14:54:00
result -> success
|
_removeSeen(object); |
- return true; |
+ return result; |
} else { |
return false; |
} |
@@ -715,17 +716,29 @@ abstract class _JsonStringifier { |
} |
/** Serializes a [Map]. */ |
- void writeMap(Map<String, Object> map) { |
+ bool writeMap(Map<String, Object> map) { |
+ List keyValueList = new List(map.length * 2); |
+ int i = 0; |
+ bool allStringKeys = true; |
+ map.forEach((key, value) { |
+ if (key is! String) { |
+ allStringKeys = false; |
+ } |
+ keyValueList[i++] = key; |
+ keyValueList[i++] = value; |
+ }); |
+ if (!allStringKeys) return false; |
writeString('{'); |
String separator = '"'; |
- map.forEach((String key, value) { |
+ for (int i = 0; i < keyValueList.length; i += 2) { |
writeString(separator); |
separator = ',"'; |
- writeStringContent(key); |
+ writeStringContent(keyValueList[i]); |
writeString('":'); |
- writeObject(value); |
- }); |
+ writeObject(keyValueList[i + 1]); |
+ } |
writeString('}'); |
+ return true; |
} |
} |