diff --git a/Userland/Libraries/LibJS/CMakeLists.txt b/Userland/Libraries/LibJS/CMakeLists.txt index 9ba77f12ce..efc496e64e 100644 --- a/Userland/Libraries/LibJS/CMakeLists.txt +++ b/Userland/Libraries/LibJS/CMakeLists.txt @@ -119,6 +119,8 @@ set(SOURCES Runtime/Intl/SegmenterConstructor.cpp Runtime/Intl/SegmenterPrototype.cpp Runtime/Intl/Segments.cpp + Runtime/Intl/SegmentIterator.cpp + Runtime/Intl/SegmentIteratorPrototype.cpp Runtime/Intl/SegmentsPrototype.cpp Runtime/IteratorOperations.cpp Runtime/IteratorPrototype.cpp diff --git a/Userland/Libraries/LibJS/Forward.h b/Userland/Libraries/LibJS/Forward.h index 91197d7ca0..188fb0224b 100644 --- a/Userland/Libraries/LibJS/Forward.h +++ b/Userland/Libraries/LibJS/Forward.h @@ -94,6 +94,7 @@ __JS_ENUMERATE(Iterator, iterator) \ __JS_ENUMERATE(ArrayIterator, array_iterator) \ __JS_ENUMERATE(AsyncIterator, async_iterator) \ + __JS_ENUMERATE(Intl::SegmentIterator, intl_segment_iterator) \ __JS_ENUMERATE(MapIterator, map_iterator) \ __JS_ENUMERATE(RegExpStringIterator, regexp_string_iterator) \ __JS_ENUMERATE(SetIterator, set_iterator) \ diff --git a/Userland/Libraries/LibJS/Runtime/GlobalObject.cpp b/Userland/Libraries/LibJS/Runtime/GlobalObject.cpp index d5c43448f1..dc3abdac9e 100644 --- a/Userland/Libraries/LibJS/Runtime/GlobalObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/GlobalObject.cpp @@ -67,6 +67,7 @@ #include #include #include +#include #include #include #include diff --git a/Userland/Libraries/LibJS/Runtime/Intl/SegmentIterator.cpp b/Userland/Libraries/LibJS/Runtime/Intl/SegmentIterator.cpp new file mode 100644 index 0000000000..4c3be7e6de --- /dev/null +++ b/Userland/Libraries/LibJS/Runtime/Intl/SegmentIterator.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2022, Idan Horowitz + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include + +namespace JS::Intl { + +// 18.6.1 CreateSegmentIterator ( segmenter, string ), https://tc39.es/ecma402/#sec-createsegmentsobject +SegmentIterator* SegmentIterator::create(GlobalObject& global_object, Segmenter& segmenter, String string) +{ + // 1. Let internalSlotsList be « [[IteratingSegmenter]], [[IteratedString]], [[IteratedStringNextSegmentCodeUnitIndex]] ». + // 2. Let iterator be ! OrdinaryObjectCreate(%SegmentIteratorPrototype%, internalSlotsList). + // 3. Set iterator.[[IteratingSegmenter]] to segmenter. + // 4. Set iterator.[[IteratedString]] to string. + // 5. Set iterator.[[IteratedStringNextSegmentCodeUnitIndex]] to 0. + // 6. Return iterator. + return global_object.heap().allocate(global_object, global_object, segmenter, move(string)); +} + +// 18.6 Segment Iterator Objects, https://tc39.es/ecma402/#sec-segment-iterator-objects +SegmentIterator::SegmentIterator(GlobalObject& global_object, Segmenter& segmenter, String string) + : Object(*global_object.intl_segment_iterator_prototype()) + , m_iterating_segmenter(segmenter) + , m_iterated_string(move(string)) +{ +} + +void SegmentIterator::visit_edges(Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); + visitor.visit(&m_iterating_segmenter); +} + +} diff --git a/Userland/Libraries/LibJS/Runtime/Intl/SegmentIterator.h b/Userland/Libraries/LibJS/Runtime/Intl/SegmentIterator.h new file mode 100644 index 0000000000..30cd05488b --- /dev/null +++ b/Userland/Libraries/LibJS/Runtime/Intl/SegmentIterator.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2022, Idan Horowitz + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace JS::Intl { + +class SegmentIterator final : public Object { + JS_OBJECT(SegmentIterator, Object); + +public: + static SegmentIterator* create(GlobalObject&, Segmenter&, String); + + SegmentIterator(GlobalObject&, Segmenter&, String); + virtual ~SegmentIterator() override = default; + + Segmenter const& iterating_segmenter() const { return m_iterating_segmenter; } + String const& iterated_string() const { return m_iterated_string; } + size_t iterated_string_next_segment_code_unit_index() const { return m_iterated_string_next_segment_code_unit_index; } + +private: + virtual void visit_edges(Cell::Visitor&) override; + + Segmenter& m_iterating_segmenter; // [[IteratingSegmenter]] + String m_iterated_string; // [[IteratedString]] + size_t m_iterated_string_next_segment_code_unit_index { 0 }; // [[IteratedStringNextSegmentCodeUnitIndex]] +}; + +} diff --git a/Userland/Libraries/LibJS/Runtime/Intl/SegmentIteratorPrototype.cpp b/Userland/Libraries/LibJS/Runtime/Intl/SegmentIteratorPrototype.cpp new file mode 100644 index 0000000000..fc81407f0c --- /dev/null +++ b/Userland/Libraries/LibJS/Runtime/Intl/SegmentIteratorPrototype.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022, Idan Horowitz + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace JS::Intl { + +// 18.6.2 The %SegmentIteratorPrototype% Object, https://tc39.es/ecma402/#sec-%segmentiteratorprototype%-object +SegmentIteratorPrototype::SegmentIteratorPrototype(GlobalObject& global_object) + : PrototypeObject(*global_object.iterator_prototype()) +{ +} + +void SegmentIteratorPrototype::initialize(GlobalObject& global_object) +{ + Object::initialize(global_object); + + auto& vm = this->vm(); + + // 18.6.2.2 %SegmentIteratorPrototype% [ @@toStringTag ], https://tc39.es/ecma402/#sec-%segmentiteratorprototype%.@@tostringtag + define_direct_property(*vm.well_known_symbol_to_string_tag(), js_string(global_object.heap(), "Segmenter String Iterator"), Attribute::Configurable); +} + +} diff --git a/Userland/Libraries/LibJS/Runtime/Intl/SegmentIteratorPrototype.h b/Userland/Libraries/LibJS/Runtime/Intl/SegmentIteratorPrototype.h new file mode 100644 index 0000000000..1ac12ef7bc --- /dev/null +++ b/Userland/Libraries/LibJS/Runtime/Intl/SegmentIteratorPrototype.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2022, Idan Horowitz + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace JS::Intl { + +class SegmentIteratorPrototype final : public PrototypeObject { + JS_PROTOTYPE_OBJECT(SegmentIteratorPrototype, SegmentIterator, SegmentIterator); + +public: + explicit SegmentIteratorPrototype(GlobalObject&); + virtual void initialize(GlobalObject&) override; + virtual ~SegmentIteratorPrototype() override = default; +}; + +}