1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2008 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Flags: --expose-debug-as debug
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Test the mirror object for unresolved functions.
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MirrorRefCache(json_refs) {
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var tmp = eval('(' + json_refs + ')');
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  this.refs_ = [];
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (var i = 0; i < tmp.length; i++) {
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    this.refs_[tmp[i].handle] = tmp[i];
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMirrorRefCache.prototype.lookup = function(handle) {
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.refs_[handle];
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar mirror = new debug.UnresolvedFunctionMirror("f");
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar serializer = debug.MakeMirrorSerializer();
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar json = JSON.stringify(serializer.serializeValue(mirror));
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar refs = new MirrorRefCache(
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    JSON.stringify(serializer.serializeReferencedObjects()));
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Check the mirror hierachy for unresolved functions.
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertTrue(mirror instanceof debug.Mirror);
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertTrue(mirror instanceof debug.ValueMirror);
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertTrue(mirror instanceof debug.ObjectMirror);
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertTrue(mirror instanceof debug.FunctionMirror);
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Check the mirror properties for unresolved functions.
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertTrue(mirror.isUnresolvedFunction());
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('function', mirror.type());
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertFalse(mirror.isPrimitive());
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("Function", mirror.className());
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("f", mirror.name());
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('undefined', typeof mirror.inferredName());
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertFalse(mirror.resolved());
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(void 0, mirror.source());
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('undefined', mirror.constructorFunction().type());
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('undefined', mirror.protoObject().type());
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('undefined', mirror.prototypeObject().type());
67589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Parse JSON representation of unresolved functions and check.
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar fromJSON = eval('(' + json + ')');
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('function', fromJSON.type, 'Unexpected mirror type in JSON');
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('Function', fromJSON.className, 'Unexpected mirror class name in JSON');
72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(mirror.constructorFunction().handle(), fromJSON.constructorFunction.ref, 'Unexpected constructor function handle in JSON');
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('undefined', refs.lookup(fromJSON.constructorFunction.ref).type, 'Unexpected constructor function type in JSON');
74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(mirror.protoObject().handle(), fromJSON.protoObject.ref, 'Unexpected proto object handle in JSON');
75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('undefined', refs.lookup(fromJSON.protoObject.ref).type, 'Unexpected proto object type in JSON');
76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(mirror.prototypeObject().handle(), fromJSON.prototypeObject.ref, 'Unexpected prototype object handle in JSON');
77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('undefined', refs.lookup(fromJSON.prototypeObject.ref).type, 'Unexpected prototype object type in JSON');
78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertFalse(fromJSON.resolved);
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("f", fromJSON.name);
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertFalse('inferredName' in fromJSON);
81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(void 0, fromJSON.source);
82