SegmentIterator.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. /*
  2. * Copyright (c) 2022, Idan Horowitz <idan.horowitz@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibJS/Runtime/GlobalObject.h>
  7. #include <LibJS/Runtime/Intl/SegmentIterator.h>
  8. #include <LibJS/Runtime/Intl/Segments.h>
  9. namespace JS::Intl {
  10. JS_DEFINE_ALLOCATOR(SegmentIterator);
  11. // 18.6.1 CreateSegmentIterator ( segmenter, string ), https://tc39.es/ecma402/#sec-createsegmentsobject
  12. NonnullGCPtr<SegmentIterator> SegmentIterator::create(Realm& realm, Segmenter& segmenter, Utf16View const& string, Segments const& segments)
  13. {
  14. // 1. Let internalSlotsList be « [[IteratingSegmenter]], [[IteratedString]], [[IteratedStringNextSegmentCodeUnitIndex]] ».
  15. // 2. Let iterator be OrdinaryObjectCreate(%SegmentIteratorPrototype%, internalSlotsList).
  16. // 3. Set iterator.[[IteratingSegmenter]] to segmenter.
  17. // 4. Set iterator.[[IteratedString]] to string.
  18. // 5. Set iterator.[[IteratedStringNextSegmentCodeUnitIndex]] to 0.
  19. // 6. Return iterator.
  20. return realm.heap().allocate<SegmentIterator>(realm, realm, segmenter, move(string), segments);
  21. }
  22. // 18.6 Segment Iterator Objects, https://tc39.es/ecma402/#sec-segment-iterator-objects
  23. SegmentIterator::SegmentIterator(Realm& realm, Segmenter& segmenter, Utf16View const& string, Segments const& segments)
  24. : Object(ConstructWithPrototypeTag::Tag, realm.intrinsics().intl_segment_iterator_prototype())
  25. , m_iterating_segmenter(segmenter)
  26. , m_iterated_string(string)
  27. , m_segments(segments)
  28. {
  29. }
  30. void SegmentIterator::visit_edges(Cell::Visitor& visitor)
  31. {
  32. Base::visit_edges(visitor);
  33. visitor.visit(m_iterating_segmenter);
  34. visitor.visit(m_segments);
  35. }
  36. }