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

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

Issue 12208067: Build finishClasses from JS AST nodes. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebased Created 7 years, 10 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: dart/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
diff --git a/dart/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart b/dart/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
index 86717aed749ec162fc5a31a50342a8ffb065f2f8..896044deae998e6131667f0e52885fc8b1710c73 100644
--- a/dart/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
+++ b/dart/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
@@ -19,7 +19,7 @@ class ConstantEmitter {
* canonical name unless the constant can be emitted multiple times (as for
* numbers and strings).
*/
- js.Expression reference(Constant constant) {
+ jsAst.Expression reference(Constant constant) {
return _referenceEmitter.generate(constant);
}
@@ -27,14 +27,14 @@ class ConstantEmitter {
* Constructs an expression like [reference], but the expression is valid
* during isolate initialization.
*/
- js.Expression referenceInInitializationContext(Constant constant) {
+ jsAst.Expression referenceInInitializationContext(Constant constant) {
return _referenceEmitter.generateInInitializationContext(constant);
}
/**
* Constructs an expression used to initialize a canonicalized constant.
*/
- js.Expression initializationExpression(Constant constant) {
+ jsAst.Expression initializationExpression(Constant constant) {
return _initializerEmitter.generate(constant);
}
}
@@ -43,74 +43,74 @@ class ConstantEmitter {
* Visitor for generating JavaScript expressions to refer to [Constant]s.
* Do not use directly, use methods from [ConstantEmitter].
*/
-class ConstantReferenceEmitter implements ConstantVisitor<js.Expression> {
+class ConstantReferenceEmitter implements ConstantVisitor<jsAst.Expression> {
final Compiler compiler;
final Namer namer;
bool inIsolateInitializationContext = false;
ConstantReferenceEmitter(this.compiler, this.namer);
- js.Expression generate(Constant constant) {
+ jsAst.Expression generate(Constant constant) {
inIsolateInitializationContext = false;
return _visit(constant);
}
- js.Expression generateInInitializationContext(Constant constant) {
+ jsAst.Expression generateInInitializationContext(Constant constant) {
inIsolateInitializationContext = true;
return _visit(constant);
}
- js.Expression _visit(Constant constant) {
+ jsAst.Expression _visit(Constant constant) {
return constant.accept(this);
}
- js.Expression visitSentinel(SentinelConstant constant) {
- return new js.VariableUse(namer.CURRENT_ISOLATE);
+ jsAst.Expression visitSentinel(SentinelConstant constant) {
+ return new jsAst.VariableUse(namer.CURRENT_ISOLATE);
}
- js.Expression visitFunction(FunctionConstant constant) {
+ jsAst.Expression visitFunction(FunctionConstant constant) {
return inIsolateInitializationContext
- ? new js.VariableUse(namer.isolatePropertiesAccess(constant.element))
- : new js.VariableUse(namer.isolateAccess(constant.element));
+ ? new jsAst.VariableUse(namer.isolatePropertiesAccess(constant.element))
+ : new jsAst.VariableUse(namer.isolateAccess(constant.element));
}
- js.Expression visitNull(NullConstant constant) {
- return new js.LiteralNull();
+ jsAst.Expression visitNull(NullConstant constant) {
+ return new jsAst.LiteralNull();
}
- js.Expression visitInt(IntConstant constant) {
- return new js.LiteralNumber('${constant.value}');
+ jsAst.Expression visitInt(IntConstant constant) {
+ return new jsAst.LiteralNumber('${constant.value}');
}
- js.Expression visitDouble(DoubleConstant constant) {
+ jsAst.Expression visitDouble(DoubleConstant constant) {
double value = constant.value;
if (value.isNaN) {
- return new js.LiteralNumber("(0/0)");
+ return new jsAst.LiteralNumber("(0/0)");
} else if (value == double.INFINITY) {
- return new js.LiteralNumber("(1/0)");
+ return new jsAst.LiteralNumber("(1/0)");
} else if (value == -double.INFINITY) {
- return new js.LiteralNumber("(-1/0)");
+ return new jsAst.LiteralNumber("(-1/0)");
} else {
- return new js.LiteralNumber("$value");
+ return new jsAst.LiteralNumber("$value");
}
}
- js.Expression visitTrue(TrueConstant constant) {
+ jsAst.Expression visitTrue(TrueConstant constant) {
if (compiler.enableMinification) {
// Use !0 for true.
- return new js.Prefix("!", new js.LiteralNumber("0"));
+ return new jsAst.Prefix("!", new jsAst.LiteralNumber("0"));
} else {
- return new js.LiteralBool(true);
+ return new jsAst.LiteralBool(true);
}
}
- js.Expression visitFalse(FalseConstant constant) {
+ jsAst.Expression visitFalse(FalseConstant constant) {
if (compiler.enableMinification) {
// Use !1 for false.
- return new js.Prefix("!", new js.LiteralNumber("1"));
+ return new jsAst.Prefix("!", new jsAst.LiteralNumber("1"));
} else {
- return new js.LiteralBool(false);
+ return new jsAst.LiteralBool(false);
}
}
@@ -119,44 +119,44 @@ class ConstantReferenceEmitter implements ConstantVisitor<js.Expression> {
* a form that is valid as JavaScript string literal content.
* The string is assumed quoted by double quote characters.
*/
- js.Expression visitString(StringConstant constant) {
+ jsAst.Expression visitString(StringConstant constant) {
// TODO(sra): If the string is long *and repeated* (and not on a hot path)
// then it should be assigned to a name. We don't have reference counts (or
// profile information) here, so this is the wrong place.
StringBuffer sb = new StringBuffer();
writeJsonEscapedCharsOn(constant.value.slowToString(), sb);
- return new js.LiteralString('"$sb"');
+ return new jsAst.LiteralString('"$sb"');
}
- js.Expression emitCanonicalVersion(Constant constant) {
+ jsAst.Expression emitCanonicalVersion(Constant constant) {
String name = namer.constantName(constant);
if (inIsolateInitializationContext) {
// $isolateName.$isolatePropertiesName.$name
- return new js.PropertyAccess.field(
- new js.PropertyAccess.field(
- new js.VariableUse(namer.isolateName),
+ return new jsAst.PropertyAccess.field(
+ new jsAst.PropertyAccess.field(
+ new jsAst.VariableUse(namer.isolateName),
namer.isolatePropertiesName),
name);
} else {
- return new js.PropertyAccess.field(
- new js.VariableUse(namer.CURRENT_ISOLATE),
+ return new jsAst.PropertyAccess.field(
+ new jsAst.VariableUse(namer.CURRENT_ISOLATE),
name);
}
}
- js.Expression visitList(ListConstant constant) {
+ jsAst.Expression visitList(ListConstant constant) {
return emitCanonicalVersion(constant);
}
- js.Expression visitMap(MapConstant constant) {
+ jsAst.Expression visitMap(MapConstant constant) {
return emitCanonicalVersion(constant);
}
- js.Expression visitType(TypeConstant constant) {
+ jsAst.Expression visitType(TypeConstant constant) {
return emitCanonicalVersion(constant);
}
- js.Expression visitConstructed(ConstructedConstant constant) {
+ jsAst.Expression visitConstructed(ConstructedConstant constant) {
return emitCanonicalVersion(constant);
}
}
@@ -165,90 +165,90 @@ class ConstantReferenceEmitter implements ConstantVisitor<js.Expression> {
* Visitor for generating JavaScript expressions to initialize [Constant]s.
* Do not use directly; use methods from [ConstantEmitter].
*/
-class ConstantInitializerEmitter implements ConstantVisitor<js.Expression> {
+class ConstantInitializerEmitter implements ConstantVisitor<jsAst.Expression> {
final Compiler compiler;
final Namer namer;
final ConstantReferenceEmitter referenceEmitter;
ConstantInitializerEmitter(this.compiler, this.namer, this.referenceEmitter);
- js.Expression generate(Constant constant) {
+ jsAst.Expression generate(Constant constant) {
return _visit(constant);
}
- js.Expression _visit(Constant constant) {
+ jsAst.Expression _visit(Constant constant) {
return constant.accept(this);
}
- js.Expression _reference(Constant constant) {
+ jsAst.Expression _reference(Constant constant) {
return referenceEmitter.generateInInitializationContext(constant);
}
- js.Expression visitSentinel(SentinelConstant constant) {
+ jsAst.Expression visitSentinel(SentinelConstant constant) {
compiler.internalError(
"The parameter sentinel constant does not need specific JS code");
}
- js.Expression visitFunction(FunctionConstant constant) {
+ jsAst.Expression visitFunction(FunctionConstant constant) {
compiler.internalError(
"The function constant does not need specific JS code");
}
- js.Expression visitNull(NullConstant constant) {
+ jsAst.Expression visitNull(NullConstant constant) {
return _reference(constant);
}
- js.Expression visitInt(IntConstant constant) {
+ jsAst.Expression visitInt(IntConstant constant) {
return _reference(constant);
}
- js.Expression visitDouble(DoubleConstant constant) {
+ jsAst.Expression visitDouble(DoubleConstant constant) {
return _reference(constant);
}
- js.Expression visitTrue(TrueConstant constant) {
+ jsAst.Expression visitTrue(TrueConstant constant) {
return _reference(constant);
}
- js.Expression visitFalse(FalseConstant constant) {
+ jsAst.Expression visitFalse(FalseConstant constant) {
return _reference(constant);
}
- js.Expression visitString(StringConstant constant) {
+ jsAst.Expression visitString(StringConstant constant) {
// TODO(sra): Some larger strings are worth sharing.
return _reference(constant);
}
- js.Expression visitList(ListConstant constant) {
- return new js.Call(
- new js.PropertyAccess.field(
- new js.VariableUse(namer.isolateName),
+ jsAst.Expression visitList(ListConstant constant) {
+ return new jsAst.Call(
+ new jsAst.PropertyAccess.field(
+ new jsAst.VariableUse(namer.isolateName),
'makeConstantList'),
- [new js.ArrayInitializer.from(_array(constant.entries))]);
+ [new jsAst.ArrayInitializer.from(_array(constant.entries))]);
}
String getJsConstructor(ClassElement element) {
return namer.isolatePropertiesAccess(element);
}
- js.Expression visitMap(MapConstant constant) {
- js.Expression jsMap() {
- List<js.Property> properties = <js.Property>[];
+ jsAst.Expression visitMap(MapConstant constant) {
+ jsAst.Expression jsMap() {
+ List<jsAst.Property> properties = <jsAst.Property>[];
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;
// Keys in literal maps must be emitted in place.
- js.Literal keyExpression = _visit(key);
- js.Expression valueExpression =
+ jsAst.Literal keyExpression = _visit(key);
+ jsAst.Expression valueExpression =
_reference(constant.values[valueIndex++]);
- properties.add(new js.Property(keyExpression, valueExpression));
+ properties.add(new jsAst.Property(keyExpression, valueExpression));
}
if (valueIndex != constant.values.length) {
compiler.internalError("Bad value count.");
}
- return new js.ObjectInitializer(properties);
+ return new jsAst.ObjectInitializer(properties);
}
void badFieldCountError() {
@@ -258,7 +258,7 @@ class ConstantInitializerEmitter implements ConstantVisitor<js.Expression> {
ClassElement classElement = constant.type.element;
- List<js.Expression> arguments = <js.Expression>[];
+ List<jsAst.Expression> arguments = <jsAst.Expression>[];
// The arguments of the JavaScript constructor for any given Dart class
// are in the same order as the members of the class element.
@@ -267,7 +267,7 @@ class ConstantInitializerEmitter implements ConstantVisitor<js.Expression> {
(ClassElement enclosing, Element field) {
if (field.name == MapConstant.LENGTH_NAME) {
arguments.add(
- new js.LiteralNumber('${constant.keys.entries.length}'));
+ new jsAst.LiteralNumber('${constant.keys.entries.length}'));
} else if (field.name == MapConstant.JS_OBJECT_NAME) {
arguments.add(jsMap());
} else if (field.name == MapConstant.KEYS_NAME) {
@@ -288,12 +288,12 @@ class ConstantInitializerEmitter implements ConstantVisitor<js.Expression> {
badFieldCountError();
}
- return new js.New(
- new js.VariableUse(getJsConstructor(classElement)),
+ return new jsAst.New(
+ new jsAst.VariableUse(getJsConstructor(classElement)),
arguments);
}
- js.Expression visitType(TypeConstant constant) {
+ jsAst.Expression visitType(TypeConstant constant) {
SourceString helperSourceName = const SourceString('createRuntimeType');
Element helper = compiler.findHelper(helperSourceName);
JavaScriptBackend backend = compiler.backend;
@@ -301,22 +301,22 @@ class ConstantInitializerEmitter implements ConstantVisitor<js.Expression> {
DartType type = constant.representedType;
Element element = type.element;
String name = backend.rti.getRawTypeRepresentation(type);
- js.Expression typeName = new js.LiteralString("'$name'");
- return new js.Call(
- new js.PropertyAccess.field(
- new js.VariableUse(namer.CURRENT_ISOLATE),
+ jsAst.Expression typeName = new jsAst.LiteralString("'$name'");
+ return new jsAst.Call(
+ new jsAst.PropertyAccess.field(
+ new jsAst.VariableUse(namer.CURRENT_ISOLATE),
helperName),
[typeName]);
}
- js.Expression visitConstructed(ConstructedConstant constant) {
- return new js.New(
- new js.VariableUse(getJsConstructor(constant.type.element)),
+ jsAst.Expression visitConstructed(ConstructedConstant constant) {
+ return new jsAst.New(
+ new jsAst.VariableUse(getJsConstructor(constant.type.element)),
_array(constant.fields));
}
- List<js.Expression> _array(List<Constant> values) {
- List<js.Expression> valueList = <js.Expression>[];
+ List<jsAst.Expression> _array(List<Constant> values) {
+ List<jsAst.Expression> valueList = <jsAst.Expression>[];
for (int i = 0; i < values.length; i++) {
valueList.add(_reference(values[i]));
}

Powered by Google App Engine
This is Rietveld 408576698