Skip to content

Commit

Permalink
Fix Symbol.prototype[@@iterator]
Browse files Browse the repository at this point in the history
  • Loading branch information
HalidOdat committed Apr 10, 2023
1 parent 34d6b93 commit 1cdfc8d
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 8 deletions.
7 changes: 6 additions & 1 deletion boa_engine/src/builtins/string/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2161,7 +2161,12 @@ impl String {
_: &[JsValue],
context: &mut Context<'_>,
) -> JsResult<JsValue> {
Ok(StringIterator::create_string_iterator(this.clone(), context).into())
// 1. Let O be ? RequireObjectCoercible(this value).
let o = this.require_object_coercible()?;
// 2. Let s be ? ToString(O).
let s = o.to_string(context)?;

Ok(StringIterator::create_string_iterator(s, context).into())
}
}

Expand Down
15 changes: 8 additions & 7 deletions boa_engine/src/builtins/string/string_iterator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@ use crate::{
builtins::{iterable::create_iter_result_object, BuiltInBuilder, IntrinsicObject},
context::intrinsics::Intrinsics,
error::JsNativeError,
js_string,
object::{JsObject, ObjectData},
property::Attribute,
symbol::JsSymbol,
Context, JsResult, JsValue,
Context, JsResult, JsString, JsValue,
};
use boa_gc::{Finalize, Trace};
use boa_profiler::Profiler;
Expand All @@ -25,7 +26,7 @@ use boa_profiler::Profiler;
/// [spec]: https://tc39.es/ecma262/#sec-string-iterator-objects
#[derive(Debug, Clone, Finalize, Trace)]
pub struct StringIterator {
string: JsValue,
string: JsString,
next_index: usize,
}

Expand All @@ -51,7 +52,7 @@ impl IntrinsicObject for StringIterator {

impl StringIterator {
/// Create a new `StringIterator`.
pub fn create_string_iterator(string: JsValue, context: &mut Context<'_>) -> JsObject {
pub fn create_string_iterator(string: JsString, context: &mut Context<'_>) -> JsObject {
JsObject::from_proto_and_data(
context
.intrinsics()
Expand All @@ -73,18 +74,18 @@ impl StringIterator {
.and_then(|obj| obj.as_string_iterator_mut())
.ok_or_else(|| JsNativeError::typ().with_message("`this` is not an ArrayIterator"))?;

if string_iterator.string.is_undefined() {
if string_iterator.string.is_empty() {
return Ok(create_iter_result_object(
JsValue::undefined(),
true,
context,
));
}
let native_string = string_iterator.string.to_string(context)?;
let native_string = &string_iterator.string;
let len = native_string.len();
let position = string_iterator.next_index;
if position >= len {
string_iterator.string = JsValue::undefined();
string_iterator.string = js_string!();
return Ok(create_iter_result_object(
JsValue::undefined(),
true,
Expand All @@ -94,7 +95,7 @@ impl StringIterator {
let code_point = native_string.code_point_at(position);
string_iterator.next_index += code_point.code_unit_count();
let result_string = crate::builtins::string::String::substring(
&string_iterator.string,
&string_iterator.string.clone().into(),
&[position.into(), string_iterator.next_index.into()],
context,
)?;
Expand Down
1 change: 1 addition & 0 deletions boa_engine/src/object/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -543,6 +543,7 @@ impl ObjectData {
}

/// Create the `StringIterator` object data
#[must_use]
pub fn string_iterator(string_iterator: StringIterator) -> Self {
Self {
kind: ObjectKind::StringIterator(string_iterator),
Expand Down

0 comments on commit 1cdfc8d

Please sign in to comment.