// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

part of dart2js.js_emitter.full_emitter;

// TODO(ahe): Share these with js_helper.dart.
const FUNCTION_INDEX = 0;
const NAME_INDEX = 1;
const CALL_NAME_INDEX = 2;
const REQUIRED_PARAMETER_INDEX = 3;
const OPTIONAL_PARAMETER_INDEX = 4;
const DEFAULT_ARGUMENTS_INDEX = 5;

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 RANGE3_ADJUST =
    - (FIRST_FIELD_CODE + RANGE1_SIZE + RANGE2_SIZE - RANGE3_FIRST);

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) {

  jsAst.Expression typeInformationAccess =
      emitter.generateEmbeddedGlobalAccess(embeddedNames.TYPE_INFORMATION);
  jsAst.Expression globalFunctionsAccess =
      emitter.generateEmbeddedGlobalAccess(embeddedNames.GLOBAL_FUNCTIONS);
  jsAst.Expression staticsAccess =
      emitter.generateEmbeddedGlobalAccess(embeddedNames.STATICS);
  jsAst.Expression interceptedNamesAccess =
      emitter.generateEmbeddedGlobalAccess(embeddedNames.INTERCEPTED_NAMES);
  jsAst.Expression mangledGlobalNamesAccess =
      emitter.generateEmbeddedGlobalAccess(embeddedNames.MANGLED_GLOBAL_NAMES);
  jsAst.Expression mangledNamesAccess =
      emitter.generateEmbeddedGlobalAccess(embeddedNames.MANGLED_NAMES);
  jsAst.Expression librariesAccess =
      emitter.generateEmbeddedGlobalAccess(embeddedNames.LIBRARIES);
  jsAst.Expression typesAccess =
      emitter.generateEmbeddedGlobalAccess(embeddedNames.TYPES);
  jsAst.Expression createNewIsolateFunctionAccess =
      emitter.generateEmbeddedGlobalAccess(embeddedNames.CREATE_NEW_ISOLATE);
  jsAst.Expression classIdExtractorAccess =
      emitter.generateEmbeddedGlobalAccess(embeddedNames.CLASS_ID_EXTRACTOR);
  jsAst.Expression allClassesAccess =
      emitter.generateEmbeddedGlobalAccess(embeddedNames.ALL_CLASSES);
  jsAst.Expression precompiledAccess =
      emitter.generateEmbeddedGlobalAccess(embeddedNames.PRECOMPILED);
  jsAst.Expression finishedClassesAccess =
      emitter.generateEmbeddedGlobalAccess(embeddedNames.FINISHED_CLASSES);
  jsAst.Expression interceptorsByTagAccess =
      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);

  String reflectableField = namer.reflectableField;
  String reflectionInfoField = namer.reflectionInfoField;
  String reflectionNameField = namer.reflectionNameField;
  String metadataIndexField = namer.metadataIndexField;
  String defaultValuesField = namer.defaultValuesField;
  String methodsWithOptionalArgumentsField =
      namer.methodsWithOptionalArgumentsField;
  String unmangledNameIndex = backend.mustRetainMetadata
      ? ' 3 * optionalParameterCount + 2 * requiredParameterCount + 3'
      : ' 2 * optionalParameterCount + requiredParameterCount + 3';
  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}"';  // "%"
  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 = '''
function $setupProgramName(programData, typesOffset) {
  "use strict";
  if (#needsClassSupport) {

    function generateAccessor(fieldDescriptor, accessors, cls) {
      var fieldInformation = fieldDescriptor.split("-");
      var field = fieldInformation[0];
      var len = field.length;
      var code = field.charCodeAt(len - 1);
      var reflectable;
      if (fieldInformation.length > 1) reflectable = true;
           else reflectable = false;
      code = ((code >= $RANGE1_FIRST) && (code <= $RANGE1_LAST))
            ? code - $RANGE1_ADJUST
            : ((code >= $RANGE2_FIRST) && (code <= $RANGE2_LAST))
              ? code - $RANGE2_ADJUST
              : ((code >= $RANGE3_FIRST) && (code <= $RANGE3_LAST))
                ? code - $RANGE3_ADJUST
                : $NO_FIELD_CODE;

      if (code) {  // needsAccessor
        var getterCode = code & 3;
        var setterCode = code >> 2;
        var accessorName = field = field.substring(0, len - 1);

        var divider = field.indexOf(":");
        if (divider > 0) { // Colon never in first position.
          accessorName = field.substring(0, divider);
          field = field.substring(divider + 1);
        }

        if (getterCode) {  // needsGetter
          var args = (getterCode & 2) ? "$receiverParamName" : "";
          var receiver = (getterCode & 1) ? "this" : "$receiverParamName";
          var body = "return " + receiver + "." + field;
          var property =
              cls + ".prototype.${namer.getterPrefix}" + accessorName + "=";
          var fn = "function(" + args + "){" + body + "}";
          if (reflectable)
            accessors.push(property + "\$reflectable(" + fn + ");\\n");
          else
            accessors.push(property + fn + ";\\n");
        }

        if (setterCode) {  // needsSetter
          var args = (setterCode & 2)
              ? "$receiverParamName,${_}$valueParamName"
              : "$valueParamName";
          var receiver = (setterCode & 1) ? "this" : "$receiverParamName";
          var body = receiver + "." + field + "$_=$_$valueParamName";
          var property =
              cls + ".prototype.${namer.setterPrefix}" + accessorName + "=";
          var fn = "function(" + args + "){" + body + "}";
          if (reflectable)
            accessors.push(property + "\$reflectable(" + fn + ");\\n");
          else
            accessors.push(property + fn + ";\\n");
        }
      }

      return field;
    }

    // First the class name, then the field names in an array and the members
    // (inside an Object literal).
    // The caller can also pass in the constructor as a function if needed.
    //
    // Example:
    // defineClass("A", ["x", "y"], {
    //  foo\$1: function(y) {
    //   print(this.x + y);
    //  },
    //  bar\$2: function(t, v) {
    //   this.x = t - v;
    //  },
    // });
    function defineClass(name, fields) {
      var accessors = [];

      var str = "function " + name + "(";
      var body = "";
      if (#hasIsolateSupport) { var fieldNames = ""; }

      for (var i = 0; i < fields.length; i++) {
        if(i != 0) str += ", ";

        var field = generateAccessor(fields[i], accessors, name);
        if (#hasIsolateSupport) { fieldNames += "'" + field + "',"; }
        var parameter = "p_" + field;
        str += parameter;
        body += ("this." + field + " = " + parameter + ";\\n");
      }
      if (supportsDirectProtoAccess) {
        body += "this." + #deferredActionString + "();";
      }
      str += ") {\\n" + body + "}\\n";
      str += name + ".$typeNameProperty=\\"" + name + "\\";\\n";
      str += "\$desc=\$collectedClasses." + name + "[1];\\n";
      str += name + ".prototype = \$desc;\\n";
      if (typeof defineClass.name != "string") {
        str += name + ".name=\\"" + name + "\\";\\n";
      }
      if (#hasIsolateSupport) {
        str += name + "." + #fieldNamesProperty + "=[" + fieldNames
               + "];\\n";
      }
      str += accessors.join("");

      return str;
    }

    if (#hasIncrementalSupport) {
      #incrementalHelper.defineClass = defineClass;
    }

    if (#hasIsolateSupport) {
      #createNewIsolateFunction = function() { return new #isolateName(); };

      #classIdExtractor = function(o) { return o.constructor.name; };

      #classFieldsExtractor = function(o) {
        var fieldNames = o.constructor.#fieldNamesProperty;
        if (!fieldNames) return [];  // TODO(floitsch): do something else here.
        var result = [];
        result.length = fieldNames.length;
        for (var i = 0; i < fieldNames.length; i++) {
          result[i] = o[fieldNames[i]];
        }
        return result;
      };

      #instanceFromClassId = function(name) { return new #allClasses[name](); };

      #initializeEmptyInstance = function(name, o, fields) {
        #allClasses[name].apply(o, fields);
        return o;
      }
    }

    // If the browser supports changing the prototype via __proto__, we make
    // use of that feature. Otherwise, we copy the properties into a new
    // constructor.
    var inheritFrom = supportsDirectProtoAccess ?
      function(constructor, superConstructor) {
        var prototype = constructor.prototype;
        prototype.__proto__ = superConstructor.prototype;
        // Use a function for `true` here, as functions are stored in the
        // hidden class and not as properties in the object.
        prototype.constructor = constructor;
        prototype[#operatorIsPrefix + constructor.name] = constructor;
        return convertToFastObject(prototype);
      } :
      function() {
        function tmp() {}
        return function (constructor, superConstructor) {
          tmp.prototype = superConstructor.prototype;
          var object = new tmp();
          convertToSlowObject(object);
          var properties = constructor.prototype;
          var members = Object.keys(properties);
          for (var i = 0; i < members.length; i++) {
            var member = members[i];
            object[member] = properties[member];
          }
          // Use a function for `true` here, as functions are stored in the
          // hidden class and not as properties in the object.
          object[#operatorIsPrefix + constructor.name] = constructor;
          object.constructor = constructor;
          constructor.prototype = object;
          return object;
        };
      }();

     if (#hasIncrementalSupport) {
       #incrementalHelper.inheritFrom = inheritFrom;
     }

    // Class descriptions are collected in a JS object.
    // 'finishClasses' takes all collected descriptions and sets up
    // the prototype.
    // Once set up, the constructors prototype field satisfy:
    //  - it contains all (local) members.
    //  - its internal prototype (__proto__) points to the superclass'
    //    prototype field.
    //  - the prototype's constructor field points to the JavaScript
    //    constructor.
    // For engines where we have access to the '__proto__' we can manipulate
    // the object literal directly. For other engines we have to create a new
    // object and copy over the members.
    function finishClasses(processedClasses) {
      if (#debugFastObjects)
        print("Number of classes: " +
              Object.getOwnPropertyNames(processedClasses.collected).length);

      var allClasses = #allClasses;

      if (#inCspMode) {
        var constructors = #precompiled(processedClasses.collected);
      }

      if (#notInCspMode) {
        processedClasses.combinedConstructorFunction +=
          "return [\\n" + processedClasses.constructorsList.join(",\\n  ") +
          "\\n]";
       var constructors =
         new Function("\$collectedClasses",
             processedClasses.combinedConstructorFunction)
                 (processedClasses.collected);
        processedClasses.combinedConstructorFunction = null;
      }

      for (var i = 0; i < constructors.length; i++) {
        var constructor = constructors[i];
        var cls = constructor.name;
        var desc = processedClasses.collected[cls];
        var globalObject = desc[0];
        desc = desc[1];
        if (#isTreeShakingDisabled)
          constructor["${namer.metadataField}"] = desc;
        allClasses[cls] = constructor;
        globalObject[cls] = constructor;
      }
      constructors = null;

      var finishedClasses = #finishedClassesAccess;

      function finishClass(cls) {

        if (finishedClasses[cls]) return;
        finishedClasses[cls] = true;

        var superclass = processedClasses.pending[cls];

        if (#needsMixinSupport) {
          if (superclass && superclass.indexOf("+") > 0) {
            var s = superclass.split("+");
            superclass = s[0];
            var mixinClass = s[1];
            finishClass(mixinClass);
            var mixin = allClasses[mixinClass];
            var mixinPrototype = mixin.prototype;
            var clsPrototype = allClasses[cls].prototype;

            var properties = Object.keys(mixinPrototype);
            for (var i = 0; i < properties.length; i++) {
              var d = properties[i];
              if (!hasOwnProperty.call(clsPrototype, d))
                clsPrototype[d] = mixinPrototype[d];
            }
          }
        }

        // The superclass is only false (empty string) for the Dart Object
        // class.  The minifier together with noSuchMethod can put methods on
        // the Object.prototype object, and they show through here, so we check
        // that we have a string.
        if (!superclass || typeof superclass != "string") {
          // Inlined special case of InheritFrom here for performance reasons.
          // Fix up the the Dart Object class' prototype.
          var constructor = allClasses[cls];
          var prototype = constructor.prototype;
          prototype.constructor = constructor;
          prototype.#isObject = constructor;
          prototype.#deferredAction = function() {};
          return;
        }
        finishClass(superclass);
        var superConstructor = allClasses[superclass];

        if (!superConstructor) {
          superConstructor = existingIsolateProperties[superclass];
        }

        var constructor = allClasses[cls];
        var prototype = inheritFrom(constructor, superConstructor);

        if (#needsMixinSupport) {
          if (mixinPrototype) {
            prototype.#deferredAction
              = mixinDeferredActionHelper(mixinPrototype, prototype);
          }
        }

        if (#needsNativeSupport) {
          if (Object.prototype.hasOwnProperty.call(prototype, #specProperty)) {
            #nativeInfoHandler;
            // As native classes can come into existence without a constructor
            // call, we have to ensure that the class has been fully
            // initialized.
            prototype.#deferredAction();
          }
        }
        // Interceptors (or rather their prototypes) are also used without
        // first instantiating them first.
        if (prototype.#isInterceptorClass) {
          prototype.#deferredAction();
        }
      }

      #trivialNsmHandlers;

      var properties = Object.keys(processedClasses.pending);
      for (var i = 0; i < properties.length; i++) finishClass(properties[i]);
    }

    // Generic handler for deferred class setup. The handler updates the 
    // prototype that it is installed on (it traverses the prototype chain
    // of [this] to find itself) and then removes itself. It recurses by
    // calling deferred handling again, which terminates on Object due to
    // the final handler.
    function finishAddStubsHelper() {
      var prototype = this;
      // Find the actual prototype that this handler is installed on.
      while (!prototype.hasOwnProperty(#deferredActionString)) {
        prototype = prototype.__proto__;
      }
      delete prototype.#deferredAction; // Intended to make it slow, too.
      var properties = Object.keys(prototype);
      for (var index = 0; index < properties.length; index++) {
        var property = properties[index];
        var firstChar = property.charCodeAt(0);
        var elem;
        // We have to filter out some special properties that are used for
        // metadata in descriptors. Currently, we filter everything that
        // starts with + or *. This has to stay in sync with the special
        // properties that are used by processClassData below.
        if (property !== "${namer.classDescriptorProperty}" &&
            property !== "$reflectableField" &&
            firstChar !== 43 && // 43 is aka "+".
            firstChar !== 42 && // 42 is aka "*"
            (elem = prototype[property]) != null &&
            elem.constructor === Array &&
            property !== "<>") {
          addStubs(prototype, elem, property, false, []);
        }
      }
      convertToFastObject(prototype);
      prototype = prototype.__proto__;
      // Call other handlers.
      prototype.#deferredAction();
    }

    if (#needsMixinSupport) {
      // Returns a deferred class setup handler that first invokes the
      // handler on [mixinPrototype] and then resumes handling on
      // [targetPrototype]. If [targetPrototype] already has a handler
      // installed, the handler is preserved in the generated closure and
      // thus can be safely overwritten.
      function mixinDeferredActionHelper(mixinPrototype, targetPrototype) {
        var chain;
        if (targetPrototype.hasOwnProperty(#deferredActionString)) {
          chain = targetPrototype.#deferredAction;
        }
        return function foo() {
          var prototype = this;
          // Find the actual prototype that this handler is installed on.
          while (!prototype.hasOwnProperty(#deferredActionString)) {
            prototype = prototype.__proto__;
          }
          if (chain) {
            prototype.#deferredAction = chain;
          } else {
            delete prototype.#deferredAction;
            convertToFastObject(prototype);
          }
          mixinPrototype.#deferredAction();
          prototype.#deferredAction();
        }
      }
    }

    function processClassData(cls, descriptor, processedClasses) {
      descriptor = convertToSlowObject(descriptor); // Use a slow object.
      var previousProperty;
      var properties = Object.keys(descriptor);
      var hasDeferredWork = false;
      var shouldDeferWork =
          supportsDirectProtoAccess && cls != #objectClassName;
      for (var i = 0; i < properties.length; i++) {
        var property = properties[i];
        var firstChar = property.charCodeAt(0);
        if (property === #staticsPropertyNameString) {
          processStatics(#statics[cls] = descriptor.#staticsPropertyName,
                         processedClasses);
          delete descriptor.#staticsPropertyName;
        } else if (firstChar === 43) { // 43 is "+".
          mangledNames[previousProperty] = property.substring(1);
          var flag = descriptor[property];
          if (flag > 0)
            descriptor[previousProperty].$reflectableField = flag;
        } else if (firstChar === 42) { // 42 is "*"
          descriptor[previousProperty].$defaultValuesField =
              descriptor[property];
          var optionalMethods = descriptor.$methodsWithOptionalArgumentsField;
          if (!optionalMethods) {
            descriptor.$methodsWithOptionalArgumentsField = optionalMethods={}
          }
          optionalMethods[property] = previousProperty;
        } else {
          var elem = descriptor[property];
          if (property !== "${namer.classDescriptorProperty}" &&
              elem != null &&
              elem.constructor === Array &&
              property !== "<>") {
            if (shouldDeferWork) {
              hasDeferredWork = true;
            } else {
              addStubs(descriptor, elem, property, false, []);
            }
          } else {
            previousProperty = property;
          }
        }
      }

      if (hasDeferredWork)
        descriptor.#deferredAction = finishAddStubsHelper;

      /* The 'fields' are either a constructor function or a
       * string encoding fields, constructor and superclass. Gets the
       * superclass and fields in the format
       *   'Super;field1,field2'
       * from the CLASS_DESCRIPTOR_PROPERTY property on the descriptor.
       */
      var classData = descriptor["${namer.classDescriptorProperty}"],
          split, supr, fields = classData;

      if (#hasRetainedMetadata)
        if (typeof classData == "object" &&
            classData instanceof Array) {
          classData = fields = classData[0];
        }
      // ${ClassBuilder.fieldEncodingDescription}.
      var s = fields.split(";");
      fields = s[1] ? s[1].split(",") : [];
      supr = s[0];
      // ${ClassBuilder.functionTypeEncodingDescription}.
      split = supr.split(":");
      if (split.length == 2) {
        supr = split[0];
        var functionSignature = split[1];
        if (functionSignature)
          descriptor.${namer.operatorSignature} = function(s) {
            return function() {
              return #types[s];
            };
          }(functionSignature);
      }

      if (supr) processedClasses.pending[cls] = supr;
      if (#notInCspMode) {
        processedClasses.combinedConstructorFunction +=
            defineClass(cls, fields);
        processedClasses.constructorsList.push(cls);
      }
      processedClasses.collected[cls] = [globalObject, descriptor];
      classes.push(cls);
    }
  }

  function processStatics(descriptor, processedClasses) {
    var properties = Object.keys(descriptor);
    for (var i = 0; i < properties.length; i++) {
      var property = properties[i];
      if (property === "${namer.classDescriptorProperty}") continue;
      var element = descriptor[property];
      var firstChar = property.charCodeAt(0);
      var previousProperty;
      if (firstChar === 43) { // 43 is "+".
        mangledGlobalNames[previousProperty] = property.substring(1);
        var flag = descriptor[property];
        if (flag > 0)
          descriptor[previousProperty].$reflectableField = flag;
        if (element && element.length)
          #typeInformation[previousProperty] = element;
      } else if (firstChar === 42) { // 42 is "*"
        globalObject[previousProperty].$defaultValuesField = element;
        var optionalMethods = descriptor.$methodsWithOptionalArgumentsField;
        if (!optionalMethods) {
          descriptor.$methodsWithOptionalArgumentsField = optionalMethods = {}
        }
        optionalMethods[property] = previousProperty;
      } else if (typeof element === "function") {
        globalObject[previousProperty = property] = element;
        functions.push(property);
        #globalFunctions[property] = element;
      } else if (element.constructor === Array) {
        if (#needsStructuredMemberInfo) {
          addStubs(globalObject, element, property, true, functions);
        }
      } else {
        // We will not enter this case if no classes are defined.
        if (#needsClassSupport) {
          previousProperty = property;
          processClassData(property, element, processedClasses);
        }
      }
    }
  }

  if (#needsStructuredMemberInfo) {

    // See [dart2js.js_emitter.ContainerBuilder.addMemberMethod] for format of
    // [array].

    // Processes the stub declaration given by [array] and stores the results
    // in the corresponding [prototype]. [name] is the property name in
    // [prototype] that the stub declaration belongs to.
    // If [isStatic] is true, the property being processed belongs to a static
    // function and thus is stored as a global. In that case we also add all
    // generated functions to the [functions] array, which is used by the
    // mirrors system to enumerate all static functions of a library. For
    // non-static functions we might still add some functions to [functions] but
    // the information is thrown away at the call site. This is to avoid
    // conditionals.
    function addStubs(prototype, array, name, isStatic, functions) {
      var index = $FUNCTION_INDEX, alias = array[index], f;
      if (typeof alias == "string") {
        f = array[++index];
      } else {
        f = alias;
        alias = name;
      }
      var funcs = [prototype[name] = prototype[alias] = f];
      f.\$stubName = name;
      functions.push(name);
      for (index++; index < array.length; index++) {
        f = array[index];
        if (typeof f != "function") break;
        if (!isStatic) {
          f.\$stubName = ${readString("array", "++index")};
        }
        funcs.push(f);
        if (f.\$stubName) {
          prototype[f.\$stubName] = f;
          functions.push(f.\$stubName);
        }
      }

      for (var i = 0; i < funcs.length; index++, i++) {
        funcs[i].\$callName = ${readString("array", "index")};
      }
      var getterStubName = ${readString("array", "index")};
      array = array.slice(++index);
      var requiredParameterInfo = ${readInt("array", "0")};
      var requiredParameterCount = requiredParameterInfo >> 1;
      var isAccessor = (requiredParameterInfo & 1) === 1;
      var isSetter = requiredParameterInfo === 3;
      var isGetter = requiredParameterInfo === 1;
      var optionalParameterInfo = ${readInt("array", "1")};
      var optionalParameterCount = optionalParameterInfo >> 1;
      var optionalParametersAreNamed = (optionalParameterInfo & 1) === 1;
      var isIntercepted =
             requiredParameterCount + optionalParameterCount != funcs[0].length;
      var functionTypeIndex = ${readFunctionType("array", "2")};
      if (typeof functionTypeIndex == "number")
        ${readFunctionType("array", "2")} = functionTypeIndex + typesOffset;
      var unmangledNameIndex = $unmangledNameIndex;

      if (getterStubName) {
        f = tearOff(funcs, array, isStatic, name, isIntercepted);
        prototype[name].\$getter = f;
        f.\$getterStub = true;
        // Used to create an isolate using spawnFunction.
        if (isStatic) {
          #globalFunctions[name] = f;
          functions.push(getterStubName);
        }
        prototype[getterStubName] = f;
        funcs.push(f);
        f.\$stubName = getterStubName;
        f.\$callName = null;
        // Update the interceptedNames map (which only exists if `invokeOn` was
        // enabled).
        if (#enabledInvokeOn)
          if (isIntercepted) #interceptedNames[getterStubName] = 1;
      }

      if (#usesMangledNames) {
        var isReflectable = array.length > unmangledNameIndex;
        if (isReflectable) {
          funcs[0].$reflectableField = 1;
          funcs[0].$reflectionInfoField = array;
          for (var i = 1; i < funcs.length; i++) {
            funcs[i].$reflectableField = 2;
            funcs[i].$reflectionInfoField = array;
          }
          var mangledNames = isStatic ? #mangledGlobalNames : #mangledNames;
          var unmangledName = ${readString("array", "unmangledNameIndex")};
          // The function is either a getter, a setter, or a method.
          // If it is a method, it might also have a tear-off closure.
          // The unmangledName is the same as the getter-name.
          var reflectionName = unmangledName;
          if (getterStubName) mangledNames[getterStubName] = reflectionName;
          if (isSetter) {
            reflectionName += "=";
          } else if (!isGetter) {
            reflectionName += ":" + 
                (requiredParameterCount + optionalParameterCount);
          }
          mangledNames[name] = reflectionName;
          funcs[0].$reflectionNameField = reflectionName;
          funcs[0].$metadataIndexField = unmangledNameIndex + 1;
          // The following line installs the [${JsGetName.CALL_CATCH_ALL}]
          // property for closures.
          if (optionalParameterCount) prototype[unmangledName + "*"] = funcs[0];
        }
      }
    }

    if (#enabledJsInterop) {
      #jsInteropBoostrap
    }
    #tearOffCode;
  }

  if (#hasIncrementalSupport) {
    #incrementalHelper.addStubs = addStubs;
  }

  var functionCounter = 0;
  if (!#libraries) #libraries = [];
  if (!#mangledNames) #mangledNames = map();
  if (!#mangledGlobalNames) #mangledGlobalNames = map();
  if (!#statics) #statics = map();
  if (!#typeInformation) #typeInformation = map();
  if (!#globalFunctions) #globalFunctions = map();
  if (#enabledInvokeOn)
    if (!#interceptedNames) #interceptedNames = #interceptedNamesSet;
  var libraries = #libraries;
  var mangledNames = #mangledNames;
  var mangledGlobalNames = #mangledGlobalNames;
  var hasOwnProperty = Object.prototype.hasOwnProperty;
  var length = programData.length;
  var processedClasses = map();
  processedClasses.collected = map();
  processedClasses.pending = map();
  if (#notInCspMode) {
    processedClasses.constructorsList = [];
    // For every class processed [processedClasses.combinedConstructorFunction]
    // will be updated with the corresponding constructor function.
    processedClasses.combinedConstructorFunction =
        "function \$reflectable(fn){fn.$reflectableField=1;return fn};\\n"+
        "var \$desc;\\n";
  }
  for (var i = 0; i < length; i++) {
    var data = programData[i];

// [data] contains these elements:
// 0. The library name (not unique).
// 1. The library URI (unique).
// 2. A function returning the metadata associated with this library.
// 3. The global object to use for this library.
// 4. An object literal listing the members of the library.
// 5. This element is optional and if present it is true and signals that this
// library is the root library (see dart:mirrors IsolateMirror.rootLibrary).
//
// The entries of [data] are built in [assembleProgram] above.

    var name = data[0];
    var uri = data[1];
    var metadata = data[2];
    var globalObject = data[3];
    var descriptor = data[4];
    var isRoot = !!data[5];
    var fields = descriptor && descriptor["${namer.classDescriptorProperty}"];
    if (fields instanceof Array) fields = fields[0];
    var classes = [];
    var functions = [];
    processStatics(descriptor, processedClasses);
    libraries.push([name, uri, classes, functions, metadata, fields, isRoot,
                    globalObject]);
  }
  if (#needsClassSupport) finishClasses(processedClasses);
}''';

  // TODO(zarah): Remove empty else branches in output when if(#hole) is false.
  return js.statement(skeleton, holes);
}

String readString(String array, String index) {
  return readChecked(
      array, index, 'result != null && typeof result != "string"', 'string');
}

String readInt(String array, String index) {
  return readChecked(
      array, index,
      'result != null && (typeof result != "number" || (result|0) !== result)',
      'int');
}

String readFunctionType(String array, String index) {
  return readChecked(
      array, index,
      'result != null && '
      '(typeof result != "number" || (result|0) !== result) && '
      'typeof result != "function"',
      'function or int');
}

String readChecked(String array, String index, String check, String type) {
  if (!VALIDATE_DATA) return '$array[$index]';
  return '''
(function() {
  var result = $array[$index];
  if ($check) {
    throw new Error(
        name + ": expected value of type \'$type\' at index " + ($index) +
        " but got " + (typeof result));
  }
  return result;
})()''';
}
