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

Unified Diff: tools/ddbg.dart

Issue 10914009: Make JSON.stringify call toJson() on objects that it can't serialize. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Made JSON.length disappear. Created 8 years, 3 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 side-by-side diff with in-line comments
Download patch
« lib/json/json.dart ('K') | « tests/json/json_test.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/ddbg.dart
diff --git a/tools/ddbg.dart b/tools/ddbg.dart
index eda2a19db477409a514cd676aa7614e79c90cdfa..7bef6048c61a078debdadc451520a3bf5809528d 100644
--- a/tools/ddbg.dart
+++ b/tools/ddbg.dart
@@ -412,7 +412,7 @@ void processVmData(String data) {
} else {
vmData = vmData.concat(data);
}
- int msg_len = JSON.length(vmData);
+ int msg_len = jsonObjectLength(vmData);
if (printMessages && msg_len == 0) {
print("have partial or illegal json message"
" of ${vmData.length} chars:\n'$vmData'");
@@ -430,11 +430,57 @@ void processVmData(String data) {
if (printMessages) { print("first message: $msg"); }
processVmMessage(msg);
vmData = vmData.substring(msg_len);
- msg_len = JSON.length(vmData);
+ msg_len = jsonObjectLength(vmData);
}
if (printMessages) { print("leftover vm data '$vmData'"); }
}
+/**
+ * Skip past a JSON object value.
+ * The object value must start with '{' and continues to the
+ * matching '}'. No attempt is made to otherwise validate the contents
+ * as JSON. If it is invalid, a later [JSON.parse] will fail.
+ */
+int jsonObjectLength(String string) {
+ int skipWhitespace(int index) {
+ while (index < string.length) {
+ String char = string[index];
+ if (char != " " && char != "\n" && char != "\r" && char != "\t") break;
+ index++;
+ }
+ return index;
+ }
+ int skipString(int index) {
+ assert(string[index - 1] == '"');
+ while (index < string.length) {
+ String char = string[index];
+ if (char == '"') return index + 1;
+ if (char == @'\') index++;
+ if (index == string.length) return index;
+ index++;
+ }
+ return index;
+ }
+ int index = 0;
+ index = skipWhitespace(index);
+ // Bail out if the first non-whitespace character isn't '{'.
+ if (index == string.length || string[index] != '{') return 0;
+ int nexting = 0;
+ while (index < string.length) {
+ String char = string[index++];
+ if (char == '{') {
+ nexting++;
+ } else if (char == '}') {
+ nexting--;
+ if (nexting == 0) return index;
+ } else if (char == '"') {
+ // Strings can contain braces. Skip their content.
+ index = skipString(index);
+ }
+ }
+ return 0;
+}
+
void main() {
outstandingCommands = new Map<int, Completer>();
« lib/json/json.dart ('K') | « tests/json/json_test.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698