SegmentIterator.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  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. // 18.6.1 CreateSegmentIterator ( segmenter, string ), https://tc39.es/ecma402/#sec-createsegmentsobject
  11. NonnullGCPtr<SegmentIterator> SegmentIterator::create(Realm& realm, Segmenter& segmenter, Utf16View const& string, Segments const& segments)
  12. {
  13. // 1. Let internalSlotsList be « [[IteratingSegmenter]], [[IteratedString]], [[IteratedStringNextSegmentCodeUnitIndex]] ».
  14. // 2. Let iterator be OrdinaryObjectCreate(%SegmentIteratorPrototype%, internalSlotsList).
  15. // 3. Set iterator.[[IteratingSegmenter]] to segmenter.
  16. // 4. Set iterator.[[IteratedString]] to string.
  17. // 5. Set iterator.[[IteratedStringNextSegmentCodeUnitIndex]] to 0.
  18. // 6. Return iterator.
  19. return realm.heap().allocate<SegmentIterator>(realm, realm, segmenter, move(string), segments);
  20. }
  21. // 18.6 Segment Iterator Objects, https://tc39.es/ecma402/#sec-segment-iterator-objects
  22. SegmentIterator::SegmentIterator(Realm& realm, Segmenter& segmenter, Utf16View const& string, Segments const& segments)
  23. : Object(ConstructWithPrototypeTag::Tag, realm.intrinsics().intl_segment_iterator_prototype())
  24. , m_iterating_segmenter(segmenter)
  25. , m_iterated_string(string)
  26. , m_segments(segments)
  27. {
  28. }
  29. void SegmentIterator::visit_edges(Cell::Visitor& visitor)
  30. {
  31. Base::visit_edges(visitor);
  32. visitor.visit(m_iterating_segmenter);
  33. visitor.visit(m_segments);
  34. }
  35. }