1de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Redistribution and use in source and binary forms, with or without 39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// modification, are permitted provided that the following conditions are 49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// met: 59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// 69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Redistributions of source code must retain the above copyright 79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// notice, this list of conditions and the following disclaimer. 89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Redistributions in binary form must reproduce the above 99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// copyright notice, this list of conditions and the following 109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// disclaimer in the documentation and/or other materials provided 119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// with the distribution. 129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Neither the name of Google Inc. nor the names of its 139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// contributors may be used to endorse or promote products derived 149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// from this software without specific prior written permission. 159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// 169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Flags: --expose-debug-as debug 299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test the mirror object for objects 309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 313291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgfunction MirrorRefCache(json_refs) { 323291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org var tmp = eval('(' + json_refs + ')'); 333291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org this.refs_ = []; 343291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org for (var i = 0; i < tmp.length; i++) { 353291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org this.refs_[tmp[i].handle] = tmp[i]; 363291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org } 373291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org} 383291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 393291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgMirrorRefCache.prototype.lookup = function(handle) { 403291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org return this.refs_[handle]; 41160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org}; 423291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 433291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgfunction testObjectMirror(obj, cls_name, ctor_name, hasSpecialProperties) { 449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create mirror and JSON representation. 453291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org var mirror = debug.MakeMirror(obj); 463291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org var serializer = debug.MakeMirrorSerializer(); 47b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org var json = JSON.stringify(serializer.serializeValue(mirror)); 48b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org var refs = new MirrorRefCache( 49b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org JSON.stringify(serializer.serializeReferencedObjects())); 509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Check the mirror hierachy. 52de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org assertTrue(mirror instanceof debug.Mirror, 'Unexpected mirror hierarchy'); 53de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org assertTrue(mirror instanceof debug.ValueMirror, 'Unexpected mirror hierarchy'); 54de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org assertTrue(mirror instanceof debug.ObjectMirror, 'Unexpected mirror hierarchy'); 559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Check the mirror properties. 573291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertTrue(mirror.isObject(), 'Unexpected mirror'); 583291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals('object', mirror.type(), 'Unexpected mirror type'); 593291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertFalse(mirror.isPrimitive(), 'Unexpected primitive mirror'); 603291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals(cls_name, mirror.className(), 'Unexpected mirror class name'); 61de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org assertTrue(mirror.constructorFunction() instanceof debug.ObjectMirror, 'Unexpected mirror hierarchy'); 623291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals(ctor_name, mirror.constructorFunction().name(), 'Unexpected constructor function name'); 63de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org assertTrue(mirror.protoObject() instanceof debug.Mirror, 'Unexpected mirror hierarchy'); 64de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org assertTrue(mirror.prototypeObject() instanceof debug.Mirror, 'Unexpected mirror hierarchy'); 653291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertFalse(mirror.hasNamedInterceptor(), 'No named interceptor expected'); 663291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertFalse(mirror.hasIndexedInterceptor(), 'No indexed interceptor expected'); 679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com var names = mirror.propertyNames(); 69160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org var properties = mirror.properties(); 709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com assertEquals(names.length, properties.length); 719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com for (var i = 0; i < properties.length; i++) { 72de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org assertTrue(properties[i] instanceof debug.Mirror, 'Unexpected mirror hierarchy'); 73de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org assertTrue(properties[i] instanceof debug.PropertyMirror, 'Unexpected mirror hierarchy'); 743291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals('property', properties[i].type(), 'Unexpected mirror type'); 753291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals(names[i], properties[i].name(), 'Unexpected property name'); 769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 77a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 78de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org var internalProperties = mirror.internalProperties(); 79de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org for (var i = 0; i < internalProperties.length; i++) { 80de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org assertTrue(internalProperties[i] instanceof debug.Mirror, 'Unexpected mirror hierarchy'); 81de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org assertTrue(internalProperties[i] instanceof debug.InternalPropertyMirror, 'Unexpected mirror hierarchy'); 82de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org assertEquals('internalProperty', internalProperties[i].type(), 'Unexpected mirror type'); 83de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org } 84de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org 853291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org for (var p in obj) { 869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com var property_mirror = mirror.property(p); 879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com assertTrue(property_mirror instanceof debug.PropertyMirror); 889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com assertEquals(p, property_mirror.name()); 899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // If the object has some special properties don't test for these. 909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (!hasSpecialProperties) { 919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com assertEquals(0, property_mirror.attributes(), property_mirror.name()); 929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com assertFalse(property_mirror.isReadOnly()); 939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com assertTrue(property_mirror.isEnum()); 949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com assertTrue(property_mirror.canDelete()); 959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Parse JSON representation and check. 999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com var fromJSON = eval('(' + json + ')'); 1003291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals('object', fromJSON.type, 'Unexpected mirror type in JSON'); 1013291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals(cls_name, fromJSON.className, 'Unexpected mirror class name in JSON'); 1023291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals(mirror.constructorFunction().handle(), fromJSON.constructorFunction.ref, 'Unexpected constructor function handle in JSON'); 1033291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals('function', refs.lookup(fromJSON.constructorFunction.ref).type, 'Unexpected constructor function type in JSON'); 1043291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals(ctor_name, refs.lookup(fromJSON.constructorFunction.ref).name, 'Unexpected constructor function name in JSON'); 1053291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals(mirror.protoObject().handle(), fromJSON.protoObject.ref, 'Unexpected proto object handle in JSON'); 1063291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals(mirror.protoObject().type(), refs.lookup(fromJSON.protoObject.ref).type, 'Unexpected proto object type in JSON'); 1073291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals(mirror.prototypeObject().handle(), fromJSON.prototypeObject.ref, 'Unexpected prototype object handle in JSON'); 1083291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals(mirror.prototypeObject().type(), refs.lookup(fromJSON.prototypeObject.ref).type, 'Unexpected prototype object type in JSON'); 1093291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals(void 0, fromJSON.namedInterceptor, 'No named interceptor expected in JSON'); 1103291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals(void 0, fromJSON.indexedInterceptor, 'No indexed interceptor expected in JSON'); 1119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Check that the serialization contains all properties. 1133291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals(names.length, fromJSON.properties.length, 'Some properties missing in JSON'); 1149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com for (var i = 0; i < fromJSON.properties.length; i++) { 1159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com var name = fromJSON.properties[i].name; 116b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org if (typeof name == 'undefined') name = fromJSON.properties[i].index; 1179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com var found = false; 1189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com for (var j = 0; j < names.length; j++) { 1199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (names[j] == name) { 1203291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // Check that serialized handle is correct. 1213291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals(properties[i].value().handle(), fromJSON.properties[i].ref, 'Unexpected serialized handle'); 1223291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 1233291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // Check that serialized name is correct. 1243291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals(properties[i].name(), fromJSON.properties[i].name, 'Unexpected serialized name'); 1253291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 1263291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // If property type is normal property type is not serialized. 1279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (properties[i].propertyType() != debug.PropertyType.Normal) { 1283291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals(properties[i].propertyType(), fromJSON.properties[i].propertyType, 'Unexpected serialized property type'); 1299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } else { 1303291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertTrue(typeof(fromJSON.properties[i].propertyType) === 'undefined', 'Unexpected serialized property type'); 1319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 1323291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 1333291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // If there are no attributes attributes are not serialized. 1349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (properties[i].attributes() != debug.PropertyAttribute.None) { 1353291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals(properties[i].attributes(), fromJSON.properties[i].attributes, 'Unexpected serialized attributes'); 1369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } else { 1373291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertTrue(typeof(fromJSON.properties[i].attributes) === 'undefined', 'Unexpected serialized attributes'); 1389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 1393291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 140160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // Lookup the serialized object from the handle reference. 1413291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org var o = refs.lookup(fromJSON.properties[i].ref); 1423291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertTrue(o != void 0, 'Referenced object is not serialized'); 1433291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 1443291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals(properties[i].value().type(), o.type, 'Unexpected serialized property type for ' + name); 1453291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org if (properties[i].value().isPrimitive()) { 146160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org if (properties[i].value().type() == "null" || 147160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org properties[i].value().type() == "undefined") { 148160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // Null and undefined has no value property. 149160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org assertFalse("value" in o, 'Unexpected value property for ' + name); 150160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org } else if (properties[i].value().type() == "number" && 151160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org !isFinite(properties[i].value().value())) { 152160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org assertEquals(String(properties[i].value().value()), o.value, 153160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 'Unexpected serialized property value for ' + name); 154ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } else { 155ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org assertEquals(properties[i].value().value(), o.value, 'Unexpected serialized property value for ' + name); 156ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 1573291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org } else if (properties[i].value().isFunction()) { 1583291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org assertEquals(properties[i].value().source(), o.source, 'Unexpected serialized property value for ' + name); 1599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 1609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com found = true; 1619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 1629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 163aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com assertTrue(found, '"' + name + '" not found (' + json + ')'); 1649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 1659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 1669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comfunction Point(x,y) { 1699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com this.x_ = x; 1709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com this.y_ = y; 1719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 1729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test a number of different objects. 1749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtestObjectMirror({}, 'Object', 'Object'); 1759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtestObjectMirror({'a':1,'b':2}, 'Object', 'Object'); 1769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtestObjectMirror({'1':void 0,'2':null,'f':function pow(x,y){return Math.pow(x,y);}}, 'Object', 'Object'); 1779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtestObjectMirror(new Point(-1.2,2.003), 'Object', 'Point'); 1783291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgtestObjectMirror(this, 'global', '', true); // Global object has special properties 179ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgtestObjectMirror(this.__proto__, 'Object', ''); 1809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtestObjectMirror([], 'Array', 'Array'); 1819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtestObjectMirror([1,2], 'Array', 'Array'); 182de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgtestObjectMirror(Object(17), 'Number', 'Number'); 1839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 184aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com// Test circular references. 185aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.como = {}; 186aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.como.o = o; 187aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.comtestObjectMirror(o, 'Object', 'Object'); 188aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com 1899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test that non enumerable properties are part of the mirror 1909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comglobal_mirror = debug.MakeMirror(this); 1919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals('property', global_mirror.property("Math").type()); 1929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertFalse(global_mirror.property("Math").isEnum(), "Math is enumerable" + global_mirror.property("Math").attributes()); 1939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.commath_mirror = global_mirror.property("Math").value(); 1959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals('property', math_mirror.property("E").type()); 1969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertFalse(math_mirror.property("E").isEnum(), "Math.E is enumerable"); 1979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertTrue(math_mirror.property("E").isReadOnly()); 1989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertFalse(math_mirror.property("E").canDelete()); 1999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test objects with JavaScript accessors. 2019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.como = {} 2023291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgo.__defineGetter__('a', function(){return 'a';}); 2033291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgo.__defineSetter__('b', function(){}); 2043291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgo.__defineGetter__('c', function(){throw 'c';}); 2053291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgo.__defineSetter__('c', function(){throw 'c';}); 2069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtestObjectMirror(o, 'Object', 'Object'); 2079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.commirror = debug.MakeMirror(o); 2089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// a has getter but no setter. 2093291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertTrue(mirror.property('a').hasGetter()); 2103291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertFalse(mirror.property('a').hasSetter()); 2119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(debug.PropertyType.Callbacks, mirror.property('a').propertyType()); 2123291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertEquals('function', mirror.property('a').getter().type()); 2133291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertEquals('undefined', mirror.property('a').setter().type()); 2143291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertEquals('function (){return \'a\';}', mirror.property('a').getter().source()); 2159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// b has setter but no getter. 2163291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertFalse(mirror.property('b').hasGetter()); 2173291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertTrue(mirror.property('b').hasSetter()); 2189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(debug.PropertyType.Callbacks, mirror.property('b').propertyType()); 2193291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertEquals('undefined', mirror.property('b').getter().type()); 2203291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertEquals('function', mirror.property('b').setter().type()); 2213291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertEquals('function (){}', mirror.property('b').setter().source()); 2223291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertFalse(mirror.property('b').isException()); 2233291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// c has both getter and setter. The getter throws an exception. 2243291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertTrue(mirror.property('c').hasGetter()); 2253291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertTrue(mirror.property('c').hasSetter()); 2269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(debug.PropertyType.Callbacks, mirror.property('c').propertyType()); 2273291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertEquals('function', mirror.property('c').getter().type()); 2283291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertEquals('function', mirror.property('c').setter().type()); 2293291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertEquals('function (){throw \'c\';}', mirror.property('c').getter().source()); 2303291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertEquals('function (){throw \'c\';}', mirror.property('c').setter().source()); 2319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test objects with native accessors. 2339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.commirror = debug.MakeMirror(new String('abc')); 2349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertTrue(mirror instanceof debug.ObjectMirror); 2353291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertFalse(mirror.property('length').hasGetter()); 2363291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertFalse(mirror.property('length').hasSetter()); 2373291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertTrue(mirror.property('length').isNative()); 2389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals('a', mirror.property(0).value().value()); 2399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals('b', mirror.property(1).value().value()); 2409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals('c', mirror.property(2).value().value()); 241de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org 242de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org// Test value wrapper internal properties. 243de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgmirror = debug.MakeMirror(Object("Capybara")); 244de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgvar ip = mirror.internalProperties(); 245de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals(1, ip.length); 246de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals("[[PrimitiveValue]]", ip[0].name()); 247de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals("string", ip[0].value().type()); 248de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals("Capybara", ip[0].value().value()); 249de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org 250de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org// Test bound function internal properties. 251de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgmirror = debug.MakeMirror(Number.bind(Array, 2)); 252de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgip = mirror.internalProperties(); 253de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals(3, ip.length); 254de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgvar property_map = {}; 255de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgfor (var i = 0; i < ip.length; i++) { 256de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org property_map[ip[i].name()] = ip[i]; 257de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org} 258de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertTrue("[[BoundThis]]" in property_map); 259de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals("function", property_map["[[BoundThis]]"].value().type()); 260de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals(Array, property_map["[[BoundThis]]"].value().value()); 261de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertTrue("[[TargetFunction]]" in property_map); 262de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals("function", property_map["[[TargetFunction]]"].value().type()); 263de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals(Number, property_map["[[TargetFunction]]"].value().value()); 264de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertTrue("[[BoundArgs]]" in property_map); 265de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals("object", property_map["[[BoundArgs]]"].value().type()); 266de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals(1, property_map["[[BoundArgs]]"].value().value().length); 267