OLD | NEW |
1 // Copyright 2006-2012 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Handle id counters. | 5 // Handle id counters. |
6 var next_handle_ = 0; | 6 var next_handle_ = 0; |
7 var next_transient_handle_ = -1; | 7 var next_transient_handle_ = -1; |
8 | 8 |
9 // Mirror cache. | 9 // Mirror cache. |
10 var mirror_cache_ = []; | 10 var mirror_cache_ = []; |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 } else if (IS_REGEXP(value)) { | 78 } else if (IS_REGEXP(value)) { |
79 mirror = new RegExpMirror(value); | 79 mirror = new RegExpMirror(value); |
80 } else if (IS_ERROR(value)) { | 80 } else if (IS_ERROR(value)) { |
81 mirror = new ErrorMirror(value); | 81 mirror = new ErrorMirror(value); |
82 } else if (IS_SCRIPT(value)) { | 82 } else if (IS_SCRIPT(value)) { |
83 mirror = new ScriptMirror(value); | 83 mirror = new ScriptMirror(value); |
84 } else if (IS_MAP(value) || IS_WEAKMAP(value)) { | 84 } else if (IS_MAP(value) || IS_WEAKMAP(value)) { |
85 mirror = new MapMirror(value); | 85 mirror = new MapMirror(value); |
86 } else if (IS_SET(value) || IS_WEAKSET(value)) { | 86 } else if (IS_SET(value) || IS_WEAKSET(value)) { |
87 mirror = new SetMirror(value); | 87 mirror = new SetMirror(value); |
| 88 } else if (IS_MAP_ITERATOR(value) || IS_SET_ITERATOR(value)) { |
| 89 mirror = new IteratorMirror(value); |
88 } else if (ObjectIsPromise(value)) { | 90 } else if (ObjectIsPromise(value)) { |
89 mirror = new PromiseMirror(value); | 91 mirror = new PromiseMirror(value); |
90 } else if (IS_GENERATOR(value)) { | 92 } else if (IS_GENERATOR(value)) { |
91 mirror = new GeneratorMirror(value); | 93 mirror = new GeneratorMirror(value); |
92 } else { | 94 } else { |
93 mirror = new ObjectMirror(value, OBJECT_TYPE, opt_transient); | 95 mirror = new ObjectMirror(value, OBJECT_TYPE, opt_transient); |
94 } | 96 } |
95 | 97 |
96 if (mirror_cache_enabled_) mirror_cache_[mirror.handle()] = mirror; | 98 if (mirror_cache_enabled_) mirror_cache_[mirror.handle()] = mirror; |
97 return mirror; | 99 return mirror; |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 var ERROR_TYPE = 'error'; | 158 var ERROR_TYPE = 'error'; |
157 var PROPERTY_TYPE = 'property'; | 159 var PROPERTY_TYPE = 'property'; |
158 var INTERNAL_PROPERTY_TYPE = 'internalProperty'; | 160 var INTERNAL_PROPERTY_TYPE = 'internalProperty'; |
159 var FRAME_TYPE = 'frame'; | 161 var FRAME_TYPE = 'frame'; |
160 var SCRIPT_TYPE = 'script'; | 162 var SCRIPT_TYPE = 'script'; |
161 var CONTEXT_TYPE = 'context'; | 163 var CONTEXT_TYPE = 'context'; |
162 var SCOPE_TYPE = 'scope'; | 164 var SCOPE_TYPE = 'scope'; |
163 var PROMISE_TYPE = 'promise'; | 165 var PROMISE_TYPE = 'promise'; |
164 var MAP_TYPE = 'map'; | 166 var MAP_TYPE = 'map'; |
165 var SET_TYPE = 'set'; | 167 var SET_TYPE = 'set'; |
| 168 var ITERATOR_TYPE = 'iterator'; |
166 var GENERATOR_TYPE = 'generator'; | 169 var GENERATOR_TYPE = 'generator'; |
167 | 170 |
168 // Maximum length when sending strings through the JSON protocol. | 171 // Maximum length when sending strings through the JSON protocol. |
169 var kMaxProtocolStringLength = 80; | 172 var kMaxProtocolStringLength = 80; |
170 | 173 |
171 // Different kind of properties. | 174 // Different kind of properties. |
172 var PropertyKind = {}; | 175 var PropertyKind = {}; |
173 PropertyKind.Named = 1; | 176 PropertyKind.Named = 1; |
174 PropertyKind.Indexed = 2; | 177 PropertyKind.Indexed = 2; |
175 | 178 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 // - ObjectMirror | 213 // - ObjectMirror |
211 // - FunctionMirror | 214 // - FunctionMirror |
212 // - UnresolvedFunctionMirror | 215 // - UnresolvedFunctionMirror |
213 // - ArrayMirror | 216 // - ArrayMirror |
214 // - DateMirror | 217 // - DateMirror |
215 // - RegExpMirror | 218 // - RegExpMirror |
216 // - ErrorMirror | 219 // - ErrorMirror |
217 // - PromiseMirror | 220 // - PromiseMirror |
218 // - MapMirror | 221 // - MapMirror |
219 // - SetMirror | 222 // - SetMirror |
| 223 // - IteratorMirror |
220 // - GeneratorMirror | 224 // - GeneratorMirror |
221 // - PropertyMirror | 225 // - PropertyMirror |
222 // - InternalPropertyMirror | 226 // - InternalPropertyMirror |
223 // - FrameMirror | 227 // - FrameMirror |
224 // - ScriptMirror | 228 // - ScriptMirror |
225 | 229 |
226 | 230 |
227 /** | 231 /** |
228 * Base class for all mirror objects. | 232 * Base class for all mirror objects. |
229 * @param {string} type The type of the mirror | 233 * @param {string} type The type of the mirror |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
449 /** | 453 /** |
450 * Check whether the mirror reflects a set. | 454 * Check whether the mirror reflects a set. |
451 * @returns {boolean} True if the mirror reflects a set | 455 * @returns {boolean} True if the mirror reflects a set |
452 */ | 456 */ |
453 Mirror.prototype.isSet = function() { | 457 Mirror.prototype.isSet = function() { |
454 return this instanceof SetMirror; | 458 return this instanceof SetMirror; |
455 }; | 459 }; |
456 | 460 |
457 | 461 |
458 /** | 462 /** |
| 463 * Check whether the mirror reflects an iterator. |
| 464 * @returns {boolean} True if the mirror reflects an iterator |
| 465 */ |
| 466 Mirror.prototype.isIterator = function() { |
| 467 return this instanceof IteratorMirror; |
| 468 }; |
| 469 |
| 470 |
| 471 /** |
459 * Allocate a handle id for this object. | 472 * Allocate a handle id for this object. |
460 */ | 473 */ |
461 Mirror.prototype.allocateHandle_ = function() { | 474 Mirror.prototype.allocateHandle_ = function() { |
462 if (mirror_cache_enabled_) this.handle_ = next_handle_++; | 475 if (mirror_cache_enabled_) this.handle_ = next_handle_++; |
463 }; | 476 }; |
464 | 477 |
465 | 478 |
466 /** | 479 /** |
467 * Allocate a transient handle id for this object. Transient handles are | 480 * Allocate a transient handle id for this object. Transient handles are |
468 * negative. | 481 * negative. |
(...skipping 867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1336 return result; | 1349 return result; |
1337 }; | 1350 }; |
1338 | 1351 |
1339 | 1352 |
1340 function SetMirror(value) { | 1353 function SetMirror(value) { |
1341 %_CallFunction(this, value, SET_TYPE, ObjectMirror); | 1354 %_CallFunction(this, value, SET_TYPE, ObjectMirror); |
1342 } | 1355 } |
1343 inherits(SetMirror, ObjectMirror); | 1356 inherits(SetMirror, ObjectMirror); |
1344 | 1357 |
1345 | 1358 |
| 1359 function IteratorGetValues_(iter, next_function) { |
| 1360 var result = []; |
| 1361 var next; |
| 1362 while (!(next = %_CallFunction(iter, next_function)).done) { |
| 1363 result.push(next.value); |
| 1364 } |
| 1365 return result; |
| 1366 } |
| 1367 |
| 1368 |
1346 /** | 1369 /** |
1347 * Returns an array of elements of a set. | 1370 * Returns an array of elements of a set. |
1348 * This will keep elements alive for WeakSets. | 1371 * This will keep elements alive for WeakSets. |
1349 * | 1372 * |
1350 * @returns {Array.<Object>} Array of elements of a set. | 1373 * @returns {Array.<Object>} Array of elements of a set. |
1351 */ | 1374 */ |
1352 SetMirror.prototype.values = function() { | 1375 SetMirror.prototype.values = function() { |
1353 if (IS_WEAKSET(this.value_)) { | 1376 if (IS_WEAKSET(this.value_)) { |
1354 return %GetWeakSetValues(this.value_); | 1377 return %GetWeakSetValues(this.value_); |
1355 } | 1378 } |
1356 | 1379 |
1357 var result = []; | |
1358 var iter = %_CallFunction(this.value_, builtins.SetValues); | 1380 var iter = %_CallFunction(this.value_, builtins.SetValues); |
1359 var next; | 1381 return IteratorGetValues_(iter, builtins.SetIteratorNextJS); |
1360 while (!(next = iter.next()).done) { | |
1361 result.push(next.value); | |
1362 } | |
1363 return result; | |
1364 }; | 1382 }; |
1365 | 1383 |
1366 | 1384 |
| 1385 function IteratorMirror(value) { |
| 1386 %_CallFunction(this, value, ITERATOR_TYPE, ObjectMirror); |
| 1387 } |
| 1388 inherits(IteratorMirror, ObjectMirror); |
| 1389 |
| 1390 |
| 1391 /** |
| 1392 * Returns a preview of elements of an iterator. |
| 1393 * Does not change the backing iterator state. |
| 1394 * |
| 1395 * @returns {Array.<Object>} Array of elements of an iterator. |
| 1396 */ |
| 1397 IteratorMirror.prototype.preview = function() { |
| 1398 if (IS_MAP_ITERATOR(this.value_)) { |
| 1399 return IteratorGetValues_(%MapIteratorClone(this.value_), |
| 1400 builtins.MapIteratorNextJS); |
| 1401 } else if (IS_SET_ITERATOR(this.value_)) { |
| 1402 return IteratorGetValues_(%SetIteratorClone(this.value_), |
| 1403 builtins.SetIteratorNextJS); |
| 1404 } |
| 1405 }; |
| 1406 |
| 1407 |
1367 /** | 1408 /** |
1368 * Mirror object for a Generator object. | 1409 * Mirror object for a Generator object. |
1369 * @param {Object} data The Generator object | 1410 * @param {Object} data The Generator object |
1370 * @constructor | 1411 * @constructor |
1371 * @extends Mirror | 1412 * @extends Mirror |
1372 */ | 1413 */ |
1373 function GeneratorMirror(value) { | 1414 function GeneratorMirror(value) { |
1374 %_CallFunction(this, value, GENERATOR_TYPE, ObjectMirror); | 1415 %_CallFunction(this, value, GENERATOR_TYPE, ObjectMirror); |
1375 } | 1416 } |
1376 inherits(GeneratorMirror, ObjectMirror); | 1417 inherits(GeneratorMirror, ObjectMirror); |
(...skipping 1589 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2966 } | 3007 } |
2967 if (!NUMBER_IS_FINITE(value)) { | 3008 if (!NUMBER_IS_FINITE(value)) { |
2968 if (value > 0) { | 3009 if (value > 0) { |
2969 return 'Infinity'; | 3010 return 'Infinity'; |
2970 } else { | 3011 } else { |
2971 return '-Infinity'; | 3012 return '-Infinity'; |
2972 } | 3013 } |
2973 } | 3014 } |
2974 return value; | 3015 return value; |
2975 } | 3016 } |
OLD | NEW |