Bug 928508 - Change String.prototype.@@iterator to iterate over code points. r=jorendorff.

This commit is contained in:
André Bargull
2013-10-23 11:42:25 -05:00
parent bbc47aa7a9
commit 4de51a90f7
12 changed files with 288 additions and 21 deletions

View File

@@ -40,6 +40,51 @@ function String_repeat(count) {
return T;
}
#define STRING_ITERATOR_SLOT_ITERATED_OBJECT 0
#define STRING_ITERATOR_SLOT_NEXT_INDEX 1
// ES6 draft specification, section 21.1.3.27, version 2013-09-27.
function String_iterator() {
CheckObjectCoercible(this);
var S = ToString(this);
var iterator = NewStringIterator();
UnsafeSetReservedSlot(iterator, STRING_ITERATOR_SLOT_ITERATED_OBJECT, S);
UnsafeSetReservedSlot(iterator, STRING_ITERATOR_SLOT_NEXT_INDEX, 0);
return iterator;
}
function StringIteratorIdentity() {
return this;
}
function StringIteratorNext() {
// FIXME: Cross-compartment wrapper StringIterator objects should pass this test. Bug 924059.
if (!IsObject(this) || !IsStringIterator(this))
ThrowError(JSMSG_INCOMPATIBLE_METHOD, "StringIterator", "next", ToString(this));
var S = UnsafeGetReservedSlot(this, STRING_ITERATOR_SLOT_ITERATED_OBJECT);
var index = UnsafeGetReservedSlot(this, STRING_ITERATOR_SLOT_NEXT_INDEX);
var size = S.length;
if (index >= size) {
return { value: undefined, done: true };
}
var charCount = 1;
var first = callFunction(std_String_charCodeAt, S, index);
if (first >= 0xD800 && first <= 0xDBFF && index + 1 < size) {
var second = callFunction(std_String_charCodeAt, S, index + 1);
if (second >= 0xDC00 && second <= 0xDFFF) {
charCount = 2;
}
}
UnsafeSetReservedSlot(this, STRING_ITERATOR_SLOT_NEXT_INDEX, index + charCount);
var value = callFunction(std_String_substring, S, index, index + charCount);
return { value: value, done: false };
}
/**
* Compare this String against that String, using the locale and collation
* options provided.