| Index: pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart
 | 
| diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart
 | 
| index 2481d12c09b41e20baafe4a14d647bbf2fde6604..3eb4c8c13408be4084b0dd6c95f218d963af1ebf 100644
 | 
| --- a/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart
 | 
| +++ b/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart
 | 
| @@ -16,21 +16,18 @@ const bool VALIDATE_DATA = false;
 | 
|  
 | 
|  const RANGE1_SIZE = RANGE1_LAST - RANGE1_FIRST + 1;
 | 
|  const RANGE2_SIZE = RANGE2_LAST - RANGE2_FIRST + 1;
 | 
| -const RANGE1_ADJUST = - (FIRST_FIELD_CODE - RANGE1_FIRST);
 | 
| -const RANGE2_ADJUST = - (FIRST_FIELD_CODE + RANGE1_SIZE - RANGE2_FIRST);
 | 
| +const RANGE1_ADJUST = -(FIRST_FIELD_CODE - RANGE1_FIRST);
 | 
| +const RANGE2_ADJUST = -(FIRST_FIELD_CODE + RANGE1_SIZE - RANGE2_FIRST);
 | 
|  const RANGE3_ADJUST =
 | 
| -    - (FIRST_FIELD_CODE + RANGE1_SIZE + RANGE2_SIZE - RANGE3_FIRST);
 | 
| +    -(FIRST_FIELD_CODE + RANGE1_SIZE + RANGE2_SIZE - RANGE3_FIRST);
 | 
|  
 | 
| -const String setupProgramName ='setupProgram';
 | 
| +const String setupProgramName = 'setupProgram';
 | 
|  // TODO(floitsch): make sure this property can't clash with anything. It's
 | 
|  //   unlikely since it lives on types, but still.
 | 
|  const String typeNameProperty = r'builtin$cls';
 | 
|  
 | 
