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

Unified Diff: lib/compiler/implementation/js_backend/constant_emitter.dart

Issue 10915083: Change assert implementation to not depend on a top-level function called 'assert'. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address review comments. 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
Index: lib/compiler/implementation/js_backend/constant_emitter.dart
diff --git a/lib/compiler/implementation/js_backend/constant_emitter.dart b/lib/compiler/implementation/js_backend/constant_emitter.dart
deleted file mode 100644
index 0deca511506e520c03f7f7743bb3ea8d083cbf20..0000000000000000000000000000000000000000
--- a/lib/compiler/implementation/js_backend/constant_emitter.dart
+++ /dev/null
@@ -1,252 +0,0 @@
-// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class ConstantEmitter implements ConstantVisitor {
- final Compiler compiler;
- final Namer namer;
-
- CodeBuffer buffer;
- bool shouldEmitCanonicalVersion;
-
- ConstantEmitter(this.compiler, this.namer);
-
- /**
- * Unless the constant can be emitted multiple times (as for numbers and
- * strings) use the canonical name.
- */
- void emitCanonicalVersionOfConstant(Constant constant, CodeBuffer newBuffer) {
- shouldEmitCanonicalVersion = true;
- buffer = newBuffer;
- _visit(constant);
- }
-
- /**
- * Emit the JavaScript code of the constant. If the constant must be
- * canonicalized this method emits the initialization value.
- */
- void emitJavaScriptCodeForConstant(Constant constant, CodeBuffer newBuffer) {
- shouldEmitCanonicalVersion = false;
- buffer = newBuffer;
- _visit(constant);
- }
-
- _visit(Constant constant) {
- constant.accept(this);
- }
-
- void visitSentinel(SentinelConstant constant) {
- if (shouldEmitCanonicalVersion) {
- buffer.add(namer.CURRENT_ISOLATE);
- } else {
- compiler.internalError(
- "The parameter sentinel constant does not need specific JS code");
- }
- }
-
- void visitFunction(FunctionConstant constant) {
- if (shouldEmitCanonicalVersion) {
- buffer.add(namer.isolatePropertiesAccess(constant.element));
- } else {
- compiler.internalError(
- "The function constant does not need specific JS code");
- }
- }
-
- void visitNull(NullConstant constant) {
- buffer.add("null");
- }
-
- void visitInt(IntConstant constant) {
- buffer.add(constant.value.toString());
- }
-
- void visitDouble(DoubleConstant constant) {
- double value = constant.value;
- if (value.isNaN()) {
- buffer.add("(0/0)");
- } else if (value == double.INFINITY) {
- buffer.add("(1/0)");
- } else if (value == -double.INFINITY) {
- buffer.add("(-1/0)");
- } else {
- buffer.add("$value");
- }
- }
-
- void visitTrue(TrueConstant constant) {
- buffer.add("true");
- }
-
- void visitFalse(FalseConstant constant) {
- buffer.add("false");
- }
-
- /**
- * Write the contents of the quoted string to a [CodeBuffer] in
- * a form that is valid as JavaScript string literal content.
- * The string is assumed quoted by single quote characters.
- */
- void writeEscapedString(DartString string,
- CodeBuffer buffer,
- Node diagnosticNode) {
- Iterator<int> iterator = string.iterator();
- while (iterator.hasNext()) {
- int code = iterator.next();
- if (code === $SQ) {
- buffer.add(@"\'");
- } else if (code === $LF) {
- buffer.add(@'\n');
- } else if (code === $CR) {
- buffer.add(@'\r');
- } else if (code === $LS) {
- // This Unicode line terminator and $PS are invalid in JS string
- // literals.
- buffer.add(@'\u2028');
- } else if (code === $PS) {
- buffer.add(@'\u2029');
- } else if (code === $BACKSLASH) {
- buffer.add(@'\\');
- } 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(@'\x');
- if (code < 0x10) buffer.add('0');
- buffer.add(code.toRadixString(16));
- } else if (code >= 0x80) {
- if (code < 0x100) {
- buffer.add(@'\x');
- } else {
- buffer.add(@'\u');
- if (code < 0x1000) {
- buffer.add('0');
- }
- }
- buffer.add(code.toRadixString(16));
- } else {
- buffer.addCharCode(code);
- }
- }
- }
- }
-
- void visitString(StringConstant constant) {
- buffer.add("'");
- writeEscapedString(constant.value, buffer, constant.node);
- buffer.add("'");
- }
-
- void emitCanonicalVersion(Constant constant) {
- String name = namer.constantName(constant);
- buffer.add(namer.isolatePropertiesAccessForConstant(name));
- }
-
- void visitList(ListConstant constant) {
- if (shouldEmitCanonicalVersion) {
- emitCanonicalVersion(constant);
- } else {
- shouldEmitCanonicalVersion = true;
- buffer.add("${namer.ISOLATE}.makeConstantList");
- buffer.add("([");
- for (int i = 0; i < constant.entries.length; i++) {
- if (i != 0) buffer.add(", ");
- _visit(constant.entries[i]);
- }
- buffer.add("])");
- }
- }
-
- String getJsConstructor(ClassElement element) {
- return namer.isolatePropertiesAccess(element);
- }
-
- void visitMap(MapConstant constant) {
- if (shouldEmitCanonicalVersion) {
- emitCanonicalVersion(constant);
- } else {
- void writeJsMap() {
- buffer.add("{");
- int valueIndex = 0;
- for (int i = 0; i < constant.keys.entries.length; i++) {
- StringConstant key = constant.keys.entries[i];
- if (key.value == MapConstant.PROTO_PROPERTY) continue;
-
- if (valueIndex != 0) buffer.add(", ");
-
- // Keys in literal maps must be emitted in place.
- emitJavaScriptCodeForConstant(key, buffer);
-
- buffer.add(": ");
- emitCanonicalVersionOfConstant(constant.values[valueIndex++], buffer);
- }
- buffer.add("}");
- if (valueIndex != constant.values.length) {
- compiler.internalError("Bad value count.");
- }
- }
-
- void badFieldCountError() {
- compiler.internalError(
- "Compiler and ConstantMap disagree on number of fields.");
- }
-
- shouldEmitCanonicalVersion = true;
-
- ClassElement classElement = constant.type.element;
- buffer.add("new ");
- buffer.add(getJsConstructor(classElement));
- buffer.add("(");
- // The arguments of the JavaScript constructor for any given Dart class
- // are in the same order as the members of the class element.
- int emittedArgumentCount = 0;
- classElement.forEachInstanceField(
- includeBackendMembers: true,
- includeSuperMembers: true,
- f: (ClassElement enclosing, Element field) {
- if (emittedArgumentCount != 0) buffer.add(", ");
- if (field.name == MapConstant.LENGTH_NAME) {
- buffer.add(constant.keys.entries.length);
- } else if (field.name == MapConstant.JS_OBJECT_NAME) {
- writeJsMap();
- } else if (field.name == MapConstant.KEYS_NAME) {
- emitCanonicalVersionOfConstant(constant.keys, buffer);
- } else if (field.name == MapConstant.PROTO_VALUE) {
- assert(constant.protoValue !== null);
- emitCanonicalVersionOfConstant(constant.protoValue, buffer);
- } else {
- badFieldCountError();
- }
- emittedArgumentCount++;
- });
- if ((constant.protoValue === null && emittedArgumentCount != 3) ||
- (constant.protoValue !== null && emittedArgumentCount != 4)) {
- badFieldCountError();
- }
- buffer.add(")");
- }
- }
-
- void visitConstructed(ConstructedConstant constant) {
- if (shouldEmitCanonicalVersion) {
- emitCanonicalVersion(constant);
- } else {
- shouldEmitCanonicalVersion = true;
-
- buffer.add("new ");
- buffer.add(getJsConstructor(constant.type.element));
- buffer.add("(");
- for (int i = 0; i < constant.fields.length; i++) {
- if (i != 0) buffer.add(", ");
- _visit(constant.fields[i]);
- }
- buffer.add(")");
- }
- }
-}
« no previous file with comments | « lib/compiler/implementation/elements/elements.dart ('k') | lib/compiler/implementation/js_backend/emitter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698