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