Chromium Code Reviews| Index: sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart |
| diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart |
| index ad7b2b055f31b680a7b176a195af55da1fb5f454..5e7575bd1a987f9def335be6cb086396d34699da 100644 |
| --- a/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart |
| +++ b/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart |
| @@ -84,6 +84,26 @@ class ConstantEmitter implements ConstantVisitor { |
| buffer.add("false"); |
| } |
| + void addHexEscape(CodeBuffer buffer, int code) { |
| + assert(code < 0x10000); |
| + if (code < 0x20) { |
| + buffer.add(r'\x'); |
| + if (code < 0x10) buffer.add('0'); |
| + buffer.add(code.toRadixString(16)); |
| + } else { |
| + if (code < 0x100) { |
| + assert(code >= 0x80); |
| + buffer.add(r'\x'); |
| + } else { |
| + buffer.add(r'\u'); |
| + if (code < 0x1000) { |
| + buffer.add('0'); |
| + } |
| + } |
| + buffer.add(code.toRadixString(16)); |
| + } |
| + } |
| + |
| /** |
| * Write the contents of the quoted string to a [CodeBuffer] in |
| * a form that is valid as JavaScript string literal content. |
| @@ -104,34 +124,25 @@ class ConstantEmitter implements ConstantVisitor { |
| } else if (identical(code, $LS)) { |
| // This Unicode line terminator and $PS are invalid in JS string |
| // literals. |
| - buffer.add(r'\u2028'); |
| + addHexEscape(buffer, 0x2028); |
| } else if (identical(code, $PS)) { |
| - buffer.add(r'\u2029'); |
| + addHexEscape(buffer, 0x2029); |
| } else if (identical(code, $BACKSLASH)) { |
| buffer.add(r'\\'); |
| } else { |
| - if (code > 0xffff) { |
| - compiler.reportError( |
| - diagnosticNode, |
| - 'Unhandled non-BMP character: U+${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)); |
| + addHexEscape(buffer, code); |
| } else if (code >= 0x80) { |
| - if (code < 0x100) { |
| - buffer.add(r'\x'); |
| + // 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 >= 0x10000) { |
|
floitsch
2012/11/08 15:28:21
Why not move the surrogate-code into addHexEscape?
erikcorry
2012/11/15 13:28:25
This part has all been rewritten with the new JSON
|
| + // Surrogate pair. |
| + addHexEscape(buffer, 0xd800 + (((code - 0x10000) >> 10) & 0x3ff)); |
| + addHexEscape(buffer, 0xdc00 + (code & 0x3ff)); |
| } else { |
| - buffer.add(r'\u'); |
| - if (code < 0x1000) { |
| - buffer.add('0'); |
| - } |
| + addHexEscape(buffer, code); |
| } |
| - buffer.add(code.toRadixString(16)); |
| } else { |
| buffer.addCharCode(code); |
| } |