|  jsAst.Statement buildSetupProgram(Program program, Compiler compiler,
 | 
| -                                JavaScriptBackend backend,
 | 
| -                                Namer namer,
 | 
| -                                Emitter emitter) {
 | 
| -
 | 
| +    JavaScriptBackend backend, Namer namer, Emitter emitter) {
 | 
|    jsAst.Expression typeInformationAccess =
 | 
|        emitter.generateEmbeddedGlobalAccess(embeddedNames.TYPE_INFORMATION);
 | 
|    jsAst.Expression globalFunctionsAccess =
 | 
| @@ -61,15 +58,12 @@ jsAst.Statement buildSetupProgram(Program program, Compiler compiler,
 | 
|        emitter.generateEmbeddedGlobalAccess(embeddedNames.INTERCEPTORS_BY_TAG);
 | 
|    jsAst.Expression leafTagsAccess =
 | 
|        emitter.generateEmbeddedGlobalAccess(embeddedNames.LEAF_TAGS);
 | 
| -  jsAst.Expression initializeEmptyInstanceAccess =
 | 
| -      emitter.generateEmbeddedGlobalAccess(
 | 
| -            embeddedNames.INITIALIZE_EMPTY_INSTANCE);
 | 
| -  jsAst.Expression classFieldsExtractorAccess =
 | 
| -      emitter.generateEmbeddedGlobalAccess(
 | 
| -          embeddedNames.CLASS_FIELDS_EXTRACTOR);
 | 
| -  jsAst.Expression instanceFromClassIdAccess =
 | 
| -      emitter.generateEmbeddedGlobalAccess(
 | 
| -          embeddedNames.INSTANCE_FROM_CLASS_ID);
 | 
| +  jsAst.Expression initializeEmptyInstanceAccess = emitter
 | 
| +      .generateEmbeddedGlobalAccess(embeddedNames.INITIALIZE_EMPTY_INSTANCE);
 | 
| +  jsAst.Expression classFieldsExtractorAccess = emitter
 | 
| +      .generateEmbeddedGlobalAccess(embeddedNames.CLASS_FIELDS_EXTRACTOR);
 | 
| +  jsAst.Expression instanceFromClassIdAccess = emitter
 | 
| +      .generateEmbeddedGlobalAccess(embeddedNames.INSTANCE_FROM_CLASS_ID);
 | 
|  
 | 
|    String reflectableField = namer.reflectableField;
 | 
|    String reflectionInfoField = namer.reflectionInfoField;
 | 
| @@ -81,73 +75,76 @@ jsAst.Statement buildSetupProgram(Program program, Compiler compiler,
 | 
|    String unmangledNameIndex = backend.mustRetainMetadata
 | 
|        ? ' 3 * optionalParameterCount + 2 * requiredParameterCount + 3'
 | 
|        : ' 2 * optionalParameterCount + requiredParameterCount + 3';
 | 
| -  String receiverParamName = compiler.options.enableMinification
 | 
| -      ? "r" : "receiver";
 | 
| +  String receiverParamName =
 | 
| +      compiler.options.enableMinification ? "r" : "receiver";
 | 
|    String valueParamName = compiler.options.enableMinification ? "v" : "value";
 | 
|    String space = compiler.options.enableMinification ? "" : " ";
 | 
|    String _ = space;
 | 
|  
 | 
| -  String specProperty = '"${namer.nativeSpecProperty}"';  // "%"
 | 
| +  String specProperty = '"${namer.nativeSpecProperty}"'; // "%"
 | 
|    jsAst.Expression nativeInfoAccess = js('prototype[$specProperty]', []);
 | 
|    jsAst.Expression constructorAccess = js('constructor', []);
 | 
|    Function subclassReadGenerator =
 | 
|        (jsAst.Expression subclass) => js('allClasses[#]', subclass);
 | 
| -  jsAst.Statement nativeInfoHandler = emitter.
 | 
| -      buildNativeInfoHandler(nativeInfoAccess, constructorAccess,
 | 
| -                             subclassReadGenerator, interceptorsByTagAccess,
 | 
| -                             leafTagsAccess);
 | 
| -
 | 
| -  Map<String, dynamic> holes =
 | 
| -    {'needsClassSupport': emitter.needsClassSupport,
 | 
| -     'libraries': librariesAccess,
 | 
| -     'mangledNames': mangledNamesAccess,
 | 
| -     'mangledGlobalNames': mangledGlobalNamesAccess,
 | 
| -     'statics': staticsAccess,
 | 
| -     'staticsPropertyName': namer.staticsPropertyName,
 | 
| -     'staticsPropertyNameString': js.quoteName(namer.staticsPropertyName),
 | 
| -     'typeInformation': typeInformationAccess,
 | 
| -     'globalFunctions': globalFunctionsAccess,
 | 
| -     'enabledInvokeOn': compiler.enabledInvokeOn,
 | 
| -     'interceptedNames': interceptedNamesAccess,
 | 
| -     'interceptedNamesSet': emitter.generateInterceptedNamesSet(),
 | 
| -     'notInCspMode': !compiler.options.useContentSecurityPolicy,
 | 
| -     'inCspMode': compiler.options.useContentSecurityPolicy,
 | 
| -     'deferredAction': namer.deferredAction,
 | 
| -     'hasIsolateSupport': program.hasIsolateSupport,
 | 
| -     'fieldNamesProperty': js.string(Emitter.FIELD_NAMES_PROPERTY_NAME),
 | 
| -     'hasIncrementalSupport': compiler.options.hasIncrementalSupport,
 | 
| -     'incrementalHelper': namer.accessIncrementalHelper,
 | 
| -     'createNewIsolateFunction': createNewIsolateFunctionAccess,
 | 
| -     'isolateName': namer.isolateName,
 | 
| -     'classIdExtractor': classIdExtractorAccess,
 | 
| -     'classFieldsExtractor': classFieldsExtractorAccess,
 | 
| -     'instanceFromClassId': instanceFromClassIdAccess,
 | 
| -     'initializeEmptyInstance': initializeEmptyInstanceAccess,
 | 
| -     'allClasses': allClassesAccess,
 | 
| -     'debugFastObjects': DEBUG_FAST_OBJECTS,
 | 
| -     'isTreeShakingDisabled': backend.isTreeShakingDisabled,
 | 
| -     'precompiled': precompiledAccess,
 | 
| -     'finishedClassesAccess': finishedClassesAccess,
 | 
| -     'needsMixinSupport': emitter.needsMixinSupport,
 | 
| -     'needsNativeSupport': program.needsNativeSupport,
 | 
| -     'enabledJsInterop': backend.jsInteropAnalysis.enabledJsInterop,
 | 
| -     'jsInteropBoostrap':backend.jsInteropAnalysis.buildJsInteropBootstrap(),
 | 
| -     'isInterceptorClass': namer.operatorIs(backend.helpers.jsInterceptorClass),
 | 
| -     'isObject' : namer.operatorIs(compiler.coreClasses.objectClass),
 | 
| -     'specProperty': js.string(namer.nativeSpecProperty),
 | 
| -     'trivialNsmHandlers': emitter.buildTrivialNsmHandlers(),
 | 
| -     'hasRetainedMetadata': backend.hasRetainedMetadata,
 | 
| -     'types': typesAccess,
 | 
| -     'objectClassName': js.quoteName(
 | 
| -         namer.runtimeTypeName(compiler.coreClasses.objectClass)),
 | 
| -     'needsStructuredMemberInfo': emitter.needsStructuredMemberInfo,
 | 
| -     'usesMangledNames':
 | 
| -          compiler.mirrorsLibrary != null || compiler.enabledFunctionApply,
 | 
| -     'tearOffCode': buildTearOffCode(backend),
 | 
| -     'nativeInfoHandler': nativeInfoHandler,
 | 
| -     'operatorIsPrefix' : js.string(namer.operatorIsPrefix),
 | 
| -     'deferredActionString': js.string(namer.deferredAction)};
 | 
| -   String skeleton = '''
 | 
| +  jsAst.Statement nativeInfoHandler = emitter.buildNativeInfoHandler(
 | 
| +      nativeInfoAccess,
 | 
| +      constructorAccess,
 | 
| +      subclassReadGenerator,
 | 
| +      interceptorsByTagAccess,
 | 
| +      leafTagsAccess);
 | 
| +
 | 
| +  Map<String, dynamic> holes = {
 | 
| +    'needsClassSupport': emitter.needsClassSupport,
 | 
| +    'libraries': librariesAccess,
 | 
| +    'mangledNames': mangledNamesAccess,
 | 
| +    'mangledGlobalNames': mangledGlobalNamesAccess,
 | 
| +    'statics': staticsAccess,
 | 
| +    'staticsPropertyName': namer.staticsPropertyName,
 | 
| +    'staticsPropertyNameString': js.quoteName(namer.staticsPropertyName),
 | 
| +    'typeInformation': typeInformationAccess,
 | 
| +    'globalFunctions': globalFunctionsAccess,
 | 
| +    'enabledInvokeOn': compiler.enabledInvokeOn,
 | 
| +    'interceptedNames': interceptedNamesAccess,
 | 
| +    'interceptedNamesSet': emitter.generateInterceptedNamesSet(),
 | 
| +    'notInCspMode': !compiler.options.useContentSecurityPolicy,
 | 
| +    'inCspMode': compiler.options.useContentSecurityPolicy,
 | 
| +    'deferredAction': namer.deferredAction,
 | 
| +    'hasIsolateSupport': program.hasIsolateSupport,
 | 
| +    'fieldNamesProperty': js.string(Emitter.FIELD_NAMES_PROPERTY_NAME),
 | 
| +    'hasIncrementalSupport': compiler.options.hasIncrementalSupport,
 | 
| +    'incrementalHelper': namer.accessIncrementalHelper,
 | 
| +    'createNewIsolateFunction': createNewIsolateFunctionAccess,
 | 
| +    'isolateName': namer.isolateName,
 | 
| +    'classIdExtractor': classIdExtractorAccess,
 | 
| +    'classFieldsExtractor': classFieldsExtractorAccess,
 | 
| +    'instanceFromClassId': instanceFromClassIdAccess,
 | 
| +    'initializeEmptyInstance': initializeEmptyInstanceAccess,
 | 
| +    'allClasses': allClassesAccess,
 | 
| +    'debugFastObjects': DEBUG_FAST_OBJECTS,
 | 
| +    'isTreeShakingDisabled': backend.isTreeShakingDisabled,
 | 
| +    'precompiled': precompiledAccess,
 | 
| +    'finishedClassesAccess': finishedClassesAccess,
 | 
| +    'needsMixinSupport': emitter.needsMixinSupport,
 | 
| +    'needsNativeSupport': program.needsNativeSupport,
 | 
| +    'enabledJsInterop': backend.jsInteropAnalysis.enabledJsInterop,
 | 
| +    'jsInteropBoostrap': backend.jsInteropAnalysis.buildJsInteropBootstrap(),
 | 
| +    'isInterceptorClass': namer.operatorIs(backend.helpers.jsInterceptorClass),
 | 
| +    'isObject': namer.operatorIs(compiler.coreClasses.objectClass),
 | 
| +    'specProperty': js.string(namer.nativeSpecProperty),
 | 
| +    'trivialNsmHandlers': emitter.buildTrivialNsmHandlers(),
 | 
| +    'hasRetainedMetadata': backend.hasRetainedMetadata,
 | 
| +    'types': typesAccess,
 | 
| +    'objectClassName':
 | 
| +        js.quoteName(namer.runtimeTypeName(compiler.coreClasses.objectClass)),
 | 
| +    'needsStructuredMemberInfo': emitter.needsStructuredMemberInfo,
 | 
| +    'usesMangledNames':
 | 
| +        compiler.mirrorsLibrary != null || compiler.enabledFunctionApply,
 | 
| +    'tearOffCode': buildTearOffCode(backend),
 | 
| +    'nativeInfoHandler': nativeInfoHandler,
 | 
| +    'operatorIsPrefix': js.string(namer.operatorIsPrefix),
 | 
| +    'deferredActionString': js.string(namer.deferredAction)
 | 
| +  };
 | 
| +  String skeleton = '''
 | 
|  function $setupProgramName(programData, typesOffset) {
 | 
|    "use strict";
 | 
|    if (#needsClassSupport) {
 | 
| @@ -835,14 +832,16 @@ String readString(String array, String index) {
 | 
|  
 | 
|  String readInt(String array, String index) {
 | 
|    return readChecked(
 | 
| -      array, index,
 | 
| +      array,
 | 
| +      index,
 | 
|        'result != null && (typeof result != "number" || (result|0) !== result)',
 | 
|        'int');
 | 
|  }
 | 
|  
 | 
|  String readFunctionType(String array, String index) {
 | 
|    return readChecked(
 | 
| -      array, index,
 | 
| +      array,
 | 
| +      index,
 | 
|        'result != null && '
 | 
|        '(typeof result != "number" || (result|0) !== result) && '
 | 
|        'typeof result != "function"',
 | 
| 
 |