| OLD | NEW |
| 1 // Copyright 2008 the V8 project authors. All rights reserved. | 1 // Copyright 2008 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 27 | 27 |
| 28 // Flags: --expose-debug-as debug | 28 // Flags: --expose-debug-as debug |
| 29 // Test the mirror object for objects | 29 // Test the mirror object for objects |
| 30 | 30 |
| 31 function testObjectMirror(o, cls_name, ctor_name, hasSpecialProperties) { | 31 function MirrorRefCache(json_refs) { |
| 32 var tmp = eval('(' + json_refs + ')'); |
| 33 this.refs_ = []; |
| 34 for (var i = 0; i < tmp.length; i++) { |
| 35 this.refs_[tmp[i].handle] = tmp[i]; |
| 36 } |
| 37 } |
| 38 |
| 39 MirrorRefCache.prototype.lookup = function(handle) { |
| 40 return this.refs_[handle]; |
| 41 } |
| 42 |
| 43 function testObjectMirror(obj, cls_name, ctor_name, hasSpecialProperties) { |
| 32 // Create mirror and JSON representation. | 44 // Create mirror and JSON representation. |
| 33 var mirror = debug.MakeMirror(o); | 45 var mirror = debug.MakeMirror(obj); |
| 34 var json = mirror.toJSONProtocol(true); | 46 var serializer = debug.MakeMirrorSerializer(); |
| 47 var json = serializer.serializeValue(mirror); |
| 48 var refs = new MirrorRefCache(serializer.serializeReferencedObjects()); |
| 35 | 49 |
| 36 // Check the mirror hierachy. | 50 // Check the mirror hierachy. |
| 37 assertTrue(mirror instanceof debug.Mirror); | 51 assertTrue(mirror instanceof debug.Mirror, 'Unexpected mirror hierachy'); |
| 38 assertTrue(mirror instanceof debug.ValueMirror); | 52 assertTrue(mirror instanceof debug.ValueMirror, 'Unexpected mirror hierachy'); |
| 39 assertTrue(mirror instanceof debug.ObjectMirror); | 53 assertTrue(mirror instanceof debug.ObjectMirror, 'Unexpected mirror hierachy')
; |
| 40 | 54 |
| 41 // Check the mirror properties. | 55 // Check the mirror properties. |
| 42 assertTrue(mirror.isObject()); | 56 assertTrue(mirror.isObject(), 'Unexpected mirror'); |
| 43 assertEquals('object', mirror.type()); | 57 assertEquals('object', mirror.type(), 'Unexpected mirror type'); |
| 44 assertFalse(mirror.isPrimitive()); | 58 assertFalse(mirror.isPrimitive(), 'Unexpected primitive mirror'); |
| 45 assertEquals(cls_name, mirror.className()); | 59 assertEquals(cls_name, mirror.className(), 'Unexpected mirror class name'); |
| 46 assertTrue(mirror.constructorFunction() instanceof debug.ObjectMirror); | 60 assertTrue(mirror.constructorFunction() instanceof debug.ObjectMirror, 'Unexpe
cted mirror hierachy'); |
| 47 assertTrue(mirror.protoObject() instanceof debug.Mirror); | 61 assertEquals(ctor_name, mirror.constructorFunction().name(), 'Unexpected const
ructor function name'); |
| 48 assertTrue(mirror.prototypeObject() instanceof debug.Mirror); | 62 assertTrue(mirror.protoObject() instanceof debug.Mirror, 'Unexpected mirror hi
erachy'); |
| 49 assertFalse(mirror.hasNamedInterceptor(), "hasNamedInterceptor()"); | 63 assertTrue(mirror.prototypeObject() instanceof debug.Mirror, 'Unexpected mirro
r hierachy'); |
| 50 assertFalse(mirror.hasIndexedInterceptor(), "hasIndexedInterceptor()"); | 64 assertFalse(mirror.hasNamedInterceptor(), 'No named interceptor expected'); |
| 65 assertFalse(mirror.hasIndexedInterceptor(), 'No indexed interceptor expected')
; |
| 51 | 66 |
| 52 var names = mirror.propertyNames(); | 67 var names = mirror.propertyNames(); |
| 53 var properties = mirror.properties() | 68 var properties = mirror.properties() |
| 54 assertEquals(names.length, properties.length); | 69 assertEquals(names.length, properties.length); |
| 55 for (var i = 0; i < properties.length; i++) { | 70 for (var i = 0; i < properties.length; i++) { |
| 56 assertTrue(properties[i] instanceof debug.Mirror); | 71 assertTrue(properties[i] instanceof debug.Mirror, 'Unexpected mirror hierach
y'); |
| 57 assertTrue(properties[i] instanceof debug.PropertyMirror); | 72 assertTrue(properties[i] instanceof debug.PropertyMirror, 'Unexpected mirror
hierachy'); |
| 58 assertEquals('property', properties[i].type()); | 73 assertEquals('property', properties[i].type(), 'Unexpected mirror type'); |
| 59 assertEquals(names[i], properties[i].name()); | 74 assertEquals(names[i], properties[i].name(), 'Unexpected property name'); |
| 60 } | 75 } |
| 61 | 76 |
| 62 for (var p in o) { | 77 for (var p in obj) { |
| 63 var property_mirror = mirror.property(p); | 78 var property_mirror = mirror.property(p); |
| 64 assertTrue(property_mirror instanceof debug.PropertyMirror); | 79 assertTrue(property_mirror instanceof debug.PropertyMirror); |
| 65 assertEquals(p, property_mirror.name()); | 80 assertEquals(p, property_mirror.name()); |
| 66 // If the object has some special properties don't test for these. | 81 // If the object has some special properties don't test for these. |
| 67 if (!hasSpecialProperties) { | 82 if (!hasSpecialProperties) { |
| 68 assertEquals(0, property_mirror.attributes(), property_mirror.name()); | 83 assertEquals(0, property_mirror.attributes(), property_mirror.name()); |
| 69 assertFalse(property_mirror.isReadOnly()); | 84 assertFalse(property_mirror.isReadOnly()); |
| 70 assertTrue(property_mirror.isEnum()); | 85 assertTrue(property_mirror.isEnum()); |
| 71 assertTrue(property_mirror.canDelete()); | 86 assertTrue(property_mirror.canDelete()); |
| 72 } | 87 } |
| 73 } | 88 } |
| 74 | 89 |
| 75 // Parse JSON representation and check. | 90 // Parse JSON representation and check. |
| 76 var fromJSON = eval('(' + json + ')'); | 91 var fromJSON = eval('(' + json + ')'); |
| 77 assertEquals('object', fromJSON.type); | 92 assertEquals('object', fromJSON.type, 'Unexpected mirror type in JSON'); |
| 78 assertEquals(cls_name, fromJSON.className); | 93 assertEquals(cls_name, fromJSON.className, 'Unexpected mirror class name in JS
ON'); |
| 79 assertEquals('function', fromJSON.constructorFunction.type); | 94 assertEquals(mirror.constructorFunction().handle(), fromJSON.constructorFuncti
on.ref, 'Unexpected constructor function handle in JSON'); |
| 80 if (ctor_name !== undefined) | 95 assertEquals('function', refs.lookup(fromJSON.constructorFunction.ref).type, '
Unexpected constructor function type in JSON'); |
| 81 assertEquals(ctor_name, fromJSON.constructorFunction.name); | 96 assertEquals(ctor_name, refs.lookup(fromJSON.constructorFunction.ref).name, 'U
nexpected constructor function name in JSON'); |
| 82 assertEquals(void 0, fromJSON.namedInterceptor); | 97 assertEquals(mirror.protoObject().handle(), fromJSON.protoObject.ref, 'Unexpec
ted proto object handle in JSON'); |
| 83 assertEquals(void 0, fromJSON.indexedInterceptor); | 98 assertEquals(mirror.protoObject().type(), refs.lookup(fromJSON.protoObject.ref
).type, 'Unexpected proto object type in JSON'); |
| 84 | 99 assertEquals(mirror.prototypeObject().handle(), fromJSON.prototypeObject.ref,
'Unexpected prototype object handle in JSON'); |
| 85 // For array the index properties are seperate from named properties. | 100 assertEquals(mirror.prototypeObject().type(), refs.lookup(fromJSON.prototypeOb
ject.ref).type, 'Unexpected prototype object type in JSON'); |
| 86 if (!cls_name == 'Array') { | 101 assertEquals(void 0, fromJSON.namedInterceptor, 'No named interceptor expected
in JSON'); |
| 87 assertEquals(names.length, fromJSON.properties.length, 'Some properties miss
ing in JSON'); | 102 assertEquals(void 0, fromJSON.indexedInterceptor, 'No indexed interceptor expe
cted in JSON'); |
| 88 } | |
| 89 | 103 |
| 90 // Check that the serialization contains all properties. | 104 // Check that the serialization contains all properties. |
| 105 assertEquals(names.length, fromJSON.properties.length, 'Some properties missin
g in JSON'); |
| 91 for (var i = 0; i < fromJSON.properties.length; i++) { | 106 for (var i = 0; i < fromJSON.properties.length; i++) { |
| 92 var name = fromJSON.properties[i].name; | 107 var name = fromJSON.properties[i].name; |
| 93 if (!name) name = fromJSON.properties[i].index; | 108 if (!name) name = fromJSON.properties[i].index; |
| 94 var found = false; | 109 var found = false; |
| 95 for (var j = 0; j < names.length; j++) { | 110 for (var j = 0; j < names.length; j++) { |
| 96 if (names[j] == name) { | 111 if (names[j] == name) { |
| 97 assertEquals(properties[i].value().type(), fromJSON.properties[i].value.
type); | 112 // Check that serialized handle is correct. |
| 98 // If property type is normal nothing is serialized. | 113 assertEquals(properties[i].value().handle(), fromJSON.properties[i].ref,
'Unexpected serialized handle'); |
| 114 |
| 115 // Check that serialized name is correct. |
| 116 assertEquals(properties[i].name(), fromJSON.properties[i].name, 'Unexpec
ted serialized name'); |
| 117 |
| 118 // If property type is normal property type is not serialized. |
| 99 if (properties[i].propertyType() != debug.PropertyType.Normal) { | 119 if (properties[i].propertyType() != debug.PropertyType.Normal) { |
| 100 assertEquals(properties[i].propertyType(), fromJSON.properties[i].prop
ertyType); | 120 assertEquals(properties[i].propertyType(), fromJSON.properties[i].prop
ertyType, 'Unexpected serialized property type'); |
| 101 } else { | 121 } else { |
| 102 assertTrue(typeof(fromJSON.properties[i].propertyType) === 'undefined'
); | 122 assertTrue(typeof(fromJSON.properties[i].propertyType) === 'undefined'
, 'Unexpected serialized property type'); |
| 103 } | 123 } |
| 104 // If there are no attributes nothing is serialized. | 124 |
| 125 // If there are no attributes attributes are not serialized. |
| 105 if (properties[i].attributes() != debug.PropertyAttribute.None) { | 126 if (properties[i].attributes() != debug.PropertyAttribute.None) { |
| 106 assertEquals(properties[i].attributes(), fromJSON.properties[i].attrib
utes); | 127 assertEquals(properties[i].attributes(), fromJSON.properties[i].attrib
utes, 'Unexpected serialized attributes'); |
| 107 } else { | 128 } else { |
| 108 assertTrue(typeof(fromJSON.properties[i].attributes) === 'undefined'); | 129 assertTrue(typeof(fromJSON.properties[i].attributes) === 'undefined',
'Unexpected serialized attributes'); |
| 109 } | 130 } |
| 110 if (!properties[i].value().isPrimitive()) { | 131 |
| 111 // NaN is not equal to NaN. | 132 // Lookup the serialized object from the handle reference. |
| 112 if (isNaN(properties[i].value().value())) { | 133 var o = refs.lookup(fromJSON.properties[i].ref); |
| 113 assertTrue(isNaN(fromJSON.properties[i].value.value)); | 134 assertTrue(o != void 0, 'Referenced object is not serialized'); |
| 114 } else { | 135 |
| 115 assertEquals(properties[i].value().value(), fromJSON.properties[i].v
alue.value); | 136 assertEquals(properties[i].value().type(), o.type, 'Unexpected serialize
d property type for ' + name); |
| 116 } | 137 if (properties[i].value().isPrimitive()) { |
| 138 assertEquals(properties[i].value().value(), o.value, 'Unexpected seria
lized property value for ' + name); |
| 139 } else if (properties[i].value().isFunction()) { |
| 140 assertEquals(properties[i].value().source(), o.source, 'Unexpected ser
ialized property value for ' + name); |
| 117 } | 141 } |
| 118 found = true; | 142 found = true; |
| 119 } | 143 } |
| 120 } | 144 } |
| 121 assertTrue(found, '"' + name + '" not found (' + json + ')'); | 145 assertTrue(found, '"' + name + '" not found (' + json + ')'); |
| 122 } | 146 } |
| 123 } | 147 } |
| 124 | 148 |
| 125 | 149 |
| 126 function Point(x,y) { | 150 function Point(x,y) { |
| 127 this.x_ = x; | 151 this.x_ = x; |
| 128 this.y_ = y; | 152 this.y_ = y; |
| 129 } | 153 } |
| 130 | 154 |
| 131 | 155 |
| 132 // Test a number of different objects. | 156 // Test a number of different objects. |
| 133 testObjectMirror({}, 'Object', 'Object'); | 157 testObjectMirror({}, 'Object', 'Object'); |
| 134 testObjectMirror({'a':1,'b':2}, 'Object', 'Object'); | 158 testObjectMirror({'a':1,'b':2}, 'Object', 'Object'); |
| 135 testObjectMirror({'1':void 0,'2':null,'f':function pow(x,y){return Math.pow(x,y)
;}}, 'Object', 'Object'); | 159 testObjectMirror({'1':void 0,'2':null,'f':function pow(x,y){return Math.pow(x,y)
;}}, 'Object', 'Object'); |
| 136 testObjectMirror(new Point(-1.2,2.003), 'Object', 'Point'); | 160 testObjectMirror(new Point(-1.2,2.003), 'Object', 'Point'); |
| 137 testObjectMirror(this, 'global', undefined, true); // Global object has special
properties | 161 testObjectMirror(this, 'global', '', true); // Global object has special proper
ties |
| 138 testObjectMirror([], 'Array', 'Array'); | 162 testObjectMirror([], 'Array', 'Array'); |
| 139 testObjectMirror([1,2], 'Array', 'Array'); | 163 testObjectMirror([1,2], 'Array', 'Array'); |
| 140 | 164 |
| 141 // Test circular references. | 165 // Test circular references. |
| 142 o = {}; | 166 o = {}; |
| 143 o.o = o; | 167 o.o = o; |
| 144 testObjectMirror(o, 'Object', 'Object'); | 168 testObjectMirror(o, 'Object', 'Object'); |
| 145 | 169 |
| 146 // Test that non enumerable properties are part of the mirror | 170 // Test that non enumerable properties are part of the mirror |
| 147 global_mirror = debug.MakeMirror(this); | 171 global_mirror = debug.MakeMirror(this); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 | 216 |
| 193 // Test objects with native accessors. | 217 // Test objects with native accessors. |
| 194 mirror = debug.MakeMirror(new String('abc')); | 218 mirror = debug.MakeMirror(new String('abc')); |
| 195 assertTrue(mirror instanceof debug.ObjectMirror); | 219 assertTrue(mirror instanceof debug.ObjectMirror); |
| 196 assertFalse(mirror.property('length').hasGetter()); | 220 assertFalse(mirror.property('length').hasGetter()); |
| 197 assertFalse(mirror.property('length').hasSetter()); | 221 assertFalse(mirror.property('length').hasSetter()); |
| 198 assertTrue(mirror.property('length').isNative()); | 222 assertTrue(mirror.property('length').isNative()); |
| 199 assertEquals('a', mirror.property(0).value().value()); | 223 assertEquals('a', mirror.property(0).value().value()); |
| 200 assertEquals('b', mirror.property(1).value().value()); | 224 assertEquals('b', mirror.property(1).value().value()); |
| 201 assertEquals('c', mirror.property(2).value().value()); | 225 assertEquals('c', mirror.property(2).value().value()); |
| OLD | NEW |