| Index: pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart | 
| diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart | 
| index 240c986f6ed899938b219f527cac40d5b34a7398..b2979b1455a5942db11cfdab92a910a7aa7a2de5 100644 | 
| --- a/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart | 
| +++ b/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart | 
| @@ -1010,8 +1010,8 @@ class OldEmitter implements Emitter { | 
| output.add(N); | 
| } | 
|  | 
| -  void writeLibraryDescriptor(CodeOutput output, LibraryElement library, | 
| -                              Fragment fragment) { | 
| +  jsAst.Expression generateLibraryDescriptor(LibraryElement library, | 
| +                                             Fragment fragment) { | 
| var uri = ""; | 
| if (!compiler.enableMinification || backend.mustPreserveUris) { | 
| uri = library.canonicalUri; | 
| @@ -1019,14 +1019,6 @@ class OldEmitter implements Emitter { | 
| uri = relativize(compiler.outputUri, library.canonicalUri, false); | 
| } | 
| } | 
| -    ClassBuilder descriptor = elementDescriptors[fragment][library]; | 
| -    if (descriptor == null) { | 
| -      // Nothing of the library was emitted. | 
| -      // TODO(floitsch): this should not happen. We currently have an example | 
| -      // with language/prefix6_negative_test.dart where we have an instance | 
| -      // method without its corresponding class. | 
| -      return; | 
| -    } | 
|  | 
| String libraryName = | 
| (!compiler.enableMinification || backend.mustRetainLibraryNames) ? | 
| @@ -1035,27 +1027,33 @@ class OldEmitter implements Emitter { | 
|  | 
| jsAst.Fun metadata = task.metadataCollector.buildMetadataFunction(library); | 
|  | 
| -    jsAst.ObjectInitializer initializers = descriptor.toObjectInitializer(); | 
| +    ClassBuilder descriptor = elementDescriptors[fragment][library]; | 
| + | 
| +    jsAst.ObjectInitializer initializer; | 
| +    if (descriptor == null) { | 
| +      // Nothing of the library was emitted. | 
| +      // TODO(floitsch): this should not happen. We currently have an example | 
| +      // with language/prefix6_negative_test.dart where we have an instance | 
| +      // method without its corresponding class. | 
| +      initializer = new jsAst.ObjectInitializer([]); | 
| +    } else { | 
| +      initializer = descriptor.toObjectInitializer(); | 
| +    } | 
|  | 
| compiler.dumpInfoTask.registerElementAst(library, metadata); | 
| -    compiler.dumpInfoTask.registerElementAst(library, initializers); | 
| -    output | 
| -        ..add('["$libraryName",$_') | 
| -        ..add('"${uri}",$_'); | 
| -    if (metadata != null) { | 
| -      output.addBuffer(jsAst.prettyPrint(metadata, | 
| -                                         compiler, | 
| -                                         monitor: compiler.dumpInfoTask)); | 
| +    compiler.dumpInfoTask.registerElementAst(library, initializer); | 
| + | 
| +    List<jsAst.Expression> parts = <jsAst.Expression>[]; | 
| +    parts..add(js.string(libraryName)) | 
| +         ..add(js.string(uri.toString())) | 
| +         ..add(metadata == null ? new jsAst.ArrayHole() : metadata) | 
| +         ..add(js.name(namer.globalObjectFor(library))) | 
| +         ..add(initializer); | 
| +    if (library == compiler.mainApp) { | 
| +      parts.add(js.number(1)); | 
| } | 
| -    output | 
| -        ..add(',$_') | 
| -        ..add(namer.globalObjectFor(library)) | 
| -        ..add(',$_') | 
| -        ..addBuffer(jsAst.prettyPrint(initializers, | 
| -                                      compiler, | 
| -                                      monitor: compiler.dumpInfoTask)) | 
| -        ..add(library == compiler.mainApp ? ',${n}1' : "") | 
| -        ..add('],$n'); | 
| + | 
| +    return new jsAst.ArrayInitializer(parts); | 
| } | 
|  | 
| void assemblePrecompiledConstructor(OutputUnit outputUnit, | 
| @@ -1329,9 +1327,9 @@ class OldEmitter implements Emitter { | 
|  | 
| checkEverythingEmitted(descriptors.keys); | 
|  | 
| -    CodeBuffer libraryBuffer = new CodeBuffer(); | 
| +    List<jsAst.Expression> parts = <jsAst.Expression>[]; | 
| for (LibraryElement library in Elements.sortedByPosition(libraries)) { | 
| -      writeLibraryDescriptor(libraryBuffer, library, mainFragment); | 
| +      parts.add(generateLibraryDescriptor(library, mainFragment)); | 
| descriptors.remove(library); | 
| } | 
|  | 
| @@ -1346,11 +1344,12 @@ class OldEmitter implements Emitter { | 
| for (LibraryElement element in remainingLibraries) { | 
| assert(element is LibraryElement || compiler.hasIncrementalSupport); | 
| if (element is LibraryElement) { | 
| -          writeLibraryDescriptor(libraryBuffer, element, mainFragment); | 
| +          parts.add(generateLibraryDescriptor(element, mainFragment)); | 
| descriptors.remove(element); | 
| } | 
| } | 
| } | 
| +    jsAst.ArrayInitializer descriptorsAst = new jsAst.ArrayInitializer(parts); | 
|  | 
| bool needsNativeSupport = program.needsNativeSupport; | 
| mainOutput.addBuffer( | 
| @@ -1361,9 +1360,9 @@ class OldEmitter implements Emitter { | 
| // The argument to reflectionDataParser is assigned to a temporary 'dart' | 
| // so that 'dart.' will appear as the prefix to dart methods in stack | 
| // traces and profile entries. | 
| -    mainOutput..add('var dart = [$n') | 
| -              ..addBuffer(libraryBuffer) | 
| -              ..add(']$N'); | 
| +    mainOutput..add('var dart =') | 
| +              ..addBuffer(jsAst.prettyPrint(descriptorsAst, compiler)) | 
| +              ..add('$N'); | 
| if (compiler.useContentSecurityPolicy) { | 
| jsAst.Statement precompiledFunctionAst = | 
| buildCspPrecompiledFunctionFor(mainOutputUnit); | 
| @@ -1607,8 +1606,8 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) { | 
| Map<OutputUnit, String> emitDeferredOutputUnits(Program program) { | 
| if (!program.isSplit) return const {}; | 
|  | 
| -    Map<OutputUnit, CodeBuffer> outputBuffers = | 
| -        new Map<OutputUnit, CodeBuffer>(); | 
| +    Map<OutputUnit, jsAst.Expression> outputs = | 
| +        new Map<OutputUnit, jsAst.Expression>(); | 
|  | 
| for (Fragment fragment in program.deferredFragments) { | 
| OutputUnit outputUnit = fragment.outputUnit; | 
| @@ -1621,16 +1620,17 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) { | 
| if (libraries == null) libraries = []; | 
|  | 
| // TODO(johnniwinther): Avoid creating [CodeBuffer]s. | 
| -        CodeBuffer buffer = new CodeBuffer(); | 
| -        outputBuffers[outputUnit] = buffer; | 
| +        List<jsAst.Expression> parts = <jsAst.Expression>[]; | 
| for (LibraryElement library in Elements.sortedByPosition(libraries)) { | 
| -          writeLibraryDescriptor(buffer, library, fragment); | 
| +          parts.add(generateLibraryDescriptor(library, fragment)); | 
| descriptors.remove(library); | 
| } | 
| + | 
| +        outputs[outputUnit] = new jsAst.ArrayInitializer(parts); | 
| } | 
| } | 
|  | 
| -    return emitDeferredCode(program, outputBuffers); | 
| +    return emitDeferredCode(program, outputs); | 
| } | 
|  | 
| int emitProgram(ProgramBuilder programBuilder) { | 
| @@ -1773,14 +1773,14 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) { | 
| /// can be used for calling the initializer. | 
| Map<OutputUnit, String> emitDeferredCode( | 
| Program program, | 
| -      Map<OutputUnit, CodeBuffer> deferredBuffers) { | 
| +      Map<OutputUnit, jsAst.Expression> deferredAsts) { | 
|  | 
| Map<OutputUnit, String> hunkHashes = new Map<OutputUnit, String>(); | 
|  | 
| for (Fragment fragment in program.deferredFragments) { | 
| OutputUnit outputUnit = fragment.outputUnit; | 
|  | 
| -      CodeOutput libraryDescriptorBuffer = deferredBuffers[outputUnit]; | 
| +      jsAst.Expression libraryDescriptor = deferredAsts[outputUnit]; | 
|  | 
| List<CodeOutputListener> outputListeners = <CodeOutputListener>[]; | 
| Hasher hasher = new Hasher(); | 
| @@ -1817,7 +1817,7 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) { | 
| '${globalsHolder}.${namer.isolateName}$N'); | 
| String typesAccess = | 
| generateEmbeddedGlobalAccessString(embeddedNames.TYPES); | 
| -      if (libraryDescriptorBuffer != null) { | 
| +      if (libraryDescriptor != null) { | 
| // TODO(ahe): This defines a lot of properties on the | 
| // Isolate.prototype object.  We know this will turn it into a | 
| // slow object in V8, so instead we should do something similar | 
| @@ -1827,9 +1827,9 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) { | 
| // The argument to reflectionDataParser is assigned to a temporary | 
| // 'dart' so that 'dart.' will appear as the prefix to dart methods | 
| // in stack traces and profile entries. | 
| -            ..add('var dart = [$n ') | 
| -            ..addBuffer(libraryDescriptorBuffer) | 
| -            ..add(']$N'); | 
| +            ..add('var dart = $n ') | 
| +            ..addBuffer(jsAst.prettyPrint(libraryDescriptor, compiler)) | 
| +            ..add('$N'); | 
|  | 
| if (compiler.useContentSecurityPolicy) { | 
| jsAst.Statement precompiledFunctionAst = | 
|  |