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 |