166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Copyright (c) 2013 The Chromium Authors. All rights reserved.
266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Use of this source code is governed by a BSD-style license that can be
366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// found in the LICENSE file.
466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis'use strict';
666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.exportTo('tracing.trace_model', function() {
866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  /**
966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   * A snapshot of an object instance, at a given moment in time.
1066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   *
1166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   * Initialization of snapshots and instances is three phased:
1266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   *
1366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   * 1. Instances and snapshots are constructed. This happens during event
1466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   *    importing. Little should be done here, because the object's data
1566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   *    are still being used by the importer to reconstruct object references.
1666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   *
1766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   * 2. Instances and snapshtos are preinitialized. This happens after implicit
1866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   *    objects have been found, but before any references have been found and
1966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   *    switched to direct references. Thus, every snapshot stands on its own.
2066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   *    This is a good time to do global field renaming and type conversion,
2166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   *    e.g. recognizing domain-specific types and converting from C++ naming
2266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   *    convention to JS.
2366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   *
2466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   * 3. Instances and snapshtos are initialized. At this point, {id_ref:
2566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   *    '0x1000'} fields have been converted to snapshot references. This is a
2666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   *    good time to generic initialization steps and argument verification.
2766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   *
2866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   * @constructor
2966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   */
3066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  function ObjectSnapshot(objectInstance, ts, args) {
3166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    this.objectInstance = objectInstance;
3266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    this.ts = ts;
3366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    this.args = args;
3466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    this.selected = false;
3566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  }
3666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
3766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  ObjectSnapshot.prototype = {
3866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    __proto__: Object.prototype,
3966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
4066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    /**
4166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis     * See ObjectSnapshot constructor notes on object initialization.
4266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis     */
4366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    preInitialize: function() {
4466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
4566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
4666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    /**
4766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis     * See ObjectSnapshot constructor notes on object initialization.
4866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis     */
4966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    initialize: function() {
5066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    }
5166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
5266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
5366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  ObjectSnapshot.nameToConstructorMap_ = {};
5466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  ObjectSnapshot.register = function(name, constructor) {
5566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    if (ObjectSnapshot.nameToConstructorMap_[name])
5666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      throw new Error('Constructor already registerd for ' + name);
5766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    ObjectSnapshot.nameToConstructorMap_[name] = constructor;
5866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
5966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
6066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  ObjectSnapshot.unregister = function(name) {
6166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    delete ObjectSnapshot.nameToConstructorMap_[name];
6266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
6366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
6466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  ObjectSnapshot.getConstructor = function(name) {
6566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    if (ObjectSnapshot.nameToConstructorMap_[name])
6666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      return ObjectSnapshot.nameToConstructorMap_[name];
6766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return ObjectSnapshot;
6866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
6966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
7066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  return {
7166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    ObjectSnapshot: ObjectSnapshot
7266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
7366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis});
74