13100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Copyright 2006-2008 the V8 project authors. All rights reserved.
23100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Redistribution and use in source and binary forms, with or without
33100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// modification, are permitted provided that the following conditions are
43100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// met:
53100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//
63100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//     * Redistributions of source code must retain the above copyright
73100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       notice, this list of conditions and the following disclaimer.
83100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//     * Redistributions in binary form must reproduce the above
93100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       copyright notice, this list of conditions and the following
103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       disclaimer in the documentation and/or other materials provided
113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       with the distribution.
123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//     * Neither the name of Google Inc. nor the names of its
133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       contributors may be used to endorse or promote products derived
143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       from this software without specific prior written permission.
153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//
163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Handle id counters.
293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuvar next_handle_ = 0;
303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuvar next_transient_handle_ = -1;
313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Mirror cache.
333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuvar mirror_cache_ = [];
343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Clear the mirror handle cache.
383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ClearMirrorCache() {
403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  next_handle_ = 0;
413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  mirror_cache_ = [];
423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the mirror for a specified value or object.
473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {value or Object} value the value or object to retreive the mirror for
493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {boolean} transient indicate whether this object is transient and
503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    should not be added to the mirror cache. The default is not transient.
513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {Mirror} the mirror reflects the passed value or object
523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeMirror(value, opt_transient) {
543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var mirror;
553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Look for non transient mirrors in the mirror cache.
573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (!opt_transient) {
583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    for (id in mirror_cache_) {
593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      mirror = mirror_cache_[id];
603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (mirror.value() === value) {
613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        return mirror;
623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Special check for NaN as NaN == NaN is false.
643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (mirror.isNumber() && isNaN(mirror.value()) &&
653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          typeof value == 'number' && isNaN(value)) {
663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        return mirror;
673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (IS_UNDEFINED(value)) {
723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new UndefinedMirror();
733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (IS_NULL(value)) {
743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new NullMirror();
753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (IS_BOOLEAN(value)) {
763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new BooleanMirror(value);
773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (IS_NUMBER(value)) {
783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new NumberMirror(value);
793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (IS_STRING(value)) {
803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new StringMirror(value);
813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (IS_ARRAY(value)) {
823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new ArrayMirror(value);
833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (IS_DATE(value)) {
843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new DateMirror(value);
853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (IS_FUNCTION(value)) {
863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new FunctionMirror(value);
873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (IS_REGEXP(value)) {
883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new RegExpMirror(value);
893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (IS_ERROR(value)) {
903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new ErrorMirror(value);
913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (IS_SCRIPT(value)) {
923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new ScriptMirror(value);
933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    mirror = new ObjectMirror(value, OBJECT_TYPE, opt_transient);
953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  mirror_cache_[mirror.handle()] = mirror;
983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return mirror;
993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
1003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
1033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the mirror for a specified mirror handle.
1043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
1053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} handle the handle to find the mirror for
1063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {Mirror or undefiend} the mirror with the requested handle or
1073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     undefined if no mirror with the requested handle was found
1083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
1093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction LookupMirror(handle) {
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() {
1203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(void 0);
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';
1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar OBJECT_TYPE = 'object';
1533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar FUNCTION_TYPE = 'function';
1543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar REGEXP_TYPE = 'regexp';
1553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar ERROR_TYPE = 'error';
1563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar PROPERTY_TYPE = 'property';
1573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar FRAME_TYPE = 'frame';
1583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar SCRIPT_TYPE = 'script';
1593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar CONTEXT_TYPE = 'context';
1603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar SCOPE_TYPE = 'scope';
1613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Maximum length when sending strings through the JSON protocol.
1633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kMaxProtocolStringLength = 80;
1643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Different kind of properties.
1663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar PropertyKind = {};
1673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyKind.Named   = 1;
1683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyKind.Indexed = 2;
1693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// A copy of the PropertyType enum from global.h
1723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar PropertyType = {};
17344f0eee88ff00398ff7f715fab053374d808c90dSteve BlockPropertyType.Normal                  = 0;
17444f0eee88ff00398ff7f715fab053374d808c90dSteve BlockPropertyType.Field                   = 1;
17544f0eee88ff00398ff7f715fab053374d808c90dSteve BlockPropertyType.ConstantFunction        = 2;
17644f0eee88ff00398ff7f715fab053374d808c90dSteve BlockPropertyType.Callbacks               = 3;
177257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochPropertyType.Handler                 = 4;
178257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochPropertyType.Interceptor             = 5;
179257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochPropertyType.MapTransition           = 6;
180257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochPropertyType.ExternalArrayTransition = 7;
181257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochPropertyType.ConstantTransition      = 8;
182257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochPropertyType.NullDescriptor          = 9;
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
2093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       - ObjectMirror
2103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//         - FunctionMirror
2113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//           - UnresolvedFunctionMirror
2123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//         - ArrayMirror
2133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//         - DateMirror
2143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//         - RegExpMirror
2153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//         - ErrorMirror
2163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//     - PropertyMirror
2173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//     - FrameMirror
2183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//     - ScriptMirror
2193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
2223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Base class for all mirror objects.
2233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {string} type The type of the mirror
2243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
2253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
2263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction Mirror(type) {
2273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.type_ = type;
2283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.type = function() {
2323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.type_;
2333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
2343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
2373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a value.
2383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a value.
2393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
2403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isValue = function() {
2413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof ValueMirror;
2423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
2463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects the undefined value.
2473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects the undefined value.
2483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
2493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isUndefined = function() {
2503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof UndefinedMirror;
2513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
2553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects the null value.
2563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects the null value
2573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
2583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isNull = function() {
2593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof NullMirror;
2603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
2643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a boolean value.
2653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a boolean value
2663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
2673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isBoolean = function() {
2683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof BooleanMirror;
2693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
2733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a number value.
2743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a number value
2753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
2763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isNumber = function() {
2773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof NumberMirror;
2783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
2823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a string value.
2833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a string value
2843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
2853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isString = function() {
2863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof StringMirror;
2873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
2913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects an object.
2923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects an object
2933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
2943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isObject = function() {
2953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof ObjectMirror;
2963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
3003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a function.
3013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a function
3023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
3033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isFunction = function() {
3043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof FunctionMirror;
3053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
3093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects an unresolved function.
3103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects an unresolved function
3113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
3123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isUnresolvedFunction = function() {
3133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof UnresolvedFunctionMirror;
3143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
3183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects an array.
3193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects an array
3203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
3213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isArray = function() {
3223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof ArrayMirror;
3233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
3273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a date.
3283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a date
3293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
3303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isDate = function() {
3313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof DateMirror;
3323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
3363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a regular expression.
3373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a regular expression
3383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
3393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isRegExp = function() {
3403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof RegExpMirror;
3413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
3453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects an error.
3463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects an error
3473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
3483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isError = function() {
3493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof ErrorMirror;
3503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
3543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a property.
3553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a property
3563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
3573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isProperty = function() {
3583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof PropertyMirror;
3593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
3633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a stack frame.
3643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a stack frame
3653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
3663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isFrame = function() {
3673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof FrameMirror;
3683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
3723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a script.
3733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a script
3743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
3753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isScript = function() {
3763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof ScriptMirror;
3773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
3813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a context.
3823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a context
3833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
3843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isContext = function() {
3853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof ContextMirror;
3863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
3903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether the mirror reflects a scope.
3913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {boolean} True if the mirror reflects a scope
3923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
3933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.isScope = function() {
3943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this instanceof ScopeMirror;
3953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
3993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Allocate a handle id for this object.
4003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
4013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.allocateHandle_ = function() {
4023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.handle_ = next_handle_++;
4033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
4043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
4073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Allocate a transient handle id for this object. Transient handles are
4083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * negative.
4093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
4103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.allocateTransientHandle_ = function() {
4113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.handle_ = next_transient_handle_--;
4123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
4133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.toText = function() {
4163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Simpel to text which is used when on specialization in subclass.
4171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return "#<" + this.constructor.name + ">";
4183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
4193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
4223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Base class for all value mirror objects.
4233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {string} type The type of the mirror
4243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {value} value The value reflected by this mirror
4253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {boolean} transient indicate whether this object is transient with a
4263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    transient handle
4273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
4283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends Mirror
4293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
4303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ValueMirror(type, value, transient) {
4311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, type, Mirror);
4323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.value_ = value;
4333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (!transient) {
4343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    this.allocateHandle_();
4353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
4363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    this.allocateTransientHandle_();
4373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
4383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
4393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(ValueMirror, Mirror);
4403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuMirror.prototype.handle = function() {
4433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.handle_;
4443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
4453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
4483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Check whether this is a primitive value.
4493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {boolean} True if the mirror reflects a primitive value
4503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
4513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuValueMirror.prototype.isPrimitive = function() {
4523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var type = this.type();
4533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return type === 'undefined' ||
4543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu         type === 'null' ||
4553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu         type === 'boolean' ||
4563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu         type === 'number' ||
4573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu         type === 'string';
4583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
4593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
4623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Get the actual value reflected by this mirror.
4633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {value} The value reflected by this mirror
4643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
4653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuValueMirror.prototype.value = function() {
4663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.value_;
4673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
4683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
4713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for Undefined.
4723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
4733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ValueMirror
4743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
4753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction UndefinedMirror() {
4761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, UNDEFINED_TYPE, void 0, ValueMirror);
4773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
4783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(UndefinedMirror, ValueMirror);
4793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuUndefinedMirror.prototype.toText = function() {
4823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return 'undefined';
4833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
4843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
4873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for null.
4883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
4893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ValueMirror
4903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
4913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction NullMirror() {
4921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, NULL_TYPE, null, ValueMirror);
4933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
4943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(NullMirror, ValueMirror);
4953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
4973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuNullMirror.prototype.toText = function() {
4983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return 'null';
4993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
5003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
5033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for boolean values.
5043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {boolean} value The boolean value reflected by this mirror
5053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
5063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ValueMirror
5073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
5083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction BooleanMirror(value) {
5091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, BOOLEAN_TYPE, value, ValueMirror);
5103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
5113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(BooleanMirror, ValueMirror);
5123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBooleanMirror.prototype.toText = function() {
5153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.value_ ? 'true' : 'false';
5163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
5173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
5203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for number values.
5213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} value The number value reflected by this mirror
5223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
5233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ValueMirror
5243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
5253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction NumberMirror(value) {
5261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, NUMBER_TYPE, value, ValueMirror);
5273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
5283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(NumberMirror, ValueMirror);
5293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuNumberMirror.prototype.toText = function() {
5323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return %NumberToString(this.value_);
5333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
5343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
5373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for string values.
5383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {string} value The string value reflected by this mirror
5393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
5403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ValueMirror
5413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
5423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction StringMirror(value) {
5431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, STRING_TYPE, value, ValueMirror);
5443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
5453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(StringMirror, ValueMirror);
5463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuStringMirror.prototype.length = function() {
5493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.value_.length;
5503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
5513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
552402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei PopescuStringMirror.prototype.getTruncatedValue = function(maxLength) {
553402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  if (maxLength != -1 && this.length() > maxLength) {
554402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    return this.value_.substring(0, maxLength) +
5553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu           '... (length: ' + this.length() + ')';
5563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
557402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  return this.value_;
5583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
559402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
560402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei PopescuStringMirror.prototype.toText = function() {
561402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  return this.getTruncatedValue(kMaxProtocolStringLength);
5623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
5633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
5663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for objects.
5673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {object} value The object reflected by this mirror
5683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {boolean} transient indicate whether this object is transient with a
5693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    transient handle
5703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
5713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ValueMirror
5723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
5733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ObjectMirror(value, type, transient) {
5741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, type || OBJECT_TYPE, value, transient, ValueMirror);
5753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
5763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(ObjectMirror, ValueMirror);
5773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.className = function() {
5803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return %_ClassOf(this.value_);
5813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
5823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.constructorFunction = function() {
5853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(%DebugGetProperty(this.value_, 'constructor'));
5863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
5873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.prototypeObject = function() {
5903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(%DebugGetProperty(this.value_, 'prototype'));
5913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
5923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.protoObject = function() {
5953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(%DebugGetPrototype(this.value_));
5963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
5973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
5993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.hasNamedInterceptor = function() {
6003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Get information on interceptors for this object.
6013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var x = %GetInterceptorInfo(this.value_);
6023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return (x & 2) != 0;
6033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
6043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.hasIndexedInterceptor = function() {
6073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Get information on interceptors for this object.
6083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var x = %GetInterceptorInfo(this.value_);
6093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return (x & 1) != 0;
6103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
6113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
6143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Return the property names for this object.
6153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} kind Indicate whether named, indexed or both kinds of
6163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     properties are requested
6173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} limit Limit the number of names returend to the specified
6183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu       value
6193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Array} Property names for this object
6203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
6213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.propertyNames = function(kind, limit) {
6223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Find kind and limit and allocate array for the result
6233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  kind = kind || PropertyKind.Named | PropertyKind.Indexed;
6243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var propertyNames;
6263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var elementNames;
6273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var total = 0;
6286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
6293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Find all the named properties.
6303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (kind & PropertyKind.Named) {
6313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // Get the local property names.
6323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    propertyNames = %GetLocalPropertyNames(this.value_);
6333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    total += propertyNames.length;
6343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // Get names for named interceptor properties if any.
6363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (this.hasNamedInterceptor() && (kind & PropertyKind.Named)) {
6373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      var namedInterceptorNames =
6383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          %GetNamedInterceptorPropertyNames(this.value_);
6393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (namedInterceptorNames) {
6403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        propertyNames = propertyNames.concat(namedInterceptorNames);
6413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        total += namedInterceptorNames.length;
6423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
6433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
6443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
6453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Find all the indexed properties.
6473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (kind & PropertyKind.Indexed) {
6483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // Get the local element names.
6493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    elementNames = %GetLocalElementNames(this.value_);
6503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    total += elementNames.length;
6513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // Get names for indexed interceptor properties.
6533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (this.hasIndexedInterceptor() && (kind & PropertyKind.Indexed)) {
6543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      var indexedInterceptorNames =
6553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          %GetIndexedInterceptorElementNames(this.value_);
6563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (indexedInterceptorNames) {
6573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        elementNames = elementNames.concat(indexedInterceptorNames);
6583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        total += indexedInterceptorNames.length;
6593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
6603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
6613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
6623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  limit = Math.min(limit || total, total);
6633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var names = new Array(limit);
6653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var index = 0;
6663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Copy names for named properties.
6683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (kind & PropertyKind.Named) {
6693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    for (var i = 0; index < limit && i < propertyNames.length; i++) {
6703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      names[index++] = propertyNames[i];
6713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
6723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
6733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Copy names for indexed properties.
6753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (kind & PropertyKind.Indexed) {
6763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    for (var i = 0; index < limit && i < elementNames.length; i++) {
6773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      names[index++] = elementNames[i];
6783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
6793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
6803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return names;
6823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
6833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
6853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
6863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Return the properties for this object as an array of PropertyMirror objects.
6873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} kind Indicate whether named, indexed or both kinds of
6883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     properties are requested
6893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} limit Limit the number of properties returend to the
6903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu       specified value
6913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Array} Property mirrors for this object
6923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
6933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.properties = function(kind, limit) {
6943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var names = this.propertyNames(kind, limit);
6953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var properties = new Array(names.length);
6963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < names.length; i++) {
6973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    properties[i] = this.property(names[i]);
6983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
6993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return properties;
7013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
7023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.property = function(name) {
7053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var details = %DebugGetPropertyDetails(this.value_, %ToString(name));
7063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (details) {
7073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return new PropertyMirror(this, name, details);
7083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
7093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Nothing found.
7113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return GetUndefinedMirror();
7123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
7133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
7173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Try to find a property from its value.
7183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Mirror} value The property value to look for
7193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {PropertyMirror} The property with the specified value. If no
7203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     property was found with the specified value UndefinedMirror is returned
7213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
7223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.lookupProperty = function(value) {
7233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var properties = this.properties();
7243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Look for property value in properties.
7263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < properties.length; i++) {
7273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // Skip properties which are defined through assessors.
7293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var property = properties[i];
7303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (property.propertyType() != PropertyType.Callbacks) {
7313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (%_ObjectEquals(property.value_, value.value_)) {
7323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        return property;
7333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
7343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
7353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
7363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Nothing found.
7383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return GetUndefinedMirror();
7393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
7403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
7433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns objects which has direct references to this object
7443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} opt_max_objects Optional parameter specifying the maximum
7453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     number of referencing objects to return.
7463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Array} The objects which has direct references to this object.
7473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
7483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.referencedBy = function(opt_max_objects) {
7493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Find all objects with direct references to this object.
7503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var result = %DebugReferencedBy(this.value_,
7513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                                  Mirror.prototype, opt_max_objects || 0);
7523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Make mirrors for all the references found.
7543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < result.length; i++) {
7553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result[i] = MakeMirror(result[i]);
7563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
7573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return result;
7593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
7603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuObjectMirror.prototype.toText = function() {
7633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var name;
7643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var ctor = this.constructorFunction();
7653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (!ctor.isFunction()) {
7663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    name = this.className();
7673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
7683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    name = ctor.name();
7693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (!name) {
7703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      name = this.className();
7713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
7723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
7731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return '#<' + name + '>';
7743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
7753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
7783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for functions.
7793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {function} value The function object reflected by this mirror.
7803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
7813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ObjectMirror
7823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
7833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction FunctionMirror(value) {
7841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, value, FUNCTION_TYPE, ObjectMirror);
7853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.resolved_ = true;
7863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
7873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(FunctionMirror, ObjectMirror);
7883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
7913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns whether the function is resolved.
7923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {boolean} True if the function is resolved. Unresolved functions can
7933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     only originate as functions from stack frames
7943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
7953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFunctionMirror.prototype.resolved = function() {
7963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.resolved_;
7973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
7983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
7993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
8013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the name of the function.
8023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {string} Name of the function
8033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
8043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFunctionMirror.prototype.name = function() {
8053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return %FunctionGetName(this.value_);
8063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
8073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
8103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the inferred name of the function.
8113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {string} Name of the function
8123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
8133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFunctionMirror.prototype.inferredName = function() {
8143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return %FunctionGetInferredName(this.value_);
8153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
8163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
8193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the source code for the function.
8203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {string or undefined} The source code for the function. If the
8213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     function is not resolved undefined will be returned.
8223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
8233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFunctionMirror.prototype.source = function() {
8243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Return source if function is resolved. Otherwise just fall through to
8253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // return undefined.
8263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.resolved()) {
8273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return builtins.FunctionSourceString(this.value_);
8283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
8293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
8303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
8333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the script object for the function.
8343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {ScriptMirror or undefined} Script object for the function or
8353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     undefined if the function has no script
8363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
8373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFunctionMirror.prototype.script = function() {
8383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Return script if function is resolved. Otherwise just fall through
8393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // to return undefined.
8403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.resolved()) {
8413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var script = %FunctionGetScript(this.value_);
8423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (script) {
8433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return MakeMirror(script);
8443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
8453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
8463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
8473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
8503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the script source position for the function. Only makes sense
8513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * for functions which has a script defined.
8523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Number or undefined} in-script position for the function
8533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
8543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFunctionMirror.prototype.sourcePosition_ = function() {
8553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Return script if function is resolved. Otherwise just fall through
8563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // to return undefined.
8573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.resolved()) {
8583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return %FunctionGetScriptSourcePosition(this.value_);
8593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
8603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
8613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
8643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the script source location object for the function. Only makes sense
8653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * for functions which has a script defined.
8663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Location or undefined} in-script location for the function begin
8673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
8683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFunctionMirror.prototype.sourceLocation = function() {
8693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.resolved() && this.script()) {
8703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return this.script().locationFromPosition(this.sourcePosition_(),
8713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                                              true);
8723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
8733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
8743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
8773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns objects constructed by this function.
8783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} opt_max_instances Optional parameter specifying the maximum
8793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     number of instances to return.
8803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Array or undefined} The objects constructed by this function.
8813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
8823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFunctionMirror.prototype.constructedBy = function(opt_max_instances) {
8833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.resolved()) {
8843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // Find all objects constructed from this function.
8853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var result = %DebugConstructedBy(this.value_, opt_max_instances || 0);
8863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // Make mirrors for all the instances found.
8883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    for (var i = 0; i < result.length; i++) {
8893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result[i] = MakeMirror(result[i]);
8903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
8913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return result;
8933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
8943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return [];
8953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
8963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
8973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
8993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFunctionMirror.prototype.toText = function() {
9003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.source();
9013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
9023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
9053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for unresolved functions.
9063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {string} value The name for the unresolved function reflected by this
9073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     mirror.
9083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
9093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ObjectMirror
9103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
9113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction UnresolvedFunctionMirror(value) {
9123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Construct this using the ValueMirror as an unresolved function is not a
9133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // real object but just a string.
9141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, FUNCTION_TYPE, value, ValueMirror);
9153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.propertyCount_ = 0;
9163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.elementCount_ = 0;
9173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.resolved_ = false;
9183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
9193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(UnresolvedFunctionMirror, FunctionMirror);
9203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuUnresolvedFunctionMirror.prototype.className = function() {
9233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return 'Function';
9243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
9253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuUnresolvedFunctionMirror.prototype.constructorFunction = function() {
9283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return GetUndefinedMirror();
9293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
9303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuUnresolvedFunctionMirror.prototype.prototypeObject = function() {
9333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return GetUndefinedMirror();
9343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
9353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuUnresolvedFunctionMirror.prototype.protoObject = function() {
9383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return GetUndefinedMirror();
9393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
9403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuUnresolvedFunctionMirror.prototype.name = function() {
9433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.value_;
9443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
9453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuUnresolvedFunctionMirror.prototype.inferredName = function() {
9483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return undefined;
9493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
9503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuUnresolvedFunctionMirror.prototype.propertyNames = function(kind, limit) {
9533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return [];
9543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
9553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
9583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for arrays.
9593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Array} value The Array object reflected by this mirror
9603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
9613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ObjectMirror
9623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
9633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ArrayMirror(value) {
9641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, value, ObjectMirror);
9653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
9663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(ArrayMirror, ObjectMirror);
9673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuArrayMirror.prototype.length = function() {
9703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.value_.length;
9713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
9723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9743ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochArrayMirror.prototype.indexedPropertiesFromRange = function(opt_from_index,
9753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                            opt_to_index) {
9763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var from_index = opt_from_index || 0;
9773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var to_index = opt_to_index || this.length() - 1;
9783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (from_index > to_index) return new Array();
9793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var values = new Array(to_index - from_index + 1);
9803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = from_index; i <= to_index; i++) {
9813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var details = %DebugGetPropertyDetails(this.value_, %ToString(i));
9823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var value;
9833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (details) {
9843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      value = new PropertyMirror(this, i, details);
9853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    } else {
9863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      value = GetUndefinedMirror();
9873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
9883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    values[i - from_index] = value;
9893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
9903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return values;
9913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
9923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
9943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
9953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for dates.
9963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Date} value The Date object reflected by this mirror
9973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
9983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ObjectMirror
9993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
10003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction DateMirror(value) {
10011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, value, ObjectMirror);
10023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
10033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(DateMirror, ObjectMirror);
10043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDateMirror.prototype.toText = function() {
10073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var s = JSON.stringify(this.value_);
10083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return s.substring(1, s.length - 1);  // cut quotes
10093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
10103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
10133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for regular expressions.
10143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {RegExp} value The RegExp object reflected by this mirror
10153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
10163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ObjectMirror
10173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
10183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction RegExpMirror(value) {
10191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, value, REGEXP_TYPE, ObjectMirror);
10203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
10213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(RegExpMirror, ObjectMirror);
10223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
10253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the source to the regular expression.
10263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {string or undefined} The source to the regular expression
10273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
10283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuRegExpMirror.prototype.source = function() {
10293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.value_.source;
10303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
10313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
10343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns whether this regular expression has the global (g) flag set.
10353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {boolean} Value of the global flag
10363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
10373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuRegExpMirror.prototype.global = function() {
10383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.value_.global;
10393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
10403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
10433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns whether this regular expression has the ignore case (i) flag set.
10443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {boolean} Value of the ignore case flag
10453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
10463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuRegExpMirror.prototype.ignoreCase = function() {
10473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.value_.ignoreCase;
10483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
10493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
10523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns whether this regular expression has the multiline (m) flag set.
10533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {boolean} Value of the multiline flag
10543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
10553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuRegExpMirror.prototype.multiline = function() {
10563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.value_.multiline;
10573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
10583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuRegExpMirror.prototype.toText = function() {
10613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Simpel to text which is used when on specialization in subclass.
10623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return "/" + this.source() + "/";
10633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
10643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
10673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for error objects.
10683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Error} value The error object reflected by this mirror
10693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
10703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends ObjectMirror
10713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
10723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ErrorMirror(value) {
10731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, value, ERROR_TYPE, ObjectMirror);
10743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
10753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(ErrorMirror, ObjectMirror);
10763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
10793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the message for this eror object.
10803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {string or undefined} The message for this eror object
10813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
10823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuErrorMirror.prototype.message = function() {
10833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.value_.message;
10843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
10853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuErrorMirror.prototype.toText = function() {
10883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Use the same text representation as in messages.js.
10893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var text;
10903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  try {
10913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    str = %_CallFunction(this.value_, builtins.ErrorToString);
10923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } catch (e) {
10931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    str = '#<Error>';
10943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
10953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return str;
10963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
10973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
11003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Base mirror object for properties.
11013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {ObjectMirror} mirror The mirror object having this property
11023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {string} name The name of the property
11033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Array} details Details about the property
11043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
11053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends Mirror
11063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
11073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction PropertyMirror(mirror, name, details) {
11081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, PROPERTY_TYPE, Mirror);
11093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.mirror_ = mirror;
11103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.name_ = name;
11113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.value_ = details[0];
11123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.details_ = details[1];
11133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (details.length > 2) {
11143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    this.exception_ = details[2];
11153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    this.getter_ = details[3];
11163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    this.setter_ = details[4];
11173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
11183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
11193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(PropertyMirror, Mirror);
11203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.isReadOnly = function() {
11233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return (this.attributes() & PropertyAttribute.ReadOnly) != 0;
11243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
11253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.isEnum = function() {
11283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return (this.attributes() & PropertyAttribute.DontEnum) == 0;
11293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
11303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.canDelete = function() {
11333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return (this.attributes() & PropertyAttribute.DontDelete) == 0;
11343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
11353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.name = function() {
11383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.name_;
11393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
11403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.isIndexed = function() {
11433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < this.name_.length; i++) {
11443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (this.name_[i] < '0' || '9' < this.name_[i]) {
11453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return false;
11463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
11473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
11483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return true;
11493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
11503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.value = function() {
11533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(this.value_, false);
11543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
11553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
11583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns whether this property value is an exception.
11593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {booolean} True if this property value is an exception
11603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
11613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.isException = function() {
11623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.exception_ ? true : false;
11633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
11643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.attributes = function() {
11673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return %DebugPropertyAttributesFromDetails(this.details_);
11683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
11693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.propertyType = function() {
11723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return %DebugPropertyTypeFromDetails(this.details_);
11733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
11743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.insertionIndex = function() {
11773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return %DebugPropertyIndexFromDetails(this.details_);
11783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
11793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
11823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns whether this property has a getter defined through __defineGetter__.
11833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {booolean} True if this property has a getter
11843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
11853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.hasGetter = function() {
11863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.getter_ ? true : false;
11873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
11883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
11913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns whether this property has a setter defined through __defineSetter__.
11923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {booolean} True if this property has a setter
11933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
11943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.hasSetter = function() {
11953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.setter_ ? true : false;
11963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
11973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
12003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the getter for this property defined through __defineGetter__.
12013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Mirror} FunctionMirror reflecting the getter function or
12023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     UndefinedMirror if there is no getter for this property
12033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
12043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.getter = function() {
12053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.hasGetter()) {
12063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return MakeMirror(this.getter_);
12073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
12083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return GetUndefinedMirror();
12093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
12103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
12113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
12143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns the setter for this property defined through __defineSetter__.
12153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Mirror} FunctionMirror reflecting the setter function or
12163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     UndefinedMirror if there is no setter for this property
12173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
12183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.setter = function() {
12193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.hasSetter()) {
12203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return MakeMirror(this.setter_);
12213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
12223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return GetUndefinedMirror();
12233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
12243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
12253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
12283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns whether this property is natively implemented by the host or a set
12293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * through JavaScript code.
12306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * @return {boolean} True if the property is
12313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     UndefinedMirror if there is no setter for this property
12323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
12333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuPropertyMirror.prototype.isNative = function() {
12343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return (this.propertyType() == PropertyType.Interceptor) ||
12353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu         ((this.propertyType() == PropertyType.Callbacks) &&
12363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          !this.hasGetter() && !this.hasSetter());
12373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
12383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsFrameIdIndex = 0;
12413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsReceiverIndex = 1;
12423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsFunctionIndex = 2;
12433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsArgumentCountIndex = 3;
12443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsLocalCountIndex = 4;
12453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsSourcePositionIndex = 5;
12463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsConstructCallIndex = 6;
12473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsAtReturnIndex = 7;
12483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsFlagsIndex = 8;
12493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsFirstDynamicIndex = 9;
12503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsNameIndex = 0;
12523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsValueIndex = 1;
12533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsNameValueSize = 2;
12543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsFlagDebuggerFrameMask = 1 << 0;
12563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsFlagOptimizedFrameMask = 1 << 1;
12573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kFrameDetailsFlagInlinedFrameIndexMask = 7 << 2;
12583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
12593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
12603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Wrapper for the frame details information retreived from the VM. The frame
12613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * details from the VM is an array with the following content. See runtime.cc
12623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Runtime_GetFrameDetails.
12633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     0: Id
12643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     1: Receiver
12653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     2: Function
12663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     3: Argument count
12673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     4: Local count
12683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     5: Source position
12693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     6: Construct call
12707f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch *     7: Is at return
12713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch *     8: Flags (debugger frame, optimized frame, inlined frame index)
12723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     Arguments name, value
12733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     Locals name, value
12747f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch *     Return value if any
12753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} break_id Current break id
12763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} index Frame number
12773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
12783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
12793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction FrameDetails(break_id, index) {
12803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.break_id_ = break_id;
12813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.details_ = %GetFrameDetails(break_id, index);
12823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
12833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.frameId = function() {
12863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
12873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_[kFrameDetailsFrameIdIndex];
12883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
12893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.receiver = function() {
12923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
12933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_[kFrameDetailsReceiverIndex];
12943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
12953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.func = function() {
12983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
12993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_[kFrameDetailsFunctionIndex];
13003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
13023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
13033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.isConstructCall = function() {
13043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
13053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_[kFrameDetailsConstructCallIndex];
13063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
13083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
13097f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochFrameDetails.prototype.isAtReturn = function() {
13107f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  %CheckExecutionState(this.break_id_);
13117f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  return this.details_[kFrameDetailsAtReturnIndex];
13123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13137f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
13147f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
13153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.isDebuggerFrame = function() {
13163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
13173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  var f = kFrameDetailsFlagDebuggerFrameMask;
13183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return (this.details_[kFrameDetailsFlagsIndex] & f) == f;
13193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
13213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
13223fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochFrameDetails.prototype.isOptimizedFrame = function() {
13233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  %CheckExecutionState(this.break_id_);
13243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  var f = kFrameDetailsFlagOptimizedFrameMask;
13253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return (this.details_[kFrameDetailsFlagsIndex] & f) == f;
13263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
13283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
13293fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochFrameDetails.prototype.isInlinedFrame = function() {
13303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return this.inlinedFrameIndex() > 0;
13313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
13333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
13343fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochFrameDetails.prototype.inlinedFrameIndex = function() {
13353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  %CheckExecutionState(this.break_id_);
13363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  var f = kFrameDetailsFlagInlinedFrameIndexMask;
13373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return (this.details_[kFrameDetailsFlagsIndex] & f) >> 2;
13383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
13403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
13413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.argumentCount = function() {
13423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
13433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_[kFrameDetailsArgumentCountIndex];
13443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
13463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
13473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.argumentName = function(index) {
13483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
13493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (index >= 0 && index < this.argumentCount()) {
13503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return this.details_[kFrameDetailsFirstDynamicIndex +
13513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                         index * kFrameDetailsNameValueSize +
13523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                         kFrameDetailsNameIndex];
13533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
13543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
13563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
13573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.argumentValue = function(index) {
13583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
13593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (index >= 0 && index < this.argumentCount()) {
13603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return this.details_[kFrameDetailsFirstDynamicIndex +
13613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                         index * kFrameDetailsNameValueSize +
13623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                         kFrameDetailsValueIndex];
13633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
13643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
13663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
13673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.localCount = function() {
13683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
13693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_[kFrameDetailsLocalCountIndex];
13703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
13723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
13733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.sourcePosition = function() {
13743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
13753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_[kFrameDetailsSourcePositionIndex];
13763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
13783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
13793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.localName = function(index) {
13803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
13813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (index >= 0 && index < this.localCount()) {
13827f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    var locals_offset = kFrameDetailsFirstDynamicIndex +
13833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        this.argumentCount() * kFrameDetailsNameValueSize;
13843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return this.details_[locals_offset +
13853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                         index * kFrameDetailsNameValueSize +
13863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                         kFrameDetailsNameIndex];
13873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
13883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
13903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
13913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.localValue = function(index) {
13923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
13933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (index >= 0 && index < this.localCount()) {
13947f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    var locals_offset = kFrameDetailsFirstDynamicIndex +
13953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        this.argumentCount() * kFrameDetailsNameValueSize;
13963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return this.details_[locals_offset +
13973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                         index * kFrameDetailsNameValueSize +
13983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                         kFrameDetailsValueIndex];
13993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
14003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
14013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14037f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochFrameDetails.prototype.returnValue = function() {
14047f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  %CheckExecutionState(this.break_id_);
14057f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  var return_value_offset =
14067f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch      kFrameDetailsFirstDynamicIndex +
14077f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch      (this.argumentCount() + this.localCount()) * kFrameDetailsNameValueSize;
14087f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  if (this.details_[kFrameDetailsAtReturnIndex]) {
14097f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    return this.details_[return_value_offset];
14107f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  }
14113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
14127f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
14137f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
14143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameDetails.prototype.scopeCount = function() {
14153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return %GetScopeCount(this.break_id_, this.frameId());
14163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
14173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
14203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for stack frames.
14213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} break_id The break id in the VM for which this frame is
14223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu       valid
14233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} index The frame index (top frame is index 0)
14243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
14253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends Mirror
14263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
14273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction FrameMirror(break_id, index) {
14281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, FRAME_TYPE, Mirror);
14293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.break_id_ = break_id;
14303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.index_ = index;
14313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.details_ = new FrameDetails(break_id, index);
14323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
14333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(FrameMirror, Mirror);
14343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.index = function() {
14373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.index_;
14383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
14393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.func = function() {
14423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Get the function for this frame from the VM.
14433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var f = this.details_.func();
14446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
14453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Create a function mirror. NOTE: MakeMirror cannot be used here as the
14463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // value returned from the VM might be a string if the function for the
14473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // frame is unresolved.
14483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (IS_FUNCTION(f)) {
14493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return MakeMirror(f);
14503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
14513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return new UnresolvedFunctionMirror(f);
14523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
14533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
14543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.receiver = function() {
14573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(this.details_.receiver());
14583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
14593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.isConstructCall = function() {
14623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_.isConstructCall();
14633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
14643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14667f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochFrameMirror.prototype.isAtReturn = function() {
14677f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  return this.details_.isAtReturn();
14687f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch};
14697f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
14707f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
14713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.isDebuggerFrame = function() {
14723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_.isDebuggerFrame();
14733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
14743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14763fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochFrameMirror.prototype.isOptimizedFrame = function() {
14773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return this.details_.isOptimizedFrame();
14783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
14793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
14803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
14813fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochFrameMirror.prototype.isInlinedFrame = function() {
14823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return this.details_.isInlinedFrame();
14833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
14843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
14853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
14863fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochFrameMirror.prototype.inlinedFrameIndex = function() {
14873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return this.details_.inlinedFrameIndex();
14883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
14893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
14903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
14913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.argumentCount = function() {
14923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_.argumentCount();
14933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
14943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
14963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.argumentName = function(index) {
14973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_.argumentName(index);
14983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
14993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.argumentValue = function(index) {
15023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(this.details_.argumentValue(index));
15033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
15043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.localCount = function() {
15073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_.localCount();
15083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
15093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.localName = function(index) {
15123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_.localName(index);
15133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
15143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.localValue = function(index) {
15173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(this.details_.localValue(index));
15183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
15193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15217f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochFrameMirror.prototype.returnValue = function() {
15227f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  return MakeMirror(this.details_.returnValue());
15237f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch};
15247f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
15257f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
15263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.sourcePosition = function() {
15273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_.sourcePosition();
15283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
15293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.sourceLocation = function() {
15323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.func().resolved() && this.func().script()) {
15333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return this.func().script().locationFromPosition(this.sourcePosition(),
15343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                                                     true);
15353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
15363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
15373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.sourceLine = function() {
15403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.func().resolved()) {
15413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var location = this.sourceLocation();
15423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (location) {
15433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return location.line;
15443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
15453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
15463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
15473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.sourceColumn = function() {
15503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.func().resolved()) {
15513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var location = this.sourceLocation();
15523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (location) {
15533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return location.column;
15543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
15553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
15563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
15573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.sourceLineText = function() {
15603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.func().resolved()) {
15613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var location = this.sourceLocation();
15623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (location) {
15633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return location.sourceText();
15643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
15653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
15663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
15673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.scopeCount = function() {
15703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_.scopeCount();
15713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
15723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.scope = function(index) {
15753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return new ScopeMirror(this, index);
15763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
15773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15793ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochFrameMirror.prototype.evaluate = function(source, disable_break,
15803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                          opt_context_object) {
15813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  var result = %DebugEvaluate(this.break_id_,
15823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                              this.details_.frameId(),
15833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                              this.details_.inlinedFrameIndex(),
15843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                              source,
15853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                              Boolean(disable_break),
15863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                              opt_context_object);
15873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(result);
15883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
15893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.invocationText = function() {
15923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Format frame invoaction (receiver, function and arguments).
15933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var result = '';
15943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var func = this.func();
15953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var receiver = this.receiver();
15963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.isConstructCall()) {
15973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // For constructor frames display new followed by the function name.
15983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += 'new ';
15993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += func.name() ? func.name() : '[anonymous]';
16003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else if (this.isDebuggerFrame()) {
16013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += '[debugger]';
16023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
16033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // If the receiver has a className which is 'global' don't display it.
16043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    var display_receiver =
16053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      !receiver.className || (receiver.className() != 'global');
16063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (display_receiver) {
16073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result += receiver.toText();
16083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
16093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // Try to find the function as a property in the receiver. Include the
16103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // prototype chain in the lookup.
16113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var property = GetUndefinedMirror();
16123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    if (receiver.isObject()) {
16133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      for (var r = receiver;
16143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch           !r.isNull() && property.isUndefined();
16153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch           r = r.protoObject()) {
16163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        property = r.lookupProperty(func);
16173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
16183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
16193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (!property.isUndefined()) {
16203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // The function invoked was found on the receiver. Use the property name
16213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // for the backtrace.
16223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (!property.isIndexed()) {
16233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        if (display_receiver) {
16243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          result += '.';
16253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        }
16263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += property.name();
16273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      } else {
16283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += '[';
16293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += property.name();
16303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += ']';
16313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
16323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Also known as - if the name in the function doesn't match the name
16333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // under which it was looked up.
16343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (func.name() && func.name() != property.name()) {
16353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += '(aka ' + func.name() + ')';
16363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
16373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    } else {
16383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // The function invoked was not found on the receiver. Use the function
16393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // name if available for the backtrace.
16403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (display_receiver) {
16413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += '.';
16423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
16433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result += func.name() ? func.name() : '[anonymous]';
16443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
16453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
16463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
16473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Render arguments for normal frames.
16483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (!this.isDebuggerFrame()) {
16493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += '(';
16503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    for (var i = 0; i < this.argumentCount(); i++) {
16513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (i != 0) result += ', ';
16523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (this.argumentName(i)) {
16533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += this.argumentName(i);
16543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += '=';
16553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
16563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result += this.argumentValue(i).toText();
16573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
16583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += ')';
16593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
16603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
16617f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  if (this.isAtReturn()) {
16627f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    result += ' returning ';
16637f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    result += this.returnValue().toText();
16647f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  }
1665f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
16663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return result;
16673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
16683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
16693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
16703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.sourceAndPositionText = function() {
16713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Format source and position.
16723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var result = '';
16733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var func = this.func();
16743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (func.resolved()) {
16753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (func.script()) {
16763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (func.script().name()) {
16773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += func.script().name();
16783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      } else {
16793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += '[unnamed]';
16803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
16813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (!this.isDebuggerFrame()) {
16823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        var location = this.sourceLocation();
16833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += ' line ';
16843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += !IS_UNDEFINED(location) ? (location.line + 1) : '?';
16853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += ' column ';
16863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        result += !IS_UNDEFINED(location) ? (location.column + 1) : '?';
16873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        if (!IS_UNDEFINED(this.sourcePosition())) {
16883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          result += ' (position ' + (this.sourcePosition() + 1) + ')';
16893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        }
16903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
16913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    } else {
16923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result += '[no source]';
16933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
16943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
16953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += '[unresolved]';
16963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
16973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
16983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return result;
16993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
17003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.localsText = function() {
17033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Format local variables.
17043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var result = '';
17053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var locals_count = this.localCount();
17063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (locals_count > 0) {
17073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    for (var i = 0; i < locals_count; ++i) {
17083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result += '      var ';
17093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result += this.localName(i);
17103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result += ' = ';
17113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result += this.localValue(i).toText();
17123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (i < locals_count - 1) result += '\n';
17133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
17143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
17153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return result;
17173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
17183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuFrameMirror.prototype.toText = function(opt_locals) {
17213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var result = '';
17223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  result += '#' + (this.index() <= 9 ? '0' : '') + this.index();
17233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  result += ' ';
17243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  result += this.invocationText();
17253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  result += ' ';
17263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  result += this.sourceAndPositionText();
17273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (opt_locals) {
17283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += '\n';
17293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += this.localsText();
17303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
17313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return result;
17323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
17333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kScopeDetailsTypeIndex = 0;
17363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kScopeDetailsObjectIndex = 1;
17373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ScopeDetails(frame, index) {
17393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.break_id_ = frame.break_id_;
17403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.details_ = %GetScopeDetails(frame.break_id_,
17413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                                   frame.details_.frameId(),
17423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                   frame.details_.inlinedFrameIndex(),
17433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                                   index);
17443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
17453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScopeDetails.prototype.type = function() {
17483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
17493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_[kScopeDetailsTypeIndex];
17503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
17513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScopeDetails.prototype.object = function() {
17543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  %CheckExecutionState(this.break_id_);
17553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_[kScopeDetailsObjectIndex];
17563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
17573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
17603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for scope.
17613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {FrameMirror} frame The frame this scope is a part of
17623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} index The scope index in the frame
17633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
17643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends Mirror
17653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
17663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ScopeMirror(frame, index) {
17671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, SCOPE_TYPE, Mirror);
17683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.frame_index_ = frame.index_;
17693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.scope_index_ = index;
17703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.details_ = new ScopeDetails(frame, index);
17713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
17723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(ScopeMirror, Mirror);
17733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScopeMirror.prototype.frameIndex = function() {
17763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.frame_index_;
17773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
17783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScopeMirror.prototype.scopeIndex = function() {
17813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.scope_index_;
17823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
17833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScopeMirror.prototype.scopeType = function() {
17863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.details_.type();
17873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
17883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScopeMirror.prototype.scopeObject = function() {
17913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // For local and closure scopes create a transient mirror as these objects are
17923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // created on the fly materializing the local or closure scopes and
17933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // therefore will not preserve identity.
17943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var transient = this.scopeType() == ScopeType.Local ||
17953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                  this.scopeType() == ScopeType.Closure;
17963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(this.details_.object(), transient);
17973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
17983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
17993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
18013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for script source.
18023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Script} script The script object
18033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
18043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends Mirror
18053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
18063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ScriptMirror(script) {
18071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, SCRIPT_TYPE, Mirror);
18083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.script_ = script;
18093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.context_ = new ContextMirror(script.context_data);
18103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.allocateHandle_();
18113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
18123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(ScriptMirror, Mirror);
18133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.value = function() {
18163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_;
18173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.name = function() {
18216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return this.script_.name || this.script_.nameOrSourceURL();
18223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.id = function() {
18263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_.id;
18273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.source = function() {
18313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_.source;
18323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18353ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochScriptMirror.prototype.setSource = function(source) {
18363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  %DebugSetScriptSource(this.script_, source);
18373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
18383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.lineOffset = function() {
18413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_.line_offset;
18423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.columnOffset = function() {
18463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_.column_offset;
18473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.data = function() {
18513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_.data;
18523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.scriptType = function() {
18563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_.type;
18573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.compilationType = function() {
18613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_.compilation_type;
18623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.lineCount = function() {
18663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_.lineCount();
18673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.locationFromPosition = function(
18713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    position, include_resource_offset) {
18723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_.locationFromPosition(position, include_resource_offset);
18733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
18743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.sourceSlice = function (opt_from_line, opt_to_line) {
18773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.script_.sourceSlice(opt_from_line, opt_to_line);
18783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
18793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.context = function() {
18823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.context_;
18833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.evalFromScript = function() {
18873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(this.script_.eval_from_script);
18883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.evalFromFunctionName = function() {
18923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return MakeMirror(this.script_.eval_from_function_name);
18933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
18943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
18963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.evalFromLocation = function() {
18973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var eval_from_script = this.evalFromScript();
18983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (!eval_from_script.isUndefined()) {
18993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var position = this.script_.eval_from_script_position;
19003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return eval_from_script.locationFromPosition(position, true);
19013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
19023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
19033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptMirror.prototype.toText = function() {
19063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var result = '';
19073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  result += this.name();
19083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  result += ' (lines: ';
19093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.lineOffset() > 0) {
19103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += this.lineOffset();
19113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += '-';
19123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += this.lineOffset() + this.lineCount() - 1;
19133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
19143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result += this.lineCount();
19153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
19163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  result += ')';
19173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return result;
19183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
19193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
19223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Mirror object for context.
19233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Object} data The context data
19243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
19253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @extends Mirror
19263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
19273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ContextMirror(data) {
19281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  %_CallFunction(this, CONTEXT_TYPE, Mirror);
19293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.data_ = data;
19303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.allocateHandle_();
19313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
19323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuinherits(ContextMirror, Mirror);
19333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuContextMirror.prototype.data = function() {
19363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.data_;
19373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
19383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
19413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns a mirror serializer
19423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
19433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {boolean} details Set to true to include details
19443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Object} options Options comtrolling the serialization
19453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     The following options can be set:
19463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *       includeSource: include ths full source of scripts
19473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {MirrorSerializer} mirror serializer
19483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
19493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeMirrorSerializer(details, options) {
19503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return new JSONProtocolSerializer(details, options);
19513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
19523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
19553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Object for serializing a mirror objects and its direct references.
19563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {boolean} details Indicates whether to include details for the mirror
19573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     serialized
19583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @constructor
19593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
19603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction JSONProtocolSerializer(details, options) {
19613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.details_ = details;
19623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.options_ = options;
19633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.mirrors_ = [ ];
19643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
19653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
19683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns a serialization of an object reference. The referenced object are
19693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * added to the serialization state.
19703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
19713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Mirror} mirror The mirror to serialize
19723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {String} JSON serialization
19733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
19743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.serializeReference = function(mirror) {
19753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.serialize_(mirror, true, true);
19763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
19773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
19803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns a serialization of an object value. The referenced objects are
19813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * added to the serialization state.
19823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
19833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Mirror} mirror The mirror to serialize
19843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {String} JSON serialization
19853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
19863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.serializeValue = function(mirror) {
19873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var json = this.serialize_(mirror, false, true);
19883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return json;
19893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
19903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
19933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Returns a serialization of all the objects referenced.
19943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
19953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Mirror} mirror The mirror to serialize.
19963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {Array.<Object>} Array of the referenced objects converted to
19973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *     protcol objects.
19983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
19993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.serializeReferencedObjects = function() {
20003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Collect the protocol representation of the referenced objects in an array.
20013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var content = [];
20026ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
20033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Get the number of referenced objects.
20043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var count = this.mirrors_.length;
20056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
20063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < count; i++) {
20073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.push(this.serialize_(this.mirrors_[i], false, false));
20083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
20093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
20103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return content;
20113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
20123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
20133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
20143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.includeSource_ = function() {
20153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.options_ && this.options_.includeSource;
20163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
20173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
20183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
20193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.inlineRefs_ = function() {
20203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return this.options_ && this.options_.inlineRefs;
20213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
20223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
20233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2024402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei PopescuJSONProtocolSerializer.prototype.maxStringLength_ = function() {
2025402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  if (IS_UNDEFINED(this.options_) ||
2026402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu      IS_UNDEFINED(this.options_.maxStringLength)) {
2027402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    return kMaxProtocolStringLength;
2028402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  }
2029402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  return this.options_.maxStringLength;
20303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2031402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
2032402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
20333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.add_ = function(mirror) {
20343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // If this mirror is already in the list just return.
20353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < this.mirrors_.length; i++) {
20363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (this.mirrors_[i] === mirror) {
20373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return;
20383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
20393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
20406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
20413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Add the mirror to the list of mirrors to be serialized.
20423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  this.mirrors_.push(mirror);
20433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
20443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
20453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
20463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
20473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Formats mirror object to protocol reference object with some data that can
20483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * be used to display the value in debugger.
20493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Mirror} mirror Mirror to serialize.
20503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Object} Protocol reference object.
20513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
20526ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockJSONProtocolSerializer.prototype.serializeReferenceWithDisplayData_ =
20533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    function(mirror) {
20543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var o = {};
20553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  o.ref = mirror.handle();
20563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  o.type = mirror.type();
20573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  switch (mirror.type()) {
20583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case UNDEFINED_TYPE:
20593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case NULL_TYPE:
20603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case BOOLEAN_TYPE:
20613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case NUMBER_TYPE:
20623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      o.value = mirror.value();
20633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
20643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case STRING_TYPE:
2065402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu      o.value = mirror.getTruncatedValue(this.maxStringLength_());
20663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
20673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case FUNCTION_TYPE:
20683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      o.name = mirror.name();
20693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      o.inferredName = mirror.inferredName();
20703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (mirror.script()) {
20713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        o.scriptId = mirror.script().id();
20723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
20733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
20743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case ERROR_TYPE:
20753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case REGEXP_TYPE:
20763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      o.value = mirror.toText();
20773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
20783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case OBJECT_TYPE:
20793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      o.className = mirror.className();
20803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
20813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
20823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return o;
20833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
20843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
20853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
20863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.serialize_ = function(mirror, reference,
20873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                                                       details) {
20883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // If serializing a reference to a mirror just return the reference and add
20893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // the mirror to the referenced mirrors.
20903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (reference &&
20913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      (mirror.isValue() || mirror.isScript() || mirror.isContext())) {
20923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (this.inlineRefs_() && mirror.isValue()) {
20933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return this.serializeReferenceWithDisplayData_(mirror);
20943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    } else {
20953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      this.add_(mirror);
20963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return {'ref' : mirror.handle()};
20973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
20983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
20996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
21003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Collect the JSON property/value pairs.
21013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var content = {};
21023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Add the mirror handle.
21043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (mirror.isValue() || mirror.isScript() || mirror.isContext()) {
21053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.handle = mirror.handle();
21063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
21073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Always add the type.
21093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.type = mirror.type();
21103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  switch (mirror.type()) {
21123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case UNDEFINED_TYPE:
21133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case NULL_TYPE:
21143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Undefined and null are represented just by their type.
21153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
21163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case BOOLEAN_TYPE:
21183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Boolean values are simply represented by their value.
21193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.value = mirror.value();
21203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
21213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case NUMBER_TYPE:
21233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Number values are simply represented by their value.
21243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.value = NumberToJSON_(mirror.value());
21253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
21263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case STRING_TYPE:
21283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // String values might have their value cropped to keep down size.
2129402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu      if (this.maxStringLength_() != -1 &&
2130402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu          mirror.length() > this.maxStringLength_()) {
2131402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu        var str = mirror.getTruncatedValue(this.maxStringLength_());
21323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        content.value = str;
21333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        content.fromIndex = 0;
2134402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu        content.toIndex = this.maxStringLength_();
21353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      } else {
21363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        content.value = mirror.value();
21373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
21383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.length = mirror.length();
21393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
21403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case OBJECT_TYPE:
21423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case FUNCTION_TYPE:
21433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case ERROR_TYPE:
21443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case REGEXP_TYPE:
21453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Add object representation.
21463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      this.serializeObject_(mirror, content, details);
21473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
21483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case PROPERTY_TYPE:
21503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      throw new Error('PropertyMirror cannot be serialized independeltly');
21513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
21523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case FRAME_TYPE:
21543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Add object representation.
21553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      this.serializeFrame_(mirror, content);
21563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
21573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case SCOPE_TYPE:
21593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Add object representation.
21603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      this.serializeScope_(mirror, content);
21613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
21623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case SCRIPT_TYPE:
21643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Script is represented by id, name and source attributes.
21653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (mirror.name()) {
21663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        content.name = mirror.name();
21673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
21683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.id = mirror.id();
21693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.lineOffset = mirror.lineOffset();
21703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.columnOffset = mirror.columnOffset();
21713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.lineCount = mirror.lineCount();
21723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (mirror.data()) {
21733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        content.data = mirror.data();
21743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
21753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (this.includeSource_()) {
21763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        content.source = mirror.source();
21773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      } else {
21783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        var sourceStart = mirror.source().substring(0, 80);
21793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        content.sourceStart = sourceStart;
21803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
21813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.sourceLength = mirror.source().length;
21823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.scriptType = mirror.scriptType();
21833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.compilationType = mirror.compilationType();
21843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // For compilation type eval emit information on the script from which
21853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // eval was called if a script is present.
21863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (mirror.compilationType() == 1 &&
21873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          mirror.evalFromScript()) {
21883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        content.evalFromScript =
21893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu            this.serializeReference(mirror.evalFromScript());
21903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        var evalFromLocation = mirror.evalFromLocation();
21913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        if (evalFromLocation) {
21923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          content.evalFromLocation = { line: evalFromLocation.line,
21933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                                       column: evalFromLocation.column };
21943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        }
21953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        if (mirror.evalFromFunctionName()) {
21963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          content.evalFromFunctionName = mirror.evalFromFunctionName();
21973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        }
21983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
21993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      if (mirror.context()) {
22003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        content.context = this.serializeReference(mirror.context());
22013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      }
22023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
22033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case CONTEXT_TYPE:
22053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.data = mirror.data();
22063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
22073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
22083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Always add the text representation.
22103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.text = mirror.toText();
22116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
22123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Create and return the JSON string.
22133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return content;
22143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
22153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
22183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Serialize object information to the following JSON format.
22193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
22203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *   {"className":"<class name>",
22213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    "constructorFunction":{"ref":<number>},
22223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    "protoObject":{"ref":<number>},
22233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    "prototypeObject":{"ref":<number>},
22243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    "namedInterceptor":<boolean>,
22253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    "indexedInterceptor":<boolean>,
22263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    "properties":[<properties>]}
22273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
22283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.serializeObject_ = function(mirror, content,
22293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                                                             details) {
22303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Add general object properties.
22313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.className = mirror.className();
22323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.constructorFunction =
22333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      this.serializeReference(mirror.constructorFunction());
22343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.protoObject = this.serializeReference(mirror.protoObject());
22353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.prototypeObject = this.serializeReference(mirror.prototypeObject());
22363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Add flags to indicate whether there are interceptors.
22383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (mirror.hasNamedInterceptor()) {
22393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.namedInterceptor = true;
22403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
22413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (mirror.hasIndexedInterceptor()) {
22423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.indexedInterceptor = true;
22433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
22446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
22453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Add function specific properties.
22463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (mirror.isFunction()) {
22473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // Add function specific properties.
22483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.name = mirror.name();
22493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (!IS_UNDEFINED(mirror.inferredName())) {
22503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.inferredName = mirror.inferredName();
22513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
22523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.resolved = mirror.resolved();
22533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (mirror.resolved()) {
22543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.source = mirror.source();
22553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
22563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (mirror.script()) {
22573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.script = this.serializeReference(mirror.script());
22583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      content.scriptId = mirror.script().id();
22596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
22603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      serializeLocationFields(mirror.sourceLocation(), content);
22613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
22623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
22633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Add date specific properties.
22653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (mirror.isDate()) {
22663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // Add date specific properties.
22673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.value = mirror.value();
22683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
22693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Add actual properties - named properties followed by indexed properties.
22713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var propertyNames = mirror.propertyNames(PropertyKind.Named);
22723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var propertyIndexes = mirror.propertyNames(PropertyKind.Indexed);
22733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var p = new Array(propertyNames.length + propertyIndexes.length);
22743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < propertyNames.length; i++) {
22753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var propertyMirror = mirror.property(propertyNames[i]);
22763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    p[i] = this.serializeProperty_(propertyMirror);
22773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (details) {
22783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      this.add_(propertyMirror.value());
22793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
22803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
22813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < propertyIndexes.length; i++) {
22823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var propertyMirror = mirror.property(propertyIndexes[i]);
22833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    p[propertyNames.length + i] = this.serializeProperty_(propertyMirror);
22843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (details) {
22853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      this.add_(propertyMirror.value());
22863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
22873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
22883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.properties = p;
22893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
22903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
22923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
22933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Serialize location information to the following JSON format:
22943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
22953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *   "position":"<position>",
22963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *   "line":"<line>",
22973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *   "column":"<column>",
22986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block *
22993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {SourceLocation} location The location to serialize, may be undefined.
23003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
23013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction serializeLocationFields (location, content) {
23023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (!location) {
23033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return;
23046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
23053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.position = location.position;
23063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var line = location.line;
23073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (!IS_UNDEFINED(line)) {
23083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.line = line;
23093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
23103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var column = location.column;
23113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (!IS_UNDEFINED(column)) {
23123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.column = column;
23133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
23143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
23153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
23183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Serialize property information to the following JSON format for building the
23193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * array of properties.
23203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
23213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *   {"name":"<property name>",
23223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    "attributes":<number>,
23233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    "propertyType":<number>,
23243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *    "ref":<number>}
23253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
23263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * If the attribute for the property is PropertyAttribute.None it is not added.
23273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * If the propertyType for the property is PropertyType.Normal it is not added.
23283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Here are a couple of examples.
23293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
23303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *   {"name":"hello","ref":1}
23313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *   {"name":"length","attributes":7,"propertyType":3,"ref":2}
23323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
23333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {PropertyMirror} propertyMirror The property to serialize.
23343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {Object} Protocol object representing the property.
23353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
23363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.serializeProperty_ = function(propertyMirror) {
23373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var result = {};
23386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
23393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  result.name = propertyMirror.name();
23403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var propertyValue = propertyMirror.value();
23413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (this.inlineRefs_() && propertyValue.isValue()) {
23423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result.value = this.serializeReferenceWithDisplayData_(propertyValue);
23433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
23443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (propertyMirror.attributes() != PropertyAttribute.None) {
23453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result.attributes = propertyMirror.attributes();
23463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
23473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (propertyMirror.propertyType() != PropertyType.Normal) {
23483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      result.propertyType = propertyMirror.propertyType();
23493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
23503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result.ref = propertyValue.handle();
23513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
23523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return result;
23533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
23543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
23563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.serializeFrame_ = function(mirror, content) {
23573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.index = mirror.index();
23583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.receiver = this.serializeReference(mirror.receiver());
23593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var func = mirror.func();
23603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.func = this.serializeReference(func);
23613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (func.script()) {
23623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.script = this.serializeReference(func.script());
23633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
23643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.constructCall = mirror.isConstructCall();
23657f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  content.atReturn = mirror.isAtReturn();
23667f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  if (mirror.isAtReturn()) {
23677f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    content.returnValue = this.serializeReference(mirror.returnValue());
23687f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  }
23693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.debuggerFrame = mirror.isDebuggerFrame();
23703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var x = new Array(mirror.argumentCount());
23713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < mirror.argumentCount(); i++) {
23723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var arg = {};
23733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    var argument_name = mirror.argumentName(i);
23743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (argument_name) {
23753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      arg.name = argument_name;
23763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
23773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    arg.value = this.serializeReference(mirror.argumentValue(i));
23783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    x[i] = arg;
23793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
23803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.arguments = x;
23813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var x = new Array(mirror.localCount());
23823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < mirror.localCount(); i++) {
23833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var local = {};
23843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    local.name = mirror.localName(i);
23853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    local.value = this.serializeReference(mirror.localValue(i));
23863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    x[i] = local;
23873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
23883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.locals = x;
23893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  serializeLocationFields(mirror.sourceLocation(), content);
23903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  var source_line_text = mirror.sourceLineText();
23913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (!IS_UNDEFINED(source_line_text)) {
23923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.sourceLineText = source_line_text;
23933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
23946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
23953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.scopes = [];
23963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (var i = 0; i < mirror.scopeCount(); i++) {
23973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    var scope = mirror.scope(i);
23983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    content.scopes.push({
23993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      type: scope.scopeType(),
24003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      index: i
24013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    });
24023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
24033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
24043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
24053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
24063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuJSONProtocolSerializer.prototype.serializeScope_ = function(mirror, content) {
24073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.index = mirror.scopeIndex();
24083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.frameIndex = mirror.frameIndex();
24093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.type = mirror.scopeType();
24103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  content.object = this.inlineRefs_() ?
24113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                   this.serializeValue(mirror.scopeObject()) :
24123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                   this.serializeReference(mirror.scopeObject());
24133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
24143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
24153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
24163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/**
24173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Convert a number to a protocol value. For all finite numbers the number
24183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * itself is returned. For non finite numbers NaN, Infinite and
24193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * -Infinite the string representation "NaN", "Infinite" or "-Infinite"
24203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * (not including the quotes) is returned.
24213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu *
24223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {number} value The number value to convert to a protocol value.
24233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @returns {number|string} Protocol value.
24243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */
24253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction NumberToJSON_(value) {
24263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (isNaN(value)) {
24273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return 'NaN';
24283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
24299fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  if (!NUMBER_IS_FINITE(value)) {
24303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (value > 0) {
24313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return 'Infinity';
24323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    } else {
24333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return '-Infinity';
24343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
24353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
24366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return value;
24373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
2438