1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2006-2012 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
43100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
53100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Handle id counters.
63100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuvar next_handle_ = 0;
73100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuvar next_transient_handle_ = -1;
83100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
93100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Mirror cache.
103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuvar mirror_cache_ = [];
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar mirror_cache_enabled_ = true;
123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction ToggleMirrorCache(value) {
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  mirror_cache_enabled_ = value;
163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  next_handle_ = 0;
173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  mirror_cache_ = [];
183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Wrapper to check whether an object is a Promise.  The call may not work
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// if promises are not enabled.
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// TODO(yangguo): remove try-catch once promises are enabled by default.
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction ObjectIsPromise(value) {
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  try {
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return IS_SPEC_OBJECT(value) &&
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           !IS_UNDEFINED(%DebugGetProperty(value, builtins.promiseStatus));
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } catch (e) {
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return false;
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the mirror for a specified value or object.
363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {value or Object} value the value or object to retreive the mirror for
383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {boolean} transient indicate whether this object is transient and
393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    should not be added to the mirror cache. The default is not transient.
403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {Mirror} the mirror reflects the passed value or object
413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeMirror(value, opt_transient) {
433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var mirror;
443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Look for non transient mirrors in the mirror cache.
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!opt_transient && mirror_cache_enabled_) {
473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    for (id in mirror_cache_) {
483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      mirror = mirror_cache_[id];
493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (mirror.value() === value) {
503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        return mirror;
513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Special check for NaN as NaN == NaN is false.
533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (mirror.isNumber() && isNaN(mirror.value()) &&
543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          typeof value == 'number' && isNaN(value)) {
553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        return mirror;
563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (IS_UNDEFINED(value)) {
613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new UndefinedMirror();
623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (IS_NULL(value)) {
633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new NullMirror();
643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (IS_BOOLEAN(value)) {
653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new BooleanMirror(value);
663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (IS_NUMBER(value)) {
673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new NumberMirror(value);
683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (IS_STRING(value)) {
693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new StringMirror(value);
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (IS_SYMBOL(value)) {
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    mirror = new SymbolMirror(value);
723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (IS_ARRAY(value)) {
733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new ArrayMirror(value);
743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (IS_DATE(value)) {
753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new DateMirror(value);
763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (IS_FUNCTION(value)) {
773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new FunctionMirror(value);
783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (IS_REGEXP(value)) {
793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new RegExpMirror(value);
803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (IS_ERROR(value)) {
813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new ErrorMirror(value);
823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (IS_SCRIPT(value)) {
833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new ScriptMirror(value);
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (IS_MAP(value) || IS_WEAKMAP(value)) {
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    mirror = new MapMirror(value);
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (IS_SET(value) || IS_WEAKSET(value)) {
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    mirror = new SetMirror(value);
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (ObjectIsPromise(value)) {
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    mirror = new PromiseMirror(value);
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (IS_GENERATOR(value)) {
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    mirror = new GeneratorMirror(value);
923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new ObjectMirror(value, OBJECT_TYPE, opt_transient);
943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (mirror_cache_enabled_) mirror_cache_[mirror.handle()] = mirror;
973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return mirror;
983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
1023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the mirror for a specified mirror handle.
1033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
1043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} handle the handle to find the mirror for
1053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {Mirror or undefiend} the mirror with the requested handle or
1063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     undefined if no mirror with the requested handle was found
1073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
1083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction LookupMirror(handle) {
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!mirror_cache_enabled_) throw new Error("Mirror cache is disabled");
1103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return mirror_cache_[handle];
1113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
1123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
1153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the mirror for the undefined value.
1163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
1173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {Mirror} the mirror reflects the undefined value
1183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
1193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction GetUndefinedMirror() {
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MakeMirror(UNDEFINED);
1213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
1223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
1253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Inherit the prototype methods from one constructor into another.
1263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
1273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * The Function.prototype.inherits from lang.js rewritten as a standalone
1283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * function (not on Function.prototype). NOTE: If this file is to be loaded
1293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * during bootstrapping this function needs to be revritten using some native
1303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * functions as prototype setup using normal JavaScript does not work as
1313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * expected during bootstrapping (see mirror.js in r114903).
1323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
1333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {function} ctor Constructor function which needs to inherit the
1343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     prototype
1353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {function} superCtor Constructor function to inherit prototype from
1363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
1373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction inherits(ctor, superCtor) {
1383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var tempCtor = function(){};
1393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  tempCtor.prototype = superCtor.prototype;
1403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  ctor.super_ = superCtor.prototype;
1413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  ctor.prototype = new tempCtor();
1423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  ctor.prototype.constructor = ctor;
1433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
1443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Type names of the different mirrors.
1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar UNDEFINED_TYPE = 'undefined';
1483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar NULL_TYPE = 'null';
1493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar BOOLEAN_TYPE = 'boolean';
1503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar NUMBER_TYPE = 'number';
1513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar STRING_TYPE = 'string';
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar SYMBOL_TYPE = 'symbol';
1533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar OBJECT_TYPE = 'object';
1543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar FUNCTION_TYPE = 'function';
1553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar REGEXP_TYPE = 'regexp';
1563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar ERROR_TYPE = 'error';
1573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar PROPERTY_TYPE = 'property';
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar INTERNAL_PROPERTY_TYPE = 'internalProperty';
1593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar FRAME_TYPE = 'frame';
1603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar SCRIPT_TYPE = 'script';
1613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar CONTEXT_TYPE = 'context';
1623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar SCOPE_TYPE = 'scope';
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar PROMISE_TYPE = 'promise';
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar MAP_TYPE = 'map';
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar SET_TYPE = 'set';
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar GENERATOR_TYPE = 'generator';
1673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Maximum length when sending strings through the JSON protocol.
1693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kMaxProtocolStringLength = 80;
1703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Different kind of properties.
1723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar PropertyKind = {};
1733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyKind.Named   = 1;
1743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyKind.Indexed = 2;
1753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// A copy of the PropertyType enum from property-details.h
1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar PropertyType = {};
17944f0eee88ff00398ff7f715fab053374d808c90dSteve BlockPropertyType.Normal                  = 0;
18044f0eee88ff00398ff7f715fab053374d808c90dSteve BlockPropertyType.Field                   = 1;
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochPropertyType.Constant                = 2;
18244f0eee88ff00398ff7f715fab053374d808c90dSteve BlockPropertyType.Callbacks               = 3;
1833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Different attributes for a property.
1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar PropertyAttribute = {};
1873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyAttribute.None       = NONE;
1883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyAttribute.ReadOnly   = READ_ONLY;
1893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyAttribute.DontEnum   = DONT_ENUM;
1903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyAttribute.DontDelete = DONT_DELETE;
1913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// A copy of the scope types from runtime.cc.
1943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar ScopeType = { Global: 0,
1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                  Local: 1,
1963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                  With: 2,
1973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                  Closure: 3,
1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                  Catch: 4,
1993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                  Block: 5 };
2003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Mirror hierarchy:
2033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//   - Mirror
2043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//     - ValueMirror
2053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       - UndefinedMirror
2063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       - NullMirror
2073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       - NumberMirror
2083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       - StringMirror
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       - SymbolMirror
2103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       - ObjectMirror
2113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//         - FunctionMirror
2123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//           - UnresolvedFunctionMirror
2133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//         - ArrayMirror
2143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//         - DateMirror
2153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//         - RegExpMirror
2163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//         - ErrorMirror
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//         - PromiseMirror
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//         - MapMirror
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//         - SetMirror
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//         - GeneratorMirror
2213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//     - PropertyMirror
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     - InternalPropertyMirror
2233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//     - FrameMirror
2243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//     - ScriptMirror
2253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
2283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Base class for all mirror objects.
2293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {string} type The type of the mirror
2303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
2313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
2323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction Mirror(type) {
2333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.type_ = type;
2343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.type = function() {
2383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.type_;
2393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
2403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
2433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a value.
2443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a value.
2453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
2463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isValue = function() {
2473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof ValueMirror;
2483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
2523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects the undefined value.
2533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects the undefined value.
2543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
2553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isUndefined = function() {
2563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof UndefinedMirror;
2573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
2613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects the null value.
2623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects the null value
2633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
2643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isNull = function() {
2653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof NullMirror;
2663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
2703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a boolean value.
2713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a boolean value
2723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
2733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isBoolean = function() {
2743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof BooleanMirror;
2753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
2793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a number value.
2803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a number value
2813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
2823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isNumber = function() {
2833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof NumberMirror;
2843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
2883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a string value.
2893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a string value
2903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
2913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isString = function() {
2923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof StringMirror;
2933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Check whether the mirror reflects a symbol.
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @returns {boolean} True if the mirror reflects a symbol
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMirror.prototype.isSymbol = function() {
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return this instanceof SymbolMirror;
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/**
3063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects an object.
3073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects an object
3083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
3093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isObject = function() {
3103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof ObjectMirror;
3113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
3153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a function.
3163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a function
3173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
3183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isFunction = function() {
3193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof FunctionMirror;
3203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
3243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects an unresolved function.
3253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects an unresolved function
3263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
3273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isUnresolvedFunction = function() {
3283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof UnresolvedFunctionMirror;
3293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
3333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects an array.
3343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects an array
3353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
3363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isArray = function() {
3373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof ArrayMirror;
3383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
3423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a date.
3433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a date
3443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
3453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isDate = function() {
3463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof DateMirror;
3473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
3513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a regular expression.
3523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a regular expression
3533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
3543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isRegExp = function() {
3553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof RegExpMirror;
3563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
3603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects an error.
3613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects an error
3623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
3633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isError = function() {
3643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof ErrorMirror;
3653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Check whether the mirror reflects a promise.
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @returns {boolean} True if the mirror reflects a promise
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMirror.prototype.isPromise = function() {
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return this instanceof PromiseMirror;
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/**
378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Check whether the mirror reflects a generator object.
379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @returns {boolean} True if the mirror reflects a generator object
380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMirror.prototype.isGenerator = function() {
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return this instanceof GeneratorMirror;
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/**
3873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a property.
3883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a property
3893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
3903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isProperty = function() {
3913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof PropertyMirror;
3923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Check whether the mirror reflects an internal property.
397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @returns {boolean} True if the mirror reflects an internal property
398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */
399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMirror.prototype.isInternalProperty = function() {
400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return this instanceof InternalPropertyMirror;
401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/**
4053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a stack frame.
4063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a stack frame
4073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
4083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isFrame = function() {
4093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof FrameMirror;
4103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
4113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
4143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a script.
4153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a script
4163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
4173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isScript = function() {
4183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof ScriptMirror;
4193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
4203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
4233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a context.
4243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a context
4253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
4263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isContext = function() {
4273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof ContextMirror;
4283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
4293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
4323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a scope.
4333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a scope
4343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
4353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isScope = function() {
4363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof ScopeMirror;
4373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
4383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Check whether the mirror reflects a map.
442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @returns {boolean} True if the mirror reflects a map
443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */
444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMirror.prototype.isMap = function() {
445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return this instanceof MapMirror;
446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/**
450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Check whether the mirror reflects a set.
451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @returns {boolean} True if the mirror reflects a set
452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */
453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMirror.prototype.isSet = function() {
454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return this instanceof SetMirror;
455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/**
4593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Allocate a handle id for this object.
4603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
4613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.allocateHandle_ = function() {
462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (mirror_cache_enabled_) this.handle_ = next_handle_++;
4633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
4643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
4673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Allocate a transient handle id for this object. Transient handles are
4683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * negative.
4693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
4703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.allocateTransientHandle_ = function() {
4713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.handle_ = next_transient_handle_--;
4723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
4733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.toText = function() {
4763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Simpel to text which is used when on specialization in subclass.
4771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return "#<" + this.constructor.name + ">";
4783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
4793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
4823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Base class for all value mirror objects.
4833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {string} type The type of the mirror
4843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {value} value The value reflected by this mirror
4853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {boolean} transient indicate whether this object is transient with a
4863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    transient handle
4873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
4883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends Mirror
4893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
4903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ValueMirror(type, value, transient) {
4911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, type, Mirror);
4923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.value_ = value;
4933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (!transient) {
4943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    this.allocateHandle_();
4953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
4963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    this.allocateTransientHandle_();
4973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
4983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
4993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(ValueMirror, Mirror);
5003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.handle = function() {
5033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.handle_;
5043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
5053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
5083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether this is a primitive value.
5093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {boolean} True if the mirror reflects a primitive value
5103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
5113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuValueMirror.prototype.isPrimitive = function() {
5123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var type = this.type();
5133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return type === 'undefined' ||
5143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu         type === 'null' ||
5153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu         type === 'boolean' ||
5163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu         type === 'number' ||
517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         type === 'string' ||
518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         type === 'symbol';
5193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
5203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
5233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Get the actual value reflected by this mirror.
5243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {value} The value reflected by this mirror
5253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
5263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuValueMirror.prototype.value = function() {
5273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.value_;
5283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
5293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
5323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for Undefined.
5333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
5343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ValueMirror
5353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
5363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction UndefinedMirror() {
537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %_CallFunction(this, UNDEFINED_TYPE, UNDEFINED, ValueMirror);
5383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
5393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(UndefinedMirror, ValueMirror);
5403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuUndefinedMirror.prototype.toText = function() {
5433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return 'undefined';
5443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
5453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
5483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for null.
5493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
5503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ValueMirror
5513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
5523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction NullMirror() {
5531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, NULL_TYPE, null, ValueMirror);
5543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
5553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(NullMirror, ValueMirror);
5563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuNullMirror.prototype.toText = function() {
5593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return 'null';
5603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
5613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
5643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for boolean values.
5653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {boolean} value The boolean value reflected by this mirror
5663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
5673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ValueMirror
5683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
5693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction BooleanMirror(value) {
5701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, BOOLEAN_TYPE, value, ValueMirror);
5713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
5723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(BooleanMirror, ValueMirror);
5733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBooleanMirror.prototype.toText = function() {
5763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.value_ ? 'true' : 'false';
5773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
5783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
5813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for number values.
5823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} value The number value reflected by this mirror
5833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
5843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ValueMirror
5853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
5863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction NumberMirror(value) {
5871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, NUMBER_TYPE, value, ValueMirror);
5883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
5893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(NumberMirror, ValueMirror);
5903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuNumberMirror.prototype.toText = function() {
593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return %_NumberToString(this.value_);
5943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
5953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
5983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for string values.
5993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {string} value The string value reflected by this mirror
6003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
6013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ValueMirror
6023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
6033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction StringMirror(value) {
6041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, STRING_TYPE, value, ValueMirror);
6053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
6063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(StringMirror, ValueMirror);
6073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuStringMirror.prototype.length = function() {
6103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.value_.length;
6113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
6123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
613402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei PopescuStringMirror.prototype.getTruncatedValue = function(maxLength) {
614402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  if (maxLength != -1 && this.length() > maxLength) {
615402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    return this.value_.substring(0, maxLength) +
6163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu           '... (length: ' + this.length() + ')';
6173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
618402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  return this.value_;
6193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
620402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
621402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei PopescuStringMirror.prototype.toText = function() {
622402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  return this.getTruncatedValue(kMaxProtocolStringLength);
6233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
6243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Mirror object for a Symbol
628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @param {Object} value The Symbol
629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @constructor
630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @extends Mirror
631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */
632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction SymbolMirror(value) {
633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %_CallFunction(this, SYMBOL_TYPE, value, ValueMirror);
634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinherits(SymbolMirror, ValueMirror);
636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSymbolMirror.prototype.description = function() {
639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return %SymbolDescription(%_ValueOf(this.value_));
640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSymbolMirror.prototype.toText = function() {
644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return %_CallFunction(this.value_, builtins.SymbolToString);
645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/**
6493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for objects.
6503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {object} value The object reflected by this mirror
6513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {boolean} transient indicate whether this object is transient with a
6523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    transient handle
6533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
6543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ValueMirror
6553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
6563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ObjectMirror(value, type, transient) {
6571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, type || OBJECT_TYPE, value, transient, ValueMirror);
6583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
6593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(ObjectMirror, ValueMirror);
6603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.className = function() {
6633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return %_ClassOf(this.value_);
6643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
6653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.constructorFunction = function() {
6683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(%DebugGetProperty(this.value_, 'constructor'));
6693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
6703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.prototypeObject = function() {
6733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(%DebugGetProperty(this.value_, 'prototype'));
6743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
6753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.protoObject = function() {
6783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(%DebugGetPrototype(this.value_));
6793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
6803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.hasNamedInterceptor = function() {
6833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Get information on interceptors for this object.
6843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var x = %GetInterceptorInfo(this.value_);
6853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return (x & 2) != 0;
6863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
6873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.hasIndexedInterceptor = function() {
6903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Get information on interceptors for this object.
6913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var x = %GetInterceptorInfo(this.value_);
6923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return (x & 1) != 0;
6933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
6943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Get all own property names except for private symbols.
697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TryGetPropertyNames(object) {
698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  try {
699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // TODO(yangguo): Should there be a special debugger implementation of
700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // %GetOwnPropertyNames that doesn't perform access checks?
701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return %GetOwnPropertyNames(object, PROPERTY_ATTRIBUTES_PRIVATE_SYMBOL);
702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } catch (e) {
703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Might have hit a failed access check.
704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return [];
705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
7103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Return the property names for this object.
7113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} kind Indicate whether named, indexed or both kinds of
7123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     properties are requested
7133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} limit Limit the number of names returend to the specified
7143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu       value
7153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Array} Property names for this object
7163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
7173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.propertyNames = function(kind, limit) {
7183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Find kind and limit and allocate array for the result
7193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  kind = kind || PropertyKind.Named | PropertyKind.Indexed;
7203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var propertyNames;
7223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var elementNames;
7233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var total = 0;
7246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
7253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Find all the named properties.
7263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (kind & PropertyKind.Named) {
727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    propertyNames = TryGetPropertyNames(this.value_);
7283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    total += propertyNames.length;
7293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // Get names for named interceptor properties if any.
7313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (this.hasNamedInterceptor() && (kind & PropertyKind.Named)) {
7323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      var namedInterceptorNames =
7333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          %GetNamedInterceptorPropertyNames(this.value_);
7343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (namedInterceptorNames) {
7353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        propertyNames = propertyNames.concat(namedInterceptorNames);
7363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        total += namedInterceptorNames.length;
7373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
7383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
7393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
7403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Find all the indexed properties.
7423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (kind & PropertyKind.Indexed) {
743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Get own element names.
744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    elementNames = %GetOwnElementNames(this.value_);
7453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    total += elementNames.length;
7463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // Get names for indexed interceptor properties.
7483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (this.hasIndexedInterceptor() && (kind & PropertyKind.Indexed)) {
7493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      var indexedInterceptorNames =
7503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          %GetIndexedInterceptorElementNames(this.value_);
7513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (indexedInterceptorNames) {
7523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        elementNames = elementNames.concat(indexedInterceptorNames);
7533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        total += indexedInterceptorNames.length;
7543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
7553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
7563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
7573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  limit = Math.min(limit || total, total);
7583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var names = new Array(limit);
7603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var index = 0;
7613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Copy names for named properties.
7633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (kind & PropertyKind.Named) {
7643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    for (var i = 0; index < limit && i < propertyNames.length; i++) {
7653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      names[index++] = propertyNames[i];
7663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
7673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
7683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Copy names for indexed properties.
7703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (kind & PropertyKind.Indexed) {
7713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    for (var i = 0; index < limit && i < elementNames.length; i++) {
7723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      names[index++] = elementNames[i];
7733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
7743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
7753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return names;
7773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
7783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
7813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Return the properties for this object as an array of PropertyMirror objects.
7823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} kind Indicate whether named, indexed or both kinds of
7833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     properties are requested
784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @param {number} limit Limit the number of properties returned to the
7853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu       specified value
7863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Array} Property mirrors for this object
7873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
7883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.properties = function(kind, limit) {
7893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var names = this.propertyNames(kind, limit);
7903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var properties = new Array(names.length);
7913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < names.length; i++) {
7923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    properties[i] = this.property(names[i]);
7933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
7943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return properties;
7963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
7973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/**
800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Return the internal properties for this object as an array of
801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * InternalPropertyMirror objects.
802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @return {Array} Property mirrors for this object
803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */
804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochObjectMirror.prototype.internalProperties = function() {
805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return ObjectMirror.GetInternalProperties(this.value_);
806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
8093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.property = function(name) {
810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var details = %DebugGetPropertyDetails(this.value_, %ToName(name));
8113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (details) {
8123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return new PropertyMirror(this, name, details);
8133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
8143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Nothing found.
8163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return GetUndefinedMirror();
8173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
8183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
8223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Try to find a property from its value.
8233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Mirror} value The property value to look for
8243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {PropertyMirror} The property with the specified value. If no
8253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     property was found with the specified value UndefinedMirror is returned
8263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
8273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.lookupProperty = function(value) {
8283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var properties = this.properties();
8293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Look for property value in properties.
8313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < properties.length; i++) {
8323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // Skip properties which are defined through assessors.
8343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var property = properties[i];
8353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (property.propertyType() != PropertyType.Callbacks) {
8363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (%_ObjectEquals(property.value_, value.value_)) {
8373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        return property;
8383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
8393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
8403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
8413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Nothing found.
8433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return GetUndefinedMirror();
8443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
8453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
8483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns objects which has direct references to this object
8493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} opt_max_objects Optional parameter specifying the maximum
8503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     number of referencing objects to return.
8513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Array} The objects which has direct references to this object.
8523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
8533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.referencedBy = function(opt_max_objects) {
8543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Find all objects with direct references to this object.
8553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var result = %DebugReferencedBy(this.value_,
8563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                                  Mirror.prototype, opt_max_objects || 0);
8573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Make mirrors for all the references found.
8593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < result.length; i++) {
8603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result[i] = MakeMirror(result[i]);
8613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
8623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return result;
8643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
8653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.toText = function() {
8683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var name;
8693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var ctor = this.constructorFunction();
8703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (!ctor.isFunction()) {
8713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    name = this.className();
8723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
8733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    name = ctor.name();
8743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (!name) {
8753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      name = this.className();
8763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
8773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
8781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return '#<' + name + '>';
8793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
8803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Return the internal properties of the value, such as [[PrimitiveValue]] of
884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * scalar wrapper objects, properties of the bound function and properties of
885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * the promise.
886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * This method is done static to be accessible from Debug API with the bare
887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * values without mirrors.
888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @return {Array} array (possibly empty) of InternalProperty instances
889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */
890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochObjectMirror.GetInternalProperties = function(value) {
891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IS_STRING_WRAPPER(value) || IS_NUMBER_WRAPPER(value) ||
892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      IS_BOOLEAN_WRAPPER(value)) {
893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var primitiveValue = %_ValueOf(value);
894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return [new InternalPropertyMirror("[[PrimitiveValue]]", primitiveValue)];
895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (IS_FUNCTION(value)) {
896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var bindings = %BoundFunctionGetBindings(value);
897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var result = [];
898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (bindings && IS_ARRAY(bindings)) {
899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      result.push(new InternalPropertyMirror("[[TargetFunction]]",
900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                             bindings[0]));
901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      result.push(new InternalPropertyMirror("[[BoundThis]]", bindings[1]));
902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      var boundArgs = [];
903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (var i = 2; i < bindings.length; i++) {
904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        boundArgs.push(bindings[i]);
905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      result.push(new InternalPropertyMirror("[[BoundArgs]]", boundArgs));
907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return result;
909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (ObjectIsPromise(value)) {
910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var result = [];
911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result.push(new InternalPropertyMirror("[[PromiseStatus]]",
912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                           PromiseGetStatus_(value)));
913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result.push(new InternalPropertyMirror("[[PromiseValue]]",
914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                           PromiseGetValue_(value)));
915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return result;
916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return [];
918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/**
9223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for functions.
9233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {function} value The function object reflected by this mirror.
9243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
9253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ObjectMirror
9263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
9273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction FunctionMirror(value) {
9281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, value, FUNCTION_TYPE, ObjectMirror);
9293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.resolved_ = true;
9303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
9313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(FunctionMirror, ObjectMirror);
9323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
9353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns whether the function is resolved.
9363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {boolean} True if the function is resolved. Unresolved functions can
9373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     only originate as functions from stack frames
9383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
9393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFunctionMirror.prototype.resolved = function() {
9403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.resolved_;
9413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
9423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
9453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the name of the function.
9463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {string} Name of the function
9473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
9483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFunctionMirror.prototype.name = function() {
9493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return %FunctionGetName(this.value_);
9503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
9513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
9543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the inferred name of the function.
9553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {string} Name of the function
9563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
9573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFunctionMirror.prototype.inferredName = function() {
9583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return %FunctionGetInferredName(this.value_);
9593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
9603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
9633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the source code for the function.
9643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {string or undefined} The source code for the function. If the
9653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     function is not resolved undefined will be returned.
9663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
9673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFunctionMirror.prototype.source = function() {
9683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Return source if function is resolved. Otherwise just fall through to
9693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // return undefined.
9703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.resolved()) {
9713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return builtins.FunctionSourceString(this.value_);
9723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
9733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
9743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
9773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the script object for the function.
9783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {ScriptMirror or undefined} Script object for the function or
9793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     undefined if the function has no script
9803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
9813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFunctionMirror.prototype.script = function() {
9823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Return script if function is resolved. Otherwise just fall through
9833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // to return undefined.
9843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.resolved()) {
985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (this.script_) {
986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return this.script_;
987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
9883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var script = %FunctionGetScript(this.value_);
9893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (script) {
990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return this.script_ = MakeMirror(script);
9913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
9923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
9933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
9943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
9973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the script source position for the function. Only makes sense
9983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * for functions which has a script defined.
9993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Number or undefined} in-script position for the function
10003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
10013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFunctionMirror.prototype.sourcePosition_ = function() {
1002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Return position if function is resolved. Otherwise just fall
1003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // through to return undefined.
10043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.resolved()) {
10053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return %FunctionGetScriptSourcePosition(this.value_);
10063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
10073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
10083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
10113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the script source location object for the function. Only makes sense
10123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * for functions which has a script defined.
10133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Location or undefined} in-script location for the function begin
10143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
10153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFunctionMirror.prototype.sourceLocation = function() {
1016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (this.resolved()) {
1017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var script = this.script();
1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (script) {
1019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return script.locationFromPosition(this.sourcePosition_(), true);
1020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
10213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
10223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
10233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
10263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns objects constructed by this function.
10273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} opt_max_instances Optional parameter specifying the maximum
10283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     number of instances to return.
10293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Array or undefined} The objects constructed by this function.
10303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
10313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFunctionMirror.prototype.constructedBy = function(opt_max_instances) {
10323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.resolved()) {
10333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // Find all objects constructed from this function.
10343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var result = %DebugConstructedBy(this.value_, opt_max_instances || 0);
10353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // Make mirrors for all the instances found.
10373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    for (var i = 0; i < result.length; i++) {
10383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result[i] = MakeMirror(result[i]);
10393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
10403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return result;
10423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
10433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return [];
10443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
10453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
10463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFunctionMirror.prototype.scopeCount = function() {
1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (this.resolved()) {
1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (IS_UNDEFINED(this.scopeCount_)) {
1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      this.scopeCount_ = %GetFunctionScopeCount(this.value());
1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return this.scopeCount_;
1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return 0;
1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFunctionMirror.prototype.scope = function(index) {
1061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (this.resolved()) {
1062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new ScopeMirror(UNDEFINED, this, index);
1063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
10673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFunctionMirror.prototype.toText = function() {
10683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.source();
10693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
10703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
10733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for unresolved functions.
10743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {string} value The name for the unresolved function reflected by this
10753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     mirror.
10763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
10773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ObjectMirror
10783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
10793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction UnresolvedFunctionMirror(value) {
10803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Construct this using the ValueMirror as an unresolved function is not a
10813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // real object but just a string.
10821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, FUNCTION_TYPE, value, ValueMirror);
10833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.propertyCount_ = 0;
10843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.elementCount_ = 0;
10853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.resolved_ = false;
10863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
10873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(UnresolvedFunctionMirror, FunctionMirror);
10883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuUnresolvedFunctionMirror.prototype.className = function() {
10913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return 'Function';
10923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
10933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuUnresolvedFunctionMirror.prototype.constructorFunction = function() {
10963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return GetUndefinedMirror();
10973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
10983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuUnresolvedFunctionMirror.prototype.prototypeObject = function() {
11013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return GetUndefinedMirror();
11023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
11033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuUnresolvedFunctionMirror.prototype.protoObject = function() {
11063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return GetUndefinedMirror();
11073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
11083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuUnresolvedFunctionMirror.prototype.name = function() {
11113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.value_;
11123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
11133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuUnresolvedFunctionMirror.prototype.inferredName = function() {
11163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return undefined;
11173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
11183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuUnresolvedFunctionMirror.prototype.propertyNames = function(kind, limit) {
11213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return [];
11223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
11233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
11263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for arrays.
11273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Array} value The Array object reflected by this mirror
11283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
11293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ObjectMirror
11303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
11313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ArrayMirror(value) {
11321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, value, ObjectMirror);
11333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
11343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(ArrayMirror, ObjectMirror);
11353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuArrayMirror.prototype.length = function() {
11383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.value_.length;
11393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
11403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11423ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochArrayMirror.prototype.indexedPropertiesFromRange = function(opt_from_index,
11433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                            opt_to_index) {
11443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var from_index = opt_from_index || 0;
11453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var to_index = opt_to_index || this.length() - 1;
11463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (from_index > to_index) return new Array();
11473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var values = new Array(to_index - from_index + 1);
11483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = from_index; i <= to_index; i++) {
11493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var details = %DebugGetPropertyDetails(this.value_, %ToString(i));
11503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var value;
11513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (details) {
11523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      value = new PropertyMirror(this, i, details);
11533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    } else {
11543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      value = GetUndefinedMirror();
11553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
11563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    values[i - from_index] = value;
11573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
11583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return values;
11593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
11603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
11633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for dates.
11643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Date} value The Date object reflected by this mirror
11653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
11663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ObjectMirror
11673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
11683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction DateMirror(value) {
11691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, value, ObjectMirror);
11703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
11713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(DateMirror, ObjectMirror);
11723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDateMirror.prototype.toText = function() {
11753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var s = JSON.stringify(this.value_);
11763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return s.substring(1, s.length - 1);  // cut quotes
11773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
11783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
11813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for regular expressions.
11823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {RegExp} value The RegExp object reflected by this mirror
11833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
11843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ObjectMirror
11853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
11863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction RegExpMirror(value) {
11871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, value, REGEXP_TYPE, ObjectMirror);
11883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
11893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(RegExpMirror, ObjectMirror);
11903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
11933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the source to the regular expression.
11943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {string or undefined} The source to the regular expression
11953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
11963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuRegExpMirror.prototype.source = function() {
11973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.value_.source;
11983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
11993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
12023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns whether this regular expression has the global (g) flag set.
12033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {boolean} Value of the global flag
12043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
12053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuRegExpMirror.prototype.global = function() {
12063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.value_.global;
12073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
12083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
12113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns whether this regular expression has the ignore case (i) flag set.
12123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {boolean} Value of the ignore case flag
12133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
12143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuRegExpMirror.prototype.ignoreCase = function() {
12153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.value_.ignoreCase;
12163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
12173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
12203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns whether this regular expression has the multiline (m) flag set.
12213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {boolean} Value of the multiline flag
12223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
12233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuRegExpMirror.prototype.multiline = function() {
12243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.value_.multiline;
12253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
12263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuRegExpMirror.prototype.toText = function() {
12293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Simpel to text which is used when on specialization in subclass.
12303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return "/" + this.source() + "/";
12313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
12323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
12353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for error objects.
12363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Error} value The error object reflected by this mirror
12373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
12383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ObjectMirror
12393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
12403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ErrorMirror(value) {
12411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, value, ERROR_TYPE, ObjectMirror);
12423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
12433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(ErrorMirror, ObjectMirror);
12443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
12473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the message for this eror object.
12483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {string or undefined} The message for this eror object
12493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
12503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuErrorMirror.prototype.message = function() {
12513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.value_.message;
12523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
12533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuErrorMirror.prototype.toText = function() {
12563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Use the same text representation as in messages.js.
12573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var text;
12583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  try {
12593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    str = %_CallFunction(this.value_, builtins.ErrorToString);
12603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } catch (e) {
12611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    str = '#<Error>';
12623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
12633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return str;
12643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
12653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
1268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Mirror object for a Promise object.
1269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @param {Object} value The Promise object
1270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @constructor
1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @extends ObjectMirror
1272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */
1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction PromiseMirror(value) {
1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %_CallFunction(this, value, PROMISE_TYPE, ObjectMirror);
1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinherits(PromiseMirror, ObjectMirror);
1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction PromiseGetStatus_(value) {
1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var status = %DebugGetProperty(value, builtins.promiseStatus);
1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (status == 0) return "pending";
1282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (status == 1) return "resolved";
1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return "rejected";
1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction PromiseGetValue_(value) {
1288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return %DebugGetProperty(value, builtins.promiseValue);
1289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochPromiseMirror.prototype.status = function() {
1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return PromiseGetStatus_(this.value_);
1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochPromiseMirror.prototype.promiseValue = function() {
1298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MakeMirror(PromiseGetValue_(this.value_));
1299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction MapMirror(value) {
1303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %_CallFunction(this, value, MAP_TYPE, ObjectMirror);
1304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinherits(MapMirror, ObjectMirror);
1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/**
1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns an array of key/value pairs of a map.
1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * This will keep keys alive for WeakMaps.
1311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *
1312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @returns {Array.<Object>} Array of key/value pairs of a map.
1313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */
1314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMapMirror.prototype.entries = function() {
1315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var result = [];
1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IS_WEAKMAP(this.value_)) {
1318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var entries = %GetWeakMapEntries(this.value_);
1319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (var i = 0; i < entries.length; i += 2) {
1320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      result.push({
1321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        key: entries[i],
1322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        value: entries[i + 1]
1323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      });
1324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return result;
1326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var iter = %_CallFunction(this.value_, builtins.MapEntries);
1329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var next;
1330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  while (!(next = iter.next()).done) {
1331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result.push({
1332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      key: next.value[0],
1333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      value: next.value[1]
1334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    });
1335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction SetMirror(value) {
1341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %_CallFunction(this, value, SET_TYPE, ObjectMirror);
1342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinherits(SetMirror, ObjectMirror);
1344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/**
1347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Returns an array of elements of a set.
1348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * This will keep elements alive for WeakSets.
1349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *
1350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @returns {Array.<Object>} Array of elements of a set.
1351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */
1352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSetMirror.prototype.values = function() {
1353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IS_WEAKSET(this.value_)) {
1354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return %GetWeakSetValues(this.value_);
1355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var result = [];
1358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var iter = %_CallFunction(this.value_, builtins.SetValues);
1359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var next;
1360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  while (!(next = iter.next()).done) {
1361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result.push(next.value);
1362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/**
1368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Mirror object for a Generator object.
1369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @param {Object} data The Generator object
1370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @constructor
1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @extends Mirror
1372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */
1373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction GeneratorMirror(value) {
1374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %_CallFunction(this, value, GENERATOR_TYPE, ObjectMirror);
1375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinherits(GeneratorMirror, ObjectMirror);
1377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochGeneratorMirror.prototype.status = function() {
1380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var continuation = %GeneratorGetContinuation(this.value_);
1381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (continuation < 0) return "running";
1382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (continuation == 0) return "closed";
1383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return "suspended";
1384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochGeneratorMirror.prototype.sourcePosition_ = function() {
1388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return %GeneratorGetSourcePosition(this.value_);
1389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochGeneratorMirror.prototype.sourceLocation = function() {
1393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var pos = this.sourcePosition_();
1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_UNDEFINED(pos)) {
1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var script = this.func().script();
1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (script) {
1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return script.locationFromPosition(pos, true);
1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochGeneratorMirror.prototype.func = function() {
1404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!this.func_) {
1405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.func_ = MakeMirror(%GeneratorGetFunction(this.value_));
1406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return this.func_;
1408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochGeneratorMirror.prototype.context = function() {
1412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!this.context_) {
1413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.context_ = new ContextMirror(%GeneratorGetContext(this.value_));
1414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return this.context_;
1416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochGeneratorMirror.prototype.receiver = function() {
1420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!this.receiver_) {
1421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.receiver_ = MakeMirror(%GeneratorGetReceiver(this.value_));
1422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return this.receiver_;
1424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/**
14283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Base mirror object for properties.
14293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {ObjectMirror} mirror The mirror object having this property
14303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {string} name The name of the property
14313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Array} details Details about the property
14323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
14333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends Mirror
14343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
14353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction PropertyMirror(mirror, name, details) {
14361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, PROPERTY_TYPE, Mirror);
14373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.mirror_ = mirror;
14383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.name_ = name;
14393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.value_ = details[0];
14403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.details_ = details[1];
1441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  this.is_interceptor_ = details[2];
1442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (details.length > 3) {
1443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.exception_ = details[3];
1444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.getter_ = details[4];
1445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.setter_ = details[5];
14463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
14473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
14483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(PropertyMirror, Mirror);
14493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.isReadOnly = function() {
14523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return (this.attributes() & PropertyAttribute.ReadOnly) != 0;
14533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
14543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.isEnum = function() {
14573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return (this.attributes() & PropertyAttribute.DontEnum) == 0;
14583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
14593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.canDelete = function() {
14623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return (this.attributes() & PropertyAttribute.DontDelete) == 0;
14633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
14643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.name = function() {
14673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.name_;
14683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
14693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.isIndexed = function() {
14723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < this.name_.length; i++) {
14733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (this.name_[i] < '0' || '9' < this.name_[i]) {
14743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return false;
14753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
14763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
14773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return true;
14783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
14793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.value = function() {
14823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(this.value_, false);
14833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
14843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
14873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns whether this property value is an exception.
14883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {booolean} True if this property value is an exception
14893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
14903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.isException = function() {
14913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.exception_ ? true : false;
14923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
14933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.attributes = function() {
14963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return %DebugPropertyAttributesFromDetails(this.details_);
14973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
14983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.propertyType = function() {
15013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return %DebugPropertyTypeFromDetails(this.details_);
15023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
15033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.insertionIndex = function() {
15063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return %DebugPropertyIndexFromDetails(this.details_);
15073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
15083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
15113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns whether this property has a getter defined through __defineGetter__.
15123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {booolean} True if this property has a getter
15133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
15143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.hasGetter = function() {
15153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.getter_ ? true : false;
15163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
15173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
15203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns whether this property has a setter defined through __defineSetter__.
15213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {booolean} True if this property has a setter
15223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
15233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.hasSetter = function() {
15243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.setter_ ? true : false;
15253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
15263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
15293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the getter for this property defined through __defineGetter__.
15303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Mirror} FunctionMirror reflecting the getter function or
15313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     UndefinedMirror if there is no getter for this property
15323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
15333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.getter = function() {
15343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.hasGetter()) {
15353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return MakeMirror(this.getter_);
15363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
15373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return GetUndefinedMirror();
15383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
15393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
15403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
15433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the setter for this property defined through __defineSetter__.
15443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Mirror} FunctionMirror reflecting the setter function or
15453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     UndefinedMirror if there is no setter for this property
15463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
15473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.setter = function() {
15483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.hasSetter()) {
15493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return MakeMirror(this.setter_);
15503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
15513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return GetUndefinedMirror();
15523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
15533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
15543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
15573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns whether this property is natively implemented by the host or a set
15583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * through JavaScript code.
15596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * @return {boolean} True if the property is
15603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     UndefinedMirror if there is no setter for this property
15613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
15623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.isNative = function() {
1563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return this.is_interceptor_ ||
15643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu         ((this.propertyType() == PropertyType.Callbacks) &&
15653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          !this.hasGetter() && !this.hasSetter());
15663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
15673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/**
1570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Mirror object for internal properties. Internal property reflects properties
1571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * not accessible from user code such as [[BoundThis]] in bound function.
1572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Their names are merely symbolic.
1573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @param {string} name The name of the property
1574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @param {value} property value
1575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @constructor
1576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @extends Mirror
1577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */
1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction InternalPropertyMirror(name, value) {
1579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %_CallFunction(this, INTERNAL_PROPERTY_TYPE, Mirror);
1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  this.name_ = name;
1581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  this.value_ = value;
1582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinherits(InternalPropertyMirror, Mirror);
1584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInternalPropertyMirror.prototype.name = function() {
1587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return this.name_;
1588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInternalPropertyMirror.prototype.value = function() {
1592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MakeMirror(this.value_, false);
1593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
15963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsFrameIdIndex = 0;
15973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsReceiverIndex = 1;
15983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsFunctionIndex = 2;
15993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsArgumentCountIndex = 3;
16003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsLocalCountIndex = 4;
16013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsSourcePositionIndex = 5;
16023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsConstructCallIndex = 6;
16033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsAtReturnIndex = 7;
16043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsFlagsIndex = 8;
16053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsFirstDynamicIndex = 9;
16063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
16073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsNameIndex = 0;
16083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsValueIndex = 1;
16093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsNameValueSize = 2;
16103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
16113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsFlagDebuggerFrameMask = 1 << 0;
16123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsFlagOptimizedFrameMask = 1 << 1;
16133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsFlagInlinedFrameIndexMask = 7 << 2;
16143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
16153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
16163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Wrapper for the frame details information retreived from the VM. The frame
16173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * details from the VM is an array with the following content. See runtime.cc
16183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Runtime_GetFrameDetails.
16193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     0: Id
16203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     1: Receiver
16213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     2: Function
16223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     3: Argument count
16233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     4: Local count
16243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     5: Source position
16253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     6: Construct call
16267f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch *     7: Is at return
16273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch *     8: Flags (debugger frame, optimized frame, inlined frame index)
16283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     Arguments name, value
16293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     Locals name, value
16307f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch *     Return value if any
16313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} break_id Current break id
16323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} index Frame number
16333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
16343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
16353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction FrameDetails(break_id, index) {
16363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.break_id_ = break_id;
16373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.details_ = %GetFrameDetails(break_id, index);
16383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
16393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
16403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
16413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.frameId = function() {
16423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
16433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_[kFrameDetailsFrameIdIndex];
16443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
16453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
16463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
16473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.receiver = function() {
16483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
16493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_[kFrameDetailsReceiverIndex];
16503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
16513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
16523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
16533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.func = function() {
16543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
16553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_[kFrameDetailsFunctionIndex];
16563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
16573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
16583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
16593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.isConstructCall = function() {
16603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
16613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_[kFrameDetailsConstructCallIndex];
16623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
16633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
16643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
16657f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochFrameDetails.prototype.isAtReturn = function() {
16667f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  %CheckExecutionState(this.break_id_);
16677f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  return this.details_[kFrameDetailsAtReturnIndex];
16683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
16697f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
16707f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
16713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.isDebuggerFrame = function() {
16723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
16733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  var f = kFrameDetailsFlagDebuggerFrameMask;
16743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return (this.details_[kFrameDetailsFlagsIndex] & f) == f;
16753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
16763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
16773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
16783fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochFrameDetails.prototype.isOptimizedFrame = function() {
16793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  %CheckExecutionState(this.break_id_);
16803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  var f = kFrameDetailsFlagOptimizedFrameMask;
16813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return (this.details_[kFrameDetailsFlagsIndex] & f) == f;
16823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
16833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
16843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
16853fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochFrameDetails.prototype.isInlinedFrame = function() {
16863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return this.inlinedFrameIndex() > 0;
16873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
16883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
16893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
16903fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochFrameDetails.prototype.inlinedFrameIndex = function() {
16913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  %CheckExecutionState(this.break_id_);
16923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  var f = kFrameDetailsFlagInlinedFrameIndexMask;
16933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return (this.details_[kFrameDetailsFlagsIndex] & f) >> 2;
16943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
16953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
16963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
16973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.argumentCount = function() {
16983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
16993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_[kFrameDetailsArgumentCountIndex];
17003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
17013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.argumentName = function(index) {
17043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
17053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (index >= 0 && index < this.argumentCount()) {
17063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return this.details_[kFrameDetailsFirstDynamicIndex +
17073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                         index * kFrameDetailsNameValueSize +
17083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                         kFrameDetailsNameIndex];
17093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
17103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
17113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.argumentValue = function(index) {
17143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
17153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (index >= 0 && index < this.argumentCount()) {
17163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return this.details_[kFrameDetailsFirstDynamicIndex +
17173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                         index * kFrameDetailsNameValueSize +
17183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                         kFrameDetailsValueIndex];
17193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
17203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
17213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.localCount = function() {
17243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
17253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_[kFrameDetailsLocalCountIndex];
17263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
17273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.sourcePosition = function() {
17303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
17313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_[kFrameDetailsSourcePositionIndex];
17323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
17333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.localName = function(index) {
17363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
17373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (index >= 0 && index < this.localCount()) {
17387f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    var locals_offset = kFrameDetailsFirstDynamicIndex +
17393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        this.argumentCount() * kFrameDetailsNameValueSize;
17403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return this.details_[locals_offset +
17413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                         index * kFrameDetailsNameValueSize +
17423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                         kFrameDetailsNameIndex];
17433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
17443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
17453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.localValue = function(index) {
17483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
17493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (index >= 0 && index < this.localCount()) {
17507f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    var locals_offset = kFrameDetailsFirstDynamicIndex +
17513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        this.argumentCount() * kFrameDetailsNameValueSize;
17523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return this.details_[locals_offset +
17533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                         index * kFrameDetailsNameValueSize +
17543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                         kFrameDetailsValueIndex];
17553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
17563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
17573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17597f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochFrameDetails.prototype.returnValue = function() {
17607f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  %CheckExecutionState(this.break_id_);
17617f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  var return_value_offset =
17627f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch      kFrameDetailsFirstDynamicIndex +
17637f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch      (this.argumentCount() + this.localCount()) * kFrameDetailsNameValueSize;
17647f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  if (this.details_[kFrameDetailsAtReturnIndex]) {
17657f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    return this.details_[return_value_offset];
17667f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  }
17673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
17687f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
17697f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
17703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.scopeCount = function() {
1771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IS_UNDEFINED(this.scopeCount_)) {
1772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.scopeCount_ = %GetScopeCount(this.break_id_, this.frameId());
1773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return this.scopeCount_;
1775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFrameDetails.prototype.stepInPositionsImpl = function() {
1779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return %GetStepInPositions(this.break_id_, this.frameId());
17803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
17813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
17843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for stack frames.
17853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} break_id The break id in the VM for which this frame is
17863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu       valid
17873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} index The frame index (top frame is index 0)
17883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
17893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends Mirror
17903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
17913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction FrameMirror(break_id, index) {
17921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, FRAME_TYPE, Mirror);
17933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.break_id_ = break_id;
17943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.index_ = index;
17953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.details_ = new FrameDetails(break_id, index);
17963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
17973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(FrameMirror, Mirror);
17983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFrameMirror.prototype.details = function() {
1801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return this.details_;
1802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
18053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.index = function() {
18063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.index_;
18073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.func = function() {
1811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (this.func_) {
1812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return this.func_;
1813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
18153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Get the function for this frame from the VM.
18163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var f = this.details_.func();
18176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
18183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Create a function mirror. NOTE: MakeMirror cannot be used here as the
18193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // value returned from the VM might be a string if the function for the
18203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // frame is unresolved.
18213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (IS_FUNCTION(f)) {
1822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return this.func_ = MakeMirror(f);
18233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
18243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return new UnresolvedFunctionMirror(f);
18253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
18263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.receiver = function() {
18303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(this.details_.receiver());
18313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.isConstructCall = function() {
18353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_.isConstructCall();
18363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18397f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochFrameMirror.prototype.isAtReturn = function() {
18407f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  return this.details_.isAtReturn();
18417f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch};
18427f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
18437f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
18443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.isDebuggerFrame = function() {
18453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_.isDebuggerFrame();
18463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18493fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochFrameMirror.prototype.isOptimizedFrame = function() {
18503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return this.details_.isOptimizedFrame();
18513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
18523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
18533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
18543fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochFrameMirror.prototype.isInlinedFrame = function() {
18553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return this.details_.isInlinedFrame();
18563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
18573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
18583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
18593fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochFrameMirror.prototype.inlinedFrameIndex = function() {
18603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return this.details_.inlinedFrameIndex();
18613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
18623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
18633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
18643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.argumentCount = function() {
18653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_.argumentCount();
18663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.argumentName = function(index) {
18703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_.argumentName(index);
18713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.argumentValue = function(index) {
18753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(this.details_.argumentValue(index));
18763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.localCount = function() {
18803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_.localCount();
18813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.localName = function(index) {
18853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_.localName(index);
18863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.localValue = function(index) {
18903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(this.details_.localValue(index));
18913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18947f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochFrameMirror.prototype.returnValue = function() {
18957f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  return MakeMirror(this.details_.returnValue());
18967f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch};
18977f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
18987f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
18993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.sourcePosition = function() {
19003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_.sourcePosition();
19013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
19023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.sourceLocation = function() {
1905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var func = this.func();
1906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (func.resolved()) {
1907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var script = func.script();
1908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (script) {
1909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return script.locationFromPosition(this.sourcePosition(), true);
1910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
19113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
19123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
19133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.sourceLine = function() {
1916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var location = this.sourceLocation();
1917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (location) {
1918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return location.line;
19193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
19203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
19213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.sourceColumn = function() {
1924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var location = this.sourceLocation();
1925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (location) {
1926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return location.column;
19273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
19283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
19293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.sourceLineText = function() {
1932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var location = this.sourceLocation();
1933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (location) {
1934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return location.sourceText();
19353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
19363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
19373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.scopeCount = function() {
19403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_.scopeCount();
19413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
19423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.scope = function(index) {
1945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return new ScopeMirror(this, UNDEFINED, index);
1946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFrameMirror.prototype.allScopes = function(opt_ignore_nested_scopes) {
1950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var scopeDetails = %GetAllScopesDetails(this.break_id_,
1951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          this.details_.frameId(),
1952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          this.details_.inlinedFrameIndex(),
1953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          !!opt_ignore_nested_scopes);
1954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var result = [];
1955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0; i < scopeDetails.length; ++i) {
1956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result.push(new ScopeMirror(this, UNDEFINED, i, scopeDetails[i]));
1957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFrameMirror.prototype.stepInPositions = function() {
1963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var script = this.func().script();
1964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var funcOffset = this.func().sourcePosition_();
1965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var stepInRaw = this.details_.stepInPositionsImpl();
1967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var result = [];
1968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (stepInRaw) {
1969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (var i = 0; i < stepInRaw.length; i++) {
1970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      var posStruct = {};
1971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      var offset = script.locationFromPosition(funcOffset + stepInRaw[i],
1972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                               true);
1973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      serializeLocationFields(offset, posStruct);
1974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      var item = {
1975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        position: posStruct
1976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      };
1977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      result.push(item);
1978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
19823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
19833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19853ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochFrameMirror.prototype.evaluate = function(source, disable_break,
19863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                          opt_context_object) {
1987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MakeMirror(%DebugEvaluate(this.break_id_,
1988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   this.details_.frameId(),
1989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   this.details_.inlinedFrameIndex(),
1990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   source,
1991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   Boolean(disable_break),
1992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   opt_context_object));
19933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
19943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.invocationText = function() {
19973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Format frame invoaction (receiver, function and arguments).
19983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var result = '';
19993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var func = this.func();
20003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var receiver = this.receiver();
20013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.isConstructCall()) {
20023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // For constructor frames display new followed by the function name.
20033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += 'new ';
20043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += func.name() ? func.name() : '[anonymous]';
20053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (this.isDebuggerFrame()) {
20063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += '[debugger]';
20073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
20083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // If the receiver has a className which is 'global' don't display it.
20093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    var display_receiver =
20103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      !receiver.className || (receiver.className() != 'global');
20113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (display_receiver) {
20123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result += receiver.toText();
20133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
20143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // Try to find the function as a property in the receiver. Include the
20153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // prototype chain in the lookup.
20163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var property = GetUndefinedMirror();
20173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    if (receiver.isObject()) {
20183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      for (var r = receiver;
20193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch           !r.isNull() && property.isUndefined();
20203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch           r = r.protoObject()) {
20213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        property = r.lookupProperty(func);
20223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
20233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
20243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (!property.isUndefined()) {
20253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // The function invoked was found on the receiver. Use the property name
20263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // for the backtrace.
20273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (!property.isIndexed()) {
20283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        if (display_receiver) {
20293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          result += '.';
20303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        }
20313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += property.name();
20323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      } else {
20333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += '[';
20343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += property.name();
20353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += ']';
20363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
20373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Also known as - if the name in the function doesn't match the name
20383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // under which it was looked up.
20393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (func.name() && func.name() != property.name()) {
20403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += '(aka ' + func.name() + ')';
20413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
20423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    } else {
20433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // The function invoked was not found on the receiver. Use the function
20443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // name if available for the backtrace.
20453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (display_receiver) {
20463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += '.';
20473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
20483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result += func.name() ? func.name() : '[anonymous]';
20493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
20503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
20513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
20523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Render arguments for normal frames.
20533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (!this.isDebuggerFrame()) {
20543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += '(';
20553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    for (var i = 0; i < this.argumentCount(); i++) {
20563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (i != 0) result += ', ';
20573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (this.argumentName(i)) {
20583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += this.argumentName(i);
20593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += '=';
20603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
20613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result += this.argumentValue(i).toText();
20623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
20633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += ')';
20643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
20653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
20667f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  if (this.isAtReturn()) {
20677f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    result += ' returning ';
20687f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    result += this.returnValue().toText();
20697f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  }
2070f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
20713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return result;
20723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
20733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
20743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
20753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.sourceAndPositionText = function() {
20763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Format source and position.
20773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var result = '';
20783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var func = this.func();
20793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (func.resolved()) {
2080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var script = func.script();
2081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (script) {
2082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (script.name()) {
2083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        result += script.name();
20843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      } else {
20853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += '[unnamed]';
20863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
20873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (!this.isDebuggerFrame()) {
20883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        var location = this.sourceLocation();
20893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += ' line ';
20903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += !IS_UNDEFINED(location) ? (location.line + 1) : '?';
20913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += ' column ';
20923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += !IS_UNDEFINED(location) ? (location.column + 1) : '?';
20933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        if (!IS_UNDEFINED(this.sourcePosition())) {
20943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          result += ' (position ' + (this.sourcePosition() + 1) + ')';
20953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        }
20963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
20973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    } else {
20983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result += '[no source]';
20993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
21003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
21013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += '[unresolved]';
21023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
21033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return result;
21053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
21063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.localsText = function() {
21093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Format local variables.
21103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var result = '';
21113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var locals_count = this.localCount();
21123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (locals_count > 0) {
21133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    for (var i = 0; i < locals_count; ++i) {
21143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result += '      var ';
21153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result += this.localName(i);
21163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result += ' = ';
21173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result += this.localValue(i).toText();
21183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (i < locals_count - 1) result += '\n';
21193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
21203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
21213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return result;
21233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
21243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFrameMirror.prototype.restart = function() {
2127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var result = %LiveEditRestartFrame(this.break_id_, this.index_);
2128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IS_UNDEFINED(result)) {
2129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = "Failed to find requested frame";
2130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
2132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
2133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
21353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.toText = function(opt_locals) {
21363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var result = '';
21373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  result += '#' + (this.index() <= 9 ? '0' : '') + this.index();
21383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  result += ' ';
21393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  result += this.invocationText();
21403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  result += ' ';
21413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  result += this.sourceAndPositionText();
21423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (opt_locals) {
21433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += '\n';
21443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += this.localsText();
21453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
21463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return result;
21473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
21483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kScopeDetailsTypeIndex = 0;
21513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kScopeDetailsObjectIndex = 1;
21523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction ScopeDetails(frame, fun, index, opt_details) {
2154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (frame) {
2155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.break_id_ = frame.break_id_;
2156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.details_ = opt_details ||
2157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                    %GetScopeDetails(frame.break_id_,
2158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                     frame.details_.frameId(),
2159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                     frame.details_.inlinedFrameIndex(),
2160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                     index);
2161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.frame_id_ = frame.details_.frameId();
2162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.inlined_frame_id_ = frame.details_.inlinedFrameIndex();
2163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.details_ = opt_details || %GetFunctionScopeDetails(fun.value(), index);
2165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.fun_value_ = fun.value();
2166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.break_id_ = undefined;
2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  this.index_ = index;
21693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
21703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScopeDetails.prototype.type = function() {
2173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_UNDEFINED(this.break_id_)) {
2174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    %CheckExecutionState(this.break_id_);
2175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
21763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_[kScopeDetailsTypeIndex];
21773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
21783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScopeDetails.prototype.object = function() {
2181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_UNDEFINED(this.break_id_)) {
2182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    %CheckExecutionState(this.break_id_);
2183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
21843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_[kScopeDetailsObjectIndex];
21853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
21863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochScopeDetails.prototype.setVariableValueImpl = function(name, new_value) {
2189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var raw_res;
2190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_UNDEFINED(this.break_id_)) {
2191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    %CheckExecutionState(this.break_id_);
2192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    raw_res = %SetScopeVariableValue(this.break_id_, this.frame_id_,
2193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        this.inlined_frame_id_, this.index_, name, new_value);
2194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    raw_res = %SetScopeVariableValue(this.fun_value_, null, null, this.index_,
2196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        name, new_value);
2197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!raw_res) {
2199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw new Error("Failed to set variable value");
2200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
2202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
22043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
2205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Mirror object for scope of frame or function. Either frame or function must
2206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * be specified.
22073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {FrameMirror} frame The frame this scope is a part of
2208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @param {FunctionMirror} function The function this scope is a part of
22093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} index The scope index in the frame
2210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @param {Array=} opt_details Raw scope details data
22113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
22123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends Mirror
22133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
2214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction ScopeMirror(frame, function, index, opt_details) {
22151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, SCOPE_TYPE, Mirror);
2216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (frame) {
2217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.frame_index_ = frame.index_;
2218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.frame_index_ = undefined;
2220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
22213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.scope_index_ = index;
2222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  this.details_ = new ScopeDetails(frame, function, index, opt_details);
22233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
22243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(ScopeMirror, Mirror);
22253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochScopeMirror.prototype.details = function() {
2228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return this.details_;
2229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
2230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
22323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScopeMirror.prototype.frameIndex = function() {
22333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.frame_index_;
22343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
22353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScopeMirror.prototype.scopeIndex = function() {
22383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.scope_index_;
22393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
22403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScopeMirror.prototype.scopeType = function() {
22433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_.type();
22443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
22453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScopeMirror.prototype.scopeObject = function() {
22483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // For local and closure scopes create a transient mirror as these objects are
22493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // created on the fly materializing the local or closure scopes and
22503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // therefore will not preserve identity.
22513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var transient = this.scopeType() == ScopeType.Local ||
22523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                  this.scopeType() == ScopeType.Closure;
22533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(this.details_.object(), transient);
22543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
22553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochScopeMirror.prototype.setVariableValue = function(name, new_value) {
2258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  this.details_.setVariableValueImpl(name, new_value);
2259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
2260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
22623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
22633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for script source.
22643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Script} script The script object
22653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
22663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends Mirror
22673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
22683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ScriptMirror(script) {
22691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, SCRIPT_TYPE, Mirror);
22703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.script_ = script;
22713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.context_ = new ContextMirror(script.context_data);
22723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.allocateHandle_();
22733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
22743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(ScriptMirror, Mirror);
22753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.value = function() {
22783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_;
22793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
22803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.name = function() {
22836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return this.script_.name || this.script_.nameOrSourceURL();
22843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
22853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.id = function() {
22883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_.id;
22893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
22903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.source = function() {
22933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_.source;
22943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
22953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22973ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochScriptMirror.prototype.setSource = function(source) {
22983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  %DebugSetScriptSource(this.script_, source);
22993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
23003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.lineOffset = function() {
23033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_.line_offset;
23043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
23053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.columnOffset = function() {
23083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_.column_offset;
23093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
23103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.data = function() {
23133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_.data;
23143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
23153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.scriptType = function() {
23183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_.type;
23193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
23203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.compilationType = function() {
23233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_.compilation_type;
23243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
23253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.lineCount = function() {
23283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_.lineCount();
23293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
23303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.locationFromPosition = function(
23333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    position, include_resource_offset) {
23343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_.locationFromPosition(position, include_resource_offset);
23353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
23363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.sourceSlice = function (opt_from_line, opt_to_line) {
23393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_.sourceSlice(opt_from_line, opt_to_line);
23403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
23413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.context = function() {
23443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.context_;
23453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
23463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.evalFromScript = function() {
23493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(this.script_.eval_from_script);
23503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
23513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.evalFromFunctionName = function() {
23543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(this.script_.eval_from_function_name);
23553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
23563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.evalFromLocation = function() {
23593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var eval_from_script = this.evalFromScript();
23603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (!eval_from_script.isUndefined()) {
23613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var position = this.script_.eval_from_script_position;
23623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return eval_from_script.locationFromPosition(position, true);
23633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
23643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
23653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.toText = function() {
23683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var result = '';
23693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  result += this.name();
23703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  result += ' (lines: ';
23713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.lineOffset() > 0) {
23723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += this.lineOffset();
23733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += '-';
23743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += this.lineOffset() + this.lineCount() - 1;
23753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
23763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += this.lineCount();
23773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
23783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  result += ')';
23793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return result;
23803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
23813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
23843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for context.
23853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Object} data The context data
23863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
23873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends Mirror
23883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
23893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ContextMirror(data) {
23901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, CONTEXT_TYPE, Mirror);
23913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.data_ = data;
23923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.allocateHandle_();
23933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
23943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(ContextMirror, Mirror);
23953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuContextMirror.prototype.data = function() {
23983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.data_;
23993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
24003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
24013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
24023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
24033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns a mirror serializer
24043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
24053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {boolean} details Set to true to include details
24063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Object} options Options comtrolling the serialization
24073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     The following options can be set:
24083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *       includeSource: include ths full source of scripts
24093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {MirrorSerializer} mirror serializer
24103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
24113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeMirrorSerializer(details, options) {
24123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return new JSONProtocolSerializer(details, options);
24133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
24143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
24153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
24163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
24173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Object for serializing a mirror objects and its direct references.
24183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {boolean} details Indicates whether to include details for the mirror
24193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     serialized
24203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
24213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
24223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction JSONProtocolSerializer(details, options) {
24233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.details_ = details;
24243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.options_ = options;
24253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.mirrors_ = [ ];
24263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
24273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
24283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
24293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
24303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns a serialization of an object reference. The referenced object are
24313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * added to the serialization state.
24323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
24333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Mirror} mirror The mirror to serialize
24343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {String} JSON serialization
24353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
24363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.serializeReference = function(mirror) {
24373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.serialize_(mirror, true, true);
24383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
24393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
24403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
24413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
24423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns a serialization of an object value. The referenced objects are
24433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * added to the serialization state.
24443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
24453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Mirror} mirror The mirror to serialize
24463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {String} JSON serialization
24473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
24483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.serializeValue = function(mirror) {
24493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var json = this.serialize_(mirror, false, true);
24503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return json;
24513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
24523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
24533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
24543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
24553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns a serialization of all the objects referenced.
24563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
24573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Mirror} mirror The mirror to serialize.
24583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {Array.<Object>} Array of the referenced objects converted to
24593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     protcol objects.
24603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
24613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.serializeReferencedObjects = function() {
24623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Collect the protocol representation of the referenced objects in an array.
24633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var content = [];
24646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
24653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Get the number of referenced objects.
24663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var count = this.mirrors_.length;
24676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
24683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < count; i++) {
24693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.push(this.serialize_(this.mirrors_[i], false, false));
24703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
24713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
24723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return content;
24733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
24743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
24753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
24763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.includeSource_ = function() {
24773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.options_ && this.options_.includeSource;
24783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
24793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
24803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
24813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.inlineRefs_ = function() {
24823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.options_ && this.options_.inlineRefs;
24833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
24843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
24853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2486402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei PopescuJSONProtocolSerializer.prototype.maxStringLength_ = function() {
2487402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  if (IS_UNDEFINED(this.options_) ||
2488402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu      IS_UNDEFINED(this.options_.maxStringLength)) {
2489402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    return kMaxProtocolStringLength;
2490402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  }
2491402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  return this.options_.maxStringLength;
24923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2493402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
2494402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
24953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.add_ = function(mirror) {
24963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // If this mirror is already in the list just return.
24973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < this.mirrors_.length; i++) {
24983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (this.mirrors_[i] === mirror) {
24993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return;
25003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
25013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
25026ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
25033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Add the mirror to the list of mirrors to be serialized.
25043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.mirrors_.push(mirror);
25053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
25063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
25073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
25083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
25093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Formats mirror object to protocol reference object with some data that can
25103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * be used to display the value in debugger.
25113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Mirror} mirror Mirror to serialize.
25123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Object} Protocol reference object.
25133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
25146ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockJSONProtocolSerializer.prototype.serializeReferenceWithDisplayData_ =
25153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    function(mirror) {
25163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var o = {};
25173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  o.ref = mirror.handle();
25183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  o.type = mirror.type();
25193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  switch (mirror.type()) {
25203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case UNDEFINED_TYPE:
25213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case NULL_TYPE:
25223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case BOOLEAN_TYPE:
25233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case NUMBER_TYPE:
25243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      o.value = mirror.value();
25253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
25263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case STRING_TYPE:
2527402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu      o.value = mirror.getTruncatedValue(this.maxStringLength_());
25283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
2529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case SYMBOL_TYPE:
2530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      o.description = mirror.description();
2531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
25323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case FUNCTION_TYPE:
25333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      o.name = mirror.name();
25343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      o.inferredName = mirror.inferredName();
25353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (mirror.script()) {
25363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        o.scriptId = mirror.script().id();
25373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
25383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
25393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case ERROR_TYPE:
25403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case REGEXP_TYPE:
25413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      o.value = mirror.toText();
25423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
25433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case OBJECT_TYPE:
25443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      o.className = mirror.className();
25453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
25463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
25473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return o;
25483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
25493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
25503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
25513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.serialize_ = function(mirror, reference,
25523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                                                       details) {
25533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // If serializing a reference to a mirror just return the reference and add
25543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // the mirror to the referenced mirrors.
25553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (reference &&
25563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      (mirror.isValue() || mirror.isScript() || mirror.isContext())) {
25573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (this.inlineRefs_() && mirror.isValue()) {
25583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return this.serializeReferenceWithDisplayData_(mirror);
25593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    } else {
25603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      this.add_(mirror);
25613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return {'ref' : mirror.handle()};
25623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
25633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
25646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
25653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Collect the JSON property/value pairs.
25663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var content = {};
25673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
25683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Add the mirror handle.
25693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (mirror.isValue() || mirror.isScript() || mirror.isContext()) {
25703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.handle = mirror.handle();
25713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
25723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
25733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Always add the type.
25743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.type = mirror.type();
25753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
25763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  switch (mirror.type()) {
25773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case UNDEFINED_TYPE:
25783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case NULL_TYPE:
25793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Undefined and null are represented just by their type.
25803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
25813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
25823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case BOOLEAN_TYPE:
25833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Boolean values are simply represented by their value.
25843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.value = mirror.value();
25853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
25863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
25873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case NUMBER_TYPE:
25883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Number values are simply represented by their value.
25893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.value = NumberToJSON_(mirror.value());
25903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
25913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
25923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case STRING_TYPE:
25933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // String values might have their value cropped to keep down size.
2594402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu      if (this.maxStringLength_() != -1 &&
2595402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu          mirror.length() > this.maxStringLength_()) {
2596402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu        var str = mirror.getTruncatedValue(this.maxStringLength_());
25973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        content.value = str;
25983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        content.fromIndex = 0;
2599402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu        content.toIndex = this.maxStringLength_();
26003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      } else {
26013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        content.value = mirror.value();
26023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
26033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.length = mirror.length();
26043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
26053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case SYMBOL_TYPE:
2607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      content.description = mirror.description();
2608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
2609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
26103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case OBJECT_TYPE:
26113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case FUNCTION_TYPE:
26123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case ERROR_TYPE:
26133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case REGEXP_TYPE:
2614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case PROMISE_TYPE:
2615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case GENERATOR_TYPE:
26163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Add object representation.
26173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      this.serializeObject_(mirror, content, details);
26183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
26193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
26203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case PROPERTY_TYPE:
2621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case INTERNAL_PROPERTY_TYPE:
2622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      throw new Error('PropertyMirror cannot be serialized independently');
26233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
26243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
26253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case FRAME_TYPE:
26263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Add object representation.
26273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      this.serializeFrame_(mirror, content);
26283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
26293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
26303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case SCOPE_TYPE:
26313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Add object representation.
26323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      this.serializeScope_(mirror, content);
26333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
26343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
26353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case SCRIPT_TYPE:
26363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Script is represented by id, name and source attributes.
26373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (mirror.name()) {
26383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        content.name = mirror.name();
26393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
26403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.id = mirror.id();
26413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.lineOffset = mirror.lineOffset();
26423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.columnOffset = mirror.columnOffset();
26433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.lineCount = mirror.lineCount();
26443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (mirror.data()) {
26453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        content.data = mirror.data();
26463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
26473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (this.includeSource_()) {
26483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        content.source = mirror.source();
26493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      } else {
26503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        var sourceStart = mirror.source().substring(0, 80);
26513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        content.sourceStart = sourceStart;
26523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
26533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.sourceLength = mirror.source().length;
26543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.scriptType = mirror.scriptType();
26553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.compilationType = mirror.compilationType();
26563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // For compilation type eval emit information on the script from which
26573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // eval was called if a script is present.
26583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (mirror.compilationType() == 1 &&
26593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          mirror.evalFromScript()) {
26603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        content.evalFromScript =
26613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu            this.serializeReference(mirror.evalFromScript());
26623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        var evalFromLocation = mirror.evalFromLocation();
26633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        if (evalFromLocation) {
26643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          content.evalFromLocation = { line: evalFromLocation.line,
26653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                                       column: evalFromLocation.column };
26663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        }
26673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        if (mirror.evalFromFunctionName()) {
26683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          content.evalFromFunctionName = mirror.evalFromFunctionName();
26693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        }
26703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
26713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (mirror.context()) {
26723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        content.context = this.serializeReference(mirror.context());
26733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
26743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
26753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
26763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case CONTEXT_TYPE:
26773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.data = mirror.data();
26783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
26793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
26803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
26813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Always add the text representation.
26823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.text = mirror.toText();
26836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
26843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Create and return the JSON string.
26853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return content;
26863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
26873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
26883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
26893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
26903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Serialize object information to the following JSON format.
26913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
26923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *   {"className":"<class name>",
26933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    "constructorFunction":{"ref":<number>},
26943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    "protoObject":{"ref":<number>},
26953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    "prototypeObject":{"ref":<number>},
26963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    "namedInterceptor":<boolean>,
26973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    "indexedInterceptor":<boolean>,
2698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *    "properties":[<properties>],
2699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *    "internalProperties":[<internal properties>]}
27003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
27013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.serializeObject_ = function(mirror, content,
27023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                                                             details) {
27033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Add general object properties.
27043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.className = mirror.className();
27053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.constructorFunction =
27063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      this.serializeReference(mirror.constructorFunction());
27073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.protoObject = this.serializeReference(mirror.protoObject());
27083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.prototypeObject = this.serializeReference(mirror.prototypeObject());
27093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
27103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Add flags to indicate whether there are interceptors.
27113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (mirror.hasNamedInterceptor()) {
27123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.namedInterceptor = true;
27133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
27143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (mirror.hasIndexedInterceptor()) {
27153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.indexedInterceptor = true;
27163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
27176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
27183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (mirror.isFunction()) {
27193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // Add function specific properties.
27203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.name = mirror.name();
27213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (!IS_UNDEFINED(mirror.inferredName())) {
27223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.inferredName = mirror.inferredName();
27233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
27243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.resolved = mirror.resolved();
27253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (mirror.resolved()) {
27263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.source = mirror.source();
27273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
27283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (mirror.script()) {
27293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.script = this.serializeReference(mirror.script());
27303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.scriptId = mirror.script().id();
27316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
27323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      serializeLocationFields(mirror.sourceLocation(), content);
27333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
2734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    content.scopes = [];
2736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (var i = 0; i < mirror.scopeCount(); i++) {
2737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      var scope = mirror.scope(i);
2738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      content.scopes.push({
2739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        type: scope.scopeType(),
2740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        index: i
2741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      });
2742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (mirror.isGenerator()) {
2746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Add generator specific properties.
2747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Either 'running', 'closed', or 'suspended'.
2749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    content.status = mirror.status();
2750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    content.func = this.serializeReference(mirror.func())
2752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    content.receiver = this.serializeReference(mirror.receiver())
2753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // If the generator is suspended, the content add line/column properties.
2755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    serializeLocationFields(mirror.sourceLocation(), content);
2756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // TODO(wingo): Also serialize a reference to the context (scope chain).
27583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
27593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
27603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (mirror.isDate()) {
27613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // Add date specific properties.
27623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.value = mirror.value();
27633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
27643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (mirror.isPromise()) {
2766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Add promise specific properties.
2767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    content.status = mirror.status();
2768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    content.promiseValue = this.serializeReference(mirror.promiseValue());
2769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
27713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Add actual properties - named properties followed by indexed properties.
27723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var propertyNames = mirror.propertyNames(PropertyKind.Named);
27733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var propertyIndexes = mirror.propertyNames(PropertyKind.Indexed);
27743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var p = new Array(propertyNames.length + propertyIndexes.length);
27753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < propertyNames.length; i++) {
27763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var propertyMirror = mirror.property(propertyNames[i]);
27773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    p[i] = this.serializeProperty_(propertyMirror);
27783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (details) {
27793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      this.add_(propertyMirror.value());
27803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
27813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
27823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < propertyIndexes.length; i++) {
27833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var propertyMirror = mirror.property(propertyIndexes[i]);
27843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    p[propertyNames.length + i] = this.serializeProperty_(propertyMirror);
27853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (details) {
27863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      this.add_(propertyMirror.value());
27873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
27883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
27893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.properties = p;
2790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var internalProperties = mirror.internalProperties();
2792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (internalProperties.length > 0) {
2793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var ip = [];
2794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (var i = 0; i < internalProperties.length; i++) {
2795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ip.push(this.serializeInternalProperty_(internalProperties[i]));
2796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    content.internalProperties = ip;
2798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
27993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
28003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
28013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
28023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
28033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Serialize location information to the following JSON format:
28043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
28053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *   "position":"<position>",
28063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *   "line":"<line>",
28073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *   "column":"<column>",
28086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block *
28093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {SourceLocation} location The location to serialize, may be undefined.
28103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
28113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction serializeLocationFields (location, content) {
28123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (!location) {
28133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return;
28146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
28153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.position = location.position;
28163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var line = location.line;
28173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (!IS_UNDEFINED(line)) {
28183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.line = line;
28193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
28203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var column = location.column;
28213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (!IS_UNDEFINED(column)) {
28223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.column = column;
28233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
28243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
28253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
28263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
28273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
28283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Serialize property information to the following JSON format for building the
28293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * array of properties.
28303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
28313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *   {"name":"<property name>",
28323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    "attributes":<number>,
28333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    "propertyType":<number>,
28343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    "ref":<number>}
28353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
28363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * If the attribute for the property is PropertyAttribute.None it is not added.
28373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * If the propertyType for the property is PropertyType.Normal it is not added.
28383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Here are a couple of examples.
28393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
28403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *   {"name":"hello","ref":1}
28413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *   {"name":"length","attributes":7,"propertyType":3,"ref":2}
28423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
28433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {PropertyMirror} propertyMirror The property to serialize.
28443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {Object} Protocol object representing the property.
28453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
28463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.serializeProperty_ = function(propertyMirror) {
28473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var result = {};
28486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
28493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  result.name = propertyMirror.name();
28503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var propertyValue = propertyMirror.value();
28513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.inlineRefs_() && propertyValue.isValue()) {
28523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result.value = this.serializeReferenceWithDisplayData_(propertyValue);
28533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
28543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (propertyMirror.attributes() != PropertyAttribute.None) {
28553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result.attributes = propertyMirror.attributes();
28563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
28573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (propertyMirror.propertyType() != PropertyType.Normal) {
28583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result.propertyType = propertyMirror.propertyType();
28593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
28603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result.ref = propertyValue.handle();
28613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
28623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return result;
28633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
28643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
28653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/**
2867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Serialize internal property information to the following JSON format for
2868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * building the array of properties.
2869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *
2870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *   {"name":"<property name>",
2871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *    "ref":<number>}
2872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *
2873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *   {"name":"[[BoundThis]]","ref":117}
2874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *
2875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @param {InternalPropertyMirror} propertyMirror The property to serialize.
2876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * @returns {Object} Protocol object representing the property.
2877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */
2878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochJSONProtocolSerializer.prototype.serializeInternalProperty_ =
2879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    function(propertyMirror) {
2880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var result = {};
2881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  result.name = propertyMirror.name();
2883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var propertyValue = propertyMirror.value();
2884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (this.inlineRefs_() && propertyValue.isValue()) {
2885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result.value = this.serializeReferenceWithDisplayData_(propertyValue);
2886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result.ref = propertyValue.handle();
2888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
2890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
2891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
28933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.serializeFrame_ = function(mirror, content) {
28943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.index = mirror.index();
28953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.receiver = this.serializeReference(mirror.receiver());
28963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var func = mirror.func();
28973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.func = this.serializeReference(func);
2898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var script = func.script();
2899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (script) {
2900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    content.script = this.serializeReference(script);
29013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
29023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.constructCall = mirror.isConstructCall();
29037f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  content.atReturn = mirror.isAtReturn();
29047f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  if (mirror.isAtReturn()) {
29057f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    content.returnValue = this.serializeReference(mirror.returnValue());
29067f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  }
29073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.debuggerFrame = mirror.isDebuggerFrame();
29083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var x = new Array(mirror.argumentCount());
29093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < mirror.argumentCount(); i++) {
29103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var arg = {};
29113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    var argument_name = mirror.argumentName(i);
29123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (argument_name) {
29133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      arg.name = argument_name;
29143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
29153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    arg.value = this.serializeReference(mirror.argumentValue(i));
29163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    x[i] = arg;
29173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
29183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.arguments = x;
29193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var x = new Array(mirror.localCount());
29203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < mirror.localCount(); i++) {
29213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var local = {};
29223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    local.name = mirror.localName(i);
29233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    local.value = this.serializeReference(mirror.localValue(i));
29243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    x[i] = local;
29253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
29263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.locals = x;
29273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  serializeLocationFields(mirror.sourceLocation(), content);
29283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var source_line_text = mirror.sourceLineText();
29293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (!IS_UNDEFINED(source_line_text)) {
29303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.sourceLineText = source_line_text;
29313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
29326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
29333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.scopes = [];
29343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < mirror.scopeCount(); i++) {
29353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var scope = mirror.scope(i);
29363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.scopes.push({
29373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      type: scope.scopeType(),
29383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      index: i
29393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    });
29403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
29413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
29423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
29433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
29443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.serializeScope_ = function(mirror, content) {
29453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.index = mirror.scopeIndex();
29463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.frameIndex = mirror.frameIndex();
29473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.type = mirror.scopeType();
29483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.object = this.inlineRefs_() ?
29493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                   this.serializeValue(mirror.scopeObject()) :
29503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                   this.serializeReference(mirror.scopeObject());
29513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
29523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
29533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
29543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
29553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Convert a number to a protocol value. For all finite numbers the number
29563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * itself is returned. For non finite numbers NaN, Infinite and
29573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * -Infinite the string representation "NaN", "Infinite" or "-Infinite"
29583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * (not including the quotes) is returned.
29593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
29603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} value The number value to convert to a protocol value.
29613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {number|string} Protocol value.
29623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
29633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction NumberToJSON_(value) {
29643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (isNaN(value)) {
29653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return 'NaN';
29663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
29679fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  if (!NUMBER_IS_FINITE(value)) {
29683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (value > 0) {
29693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return 'Infinity';
29703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    } else {
29713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return '-Infinity';
29723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
29733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
29746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return value;
29753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
2976