| 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);
|
| + }
|
| + }
|
| + }
|
| +}
|
|
|