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 7b92fcd3607e3f016f67936970dbe20fc6401ec6..c2f3ae5dcfa7b57d53ccc31b76fb2e25d7ecbc59 100644 |
--- a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart |
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart |
@@ -321,13 +321,14 @@ function(cls, desc) { |
// Temporary variables for common substrings. |
List<String> varNames = <String>[]; |
// var -> expression |
- Map<String, String> varDefns = <String, String>{}; |
+ Map<String, js.Expression> varDefns = <String, js.Expression>{}; |
// tag -> expression (a string or a variable) |
- Map<ClassElement, String> tagDefns = new Map<ClassElement, String>(); |
+ Map<ClassElement, js.Expression> tagDefns = |
+ new Map<ClassElement, js.Expression>(); |
String makeExpression(ClassElement classElement) { |
// Expression fragments for this set of cls keys. |
- List<String> expressions = <String>[]; |
+ List<js.Expression> expressions = <js.Expression>[]; |
// TODO: Remove if cls is abstract. |
List<String> subtags = [toNativeName(classElement)]; |
void walk(ClassElement cls) { |
@@ -341,23 +342,28 @@ function(cls, desc) { |
if (varDefns.containsKey(existing)) { |
expressions.add(existing); |
} else { |
- String varName = 'v${varNames.length}/*${tag}*/'; |
+ String varName = 'v${varNames.length}_${tag.name.slowToString()}'; |
varNames.add(varName); |
varDefns[varName] = existing; |
- tagDefns[tag] = varName; |
- expressions.add(varName); |
+ tagDefns[tag] = new js.VariableUse(varName); |
+ expressions.add(new js.VariableUse(varName)); |
} |
} |
} |
} |
walk(classElement); |
- String constantPart = "'${Strings.join(subtags, '|')}'"; |
- if (constantPart != "''") expressions.add(constantPart); |
- String expression; |
+ if (!subtags.isEmpty) { |
+ expressions.add( |
+ new js.LiteralString("'${Strings.join(subtags, '|')}'")); |
+ } |
+ js.Expression expression; |
if (expressions.length == 1) { |
expression = expressions[0]; |
} else { |
- expression = "[${Strings.join(expressions, ',')}].join('|')"; |
+ js.Expression array = new js.ArrayInitializer.from(expressions); |
+ expression = new js.Call( |
+ new js.PropertyAccess.field(array, 'join'), |
+ [new js.LiteralString("'|'")]); |
} |
return expression; |
} |
@@ -368,27 +374,45 @@ function(cls, desc) { |
// Write out a thunk that builds the metadata. |
if (!tagDefns.isEmpty) { |
- nativeBuffer.add('(function(){\n'); |
+ List<js.Statement> statements = <js.Statement>[]; |
+ List<js.Expression> initializations = <js.Expression>[]; |
for (final String varName in varNames) { |
- nativeBuffer.add(' var ${varName} = ${varDefns[varName]};\n'); |
+ initializations.add( |
+ new js.VariableInitialization( |
+ new js.VariableDeclaration(varName), |
+ varDefns[varName])); |
} |
- |
- nativeBuffer.add(' var table = [\n'); |
- nativeBuffer.add( |
- ' // [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]}]"); |
+ if (!initializations.isEmpty) { |
+ statements.add( |
+ new js.ExpressionStatement( |
+ new js.VariableDeclarationList(initializations))); |
} |
- nativeBuffer.add(Strings.join(entries, ',')); |
- nativeBuffer.add('];\n'); |
- nativeBuffer.add('$dynamicSetMetadataName(table);\n'); |
- nativeBuffer.add('})();\n'); |
+ // [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( |
+ js.prettyPrint( |
+ new js.ExpressionStatement( |
+ new js.Call(new js.Fun([], new js.Block(statements)), [])), |
+ compiler)); |
} |
} |