1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 17:17:44 +00:00

LibJS: Implement Intl %SegmentsPrototype%[@@iterator]

This commit is contained in:
Idan Horowitz 2022-01-30 02:24:18 +02:00 committed by Linus Groh
parent 6c26a02aa8
commit 4ba4e4c777
3 changed files with 34 additions and 0 deletions

View file

@ -5,6 +5,7 @@
*/
#include <LibJS/Runtime/GlobalObject.h>
#include <LibJS/Runtime/Intl/SegmentIterator.h>
#include <LibJS/Runtime/Intl/Segments.h>
#include <LibJS/Runtime/Intl/SegmentsPrototype.h>
@ -19,6 +20,28 @@ SegmentsPrototype::SegmentsPrototype(GlobalObject& global_object)
void SegmentsPrototype::initialize(GlobalObject& global_object)
{
Object::initialize(global_object);
auto& vm = this->vm();
u8 attr = Attribute::Writable | Attribute::Configurable;
define_native_function(*vm.well_known_symbol_iterator(), symbol_iterator, 0, attr);
}
// 18.5.2.2 %SegmentsPrototype% [ @@iterator ] ( ), https://tc39.es/ecma402/#sec-%segmentsprototype%-@@iterator
JS_DEFINE_NATIVE_FUNCTION(SegmentsPrototype::symbol_iterator)
{
// 1. Let segments be the this value.
// 2. Perform ? RequireInternalSlot(segments, [[SegmentsSegmenter]]).
auto* segments = TRY(typed_this_object(global_object));
// 3. Let segmenter be segments.[[SegmentsSegmenter]].
auto& segmenter = segments->segments_segmenter();
// 4. Let string be segments.[[SegmentsString]].
auto& string = segments->segments_string();
// 5. Return ! CreateSegmentIterator(segmenter, string).
return SegmentIterator::create(global_object, segmenter, string);
}
}

View file

@ -18,6 +18,9 @@ public:
explicit SegmentsPrototype(GlobalObject&);
virtual void initialize(GlobalObject&) override;
virtual ~SegmentsPrototype() override = default;
private:
JS_DECLARE_NATIVE_FUNCTION(symbol_iterator);
};
}

View file

@ -9,4 +9,12 @@ describe("correct behavior", () => {
Object.getPrototypeOf(segmenter.segment("friends"))
);
});
test("returns segments object segment iterator", () => {
const segmenter = new Intl.Segmenter();
const segments = segmenter.segment("hello friends!");
expect(Object.getPrototypeOf(segments[Symbol.iterator]())[Symbol.toStringTag]).toBe(
"Segmenter String Iterator"
);
});
});