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