Index: src/mirror-debugger.js |
diff --git a/src/mirror-debugger.js b/src/mirror-debugger.js |
index c36d6fd720b7bf1096de432cd180b797a0d77ad8..da031d3383b55321827fee2d8bbb8e14477e7049 100644 |
--- a/src/mirror-debugger.js |
+++ b/src/mirror-debugger.js |
@@ -85,6 +85,8 @@ function MakeMirror(value, opt_transient) { |
mirror = new MapMirror(value); |
} else if (IS_SET(value) || IS_WEAKSET(value)) { |
mirror = new SetMirror(value); |
+ } else if (IS_MAP_ITERATOR(value) || IS_SET_ITERATOR(value)) { |
+ mirror = new IteratorMirror(value); |
} else if (ObjectIsPromise(value)) { |
mirror = new PromiseMirror(value); |
} else if (IS_GENERATOR(value)) { |
@@ -163,6 +165,7 @@ var SCOPE_TYPE = 'scope'; |
var PROMISE_TYPE = 'promise'; |
var MAP_TYPE = 'map'; |
var SET_TYPE = 'set'; |
+var ITERATOR_TYPE = 'iterator'; |
var GENERATOR_TYPE = 'generator'; |
// Maximum length when sending strings through the JSON protocol. |
@@ -217,6 +220,7 @@ var ScopeType = { Global: 0, |
// - PromiseMirror |
// - MapMirror |
// - SetMirror |
+// - IteratorMirror |
// - GeneratorMirror |
// - PropertyMirror |
// - InternalPropertyMirror |
@@ -456,6 +460,15 @@ Mirror.prototype.isSet = function() { |
/** |
+ * Check whether the mirror reflects an iterator. |
+ * @returns {boolean} True if the mirror reflects an iterator |
+ */ |
+Mirror.prototype.isIterator = function() { |
+ return this instanceof IteratorMirror; |
+}; |
+ |
+ |
+/** |
* Allocate a handle id for this object. |
*/ |
Mirror.prototype.allocateHandle_ = function() { |
@@ -1343,6 +1356,16 @@ function SetMirror(value) { |
inherits(SetMirror, ObjectMirror); |
+function IteratorGetValues_(iter, next_function) { |
+ var result = []; |
+ var next; |
+ while (!(next = %_CallFunction(iter, next_function)).done) { |
+ result.push(next.value); |
+ } |
+ return result; |
+} |
+ |
+ |
/** |
* Returns an array of elements of a set. |
* This will keep elements alive for WeakSets. |
@@ -1354,13 +1377,31 @@ SetMirror.prototype.values = function() { |
return %GetWeakSetValues(this.value_); |
} |
- var result = []; |
var iter = %_CallFunction(this.value_, builtins.SetValues); |
- var next; |
- while (!(next = iter.next()).done) { |
- result.push(next.value); |
+ return IteratorGetValues_(iter, builtins.SetIteratorNextJS); |
+}; |
+ |
+ |
+function IteratorMirror(value) { |
+ %_CallFunction(this, value, ITERATOR_TYPE, ObjectMirror); |
+} |
+inherits(IteratorMirror, ObjectMirror); |
+ |
+ |
+/** |
+ * Returns a preview of elements of an iterator. |
+ * Does not change the backing iterator state. |
+ * |
+ * @returns {Array.<Object>} Array of elements of an iterator. |
+ */ |
+IteratorMirror.prototype.preview = function() { |
+ if (IS_MAP_ITERATOR(this.value_)) { |
+ return IteratorGetValues_(%MapIteratorClone(this.value_), |
+ builtins.MapIteratorNextJS); |
+ } else if (IS_SET_ITERATOR(this.value_)) { |
+ return IteratorGetValues_(%SetIteratorClone(this.value_), |
+ builtins.SetIteratorNextJS); |
} |
- return result; |
}; |