15a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org// Copyright 2006-2012 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org// Handle id counters.
63291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgvar next_handle_ = 0;
7eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgvar next_transient_handle_ = -1;
8eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
9eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org// Mirror cache.
103291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgvar mirror_cache_ = [];
11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgvar mirror_cache_enabled_ = true;
12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
13196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
14196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgfunction ToggleMirrorCache(value) {
15196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  mirror_cache_enabled_ = value;
16196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  next_handle_ = 0;
17196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  mirror_cache_ = [];
183291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
193291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
203291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
21865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org// Wrapper to check whether an object is a Promise.  The call may not work
22865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org// if promises are not enabled.
23874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org// TODO(yangguo): remove try-catch once promises are enabled by default.
24865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgfunction ObjectIsPromise(value) {
25865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  try {
26874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org    return IS_SPEC_OBJECT(value) &&
27874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org           !IS_UNDEFINED(%DebugGetProperty(value, builtins.promiseStatus));
28865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  } catch (e) {
29865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    return false;
30865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  }
31865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
32865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
33865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
34aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com/**
35aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com * Returns the mirror for a specified value or object.
36aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com *
37aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com * @param {value or Object} value the value or object to retreive the mirror for
38eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * @param {boolean} transient indicate whether this object is transient and
39eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org *    should not be added to the mirror cache. The default is not transient.
40aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com * @returns {Mirror} the mirror reflects the passed value or object
41aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com */
42eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction MakeMirror(value, opt_transient) {
433291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  var mirror;
44eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
45eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // Look for non transient mirrors in the mirror cache.
46196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  if (!opt_transient && mirror_cache_enabled_) {
47eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    for (id in mirror_cache_) {
48eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      mirror = mirror_cache_[id];
49eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      if (mirror.value() === value) {
50eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        return mirror;
51eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      }
52eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      // Special check for NaN as NaN == NaN is false.
53eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      if (mirror.isNumber() && isNaN(mirror.value()) &&
54eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          typeof value == 'number' && isNaN(value)) {
55eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        return mirror;
56eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      }
57ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    }
583291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  }
5925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
603291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  if (IS_UNDEFINED(value)) {
613291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    mirror = new UndefinedMirror();
623291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  } else if (IS_NULL(value)) {
633291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    mirror = new NullMirror();
643291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  } else if (IS_BOOLEAN(value)) {
653291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    mirror = new BooleanMirror(value);
663291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  } else if (IS_NUMBER(value)) {
673291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    mirror = new NumberMirror(value);
683291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  } else if (IS_STRING(value)) {
693291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    mirror = new StringMirror(value);
7079d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org  } else if (IS_SYMBOL(value)) {
7179d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org    mirror = new SymbolMirror(value);
723291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  } else if (IS_ARRAY(value)) {
733291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    mirror = new ArrayMirror(value);
743291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  } else if (IS_DATE(value)) {
753291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    mirror = new DateMirror(value);
763291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  } else if (IS_FUNCTION(value)) {
773291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    mirror = new FunctionMirror(value);
783291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  } else if (IS_REGEXP(value)) {
793291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    mirror = new RegExpMirror(value);
803291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  } else if (IS_ERROR(value)) {
813291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    mirror = new ErrorMirror(value);
82245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  } else if (IS_SCRIPT(value)) {
83245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    mirror = new ScriptMirror(value);
849d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  } else if (IS_MAP(value) || IS_WEAKMAP(value)) {
859d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    mirror = new MapMirror(value);
867c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  } else if (IS_SET(value) || IS_WEAKSET(value)) {
877c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    mirror = new SetMirror(value);
88865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  } else if (ObjectIsPromise(value)) {
89865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    mirror = new PromiseMirror(value);
90a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  } else if (IS_GENERATOR(value)) {
91a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    mirror = new GeneratorMirror(value);
923291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  } else {
93eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    mirror = new ObjectMirror(value, OBJECT_TYPE, opt_transient);
943291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  }
953291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
96196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  if (mirror_cache_enabled_) mirror_cache_[mirror.handle()] = mirror;
973291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return mirror;
983291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
993291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
1003291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
1013291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org/**
102ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Returns the mirror for a specified mirror handle.
103ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org *
104ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @param {number} handle the handle to find the mirror for
105ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @returns {Mirror or undefiend} the mirror with the requested handle or
106ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org *     undefined if no mirror with the requested handle was found
107ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
108ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgfunction LookupMirror(handle) {
109196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  if (!mirror_cache_enabled_) throw new Error("Mirror cache is disabled");
110ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return mirror_cache_[handle];
111ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org}
112ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
11325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
114ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1153291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * Returns the mirror for the undefined value.
1163291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *
1173291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * @returns {Mirror} the mirror reflects the undefined value
1183291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org */
1193291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgfunction GetUndefinedMirror() {
120690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  return MakeMirror(UNDEFINED);
12143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
12243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Inherit the prototype methods from one constructor into another.
12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
12743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * The Function.prototype.inherits from lang.js rewritten as a standalone
12843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * function (not on Function.prototype). NOTE: If this file is to be loaded
12943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * during bootstrapping this function needs to be revritten using some native
13043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * functions as prototype setup using normal JavaScript does not work as
13143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * expected during bootstrapping (see mirror.js in r114903).
13243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
13343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {function} ctor Constructor function which needs to inherit the
13443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     prototype
13543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {function} superCtor Constructor function to inherit prototype from
13643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
13743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction inherits(ctor, superCtor) {
13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var tempCtor = function(){};
13943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  tempCtor.prototype = superCtor.prototype;
14043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ctor.super_ = superCtor.prototype;
14143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ctor.prototype = new tempCtor();
14243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ctor.prototype.constructor = ctor;
14343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
14443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Type names of the different mirrors.
147f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar UNDEFINED_TYPE = 'undefined';
148f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar NULL_TYPE = 'null';
149f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar BOOLEAN_TYPE = 'boolean';
150f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar NUMBER_TYPE = 'number';
151f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar STRING_TYPE = 'string';
15279d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.orgvar SYMBOL_TYPE = 'symbol';
153f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar OBJECT_TYPE = 'object';
154f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar FUNCTION_TYPE = 'function';
155f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar REGEXP_TYPE = 'regexp';
156f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar ERROR_TYPE = 'error';
157f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar PROPERTY_TYPE = 'property';
158de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgvar INTERNAL_PROPERTY_TYPE = 'internalProperty';
159f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar FRAME_TYPE = 'frame';
160f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar SCRIPT_TYPE = 'script';
161f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar CONTEXT_TYPE = 'context';
162f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar SCOPE_TYPE = 'scope';
163865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgvar PROMISE_TYPE = 'promise';
1649d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.orgvar MAP_TYPE = 'map';
1657c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.orgvar SET_TYPE = 'set';
166a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgvar GENERATOR_TYPE = 'generator';
16743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Maximum length when sending strings through the JSON protocol.
169f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kMaxProtocolStringLength = 80;
17043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Different kind of properties.
172f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar PropertyKind = {};
17343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPropertyKind.Named   = 1;
17443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPropertyKind.Indexed = 2;
17543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
177d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org// A copy of the PropertyType enum from property-details.h
178f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar PropertyType = {};
1797979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.orgPropertyType.Normal                  = 0;
1807979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.orgPropertyType.Field                   = 1;
181fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgPropertyType.Constant                = 2;
1827979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.orgPropertyType.Callbacks               = 3;
1839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
18443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Different attributes for a property.
186f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar PropertyAttribute = {};
18743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPropertyAttribute.None       = NONE;
18843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPropertyAttribute.ReadOnly   = READ_ONLY;
18943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPropertyAttribute.DontEnum   = DONT_ENUM;
19043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPropertyAttribute.DontDelete = DONT_DELETE;
19143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
193eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org// A copy of the scope types from runtime.cc.
194f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar ScopeType = { Global: 0,
195f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org                  Local: 1,
196f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org                  With: 2,
197f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org                  Closure: 3,
198f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org                  Catch: 4,
199f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org                  Block: 5 };
200eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
201eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
20243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Mirror hierarchy:
20343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//   - Mirror
20443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     - ValueMirror
20543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       - UndefinedMirror
20643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       - NullMirror
20743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       - NumberMirror
20843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       - StringMirror
20979d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org//       - SymbolMirror
21043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       - ObjectMirror
211aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com//         - FunctionMirror
212aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com//           - UnresolvedFunctionMirror
213aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com//         - ArrayMirror
214aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com//         - DateMirror
215aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com//         - RegExpMirror
216aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com//         - ErrorMirror
217865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org//         - PromiseMirror
2189d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org//         - MapMirror
2197c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org//         - SetMirror
220a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org//         - GeneratorMirror
22143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     - PropertyMirror
222de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org//     - InternalPropertyMirror
22343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     - FrameMirror
22443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     - ScriptMirror
22543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
22843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Base class for all mirror objects.
22943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {string} type The type of the mirror
23043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
23143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
23243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction Mirror(type) {
23343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.type_ = type;
2341b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
23543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenMirror.prototype.type = function() {
23843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.type_;
23943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
24043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
24143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
24243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
2433291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * Check whether the mirror reflects a value.
2443291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * @returns {boolean} True if the mirror reflects a value.
2453291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org */
2463291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgMirror.prototype.isValue = function() {
2473291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return this instanceof ValueMirror;
2481b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
2493291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
2503291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
2513291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org/**
25243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Check whether the mirror reflects the undefined value.
25343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @returns {boolean} True if the mirror reflects the undefined value.
25443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
25543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenMirror.prototype.isUndefined = function() {
25643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this instanceof UndefinedMirror;
2571b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
25843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
26043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
26143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Check whether the mirror reflects the null value.
26243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @returns {boolean} True if the mirror reflects the null value
26343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
26443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenMirror.prototype.isNull = function() {
26543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this instanceof NullMirror;
2661b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
26743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
26843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
26943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
27043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Check whether the mirror reflects a boolean value.
27143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @returns {boolean} True if the mirror reflects a boolean value
27243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
27343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenMirror.prototype.isBoolean = function() {
27443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this instanceof BooleanMirror;
2751b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
27643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
27743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
27843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
27943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Check whether the mirror reflects a number value.
28043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @returns {boolean} True if the mirror reflects a number value
28143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
28243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenMirror.prototype.isNumber = function() {
28343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this instanceof NumberMirror;
2841b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
28543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
28643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
28743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
28843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Check whether the mirror reflects a string value.
28943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @returns {boolean} True if the mirror reflects a string value
29043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
29143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenMirror.prototype.isString = function() {
29243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this instanceof StringMirror;
2931b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
29443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
29543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
29643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
29779d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org * Check whether the mirror reflects a symbol.
29879d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org * @returns {boolean} True if the mirror reflects a symbol
29979d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org */
30079d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.orgMirror.prototype.isSymbol = function() {
30179d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org  return this instanceof SymbolMirror;
30279d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org};
30379d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org
30479d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org
30579d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org/**
30643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Check whether the mirror reflects an object.
30743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @returns {boolean} True if the mirror reflects an object
30843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
30943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenMirror.prototype.isObject = function() {
31043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this instanceof ObjectMirror;
3111b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
31243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
31543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Check whether the mirror reflects a function.
31643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @returns {boolean} True if the mirror reflects a function
31743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
31843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenMirror.prototype.isFunction = function() {
31943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this instanceof FunctionMirror;
3201b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
32143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
32443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Check whether the mirror reflects an unresolved function.
32543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @returns {boolean} True if the mirror reflects an unresolved function
32643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
32743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenMirror.prototype.isUnresolvedFunction = function() {
32843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this instanceof UnresolvedFunctionMirror;
3291b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
33043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
33343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Check whether the mirror reflects an array.
33443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @returns {boolean} True if the mirror reflects an array
33543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
33643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenMirror.prototype.isArray = function() {
33743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this instanceof ArrayMirror;
3381b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
33943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
34243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Check whether the mirror reflects a date.
34343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @returns {boolean} True if the mirror reflects a date
34443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
34543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenMirror.prototype.isDate = function() {
34643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this instanceof DateMirror;
3471b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
34843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
35143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Check whether the mirror reflects a regular expression.
35243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @returns {boolean} True if the mirror reflects a regular expression
35343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
35443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenMirror.prototype.isRegExp = function() {
35543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this instanceof RegExpMirror;
3561b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
35743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
36043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Check whether the mirror reflects an error.
36143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @returns {boolean} True if the mirror reflects an error
36243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
36343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenMirror.prototype.isError = function() {
36443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this instanceof ErrorMirror;
3651b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
36643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
369865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org * Check whether the mirror reflects a promise.
370865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org * @returns {boolean} True if the mirror reflects a promise
371865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org */
372865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgMirror.prototype.isPromise = function() {
373865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  return this instanceof PromiseMirror;
374865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org};
375865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
376865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
377865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org/**
378a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org * Check whether the mirror reflects a generator object.
379a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org * @returns {boolean} True if the mirror reflects a generator object
380a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org */
381a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgMirror.prototype.isGenerator = function() {
382a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  return this instanceof GeneratorMirror;
383a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org};
384a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
385a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
386a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org/**
38743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Check whether the mirror reflects a property.
38843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @returns {boolean} True if the mirror reflects a property
38943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
39043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenMirror.prototype.isProperty = function() {
39143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this instanceof PropertyMirror;
3921b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
39343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
39443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
39543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
396de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * Check whether the mirror reflects an internal property.
397de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * @returns {boolean} True if the mirror reflects an internal property
398de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org */
399de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgMirror.prototype.isInternalProperty = function() {
400de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  return this instanceof InternalPropertyMirror;
401de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org};
402de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
403de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
404de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org/**
40543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Check whether the mirror reflects a stack frame.
40643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @returns {boolean} True if the mirror reflects a stack frame
40743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
40843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenMirror.prototype.isFrame = function() {
40943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this instanceof FrameMirror;
4101b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
41143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
41243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
413aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com/**
414aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com * Check whether the mirror reflects a script.
415aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com * @returns {boolean} True if the mirror reflects a script
416aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com */
417aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.comMirror.prototype.isScript = function() {
418aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  return this instanceof ScriptMirror;
4191b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
42043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
422ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
4239085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org * Check whether the mirror reflects a context.
4249085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org * @returns {boolean} True if the mirror reflects a context
4259085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org */
4269085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgMirror.prototype.isContext = function() {
4279085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  return this instanceof ContextMirror;
4281b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
4299085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
4309085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
4319085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org/**
432eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * Check whether the mirror reflects a scope.
433eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * @returns {boolean} True if the mirror reflects a scope
434eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org */
435eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgMirror.prototype.isScope = function() {
436eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  return this instanceof ScopeMirror;
4371b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
438eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
439eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
440eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org/**
4419d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org * Check whether the mirror reflects a map.
4429d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org * @returns {boolean} True if the mirror reflects a map
4439d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org */
4449d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.orgMirror.prototype.isMap = function() {
4459d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  return this instanceof MapMirror;
4469d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org};
4479d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
4489d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
4499d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org/**
4507c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org * Check whether the mirror reflects a set.
4517c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org * @returns {boolean} True if the mirror reflects a set
4527c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org */
4537c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.orgMirror.prototype.isSet = function() {
4547c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  return this instanceof SetMirror;
4557c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org};
4567c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
4577c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
4587c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org/**
459ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Allocate a handle id for this object.
460ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
461ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgMirror.prototype.allocateHandle_ = function() {
462196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  if (mirror_cache_enabled_) this.handle_ = next_handle_++;
4631b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
464ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
465ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
466eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org/**
467eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * Allocate a transient handle id for this object. Transient handles are
468eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * negative.
469eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org */
470eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgMirror.prototype.allocateTransientHandle_ = function() {
471eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  this.handle_ = next_transient_handle_--;
4721b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
473eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
474eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
47543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenMirror.prototype.toText = function() {
47643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Simpel to text which is used when on specialization in subclass.
4777a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  return "#<" + this.constructor.name + ">";
4781b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
47943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
48243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Base class for all value mirror objects.
48343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {string} type The type of the mirror
48443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {value} value The value reflected by this mirror
485eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * @param {boolean} transient indicate whether this object is transient with a
486eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org *    transient handle
48743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
48843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @extends Mirror
48943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
490eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction ValueMirror(type, value, transient) {
4917a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  %_CallFunction(this, type, Mirror);
49243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.value_ = value;
493eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  if (!transient) {
494eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    this.allocateHandle_();
495eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  } else {
496eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    this.allocateTransientHandle_();
497eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
49841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
49943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hanseninherits(ValueMirror, Mirror);
50043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
50143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5023291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgMirror.prototype.handle = function() {
5033291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return this.handle_;
5043291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org};
5053291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
5063291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
50743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
50843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Check whether this is a primitive value.
50943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {boolean} True if the mirror reflects a primitive value
51043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
51143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenValueMirror.prototype.isPrimitive = function() {
51243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var type = this.type();
51343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return type === 'undefined' ||
51443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         type === 'null' ||
51543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         type === 'boolean' ||
51643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         type === 'number' ||
51779d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org         type === 'string' ||
51879d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org         type === 'symbol';
51943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
52043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
52143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5223291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org/**
52343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Get the actual value reflected by this mirror.
52443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {value} The value reflected by this mirror
52543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
52643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenValueMirror.prototype.value = function() {
52743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.value_;
52843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
52943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
53043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
53143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
53243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Mirror object for Undefined.
53343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
53443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @extends ValueMirror
53543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
53643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction UndefinedMirror() {
537690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  %_CallFunction(this, UNDEFINED_TYPE, UNDEFINED, ValueMirror);
53841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
53943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hanseninherits(UndefinedMirror, ValueMirror);
54043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenUndefinedMirror.prototype.toText = function() {
54343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return 'undefined';
5441b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
54543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
54843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Mirror object for null.
54943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
55043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @extends ValueMirror
55143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
55243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction NullMirror() {
5537a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  %_CallFunction(this, NULL_TYPE, null, ValueMirror);
55441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
55543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hanseninherits(NullMirror, ValueMirror);
55643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
55743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
55843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenNullMirror.prototype.toText = function() {
55943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return 'null';
5601b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
56143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
56243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
56343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
56443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Mirror object for boolean values.
56543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {boolean} value The boolean value reflected by this mirror
56643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
56743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @extends ValueMirror
56843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
56943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction BooleanMirror(value) {
5707a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  %_CallFunction(this, BOOLEAN_TYPE, value, ValueMirror);
57141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
57243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hanseninherits(BooleanMirror, ValueMirror);
57343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
57443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
57543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBooleanMirror.prototype.toText = function() {
57643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.value_ ? 'true' : 'false';
5771b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
57843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
57943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
58043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
58143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Mirror object for number values.
58243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} value The number value reflected by this mirror
58343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
58443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @extends ValueMirror
58543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
58643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction NumberMirror(value) {
5877a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  %_CallFunction(this, NUMBER_TYPE, value, ValueMirror);
58841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
58943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hanseninherits(NumberMirror, ValueMirror);
59043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
59143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
59243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenNumberMirror.prototype.toText = function() {
5939b95fd75bfb24acf6b51a360058331013e74fc73machenbach@chromium.org  return %_NumberToString(this.value_);
5941b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
59543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
59643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
59743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
59843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Mirror object for string values.
59943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {string} value The string value reflected by this mirror
60043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
60143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @extends ValueMirror
60243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
60343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction StringMirror(value) {
6047a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  %_CallFunction(this, STRING_TYPE, value, ValueMirror);
60541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
60643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hanseninherits(StringMirror, ValueMirror);
60743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
60843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
60943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenStringMirror.prototype.length = function() {
61043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.value_.length;
61143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
61243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
613b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.orgStringMirror.prototype.getTruncatedValue = function(maxLength) {
614b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org  if (maxLength != -1 && this.length() > maxLength) {
615b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org    return this.value_.substring(0, maxLength) +
61643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           '... (length: ' + this.length() + ')';
61743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
618b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org  return this.value_;
6191b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
620b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org
621b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.orgStringMirror.prototype.toText = function() {
622b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org  return this.getTruncatedValue(kMaxProtocolStringLength);
6231b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
62443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
62543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
62643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
62779d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org * Mirror object for a Symbol
62879d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org * @param {Object} value The Symbol
62979d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org * @constructor
63079d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org * @extends Mirror
63179d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org */
63279d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.orgfunction SymbolMirror(value) {
63379d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org  %_CallFunction(this, SYMBOL_TYPE, value, ValueMirror);
63479d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org}
63579d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.orginherits(SymbolMirror, ValueMirror);
63679d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org
63779d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org
63879d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.orgSymbolMirror.prototype.description = function() {
63979d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org  return %SymbolDescription(%_ValueOf(this.value_));
64079d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org}
64179d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org
64279d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org
64379d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.orgSymbolMirror.prototype.toText = function() {
64479d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org  return %_CallFunction(this.value_, builtins.SymbolToString);
64579d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org}
64679d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org
64779d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org
64879d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org/**
64943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Mirror object for objects.
65043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {object} value The object reflected by this mirror
651eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * @param {boolean} transient indicate whether this object is transient with a
652eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org *    transient handle
65343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
65443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @extends ValueMirror
65543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
656eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction ObjectMirror(value, type, transient) {
6577a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  %_CallFunction(this, type || OBJECT_TYPE, value, transient, ValueMirror);
65841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
65943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hanseninherits(ObjectMirror, ValueMirror);
66043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
66143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
66243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObjectMirror.prototype.className = function() {
6632abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  return %_ClassOf(this.value_);
66443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
66543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
66643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
66743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObjectMirror.prototype.constructorFunction = function() {
66843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeMirror(%DebugGetProperty(this.value_, 'constructor'));
66943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
67043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
67143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
67243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObjectMirror.prototype.prototypeObject = function() {
67343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeMirror(%DebugGetProperty(this.value_, 'prototype'));
67443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
67543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
67643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
67743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObjectMirror.prototype.protoObject = function() {
678ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return MakeMirror(%DebugGetPrototype(this.value_));
67943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
68043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
68143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
68243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObjectMirror.prototype.hasNamedInterceptor = function() {
68343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Get information on interceptors for this object.
684b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  var x = %GetInterceptorInfo(this.value_);
68543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return (x & 2) != 0;
68643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
68743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
68843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
68943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObjectMirror.prototype.hasIndexedInterceptor = function() {
69043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Get information on interceptors for this object.
691b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  var x = %GetInterceptorInfo(this.value_);
69243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return (x & 1) != 0;
69343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
69443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
69543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
696d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org// Get all own property names except for private symbols.
697d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.orgfunction TryGetPropertyNames(object) {
698d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org  try {
699d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org    // TODO(yangguo): Should there be a special debugger implementation of
700d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org    // %GetOwnPropertyNames that doesn't perform access checks?
701d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org    return %GetOwnPropertyNames(object, PROPERTY_ATTRIBUTES_PRIVATE_SYMBOL);
702d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org  } catch (e) {
703d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org    // Might have hit a failed access check.
704d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org    return [];
705d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org  }
706d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org}
707d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org
708d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org
70943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
71043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Return the property names for this object.
71143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} kind Indicate whether named, indexed or both kinds of
71243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     properties are requested
71343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} limit Limit the number of names returend to the specified
71443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen       value
71543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {Array} Property names for this object
71643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
71743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObjectMirror.prototype.propertyNames = function(kind, limit) {
71843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Find kind and limit and allocate array for the result
71943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  kind = kind || PropertyKind.Named | PropertyKind.Indexed;
72043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
72143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var propertyNames;
72243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var elementNames;
72343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var total = 0;
72425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
7253291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  // Find all the named properties.
72643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (kind & PropertyKind.Named) {
727d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org    propertyNames = TryGetPropertyNames(this.value_);
72843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    total += propertyNames.length;
7293291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
7303291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    // Get names for named interceptor properties if any.
7313291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    if (this.hasNamedInterceptor() && (kind & PropertyKind.Named)) {
7323291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org      var namedInterceptorNames =
733b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org          %GetNamedInterceptorPropertyNames(this.value_);
7343291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org      if (namedInterceptorNames) {
7353291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org        propertyNames = propertyNames.concat(namedInterceptorNames);
7363291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org        total += namedInterceptorNames.length;
7373291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org      }
7383291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    }
73943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
7403291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
7413291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  // Find all the indexed properties.
74243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (kind & PropertyKind.Indexed) {
743fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org    // Get own element names.
744fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org    elementNames = %GetOwnElementNames(this.value_);
74543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    total += elementNames.length;
7463291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
7473291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    // Get names for indexed interceptor properties.
7483291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    if (this.hasIndexedInterceptor() && (kind & PropertyKind.Indexed)) {
7493291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org      var indexedInterceptorNames =
750b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org          %GetIndexedInterceptorElementNames(this.value_);
7513291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org      if (indexedInterceptorNames) {
7523291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org        elementNames = elementNames.concat(indexedInterceptorNames);
7533291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org        total += indexedInterceptorNames.length;
7543291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org      }
7553291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    }
75643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
75743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  limit = Math.min(limit || total, total);
75843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
75943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var names = new Array(limit);
76043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var index = 0;
76141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
76243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Copy names for named properties.
76343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (kind & PropertyKind.Named) {
76443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    for (var i = 0; index < limit && i < propertyNames.length; i++) {
76543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      names[index++] = propertyNames[i];
76643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
76743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
76841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
76943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Copy names for indexed properties.
77043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (kind & PropertyKind.Indexed) {
77143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    for (var i = 0; index < limit && i < elementNames.length; i++) {
77243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      names[index++] = elementNames[i];
77343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
77443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
77543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
77643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return names;
77743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
77843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
77943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
78043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
78143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Return the properties for this object as an array of PropertyMirror objects.
78243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} kind Indicate whether named, indexed or both kinds of
78343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     properties are requested
784de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * @param {number} limit Limit the number of properties returned to the
78543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen       specified value
78643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {Array} Property mirrors for this object
78743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
78843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObjectMirror.prototype.properties = function(kind, limit) {
78943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var names = this.propertyNames(kind, limit);
79043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var properties = new Array(names.length);
79143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < names.length; i++) {
79243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    properties[i] = this.property(names[i]);
79343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
79443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
79543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return properties;
79643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
79743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
79843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
799de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org/**
800de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * Return the internal properties for this object as an array of
801de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * InternalPropertyMirror objects.
802de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * @return {Array} Property mirrors for this object
803de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org */
804de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgObjectMirror.prototype.internalProperties = function() {
805de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  return ObjectMirror.GetInternalProperties(this.value_);
806de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org}
807de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
808de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
80943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObjectMirror.prototype.property = function(name) {
8108640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org  var details = %DebugGetPropertyDetails(this.value_, %ToName(name));
81143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (details) {
8123291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    return new PropertyMirror(this, name, details);
81343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
81443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
81543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Nothing found.
8163291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return GetUndefinedMirror();
81743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
81843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
81943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
82043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
82143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
82243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Try to find a property from its value.
82343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {Mirror} value The property value to look for
82443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {PropertyMirror} The property with the specified value. If no
82543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     property was found with the specified value UndefinedMirror is returned
82643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
82743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObjectMirror.prototype.lookupProperty = function(value) {
82843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var properties = this.properties();
82943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
83043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Look for property value in properties.
83143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < properties.length; i++) {
83243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
83343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Skip properties which are defined through assessors.
83443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var property = properties[i];
83543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (property.propertyType() != PropertyType.Callbacks) {
8369258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org      if (%_ObjectEquals(property.value_, value.value_)) {
83743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        return property;
83843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
83943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
84043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
84143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
84243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Nothing found.
8433291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return GetUndefinedMirror();
84443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
84543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
84643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
84743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
84843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns objects which has direct references to this object
849245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org * @param {number} opt_max_objects Optional parameter specifying the maximum
850245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org *     number of referencing objects to return.
85143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {Array} The objects which has direct references to this object.
85243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
853245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgObjectMirror.prototype.referencedBy = function(opt_max_objects) {
854245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Find all objects with direct references to this object.
855245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  var result = %DebugReferencedBy(this.value_,
856245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org                                  Mirror.prototype, opt_max_objects || 0);
8579258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
858245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Make mirrors for all the references found.
85943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < result.length; i++) {
86043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    result[i] = MakeMirror(result[i]);
86143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
8629258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
86343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return result;
86443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
86543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
86643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
86743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObjectMirror.prototype.toText = function() {
86843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var name;
86943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var ctor = this.constructorFunction();
8709d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  if (!ctor.isFunction()) {
87143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    name = this.className();
87243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
87343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    name = ctor.name();
87443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (!name) {
87543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      name = this.className();
87643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
87743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
8787a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  return '#<' + name + '>';
87943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
88043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
883de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * Return the internal properties of the value, such as [[PrimitiveValue]] of
884874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org * scalar wrapper objects, properties of the bound function and properties of
885874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org * the promise.
886de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * This method is done static to be accessible from Debug API with the bare
887de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * values without mirrors.
888de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * @return {Array} array (possibly empty) of InternalProperty instances
889de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org */
890de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgObjectMirror.GetInternalProperties = function(value) {
891de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  if (IS_STRING_WRAPPER(value) || IS_NUMBER_WRAPPER(value) ||
892de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org      IS_BOOLEAN_WRAPPER(value)) {
893de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    var primitiveValue = %_ValueOf(value);
894de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    return [new InternalPropertyMirror("[[PrimitiveValue]]", primitiveValue)];
895de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  } else if (IS_FUNCTION(value)) {
896de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    var bindings = %BoundFunctionGetBindings(value);
897de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    var result = [];
898de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    if (bindings && IS_ARRAY(bindings)) {
899de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org      result.push(new InternalPropertyMirror("[[TargetFunction]]",
900de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org                                             bindings[0]));
901de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org      result.push(new InternalPropertyMirror("[[BoundThis]]", bindings[1]));
902de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org      var boundArgs = [];
903de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org      for (var i = 2; i < bindings.length; i++) {
904de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org        boundArgs.push(bindings[i]);
905de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org      }
906de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org      result.push(new InternalPropertyMirror("[[BoundArgs]]", boundArgs));
907de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    }
908de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    return result;
909874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org  } else if (ObjectIsPromise(value)) {
910874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org    var result = [];
911874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org    result.push(new InternalPropertyMirror("[[PromiseStatus]]",
912874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org                                           PromiseGetStatus_(value)));
913874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org    result.push(new InternalPropertyMirror("[[PromiseValue]]",
914874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org                                           PromiseGetValue_(value)));
915874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org    return result;
916de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  }
917de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  return [];
918de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org}
919de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
920de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
921de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org/**
92243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Mirror object for functions.
92343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {function} value The function object reflected by this mirror.
92443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
92543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @extends ObjectMirror
92643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
92743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction FunctionMirror(value) {
9287a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  %_CallFunction(this, value, FUNCTION_TYPE, ObjectMirror);
92943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.resolved_ = true;
93041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
93143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hanseninherits(FunctionMirror, ObjectMirror);
93243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
93343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
93443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
93543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns whether the function is resolved.
93643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {boolean} True if the function is resolved. Unresolved functions can
93743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     only originate as functions from stack frames
93843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
93943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFunctionMirror.prototype.resolved = function() {
94043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.resolved_;
94143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
94243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
94543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns the name of the function.
94643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {string} Name of the function
94743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
94843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFunctionMirror.prototype.name = function() {
94943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return %FunctionGetName(this.value_);
95043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
95143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
95243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
95343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
9549085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org * Returns the inferred name of the function.
9559085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org * @return {string} Name of the function
9569085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org */
9579085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgFunctionMirror.prototype.inferredName = function() {
9589085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  return %FunctionGetInferredName(this.value_);
9599085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org};
9609085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
9619085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
9629085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org/**
96343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns the source code for the function.
96443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {string or undefined} The source code for the function. If the
96543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     function is not resolved undefined will be returned.
96643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
96743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFunctionMirror.prototype.source = function() {
96843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Return source if function is resolved. Otherwise just fall through to
96943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // return undefined.
97043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.resolved()) {
97143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return builtins.FunctionSourceString(this.value_);
97243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
97343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
97443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
97543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
97643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
97743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns the script object for the function.
97843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {ScriptMirror or undefined} Script object for the function or
97943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     undefined if the function has no script
98043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
98143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFunctionMirror.prototype.script = function() {
98243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Return script if function is resolved. Otherwise just fall through
98343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // to return undefined.
98443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.resolved()) {
985ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    if (this.script_) {
986ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      return this.script_;
987ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    }
98843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var script = %FunctionGetScript(this.value_);
98943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (script) {
990ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      return this.script_ = MakeMirror(script);
99143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
99243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
99343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
99443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
99543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
99643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
997c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org * Returns the script source position for the function. Only makes sense
998c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org * for functions which has a script defined.
999c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org * @return {Number or undefined} in-script position for the function
1000c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org */
1001c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgFunctionMirror.prototype.sourcePosition_ = function() {
1002a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  // Return position if function is resolved. Otherwise just fall
1003a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  // through to return undefined.
1004c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  if (this.resolved()) {
1005c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    return %FunctionGetScriptSourcePosition(this.value_);
1006c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  }
1007c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org};
1008c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
1009c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
1010c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org/**
1011c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org * Returns the script source location object for the function. Only makes sense
1012c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org * for functions which has a script defined.
1013c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org * @return {Location or undefined} in-script location for the function begin
1014c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org */
1015c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgFunctionMirror.prototype.sourceLocation = function() {
1016ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  if (this.resolved()) {
1017ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    var script = this.script();
1018ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    if (script) {
1019ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      return script.locationFromPosition(this.sourcePosition_(), true);
1020ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    }
1021c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  }
1022c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org};
1023c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
1024c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
1025c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org/**
102643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns objects constructed by this function.
102743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_max_instances Optional parameter specifying the maximum
102843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     number of instances to return.
102943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {Array or undefined} The objects constructed by this function.
103043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
103143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFunctionMirror.prototype.constructedBy = function(opt_max_instances) {
103243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.resolved()) {
103343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Find all objects constructed from this function.
103443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var result = %DebugConstructedBy(this.value_, opt_max_instances || 0);
103541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
103643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Make mirrors for all the instances found.
103743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    for (var i = 0; i < result.length; i++) {
103843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      result[i] = MakeMirror(result[i]);
103943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
104041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
104143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return result;
104243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
104343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return [];
104443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
104543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
104643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
104743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10481044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgFunctionMirror.prototype.scopeCount = function() {
10491044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  if (this.resolved()) {
1050ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    if (IS_UNDEFINED(this.scopeCount_)) {
1051ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      this.scopeCount_ = %GetFunctionScopeCount(this.value());
1052ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    }
1053ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    return this.scopeCount_;
10541044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  } else {
10551044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    return 0;
10561044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  }
10571044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org};
10581044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org
10591044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org
10601044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgFunctionMirror.prototype.scope = function(index) {
10611044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  if (this.resolved()) {
1062690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org    return new ScopeMirror(UNDEFINED, this, index);
10631044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  }
10641044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org};
10651044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org
10661044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org
106743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFunctionMirror.prototype.toText = function() {
106843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.source();
10691b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
107043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
107143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
107243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
107343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Mirror object for unresolved functions.
107443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {string} value The name for the unresolved function reflected by this
107543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     mirror.
107643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
107743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @extends ObjectMirror
107843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
107943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction UnresolvedFunctionMirror(value) {
108043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Construct this using the ValueMirror as an unresolved function is not a
108143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // real object but just a string.
10827a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  %_CallFunction(this, FUNCTION_TYPE, value, ValueMirror);
108343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.propertyCount_ = 0;
108443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.elementCount_ = 0;
108543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.resolved_ = false;
108641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
108743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hanseninherits(UnresolvedFunctionMirror, FunctionMirror);
108843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
108943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
109043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenUnresolvedFunctionMirror.prototype.className = function() {
109143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return 'Function';
109243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
109343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
109443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
109543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenUnresolvedFunctionMirror.prototype.constructorFunction = function() {
10963291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return GetUndefinedMirror();
109743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
109843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
109943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
110043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenUnresolvedFunctionMirror.prototype.prototypeObject = function() {
11013291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return GetUndefinedMirror();
110243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
110343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
110443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
110543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenUnresolvedFunctionMirror.prototype.protoObject = function() {
11063291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return GetUndefinedMirror();
110743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
110843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
110943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
111043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenUnresolvedFunctionMirror.prototype.name = function() {
111143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.value_;
111243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
111343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
111443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11159085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgUnresolvedFunctionMirror.prototype.inferredName = function() {
11169085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  return undefined;
11179085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org};
11189085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
11199085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
112043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenUnresolvedFunctionMirror.prototype.propertyNames = function(kind, limit) {
112143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return [];
11221b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
112343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
112443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
112543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
112643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Mirror object for arrays.
112743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {Array} value The Array object reflected by this mirror
112843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
112943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @extends ObjectMirror
113043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
113143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction ArrayMirror(value) {
11327a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  %_CallFunction(this, value, ObjectMirror);
113341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
113443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hanseninherits(ArrayMirror, ObjectMirror);
113543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
113643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
113743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenArrayMirror.prototype.length = function() {
113843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.value_.length;
113943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
114043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
114143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11421b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgArrayMirror.prototype.indexedPropertiesFromRange = function(opt_from_index,
11431b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                                                            opt_to_index) {
114443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var from_index = opt_from_index || 0;
114543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var to_index = opt_to_index || this.length() - 1;
114643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (from_index > to_index) return new Array();
114743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var values = new Array(to_index - from_index + 1);
114843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = from_index; i <= to_index; i++) {
11495a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    var details = %DebugGetPropertyDetails(this.value_, %ToString(i));
115043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var value;
115143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (details) {
11523291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org      value = new PropertyMirror(this, i, details);
115343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
11543291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org      value = GetUndefinedMirror();
115543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
115643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    values[i - from_index] = value;
115743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
115843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return values;
11591b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
116043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
116143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
116243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
116343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Mirror object for dates.
116443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {Date} value The Date object reflected by this mirror
116543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
116643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @extends ObjectMirror
116743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
116843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction DateMirror(value) {
11697a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  %_CallFunction(this, value, ObjectMirror);
117041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
117143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hanseninherits(DateMirror, ObjectMirror);
117243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
117343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
117443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDateMirror.prototype.toText = function() {
1175b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  var s = JSON.stringify(this.value_);
1176b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  return s.substring(1, s.length - 1);  // cut quotes
11771b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
117843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
117943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
118043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
118143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Mirror object for regular expressions.
118243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {RegExp} value The RegExp object reflected by this mirror
118343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
118443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @extends ObjectMirror
118543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
118643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction RegExpMirror(value) {
11877a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  %_CallFunction(this, value, REGEXP_TYPE, ObjectMirror);
118841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
118943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hanseninherits(RegExpMirror, ObjectMirror);
119043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
119143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
119243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
119343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns the source to the regular expression.
119443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {string or undefined} The source to the regular expression
119543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
119643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenRegExpMirror.prototype.source = function() {
119743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.value_.source;
119843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
119943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
120043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
120143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
120243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns whether this regular expression has the global (g) flag set.
120343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {boolean} Value of the global flag
120443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
120543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenRegExpMirror.prototype.global = function() {
120643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.value_.global;
120743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
120843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
120943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
121043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
121143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns whether this regular expression has the ignore case (i) flag set.
121243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {boolean} Value of the ignore case flag
121343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
121443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenRegExpMirror.prototype.ignoreCase = function() {
121543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.value_.ignoreCase;
121643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
121743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
121843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
121943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
122043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns whether this regular expression has the multiline (m) flag set.
122143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {boolean} Value of the multiline flag
122243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
122343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenRegExpMirror.prototype.multiline = function() {
122443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.value_.multiline;
122543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
122643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
122743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
122843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenRegExpMirror.prototype.toText = function() {
122943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Simpel to text which is used when on specialization in subclass.
123043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return "/" + this.source() + "/";
12311b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
123243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
123343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
123443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
123543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Mirror object for error objects.
123643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {Error} value The error object reflected by this mirror
123743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
123843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @extends ObjectMirror
123943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
124043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction ErrorMirror(value) {
12417a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  %_CallFunction(this, value, ERROR_TYPE, ObjectMirror);
124241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
124343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hanseninherits(ErrorMirror, ObjectMirror);
124443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
124543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
124643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
124743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns the message for this eror object.
124843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {string or undefined} The message for this eror object
124943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
125043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenErrorMirror.prototype.message = function() {
125143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.value_.message;
125243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
125343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
125443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
125543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenErrorMirror.prototype.toText = function() {
125643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Use the same text representation as in messages.js.
125743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var text;
125843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  try {
1259394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    str = %_CallFunction(this.value_, builtins.ErrorToString);
126043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } catch (e) {
126131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org    str = '#<Error>';
126243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
126343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return str;
12641b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
126543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
126643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
126743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
1268865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org * Mirror object for a Promise object.
126979d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org * @param {Object} value The Promise object
1270865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org * @constructor
127179d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org * @extends ObjectMirror
1272865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org */
1273865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgfunction PromiseMirror(value) {
1274865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  %_CallFunction(this, value, PROMISE_TYPE, ObjectMirror);
1275865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
1276865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orginherits(PromiseMirror, ObjectMirror);
1277865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
1278865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
1279874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.orgfunction PromiseGetStatus_(value) {
1280874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org  var status = %DebugGetProperty(value, builtins.promiseStatus);
1281865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  if (status == 0) return "pending";
1282865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  if (status == 1) return "resolved";
1283865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  return "rejected";
1284874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org}
1285874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org
1286874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org
1287874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.orgfunction PromiseGetValue_(value) {
1288874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org  return %DebugGetProperty(value, builtins.promiseValue);
1289874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org}
1290874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org
1291874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org
1292874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.orgPromiseMirror.prototype.status = function() {
1293874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org  return PromiseGetStatus_(this.value_);
1294865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org};
1295865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
1296865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
1297a70700b91bc28abeed6373b856017f7f9cc8273bmachenbach@chromium.orgPromiseMirror.prototype.promiseValue = function() {
1298874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org  return MakeMirror(PromiseGetValue_(this.value_));
1299a70700b91bc28abeed6373b856017f7f9cc8273bmachenbach@chromium.org};
1300a70700b91bc28abeed6373b856017f7f9cc8273bmachenbach@chromium.org
1301a70700b91bc28abeed6373b856017f7f9cc8273bmachenbach@chromium.org
13029d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.orgfunction MapMirror(value) {
13039d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  %_CallFunction(this, value, MAP_TYPE, ObjectMirror);
13049d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org}
13059d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.orginherits(MapMirror, ObjectMirror);
13069d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
13079d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
13089d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org/**
13099d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org * Returns an array of key/value pairs of a map.
13109d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org * This will keep keys alive for WeakMaps.
13119d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org *
13129d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org * @returns {Array.<Object>} Array of key/value pairs of a map.
13139d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org */
13149d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.orgMapMirror.prototype.entries = function() {
13159d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  var result = [];
13169d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
13179d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  if (IS_WEAKMAP(this.value_)) {
13189d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    var entries = %GetWeakMapEntries(this.value_);
13199d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    for (var i = 0; i < entries.length; i += 2) {
13209d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      result.push({
13219d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org        key: entries[i],
13229d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org        value: entries[i + 1]
13239d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      });
13249d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    }
13259d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    return result;
13269d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
13279d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
13289d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  var iter = %_CallFunction(this.value_, builtins.MapEntries);
13299d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  var next;
13309d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  while (!(next = iter.next()).done) {
13319d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    result.push({
13329d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      key: next.value[0],
13339d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      value: next.value[1]
13349d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    });
13359d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
13369d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  return result;
13379d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org};
13389d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
13399d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
13407c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.orgfunction SetMirror(value) {
13417c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  %_CallFunction(this, value, SET_TYPE, ObjectMirror);
13427c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org}
13437c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.orginherits(SetMirror, ObjectMirror);
13447c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
13457c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
13467c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org/**
13477c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org * Returns an array of elements of a set.
13487c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org * This will keep elements alive for WeakSets.
13497c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org *
13507c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org * @returns {Array.<Object>} Array of elements of a set.
13517c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org */
13527c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.orgSetMirror.prototype.values = function() {
13537c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  if (IS_WEAKSET(this.value_)) {
13547c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    return %GetWeakSetValues(this.value_);
13557c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  }
13567c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
13577c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  var result = [];
13587c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  var iter = %_CallFunction(this.value_, builtins.SetValues);
13597c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  var next;
13607c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  while (!(next = iter.next()).done) {
13617c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    result.push(next.value);
13627c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  }
13637c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  return result;
13647c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org};
13657c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
13667c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
1367865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org/**
1368a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org * Mirror object for a Generator object.
1369a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org * @param {Object} data The Generator object
1370a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org * @constructor
1371a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org * @extends Mirror
1372a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org */
1373a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgfunction GeneratorMirror(value) {
1374a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  %_CallFunction(this, value, GENERATOR_TYPE, ObjectMirror);
1375a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org}
1376a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orginherits(GeneratorMirror, ObjectMirror);
1377a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
1378a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
1379a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgGeneratorMirror.prototype.status = function() {
1380a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  var continuation = %GeneratorGetContinuation(this.value_);
1381a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  if (continuation < 0) return "running";
1382a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  if (continuation == 0) return "closed";
1383a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  return "suspended";
1384a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org};
1385a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
1386a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
1387a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgGeneratorMirror.prototype.sourcePosition_ = function() {
1388a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  return %GeneratorGetSourcePosition(this.value_);
1389a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org};
1390a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
1391a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
1392a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgGeneratorMirror.prototype.sourceLocation = function() {
1393a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  var pos = this.sourcePosition_();
1394a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  if (!IS_UNDEFINED(pos)) {
1395a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    var script = this.func().script();
1396a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    if (script) {
1397a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      return script.locationFromPosition(pos, true);
1398a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    }
1399a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  }
1400a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org};
1401a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
1402a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
1403a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgGeneratorMirror.prototype.func = function() {
1404a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  if (!this.func_) {
1405a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    this.func_ = MakeMirror(%GeneratorGetFunction(this.value_));
1406a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  }
1407a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  return this.func_;
1408a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org};
1409a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
1410a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
1411a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgGeneratorMirror.prototype.context = function() {
1412a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  if (!this.context_) {
1413a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    this.context_ = new ContextMirror(%GeneratorGetContext(this.value_));
1414a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  }
1415a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  return this.context_;
1416a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org};
1417a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
1418a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
1419a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgGeneratorMirror.prototype.receiver = function() {
1420a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  if (!this.receiver_) {
1421a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    this.receiver_ = MakeMirror(%GeneratorGetReceiver(this.value_));
1422a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  }
1423a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  return this.receiver_;
1424a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org};
1425a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
1426a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
1427a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org/**
142843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Base mirror object for properties.
142943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {ObjectMirror} mirror The mirror object having this property
143043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {string} name The name of the property
14313291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * @param {Array} details Details about the property
143243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
143343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @extends Mirror
143443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
14353291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgfunction PropertyMirror(mirror, name, details) {
14367a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  %_CallFunction(this, PROPERTY_TYPE, Mirror);
143743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.mirror_ = mirror;
143843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.name_ = name;
14393291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  this.value_ = details[0];
14403291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  this.details_ = details[1];
1441fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  this.is_interceptor_ = details[2];
1442fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  if (details.length > 3) {
1443fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    this.exception_ = details[3];
1444fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    this.getter_ = details[4];
1445fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    this.setter_ = details[5];
14463291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  }
144741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
144843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hanseninherits(PropertyMirror, Mirror);
144943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
145043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
145143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPropertyMirror.prototype.isReadOnly = function() {
145243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return (this.attributes() & PropertyAttribute.ReadOnly) != 0;
14531b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
145443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
145543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
145643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPropertyMirror.prototype.isEnum = function() {
145743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return (this.attributes() & PropertyAttribute.DontEnum) == 0;
14581b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
145943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
146043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
146143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPropertyMirror.prototype.canDelete = function() {
146243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return (this.attributes() & PropertyAttribute.DontDelete) == 0;
14631b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
146443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
146543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
146643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPropertyMirror.prototype.name = function() {
146743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.name_;
14681b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
146943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
147043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
147143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPropertyMirror.prototype.isIndexed = function() {
147243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < this.name_.length; i++) {
147343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (this.name_[i] < '0' || '9' < this.name_[i]) {
147443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return false;
147543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
147643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
147743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return true;
14781b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
147943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
148043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
148143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPropertyMirror.prototype.value = function() {
1482eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  return MakeMirror(this.value_, false);
14831b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
14843291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
14853291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
14863291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org/**
14873291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * Returns whether this property value is an exception.
14883291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * @return {booolean} True if this property value is an exception
14893291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org */
14903291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgPropertyMirror.prototype.isException = function() {
14913291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return this.exception_ ? true : false;
14921b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
149343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
149443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
149543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPropertyMirror.prototype.attributes = function() {
149643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return %DebugPropertyAttributesFromDetails(this.details_);
14971b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
149843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
149943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
150043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPropertyMirror.prototype.propertyType = function() {
150143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return %DebugPropertyTypeFromDetails(this.details_);
15021b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
150343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
150443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
150543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPropertyMirror.prototype.insertionIndex = function() {
150643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return %DebugPropertyIndexFromDetails(this.details_);
15071b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
150843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
150943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
151043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
15113291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * Returns whether this property has a getter defined through __defineGetter__.
15123291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * @return {booolean} True if this property has a getter
151343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
15143291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgPropertyMirror.prototype.hasGetter = function() {
15153291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return this.getter_ ? true : false;
15161b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
151743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
151843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
151943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
15203291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * Returns whether this property has a setter defined through __defineSetter__.
15213291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * @return {booolean} True if this property has a setter
152243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
15233291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgPropertyMirror.prototype.hasSetter = function() {
15243291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return this.setter_ ? true : false;
15251b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
152643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
152743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
152843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
15293291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * Returns the getter for this property defined through __defineGetter__.
15303291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * @return {Mirror} FunctionMirror reflecting the getter function or
15313291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *     UndefinedMirror if there is no getter for this property
153243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
15333291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgPropertyMirror.prototype.getter = function() {
15343291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  if (this.hasGetter()) {
15353291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    return MakeMirror(this.getter_);
15363291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  } else {
1537eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    return GetUndefinedMirror();
15383291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  }
15391b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
154043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
154143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
154243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
15433291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * Returns the setter for this property defined through __defineSetter__.
15443291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * @return {Mirror} FunctionMirror reflecting the setter function or
15453291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *     UndefinedMirror if there is no setter for this property
154643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
15473291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgPropertyMirror.prototype.setter = function() {
15483291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  if (this.hasSetter()) {
15493291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    return MakeMirror(this.setter_);
15503291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  } else {
1551eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    return GetUndefinedMirror();
15523291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  }
15531b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
155443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
155543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
155643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
15573291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * Returns whether this property is natively implemented by the host or a set
15583291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * through JavaScript code.
155925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org * @return {boolean} True if the property is
15603291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *     UndefinedMirror if there is no setter for this property
156143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
15623291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgPropertyMirror.prototype.isNative = function() {
1563fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  return this.is_interceptor_ ||
15643291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org         ((this.propertyType() == PropertyType.Callbacks) &&
15653291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org          !this.hasGetter() && !this.hasSetter());
15661b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
156743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
156843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1569de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org/**
1570de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * Mirror object for internal properties. Internal property reflects properties
1571de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * not accessible from user code such as [[BoundThis]] in bound function.
1572de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * Their names are merely symbolic.
1573de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * @param {string} name The name of the property
1574de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * @param {value} property value
1575de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * @constructor
1576de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * @extends Mirror
1577de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org */
1578de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgfunction InternalPropertyMirror(name, value) {
1579de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  %_CallFunction(this, INTERNAL_PROPERTY_TYPE, Mirror);
1580de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  this.name_ = name;
1581de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  this.value_ = value;
1582de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org}
1583de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orginherits(InternalPropertyMirror, Mirror);
1584de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
1585de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
1586de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgInternalPropertyMirror.prototype.name = function() {
1587de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  return this.name_;
1588de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org};
1589de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
1590de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
1591de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgInternalPropertyMirror.prototype.value = function() {
1592de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  return MakeMirror(this.value_, false);
1593de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org};
1594de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
1595de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
1596f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kFrameDetailsFrameIdIndex = 0;
1597f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kFrameDetailsReceiverIndex = 1;
1598f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kFrameDetailsFunctionIndex = 2;
1599f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kFrameDetailsArgumentCountIndex = 3;
1600f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kFrameDetailsLocalCountIndex = 4;
1601f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kFrameDetailsSourcePositionIndex = 5;
1602f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kFrameDetailsConstructCallIndex = 6;
1603f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kFrameDetailsAtReturnIndex = 7;
1604f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kFrameDetailsFlagsIndex = 8;
1605f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kFrameDetailsFirstDynamicIndex = 9;
160643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1607f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kFrameDetailsNameIndex = 0;
1608f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kFrameDetailsValueIndex = 1;
1609f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kFrameDetailsNameValueSize = 2;
161043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1611f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kFrameDetailsFlagDebuggerFrameMask = 1 << 0;
1612f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kFrameDetailsFlagOptimizedFrameMask = 1 << 1;
1613f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kFrameDetailsFlagInlinedFrameIndexMask = 7 << 2;
16144f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
161543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
161643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Wrapper for the frame details information retreived from the VM. The frame
161743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * details from the VM is an array with the following content. See runtime.cc
161843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Runtime_GetFrameDetails.
161943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     0: Id
162043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     1: Receiver
162143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     2: Function
162243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     3: Argument count
162343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     4: Local count
162443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     5: Source position
162543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     6: Construct call
16262cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org *     7: Is at return
162784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org *     8: Flags (debugger frame, optimized frame, inlined frame index)
162843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     Arguments name, value
162943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     Locals name, value
16302cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org *     Return value if any
163143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} break_id Current break id
163243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} index Frame number
163343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
163443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
163543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction FrameDetails(break_id, index) {
163643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.break_id_ = break_id;
163743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.details_ = %GetFrameDetails(break_id, index);
163841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
163943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
164043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
164143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameDetails.prototype.frameId = function() {
164243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  %CheckExecutionState(this.break_id_);
164343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.details_[kFrameDetailsFrameIdIndex];
16441b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
164543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
164643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
164743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameDetails.prototype.receiver = function() {
164843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  %CheckExecutionState(this.break_id_);
164943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.details_[kFrameDetailsReceiverIndex];
16501b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
165143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
165243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
165343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameDetails.prototype.func = function() {
165443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  %CheckExecutionState(this.break_id_);
165543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.details_[kFrameDetailsFunctionIndex];
16561b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
165743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
165843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
165943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameDetails.prototype.isConstructCall = function() {
166043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  %CheckExecutionState(this.break_id_);
166143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.details_[kFrameDetailsConstructCallIndex];
16621b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
166343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
166443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16652cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.orgFrameDetails.prototype.isAtReturn = function() {
16662cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org  %CheckExecutionState(this.break_id_);
16672cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org  return this.details_[kFrameDetailsAtReturnIndex];
16681b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
16692cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org
16702cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org
167143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameDetails.prototype.isDebuggerFrame = function() {
167243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  %CheckExecutionState(this.break_id_);
167384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  var f = kFrameDetailsFlagDebuggerFrameMask;
16744f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  return (this.details_[kFrameDetailsFlagsIndex] & f) == f;
16751b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
16764f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
16774f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
16784f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgFrameDetails.prototype.isOptimizedFrame = function() {
16794f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  %CheckExecutionState(this.break_id_);
168084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  var f = kFrameDetailsFlagOptimizedFrameMask;
16814f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  return (this.details_[kFrameDetailsFlagsIndex] & f) == f;
16821b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
16834f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
16844f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
16854f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgFrameDetails.prototype.isInlinedFrame = function() {
168684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  return this.inlinedFrameIndex() > 0;
16871b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
168884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
168984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
169084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgFrameDetails.prototype.inlinedFrameIndex = function() {
16914f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  %CheckExecutionState(this.break_id_);
169284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  var f = kFrameDetailsFlagInlinedFrameIndexMask;
16931b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  return (this.details_[kFrameDetailsFlagsIndex] & f) >> 2;
16941b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
169543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
169643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
169743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameDetails.prototype.argumentCount = function() {
169843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  %CheckExecutionState(this.break_id_);
169943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.details_[kFrameDetailsArgumentCountIndex];
17001b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
170143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
170243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
170343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameDetails.prototype.argumentName = function(index) {
170443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  %CheckExecutionState(this.break_id_);
170543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (index >= 0 && index < this.argumentCount()) {
170643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return this.details_[kFrameDetailsFirstDynamicIndex +
170743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                         index * kFrameDetailsNameValueSize +
17081b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                         kFrameDetailsNameIndex];
170943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
17101b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
171143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
171243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
171343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameDetails.prototype.argumentValue = function(index) {
171443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  %CheckExecutionState(this.break_id_);
171543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (index >= 0 && index < this.argumentCount()) {
171643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return this.details_[kFrameDetailsFirstDynamicIndex +
171743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                         index * kFrameDetailsNameValueSize +
17181b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                         kFrameDetailsValueIndex];
171943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
17201b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
172143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
172243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
172343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameDetails.prototype.localCount = function() {
172443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  %CheckExecutionState(this.break_id_);
172543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.details_[kFrameDetailsLocalCountIndex];
17261b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
172743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
172843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
172943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameDetails.prototype.sourcePosition = function() {
173043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  %CheckExecutionState(this.break_id_);
173143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.details_[kFrameDetailsSourcePositionIndex];
17321b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
173343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
173443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
173543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameDetails.prototype.localName = function(index) {
173643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  %CheckExecutionState(this.break_id_);
173743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (index >= 0 && index < this.localCount()) {
17382cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org    var locals_offset = kFrameDetailsFirstDynamicIndex +
17391b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                        this.argumentCount() * kFrameDetailsNameValueSize;
174043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return this.details_[locals_offset +
174143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                         index * kFrameDetailsNameValueSize +
17421b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                         kFrameDetailsNameIndex];
174343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
17441b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
174543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
174643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
174743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameDetails.prototype.localValue = function(index) {
174843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  %CheckExecutionState(this.break_id_);
174943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (index >= 0 && index < this.localCount()) {
17502cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org    var locals_offset = kFrameDetailsFirstDynamicIndex +
17511b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                        this.argumentCount() * kFrameDetailsNameValueSize;
175243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return this.details_[locals_offset +
175343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                         index * kFrameDetailsNameValueSize +
17541b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                         kFrameDetailsValueIndex];
175543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
17561b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
175743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
175843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17592cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.orgFrameDetails.prototype.returnValue = function() {
17602cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org  %CheckExecutionState(this.break_id_);
17612cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org  var return_value_offset =
17622cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org      kFrameDetailsFirstDynamicIndex +
17632cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org      (this.argumentCount() + this.localCount()) * kFrameDetailsNameValueSize;
17642cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org  if (this.details_[kFrameDetailsAtReturnIndex]) {
17652cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org    return this.details_[return_value_offset];
17662cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org  }
17671b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
17682cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org
17692cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org
1770eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgFrameDetails.prototype.scopeCount = function() {
1771ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  if (IS_UNDEFINED(this.scopeCount_)) {
1772ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    this.scopeCount_ = %GetScopeCount(this.break_id_, this.frameId());
1773ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  }
1774ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  return this.scopeCount_;
17751b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1776eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1777eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
17781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgFrameDetails.prototype.stepInPositionsImpl = function() {
17791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  return %GetStepInPositions(this.break_id_, this.frameId());
17801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org};
17811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
17821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
178343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
178443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Mirror object for stack frames.
178543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} break_id The break id in the VM for which this frame is
178643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen       valid
178743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} index The frame index (top frame is index 0)
178843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
178943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @extends Mirror
179043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
179143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction FrameMirror(break_id, index) {
17927a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  %_CallFunction(this, FRAME_TYPE, Mirror);
179343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.break_id_ = break_id;
179443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.index_ = index;
179543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.details_ = new FrameDetails(break_id, index);
179641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
179743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hanseninherits(FrameMirror, Mirror);
179843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
179943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18006b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgFrameMirror.prototype.details = function() {
18016b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  return this.details_;
18026b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org};
18036b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org
18046b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org
180543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameMirror.prototype.index = function() {
180643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.index_;
180743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
180843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
180943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
181043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameMirror.prototype.func = function() {
1811ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  if (this.func_) {
1812ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    return this.func_;
1813ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  }
1814ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
181543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Get the function for this frame from the VM.
181643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var f = this.details_.func();
181725156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
181843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Create a function mirror. NOTE: MakeMirror cannot be used here as the
181943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // value returned from the VM might be a string if the function for the
182043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // frame is unresolved.
182143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (IS_FUNCTION(f)) {
1822ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    return this.func_ = MakeMirror(f);
182343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
182443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return new UnresolvedFunctionMirror(f);
182543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
182643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
182743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
182843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
182943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameMirror.prototype.receiver = function() {
183043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeMirror(this.details_.receiver());
183143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
183243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
183343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
183443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameMirror.prototype.isConstructCall = function() {
183543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.details_.isConstructCall();
183643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
183743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
183843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18392cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.orgFrameMirror.prototype.isAtReturn = function() {
18402cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org  return this.details_.isAtReturn();
18412cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org};
18422cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org
18432cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org
184443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameMirror.prototype.isDebuggerFrame = function() {
184543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.details_.isDebuggerFrame();
184643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
184743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
184843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18494f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgFrameMirror.prototype.isOptimizedFrame = function() {
18504f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  return this.details_.isOptimizedFrame();
18514f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org};
18524f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
18534f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
18544f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgFrameMirror.prototype.isInlinedFrame = function() {
18554f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  return this.details_.isInlinedFrame();
18564f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org};
18574f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
18584f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
185984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgFrameMirror.prototype.inlinedFrameIndex = function() {
186084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  return this.details_.inlinedFrameIndex();
186184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org};
186284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
186384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
186443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameMirror.prototype.argumentCount = function() {
186543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.details_.argumentCount();
186643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
186743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
186843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
186943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameMirror.prototype.argumentName = function(index) {
187043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.details_.argumentName(index);
187143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
187243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
187343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
187443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameMirror.prototype.argumentValue = function(index) {
187543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeMirror(this.details_.argumentValue(index));
187643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
187743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
187843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
187943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameMirror.prototype.localCount = function() {
188043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.details_.localCount();
188143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
188243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
188343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
188443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameMirror.prototype.localName = function(index) {
188543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.details_.localName(index);
188643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
188743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
188843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
188943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameMirror.prototype.localValue = function(index) {
189043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeMirror(this.details_.localValue(index));
189143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
189243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
189343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18942cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.orgFrameMirror.prototype.returnValue = function() {
18952cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org  return MakeMirror(this.details_.returnValue());
18962cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org};
18972cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org
18982cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org
189943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameMirror.prototype.sourcePosition = function() {
190043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.details_.sourcePosition();
190143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
190243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
190343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
190443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameMirror.prototype.sourceLocation = function() {
1905ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  var func = this.func();
1906ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  if (func.resolved()) {
1907ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    var script = func.script();
1908ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    if (script) {
1909ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      return script.locationFromPosition(this.sourcePosition(), true);
1910ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    }
191143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
191243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
191343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
191443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
191543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameMirror.prototype.sourceLine = function() {
1916ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  var location = this.sourceLocation();
1917ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  if (location) {
1918ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    return location.line;
191943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
192043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
192143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
192243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
192343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameMirror.prototype.sourceColumn = function() {
1924ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  var location = this.sourceLocation();
1925ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  if (location) {
1926ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    return location.column;
192743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
192843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
192943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
193043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
193143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameMirror.prototype.sourceLineText = function() {
1932ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  var location = this.sourceLocation();
1933ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  if (location) {
1934ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    return location.sourceText();
193543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
193643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
193743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
193843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1939eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgFrameMirror.prototype.scopeCount = function() {
1940eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  return this.details_.scopeCount();
1941eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org};
1942eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1943eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1944eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgFrameMirror.prototype.scope = function(index) {
1945690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  return new ScopeMirror(this, UNDEFINED, index);
1946eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org};
1947eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1948eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1949fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgFrameMirror.prototype.allScopes = function(opt_ignore_nested_scopes) {
1950ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  var scopeDetails = %GetAllScopesDetails(this.break_id_,
1951ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org                                          this.details_.frameId(),
1952fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org                                          this.details_.inlinedFrameIndex(),
1953fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org                                          !!opt_ignore_nested_scopes);
1954ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  var result = [];
1955ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  for (var i = 0; i < scopeDetails.length; ++i) {
1956ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    result.push(new ScopeMirror(this, UNDEFINED, i, scopeDetails[i]));
1957ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  }
1958ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  return result;
1959ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org};
1960ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1961ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
19621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgFrameMirror.prototype.stepInPositions = function() {
19631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  var script = this.func().script();
19641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  var funcOffset = this.func().sourcePosition_();
19651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
19661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  var stepInRaw = this.details_.stepInPositionsImpl();
19671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  var result = [];
19681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (stepInRaw) {
19691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    for (var i = 0; i < stepInRaw.length; i++) {
19701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      var posStruct = {};
19711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      var offset = script.locationFromPosition(funcOffset + stepInRaw[i],
19721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                               true);
19731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      serializeLocationFields(offset, posStruct);
19741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      var item = {
19751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org        position: posStruct
19761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      };
19771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      result.push(item);
19781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    }
19791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
19801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
19811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  return result;
19821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org};
19831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
19841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
19851b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgFrameMirror.prototype.evaluate = function(source, disable_break,
19861b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                                          opt_context_object) {
1987ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  return MakeMirror(%DebugEvaluate(this.break_id_,
1988ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                                   this.details_.frameId(),
1989ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                                   this.details_.inlinedFrameIndex(),
1990ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                                   source,
1991ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                                   Boolean(disable_break),
1992ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                                   opt_context_object));
199343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
199443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
199543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
199643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameMirror.prototype.invocationText = function() {
199743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Format frame invoaction (receiver, function and arguments).
199843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var result = '';
199943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var func = this.func();
200043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var receiver = this.receiver();
200143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.isConstructCall()) {
200243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // For constructor frames display new followed by the function name.
200343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    result += 'new ';
200443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    result += func.name() ? func.name() : '[anonymous]';
200541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  } else if (this.isDebuggerFrame()) {
200643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    result += '[debugger]';
200743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
200843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // If the receiver has a className which is 'global' don't display it.
20091b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    var display_receiver =
20101b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      !receiver.className || (receiver.className() != 'global');
201143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (display_receiver) {
201243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      result += receiver.toText();
201343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
201443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Try to find the function as a property in the receiver. Include the
201543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // prototype chain in the lookup.
20163291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    var property = GetUndefinedMirror();
2017717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org    if (receiver.isObject()) {
2018717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org      for (var r = receiver;
2019717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org           !r.isNull() && property.isUndefined();
2020717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org           r = r.protoObject()) {
202143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        property = r.lookupProperty(func);
202243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
202343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
202443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (!property.isUndefined()) {
202543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // The function invoked was found on the receiver. Use the property name
202643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // for the backtrace.
202743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (!property.isIndexed()) {
202843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        if (display_receiver) {
202943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen          result += '.';
203043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        }
203143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        result += property.name();
203243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else {
203343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        result += '[';
203443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        result += property.name();
203543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        result += ']';
203643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
203743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Also known as - if the name in the function doesn't match the name
203843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // under which it was looked up.
203943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (func.name() && func.name() != property.name()) {
204043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        result += '(aka ' + func.name() + ')';
204141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org      }
204243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
204343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // The function invoked was not found on the receiver. Use the function
204443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // name if available for the backtrace.
204543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (display_receiver) {
204643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        result += '.';
204743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
204843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      result += func.name() ? func.name() : '[anonymous]';
204943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
205043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
205143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
205243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Render arguments for normal frames.
205343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!this.isDebuggerFrame()) {
205443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    result += '(';
205543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    for (var i = 0; i < this.argumentCount(); i++) {
205643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (i != 0) result += ', ';
205743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (this.argumentName(i)) {
205843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        result += this.argumentName(i);
205943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        result += '=';
206043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
206143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      result += this.argumentValue(i).toText();
206243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
206343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    result += ')';
206443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
206541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
20662cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org  if (this.isAtReturn()) {
20672cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org    result += ' returning ';
20682cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org    result += this.returnValue().toText();
20692cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org  }
207042841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org
207143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return result;
20721b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
207343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
207443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
207543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameMirror.prototype.sourceAndPositionText = function() {
207643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Format source and position.
207743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var result = '';
207843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var func = this.func();
207943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (func.resolved()) {
2080ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    var script = func.script();
2081ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    if (script) {
2082ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      if (script.name()) {
2083ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org        result += script.name();
208443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else {
208543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        result += '[unnamed]';
208643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
208743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (!this.isDebuggerFrame()) {
208843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        var location = this.sourceLocation();
208943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        result += ' line ';
209043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        result += !IS_UNDEFINED(location) ? (location.line + 1) : '?';
209143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        result += ' column ';
209243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        result += !IS_UNDEFINED(location) ? (location.column + 1) : '?';
209343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        if (!IS_UNDEFINED(this.sourcePosition())) {
209443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen          result += ' (position ' + (this.sourcePosition() + 1) + ')';
209543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        }
209643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
209743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
209843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      result += '[no source]';
209943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
210043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
210143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    result += '[unresolved]';
210243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
210343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
210443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return result;
21051b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
210643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
210743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
210843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameMirror.prototype.localsText = function() {
210943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Format local variables.
211043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var result = '';
21111b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  var locals_count = this.localCount();
211243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (locals_count > 0) {
211343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    for (var i = 0; i < locals_count; ++i) {
211443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      result += '      var ';
211543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      result += this.localName(i);
211643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      result += ' = ';
211743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      result += this.localValue(i).toText();
211843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (i < locals_count - 1) result += '\n';
211943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
212043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
212143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
212243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return result;
21231b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
212443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
212543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
21265a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.orgFrameMirror.prototype.restart = function() {
21275a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  var result = %LiveEditRestartFrame(this.break_id_, this.index_);
21285a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  if (IS_UNDEFINED(result)) {
21295a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    result = "Failed to find requested frame";
21305a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  }
21315a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  return result;
21325a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org};
21335a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
21345a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
213543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenFrameMirror.prototype.toText = function(opt_locals) {
213643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var result = '';
213743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  result += '#' + (this.index() <= 9 ? '0' : '') + this.index();
213843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  result += ' ';
213943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  result += this.invocationText();
214043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  result += ' ';
214143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  result += this.sourceAndPositionText();
214243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (opt_locals) {
214343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    result += '\n';
214443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    result += this.localsText();
214543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
214643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return result;
21471b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
214843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
214943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2150f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kScopeDetailsTypeIndex = 0;
2151f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kScopeDetailsObjectIndex = 1;
2152eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2153ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgfunction ScopeDetails(frame, fun, index, opt_details) {
21541044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  if (frame) {
21551044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    this.break_id_ = frame.break_id_;
2156ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    this.details_ = opt_details ||
2157ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org                    %GetScopeDetails(frame.break_id_,
21581044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org                                     frame.details_.frameId(),
21591044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org                                     frame.details_.inlinedFrameIndex(),
21601044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org                                     index);
216149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    this.frame_id_ = frame.details_.frameId();
216249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    this.inlined_frame_id_ = frame.details_.inlinedFrameIndex();
21631044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  } else {
2164ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    this.details_ = opt_details || %GetFunctionScopeDetails(fun.value(), index);
216549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    this.fun_value_ = fun.value();
21661044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    this.break_id_ = undefined;
21671044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  }
216849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  this.index_ = index;
2169eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
2170eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2171eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2172eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgScopeDetails.prototype.type = function() {
21731044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  if (!IS_UNDEFINED(this.break_id_)) {
21741044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    %CheckExecutionState(this.break_id_);
21751044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  }
2176eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  return this.details_[kScopeDetailsTypeIndex];
21771b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
2178eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2179eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2180eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgScopeDetails.prototype.object = function() {
21811044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  if (!IS_UNDEFINED(this.break_id_)) {
21821044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    %CheckExecutionState(this.break_id_);
21831044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  }
2184eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  return this.details_[kScopeDetailsObjectIndex];
21851b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
2186eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2187eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
218849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.orgScopeDetails.prototype.setVariableValueImpl = function(name, new_value) {
218949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var raw_res;
219049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  if (!IS_UNDEFINED(this.break_id_)) {
219149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    %CheckExecutionState(this.break_id_);
219249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    raw_res = %SetScopeVariableValue(this.break_id_, this.frame_id_,
219349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org        this.inlined_frame_id_, this.index_, name, new_value);
219449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  } else {
219549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    raw_res = %SetScopeVariableValue(this.fun_value_, null, null, this.index_,
219649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org        name, new_value);
219749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  }
219849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  if (!raw_res) {
219949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    throw new Error("Failed to set variable value");
220049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  }
220149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org};
220249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
220349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
2204eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org/**
22051044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org * Mirror object for scope of frame or function. Either frame or function must
22061044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org * be specified.
2207eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * @param {FrameMirror} frame The frame this scope is a part of
22081044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org * @param {FunctionMirror} function The function this scope is a part of
2209eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * @param {number} index The scope index in the frame
2210ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org * @param {Array=} opt_details Raw scope details data
2211eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * @constructor
2212eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * @extends Mirror
2213eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org */
2214ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgfunction ScopeMirror(frame, function, index, opt_details) {
22157a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  %_CallFunction(this, SCOPE_TYPE, Mirror);
22161044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  if (frame) {
22171044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    this.frame_index_ = frame.index_;
22181044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  } else {
22191044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    this.frame_index_ = undefined;
22201044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  }
2221eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  this.scope_index_ = index;
2222ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  this.details_ = new ScopeDetails(frame, function, index, opt_details);
2223eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
2224eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orginherits(ScopeMirror, Mirror);
2225eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2226eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
22276b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgScopeMirror.prototype.details = function() {
22286b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org  return this.details_;
22296b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org};
22306b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org
22316b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org
2232eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgScopeMirror.prototype.frameIndex = function() {
2233eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  return this.frame_index_;
2234eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org};
2235eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2236eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2237eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgScopeMirror.prototype.scopeIndex = function() {
2238eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  return this.scope_index_;
2239eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org};
2240eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2241eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2242eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgScopeMirror.prototype.scopeType = function() {
2243eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  return this.details_.type();
2244eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org};
2245eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2246eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2247eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgScopeMirror.prototype.scopeObject = function() {
2248eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // For local and closure scopes create a transient mirror as these objects are
2249eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // created on the fly materializing the local or closure scopes and
2250eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // therefore will not preserve identity.
2251eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var transient = this.scopeType() == ScopeType.Local ||
2252eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org                  this.scopeType() == ScopeType.Closure;
2253eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  return MakeMirror(this.details_.object(), transient);
2254eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org};
2255eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2256eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
225749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.orgScopeMirror.prototype.setVariableValue = function(name, new_value) {
225849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  this.details_.setVariableValueImpl(name, new_value);
225949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org};
226049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
226149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
226243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
226343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Mirror object for script source.
226443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {Script} script The script object
226543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
226643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @extends Mirror
226743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
226843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction ScriptMirror(script) {
22697a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  %_CallFunction(this, SCRIPT_TYPE, Mirror);
227043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.script_ = script;
22719085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  this.context_ = new ContextMirror(script.context_data);
2272ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  this.allocateHandle_();
227341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
227443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hanseninherits(ScriptMirror, Mirror);
227543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
227643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2277245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgScriptMirror.prototype.value = function() {
2278245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  return this.script_;
2279245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org};
2280245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
2281245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
228243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptMirror.prototype.name = function() {
228325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  return this.script_.name || this.script_.nameOrSourceURL();
228443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
228543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
228643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22877be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgScriptMirror.prototype.id = function() {
22887be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  return this.script_.id;
22897be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org};
22907be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
22917be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
2292245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgScriptMirror.prototype.source = function() {
2293245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  return this.script_.source;
2294245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org};
2295245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
2296245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
22972c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.orgScriptMirror.prototype.setSource = function(source) {
22982c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  %DebugSetScriptSource(this.script_, source);
22992c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org};
23002c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
23012c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
230243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptMirror.prototype.lineOffset = function() {
230343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.script_.line_offset;
230443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
230543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
230643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
230743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptMirror.prototype.columnOffset = function() {
230843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.script_.column_offset;
230943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
231043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
231143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
231265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgScriptMirror.prototype.data = function() {
231365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  return this.script_.data;
231465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org};
231565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
231665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
231743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptMirror.prototype.scriptType = function() {
231843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.script_.type;
231943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
232043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
232143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2322e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgScriptMirror.prototype.compilationType = function() {
2323e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  return this.script_.compilation_type;
2324e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org};
2325e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
2326e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
232743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptMirror.prototype.lineCount = function() {
232843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.script_.lineCount();
232943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
233043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
233143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23323a6061e672323303da424aa33256d0ae621aa3bdager@chromium.orgScriptMirror.prototype.locationFromPosition = function(
23333a6061e672323303da424aa33256d0ae621aa3bdager@chromium.org    position, include_resource_offset) {
23343a6061e672323303da424aa33256d0ae621aa3bdager@chromium.org  return this.script_.locationFromPosition(position, include_resource_offset);
23351b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
233643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
233743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
233843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptMirror.prototype.sourceSlice = function (opt_from_line, opt_to_line) {
233943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.script_.sourceSlice(opt_from_line, opt_to_line);
23401b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
234143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
234243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23439085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgScriptMirror.prototype.context = function() {
23449085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  return this.context_;
23459085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org};
23469085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
23479085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
23489818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.orgScriptMirror.prototype.evalFromScript = function() {
23499818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  return MakeMirror(this.script_.eval_from_script);
23509818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org};
23519818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org
23529818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org
23539818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.orgScriptMirror.prototype.evalFromFunctionName = function() {
23549818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  return MakeMirror(this.script_.eval_from_function_name);
2355e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org};
2356e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
2357e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
2358e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgScriptMirror.prototype.evalFromLocation = function() {
23599818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  var eval_from_script = this.evalFromScript();
23609818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  if (!eval_from_script.isUndefined()) {
23619818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org    var position = this.script_.eval_from_script_position;
23629818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org    return eval_from_script.locationFromPosition(position, true);
2363e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  }
2364e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org};
2365e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
2366e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
236743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptMirror.prototype.toText = function() {
236843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var result = '';
236943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  result += this.name();
237043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  result += ' (lines: ';
237143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.lineOffset() > 0) {
237243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    result += this.lineOffset();
237343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    result += '-';
237443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    result += this.lineOffset() + this.lineCount() - 1;
237543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
237643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    result += this.lineCount();
237743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
237843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  result += ')';
237943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return result;
23801b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
238143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
238243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23833291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org/**
23849085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org * Mirror object for context.
23859085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org * @param {Object} data The context data
23869085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org * @constructor
23879085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org * @extends Mirror
23889085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org */
23899085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgfunction ContextMirror(data) {
23907a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  %_CallFunction(this, CONTEXT_TYPE, Mirror);
23919085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  this.data_ = data;
23929085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  this.allocateHandle_();
23939085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org}
23949085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orginherits(ContextMirror, Mirror);
23959085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
23969085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
23979085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgContextMirror.prototype.data = function() {
23989085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  return this.data_;
23999085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org};
24009085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
24019085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
24029085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org/**
24033291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * Returns a mirror serializer
24043291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *
24053291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * @param {boolean} details Set to true to include details
24069085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org * @param {Object} options Options comtrolling the serialization
24079085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org *     The following options can be set:
24089085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org *       includeSource: include ths full source of scripts
24093291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * @returns {MirrorSerializer} mirror serializer
24103291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org */
24119085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgfunction MakeMirrorSerializer(details, options) {
24129085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  return new JSONProtocolSerializer(details, options);
24133291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
24143291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
24153291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
24163291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org/**
24173291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * Object for serializing a mirror objects and its direct references.
24183291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * @param {boolean} details Indicates whether to include details for the mirror
24193291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *     serialized
24203291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * @constructor
24213291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org */
24229085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgfunction JSONProtocolSerializer(details, options) {
2423aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  this.details_ = details;
24249085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  this.options_ = options;
24253291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  this.mirrors_ = [ ];
24263291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
24273291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
24283291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
24293291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org/**
24303291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * Returns a serialization of an object reference. The referenced object are
24313291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * added to the serialization state.
24323291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *
24333291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * @param {Mirror} mirror The mirror to serialize
24343291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * @returns {String} JSON serialization
24353291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org */
24363291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgJSONProtocolSerializer.prototype.serializeReference = function(mirror) {
24373291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return this.serialize_(mirror, true, true);
24381b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
24393291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
24403291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
24413291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org/**
24423291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * Returns a serialization of an object value. The referenced objects are
24433291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * added to the serialization state.
24443291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *
24453291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * @param {Mirror} mirror The mirror to serialize
24463291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * @returns {String} JSON serialization
24473291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org */
24483291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgJSONProtocolSerializer.prototype.serializeValue = function(mirror) {
24493291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  var json = this.serialize_(mirror, false, true);
24503291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return json;
24511b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
24523291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
24533291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
24543291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org/**
24553291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * Returns a serialization of all the objects referenced.
24563291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *
2457b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @param {Mirror} mirror The mirror to serialize.
2458b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @returns {Array.<Object>} Array of the referenced objects converted to
2459b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org *     protcol objects.
24603291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org */
24613291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgJSONProtocolSerializer.prototype.serializeReferencedObjects = function() {
2462b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  // Collect the protocol representation of the referenced objects in an array.
2463b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  var content = [];
246425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
24653291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  // Get the number of referenced objects.
24663291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  var count = this.mirrors_.length;
246725156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
24683291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  for (var i = 0; i < count; i++) {
24693291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    content.push(this.serialize_(this.mirrors_[i], false, false));
24703291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  }
24713291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
2472b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  return content;
24731b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
24743291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
24753291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
24769085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgJSONProtocolSerializer.prototype.includeSource_ = function() {
24779085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  return this.options_ && this.options_.includeSource;
24781b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
24799085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
24809085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
24813e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgJSONProtocolSerializer.prototype.inlineRefs_ = function() {
24823e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org  return this.options_ && this.options_.inlineRefs;
24831b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
2484b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org
2485b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org
2486b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.orgJSONProtocolSerializer.prototype.maxStringLength_ = function() {
2487b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org  if (IS_UNDEFINED(this.options_) ||
2488b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org      IS_UNDEFINED(this.options_.maxStringLength)) {
2489b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org    return kMaxProtocolStringLength;
2490b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org  }
2491b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org  return this.options_.maxStringLength;
24921b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
2493b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org
2494b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org
24953291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgJSONProtocolSerializer.prototype.add_ = function(mirror) {
24963291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  // If this mirror is already in the list just return.
24973291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  for (var i = 0; i < this.mirrors_.length; i++) {
24983291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    if (this.mirrors_[i] === mirror) {
24993291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org      return;
25003291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    }
25013291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  }
250225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
25033291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  // Add the mirror to the list of mirrors to be serialized.
25043291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  this.mirrors_.push(mirror);
25051b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
2506aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com
2507aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com
2508b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org/**
2509b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * Formats mirror object to protocol reference object with some data that can
2510b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * be used to display the value in debugger.
2511b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @param {Mirror} mirror Mirror to serialize.
2512b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @return {Object} Protocol reference object.
2513b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org */
251425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.orgJSONProtocolSerializer.prototype.serializeReferenceWithDisplayData_ =
2515b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    function(mirror) {
2516b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  var o = {};
2517b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  o.ref = mirror.handle();
2518b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  o.type = mirror.type();
2519b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  switch (mirror.type()) {
2520b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    case UNDEFINED_TYPE:
2521b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    case NULL_TYPE:
2522b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    case BOOLEAN_TYPE:
2523b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    case NUMBER_TYPE:
2524b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      o.value = mirror.value();
2525b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      break;
2526b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    case STRING_TYPE:
2527b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org      o.value = mirror.getTruncatedValue(this.maxStringLength_());
2528b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      break;
252979d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org    case SYMBOL_TYPE:
253079d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org      o.description = mirror.description();
253179d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org      break;
2532b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    case FUNCTION_TYPE:
2533b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      o.name = mirror.name();
2534b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      o.inferredName = mirror.inferredName();
2535b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      if (mirror.script()) {
2536b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org        o.scriptId = mirror.script().id();
2537b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      }
2538b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      break;
2539b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    case ERROR_TYPE:
2540b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    case REGEXP_TYPE:
2541b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      o.value = mirror.toText();
2542b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      break;
2543b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    case OBJECT_TYPE:
2544b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      o.className = mirror.className();
2545b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      break;
2546b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  }
2547b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  return o;
2548b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org};
2549b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org
2550eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
25513291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgJSONProtocolSerializer.prototype.serialize_ = function(mirror, reference,
25523291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org                                                       details) {
2553ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // If serializing a reference to a mirror just return the reference and add
2554ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // the mirror to the referenced mirrors.
2555ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  if (reference &&
25569085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org      (mirror.isValue() || mirror.isScript() || mirror.isContext())) {
25573e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org    if (this.inlineRefs_() && mirror.isValue()) {
2558b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      return this.serializeReferenceWithDisplayData_(mirror);
2559b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    } else {
2560b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      this.add_(mirror);
2561b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      return {'ref' : mirror.handle()};
2562b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    }
25633291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  }
256425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
2565b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  // Collect the JSON property/value pairs.
2566b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  var content = {};
2567aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com
25682d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org  // Add the mirror handle.
25699085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  if (mirror.isValue() || mirror.isScript() || mirror.isContext()) {
2570b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    content.handle = mirror.handle();
25713291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  }
25723291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
25733291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  // Always add the type.
2574b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  content.type = mirror.type();
2575aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com
2576aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  switch (mirror.type()) {
2577aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com    case UNDEFINED_TYPE:
2578aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com    case NULL_TYPE:
2579aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com      // Undefined and null are represented just by their type.
2580aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com      break;
2581aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com
2582aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com    case BOOLEAN_TYPE:
2583aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com      // Boolean values are simply represented by their value.
2584b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      content.value = mirror.value();
2585aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com      break;
2586aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com
2587aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com    case NUMBER_TYPE:
2588aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com      // Number values are simply represented by their value.
2589b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      content.value = NumberToJSON_(mirror.value());
2590aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com      break;
2591aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com
2592aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com    case STRING_TYPE:
2593aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com      // String values might have their value cropped to keep down size.
2594b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org      if (this.maxStringLength_() != -1 &&
2595b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org          mirror.length() > this.maxStringLength_()) {
2596b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org        var str = mirror.getTruncatedValue(this.maxStringLength_());
2597b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org        content.value = str;
2598b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org        content.fromIndex = 0;
2599b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org        content.toIndex = this.maxStringLength_();
2600aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com      } else {
2601b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org        content.value = mirror.value();
2602aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com      }
2603b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      content.length = mirror.length();
2604aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com      break;
2605aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com
260679d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org    case SYMBOL_TYPE:
260779d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org      content.description = mirror.description();
260879d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org      break;
260979d0704c4f2ed07d3b30ee08ea1e1af79e521bd2machenbach@chromium.org
2610aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com    case OBJECT_TYPE:
2611aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com    case FUNCTION_TYPE:
2612aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com    case ERROR_TYPE:
2613aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com    case REGEXP_TYPE:
2614865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    case PROMISE_TYPE:
2615a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    case GENERATOR_TYPE:
2616aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com      // Add object representation.
26173291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org      this.serializeObject_(mirror, content, details);
2618aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com      break;
2619aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com
2620aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com    case PROPERTY_TYPE:
2621de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    case INTERNAL_PROPERTY_TYPE:
2622de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org      throw new Error('PropertyMirror cannot be serialized independently');
2623aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com      break;
2624aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com
2625aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com    case FRAME_TYPE:
2626aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com      // Add object representation.
2627aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com      this.serializeFrame_(mirror, content);
2628aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com      break;
2629aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com
2630eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    case SCOPE_TYPE:
2631eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      // Add object representation.
2632eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      this.serializeScope_(mirror, content);
2633eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      break;
2634eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2635aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com    case SCRIPT_TYPE:
26362d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org      // Script is represented by id, name and source attributes.
2637aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com      if (mirror.name()) {
2638b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org        content.name = mirror.name();
2639aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com      }
2640b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      content.id = mirror.id();
2641b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      content.lineOffset = mirror.lineOffset();
2642b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      content.columnOffset = mirror.columnOffset();
2643b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      content.lineCount = mirror.lineCount();
26449085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org      if (mirror.data()) {
2645b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org        content.data = mirror.data();
26469085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org      }
26479085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org      if (this.includeSource_()) {
2648b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org        content.source = mirror.source();
26499085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org      } else {
26509085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org        var sourceStart = mirror.source().substring(0, 80);
2651b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org        content.sourceStart = sourceStart;
26529085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org      }
2653b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      content.sourceLength = mirror.source().length;
2654b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      content.scriptType = mirror.scriptType();
2655e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org      content.compilationType = mirror.compilationType();
2656636edf40cc8adefec65bb722fccc89b01ffe06bcsgjesse@chromium.org      // For compilation type eval emit information on the script from which
2657636edf40cc8adefec65bb722fccc89b01ffe06bcsgjesse@chromium.org      // eval was called if a script is present.
2658636edf40cc8adefec65bb722fccc89b01ffe06bcsgjesse@chromium.org      if (mirror.compilationType() == 1 &&
26599818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org          mirror.evalFromScript()) {
2660e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org        content.evalFromScript =
26619818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org            this.serializeReference(mirror.evalFromScript());
26621b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        var evalFromLocation = mirror.evalFromLocation();
2663b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org        if (evalFromLocation) {
2664b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org          content.evalFromLocation = { line: evalFromLocation.line,
2665b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org                                       column: evalFromLocation.column };
2666b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org        }
26679818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org        if (mirror.evalFromFunctionName()) {
26689818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org          content.evalFromFunctionName = mirror.evalFromFunctionName();
26699818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org        }
2670e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org      }
26719085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org      if (mirror.context()) {
2672b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org        content.context = this.serializeReference(mirror.context());
26739085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org      }
26749085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org      break;
26759085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
26769085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org    case CONTEXT_TYPE:
2677b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      content.data = mirror.data();
2678aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com      break;
2679aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  }
2680aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com
2681aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  // Always add the text representation.
2682b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  content.text = mirror.toText();
268325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
2684aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  // Create and return the JSON string.
2685b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  return content;
26861b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
2687aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com
2688aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com
26893291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org/**
26903291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * Serialize object information to the following JSON format.
26913291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *
26923291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *   {"className":"<class name>",
26933291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *    "constructorFunction":{"ref":<number>},
26943291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *    "protoObject":{"ref":<number>},
26953291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *    "prototypeObject":{"ref":<number>},
26963291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *    "namedInterceptor":<boolean>,
26973291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *    "indexedInterceptor":<boolean>,
2698de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org *    "properties":[<properties>],
2699de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org *    "internalProperties":[<internal properties>]}
27003291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org */
27013291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgJSONProtocolSerializer.prototype.serializeObject_ = function(mirror, content,
27023291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org                                                             details) {
27033291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  // Add general object properties.
2704b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  content.className = mirror.className();
2705b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  content.constructorFunction =
2706b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      this.serializeReference(mirror.constructorFunction());
2707b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  content.protoObject = this.serializeReference(mirror.protoObject());
2708b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  content.prototypeObject = this.serializeReference(mirror.prototypeObject());
27093291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
27103291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  // Add flags to indicate whether there are interceptors.
2711aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  if (mirror.hasNamedInterceptor()) {
2712b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    content.namedInterceptor = true;
2713aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  }
2714aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  if (mirror.hasIndexedInterceptor()) {
2715b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    content.indexedInterceptor = true;
2716aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  }
271725156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
2718aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  if (mirror.isFunction()) {
2719aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com    // Add function specific properties.
2720b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    content.name = mirror.name();
27219085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org    if (!IS_UNDEFINED(mirror.inferredName())) {
2722b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      content.inferredName = mirror.inferredName();
27239085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org    }
2724b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    content.resolved = mirror.resolved();
27253291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    if (mirror.resolved()) {
2726b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      content.source = mirror.source();
2727aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com    }
2728aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com    if (mirror.script()) {
2729b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      content.script = this.serializeReference(mirror.script());
2730c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      content.scriptId = mirror.script().id();
273125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
2732c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      serializeLocationFields(mirror.sourceLocation(), content);
2733aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com    }
27341044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org
27351044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    content.scopes = [];
27361044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    for (var i = 0; i < mirror.scopeCount(); i++) {
27371044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org      var scope = mirror.scope(i);
27381044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org      content.scopes.push({
27391044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org        type: scope.scopeType(),
27401044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org        index: i
27411044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org      });
27421044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    }
27433291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  }
27443291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
2745a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  if (mirror.isGenerator()) {
2746a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // Add generator specific properties.
2747a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
2748a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // Either 'running', 'closed', or 'suspended'.
2749a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    content.status = mirror.status();
2750a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
2751a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    content.func = this.serializeReference(mirror.func())
2752a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    content.receiver = this.serializeReference(mirror.receiver())
2753a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
2754a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // If the generator is suspended, the content add line/column properties.
2755a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    serializeLocationFields(mirror.sourceLocation(), content);
2756a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
2757a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // TODO(wingo): Also serialize a reference to the context (scope chain).
2758a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  }
2759a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
27603291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  if (mirror.isDate()) {
2761aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com    // Add date specific properties.
2762b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    content.value = mirror.value();
2763aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  }
27643291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
2765865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  if (mirror.isPromise()) {
2766865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    // Add promise specific properties.
2767865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    content.status = mirror.status();
2768874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org    content.promiseValue = this.serializeReference(mirror.promiseValue());
2769865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  }
2770865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
27713291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  // Add actual properties - named properties followed by indexed properties.
27723291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  var propertyNames = mirror.propertyNames(PropertyKind.Named);
27733291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  var propertyIndexes = mirror.propertyNames(PropertyKind.Indexed);
27743291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  var p = new Array(propertyNames.length + propertyIndexes.length);
27753291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  for (var i = 0; i < propertyNames.length; i++) {
2776b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    var propertyMirror = mirror.property(propertyNames[i]);
2777b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    p[i] = this.serializeProperty_(propertyMirror);
27783291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    if (details) {
2779b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      this.add_(propertyMirror.value());
27803291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    }
27813291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  }
27823291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  for (var i = 0; i < propertyIndexes.length; i++) {
2783b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    var propertyMirror = mirror.property(propertyIndexes[i]);
2784b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    p[propertyNames.length + i] = this.serializeProperty_(propertyMirror);
27853291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    if (details) {
2786b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      this.add_(propertyMirror.value());
27873291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    }
27883291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  }
2789b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  content.properties = p;
2790de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
2791de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  var internalProperties = mirror.internalProperties();
2792de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  if (internalProperties.length > 0) {
2793de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    var ip = [];
2794de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    for (var i = 0; i < internalProperties.length; i++) {
2795de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org      ip.push(this.serializeInternalProperty_(internalProperties[i]));
2796de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    }
2797de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    content.internalProperties = ip;
2798de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  }
27991b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
28003291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
28013291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
28023291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org/**
2803c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org * Serialize location information to the following JSON format:
2804c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org *
2805c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org *   "position":"<position>",
2806c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org *   "line":"<line>",
2807c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org *   "column":"<column>",
280825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org *
2809c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org * @param {SourceLocation} location The location to serialize, may be undefined.
2810c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org */
2811c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgfunction serializeLocationFields (location, content) {
2812c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  if (!location) {
2813c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    return;
281425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  }
2815c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  content.position = location.position;
2816c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  var line = location.line;
2817c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  if (!IS_UNDEFINED(line)) {
2818c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    content.line = line;
2819c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  }
2820c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  var column = location.column;
2821c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  if (!IS_UNDEFINED(column)) {
2822c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    content.column = column;
2823c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  }
2824c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
2825c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
2826c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
2827c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org/**
28283291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * Serialize property information to the following JSON format for building the
28293291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * array of properties.
28303291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *
28313291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *   {"name":"<property name>",
28323291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *    "attributes":<number>,
28333291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *    "propertyType":<number>,
28343291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *    "ref":<number>}
28353291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *
28363291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * If the attribute for the property is PropertyAttribute.None it is not added.
28373291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * If the propertyType for the property is PropertyType.Normal it is not added.
28383291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * Here are a couple of examples.
28393291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *
28403291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *   {"name":"hello","ref":1}
28413291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *   {"name":"length","attributes":7,"propertyType":3,"ref":2}
28423291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *
2843b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @param {PropertyMirror} propertyMirror The property to serialize.
2844b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @returns {Object} Protocol object representing the property.
28453291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org */
2846b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.orgJSONProtocolSerializer.prototype.serializeProperty_ = function(propertyMirror) {
2847b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  var result = {};
284825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
2849b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  result.name = propertyMirror.name();
2850b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  var propertyValue = propertyMirror.value();
28513e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org  if (this.inlineRefs_() && propertyValue.isValue()) {
2852b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    result.value = this.serializeReferenceWithDisplayData_(propertyValue);
2853b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  } else {
2854b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    if (propertyMirror.attributes() != PropertyAttribute.None) {
2855b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      result.attributes = propertyMirror.attributes();
2856b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    }
2857b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    if (propertyMirror.propertyType() != PropertyType.Normal) {
2858b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      result.propertyType = propertyMirror.propertyType();
2859b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    }
2860b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    result.ref = propertyValue.handle();
28613291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  }
2862b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  return result;
28631b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
2864aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com
2865aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com
2866de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org/**
2867de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * Serialize internal property information to the following JSON format for
2868de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * building the array of properties.
2869de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org *
2870de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org *   {"name":"<property name>",
2871de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org *    "ref":<number>}
2872de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org *
2873de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org *   {"name":"[[BoundThis]]","ref":117}
2874de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org *
2875de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * @param {InternalPropertyMirror} propertyMirror The property to serialize.
2876de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org * @returns {Object} Protocol object representing the property.
2877de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org */
2878de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgJSONProtocolSerializer.prototype.serializeInternalProperty_ =
2879de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    function(propertyMirror) {
2880de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  var result = {};
2881de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
2882de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  result.name = propertyMirror.name();
2883de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  var propertyValue = propertyMirror.value();
2884de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  if (this.inlineRefs_() && propertyValue.isValue()) {
2885de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    result.value = this.serializeReferenceWithDisplayData_(propertyValue);
2886de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  } else {
2887de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    result.ref = propertyValue.handle();
2888de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  }
2889de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  return result;
2890de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org};
2891de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
2892de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
2893aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.comJSONProtocolSerializer.prototype.serializeFrame_ = function(mirror, content) {
2894b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  content.index = mirror.index();
2895b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  content.receiver = this.serializeReference(mirror.receiver());
28962d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org  var func = mirror.func();
2897b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  content.func = this.serializeReference(func);
2898ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  var script = func.script();
2899ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  if (script) {
2900ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    content.script = this.serializeReference(script);
29012d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org  }
2902b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  content.constructCall = mirror.isConstructCall();
29032cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org  content.atReturn = mirror.isAtReturn();
29042cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org  if (mirror.isAtReturn()) {
29052cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org    content.returnValue = this.serializeReference(mirror.returnValue());
29062cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org  }
2907b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  content.debuggerFrame = mirror.isDebuggerFrame();
2908aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  var x = new Array(mirror.argumentCount());
2909aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  for (var i = 0; i < mirror.argumentCount(); i++) {
2910b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    var arg = {};
29111b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    var argument_name = mirror.argumentName(i);
2912aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com    if (argument_name) {
2913b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      arg.name = argument_name;
2914aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com    }
2915b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    arg.value = this.serializeReference(mirror.argumentValue(i));
2916b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    x[i] = arg;
2917aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  }
2918b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  content.arguments = x;
2919aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  var x = new Array(mirror.localCount());
2920aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  for (var i = 0; i < mirror.localCount(); i++) {
2921b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    var local = {};
2922b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    local.name = mirror.localName(i);
2923b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    local.value = this.serializeReference(mirror.localValue(i));
2924b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    x[i] = local;
2925aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  }
2926b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  content.locals = x;
2927c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  serializeLocationFields(mirror.sourceLocation(), content);
2928aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  var source_line_text = mirror.sourceLineText();
2929aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  if (!IS_UNDEFINED(source_line_text)) {
2930b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    content.sourceLineText = source_line_text;
2931aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com  }
293225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
29335aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  content.scopes = [];
29345aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  for (var i = 0; i < mirror.scopeCount(); i++) {
29355aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org    var scope = mirror.scope(i);
29365aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org    content.scopes.push({
29375aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org      type: scope.scopeType(),
29385aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org      index: i
29395aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org    });
29405aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  }
29411b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
2942aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com
2943aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com
2944eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgJSONProtocolSerializer.prototype.serializeScope_ = function(mirror, content) {
2945eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  content.index = mirror.scopeIndex();
2946eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  content.frameIndex = mirror.frameIndex();
2947eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  content.type = mirror.scopeType();
29483e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org  content.object = this.inlineRefs_() ?
29493e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org                   this.serializeValue(mirror.scopeObject()) :
29503e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org                   this.serializeReference(mirror.scopeObject());
29511b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
2952eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2953eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2954715915b45e7c5370526276e83ffc62e42124218dsgjesse@chromium.org/**
2955b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * Convert a number to a protocol value. For all finite numbers the number
2956b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * itself is returned. For non finite numbers NaN, Infinite and
2957715915b45e7c5370526276e83ffc62e42124218dsgjesse@chromium.org * -Infinite the string representation "NaN", "Infinite" or "-Infinite"
2958b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * (not including the quotes) is returned.
2959715915b45e7c5370526276e83ffc62e42124218dsgjesse@chromium.org *
2960b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @param {number} value The number value to convert to a protocol value.
2961b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @returns {number|string} Protocol value.
2962715915b45e7c5370526276e83ffc62e42124218dsgjesse@chromium.org */
296343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction NumberToJSON_(value) {
2964715915b45e7c5370526276e83ffc62e42124218dsgjesse@chromium.org  if (isNaN(value)) {
2965b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    return 'NaN';
2966715915b45e7c5370526276e83ffc62e42124218dsgjesse@chromium.org  }
29679e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org  if (!NUMBER_IS_FINITE(value)) {
2968715915b45e7c5370526276e83ffc62e42124218dsgjesse@chromium.org    if (value > 0) {
2969b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      return 'Infinity';
2970715915b45e7c5370526276e83ffc62e42124218dsgjesse@chromium.org    } else {
2971b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      return '-Infinity';
2972715915b45e7c5370526276e83ffc62e42124218dsgjesse@chromium.org    }
2973715915b45e7c5370526276e83ffc62e42124218dsgjesse@chromium.org  }
297425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  return value;
297541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
2976