Bug 928508 - Change String.prototype.@@iterator to iterate over code points. r=jorendorff.
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user