Index: dart/lib/compiler/implementation/util/util.dart |
diff --git a/dart/lib/compiler/implementation/util/util.dart b/dart/lib/compiler/implementation/util/util.dart |
index b39bd461920b19bda11a3c59cc85923cc0dc0f8a..b4ce267a9cf6403898472c647deaa51b5b29d532 100644 |
--- a/dart/lib/compiler/implementation/util/util.dart |
+++ b/dart/lib/compiler/implementation/util/util.dart |
@@ -5,6 +5,7 @@ |
library org_dartlang_compiler_util; |
import 'util_implementation.dart'; |
+import 'characters.dart'; |
part 'link.dart'; |
@@ -22,3 +23,53 @@ class SpannableAssertionFailure { |
String toString() => 'compiler crashed.'; |
} |
+ |
+/// Writes the characters of [iterator] on [buffer]. The characters |
+/// are escaped as suitable for JavaScript and JSON. [buffer] is |
+/// anything which supports [:add:] and [:addCharCode:], for example, |
+/// [StringBuffer]. |
+void writeJsonEscapedCharsOn(Iterator<int> iterator, buffer, onError(code)) { |
+ while (iterator.hasNext) { |
+ int code = iterator.next(); |
+ if (identical(code, $SQ)) { |
+ buffer.add(r"\'"); |
+ } else if (identical(code, $LF)) { |
+ buffer.add(r'\n'); |
+ } else if (identical(code, $CR)) { |
+ buffer.add(r'\r'); |
+ } else if (identical(code, $LS)) { |
+ // This Unicode line terminator and $PS are invalid in JS string |
+ // literals. |
+ buffer.add(r'\u2028'); |
+ } else if (identical(code, $PS)) { |
+ buffer.add(r'\u2029'); |
+ } else if (identical(code, $BACKSLASH)) { |
+ buffer.add(r'\\'); |
+ } else { |
+ if (code > 0xffff) { |
+ if (onError != null) onError(code); |
+ throw 'Unhandled non-BMP character: ${code.toRadixString(16)}'; |
+ } |
+ // TODO(lrn): Consider whether all codes above 0x7f really need to |
+ // be escaped. We build a Dart string here, so it should be a literal |
+ // stage that converts it to, e.g., UTF-8 for a JS interpreter. |
+ if (code < 0x20) { |
+ buffer.add(r'\x'); |
+ if (code < 0x10) buffer.add('0'); |
+ buffer.add(code.toRadixString(16)); |
+ } else if (code >= 0x80) { |
+ if (code < 0x100) { |
+ buffer.add(r'\x'); |
+ } else { |
+ buffer.add(r'\u'); |
+ if (code < 0x1000) { |
+ buffer.add('0'); |
+ } |
+ } |
+ buffer.add(code.toRadixString(16)); |
+ } else { |
+ buffer.addCharCode(code); |
+ } |
+ } |
+ } |
+} |