| 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');
|
| }
|
| }
|
|
|
|
|