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

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

Issue 11413136: Revert "Generate native class metadata as a JavaScript AST." (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 1 month 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
« no previous file with comments | « sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
index 29ec120ef38380c77e91b443ab30eb2398ff5ed8..7b92fcd3607e3f016f67936970dbe20fc6401ec6 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
@@ -321,14 +321,13 @@ function(cls, desc) {
// Temporary variables for common substrings.
List<String> varNames = <String>[];
// var -> expression
- Map<String, js.Expression> varDefns = <String, js.Expression>{};
+ Map<String, String> varDefns = <String, String>{};
// tag -> expression (a string or a variable)
- Map<ClassElement, js.Expression> tagDefns =
- new Map<ClassElement, js.Expression>();
+ Map<ClassElement, String> tagDefns = new Map<ClassElement, String>();
String makeExpression(ClassElement classElement) {
// Expression fragments for this set of cls keys.
- List<js.Expression> expressions = <js.Expression>[];
+ List<String> expressions = <String>[];
// TODO: Remove if cls is abstract.
List<String> subtags = [toNativeName(classElement)];
void walk(ClassElement cls) {
@@ -342,28 +341,23 @@ function(cls, desc) {
if (varDefns.containsKey(existing)) {
expressions.add(existing);
} else {
- String varName = 'v${varNames.length}_${tag.name.slowToString()}';
+ String varName = 'v${varNames.length}/*${tag}*/';
varNames.add(varName);
varDefns[varName] = existing;
- tagDefns[tag] = new js.VariableUse(varName);
- expressions.add(new js.VariableUse(varName));
+ tagDefns[tag] = varName;
+ expressions.add(varName);
}
}
}
}
walk(classElement);
- if (!subtags.isEmpty) {
- expressions.add(
- new js.LiteralString("'${Strings.join(subtags, '|')}'"));
- }
- js.Expression expression;
+ String constantPart = "'${Strings.join(subtags, '|')}'";
+ if (constantPart != "''") expressions.add(constantPart);
+ String expression;
if (expressions.length == 1) {
expression = expressions[0];
} else {
- js.Expression array = new js.ArrayInitializer.from(expressions);
- expression = new js.Call(
- new js.PropertyAccess.field(array, 'join'),
- [new js.LiteralString("'|'")]);
+ expression = "[${Strings.join(expressions, ',')}].join('|')";
}
return expression;
}
@@ -374,43 +368,27 @@ function(cls, desc) {
// Write out a thunk that builds the metadata.
if (!tagDefns.isEmpty) {
- List<js.Statement> statements = <js.Statement>[];
- List<js.Expression> initializations = <js.Expression>[];
+ nativeBuffer.add('(function(){\n');
+
for (final String varName in varNames) {
- initializations.add(
- new js.VariableInitialization(
- new js.VariableDeclaration(varName),
- varDefns[varName]));
+ nativeBuffer.add(' var ${varName} = ${varDefns[varName]};\n');
}
- statements.add(
- new js.ExpressionStatement(
- new js.VariableDeclarationList(initializations)));
-
- // [table] is a list of lists, each inner list of the form:
- // [dynamic-dispatch-tag, tags-of-classes-implementing-dispatch-tag]
- // E.g.
- // [['Node', 'Text|HTMLElement|HTMLDivElement|...'], ...]
- js.Expression table =
- new js.ArrayInitializer.from(
- dispatchClasses.map((cls) =>
- new js.ArrayInitializer.from([
- new js.LiteralString("'${toNativeName(cls)}'"),
- tagDefns[cls]])));
-
- // $.dynamicSetMetadata(table);
- statements.add(
- new js.ExpressionStatement(
- new js.Call(
- new js.VariableUse(dynamicSetMetadataName),
- [table])));
-
- // (function(){statements})();
+ nativeBuffer.add(' var table = [\n');
nativeBuffer.add(
- js.prettyPrint(
- new js.ExpressionStatement(
- new js.Call(new js.Fun([], new js.Block(statements)), [])),
- compiler));
+ ' // [dynamic-dispatch-tag, '
+ 'tags of classes implementing dynamic-dispatch-tag]');
+ bool needsComma = false;
+ List<String> entries = <String>[];
+ for (final ClassElement cls in dispatchClasses) {
+ String clsName = toNativeName(cls);
+ entries.add("\n ['$clsName', ${tagDefns[cls]}]");
+ }
+ nativeBuffer.add(Strings.join(entries, ','));
+ nativeBuffer.add('];\n');
+ nativeBuffer.add('$dynamicSetMetadataName(table);\n');
+
+ nativeBuffer.add('})();\n');
}
}
« no previous file with comments | « sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698