ZonedDateTime.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /*
  2. * Copyright (c) 2021, Linus Groh <linusg@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibJS/Runtime/AbstractOperations.h>
  7. #include <LibJS/Runtime/GlobalObject.h>
  8. #include <LibJS/Runtime/Temporal/Instant.h>
  9. #include <LibJS/Runtime/Temporal/ZonedDateTime.h>
  10. #include <LibJS/Runtime/Temporal/ZonedDateTimeConstructor.h>
  11. namespace JS::Temporal {
  12. // 6 Temporal.ZonedDateTime Objects, https://tc39.es/proposal-temporal/#sec-temporal-zoneddatetime-objects
  13. ZonedDateTime::ZonedDateTime(BigInt& nanoseconds, Object& time_zone, Object& calendar, Object& prototype)
  14. : Object(prototype)
  15. , m_nanoseconds(nanoseconds)
  16. , m_time_zone(time_zone)
  17. , m_calendar(calendar)
  18. {
  19. }
  20. void ZonedDateTime::visit_edges(Cell::Visitor& visitor)
  21. {
  22. Base::visit_edges(visitor);
  23. visitor.visit(&m_nanoseconds);
  24. visitor.visit(&m_time_zone);
  25. visitor.visit(&m_calendar);
  26. }
  27. // 6.5.3 CreateTemporalZonedDateTime ( epochNanoseconds, timeZone, calendar [ , newTarget ] ), https://tc39.es/proposal-temporal/#sec-temporal-createtemporalzoneddatetime
  28. ZonedDateTime* create_temporal_zoned_date_time(GlobalObject& global_object, BigInt& epoch_nanoseconds, Object& time_zone, Object& calendar, FunctionObject* new_target)
  29. {
  30. auto& vm = global_object.vm();
  31. // 1. Assert: Type(epochNanoseconds) is BigInt.
  32. // 3. Assert: Type(timeZone) is Object.
  33. // 4. Assert: Type(calendar) is Object.
  34. // 2. Assert: ! IsValidEpochNanoseconds(epochNanoseconds) is true.
  35. VERIFY(is_valid_epoch_nanoseconds(epoch_nanoseconds));
  36. // 5. If newTarget is not present, set it to %Temporal.ZonedDateTime%.
  37. if (!new_target)
  38. new_target = global_object.temporal_zoned_date_time_constructor();
  39. // 6. Let object be ? OrdinaryCreateFromConstructor(newTarget, "%Temporal.ZonedDateTime.prototype%", « [[InitializedTemporalZonedDateTime]], [[Nanoseconds]], [[TimeZone]], [[Calendar]] »).
  40. // 7. Set object.[[Nanoseconds]] to epochNanoseconds.
  41. // 8. Set object.[[TimeZone]] to timeZone.
  42. // 9. Set object.[[Calendar]] to calendar.
  43. auto* object = ordinary_create_from_constructor<ZonedDateTime>(global_object, *new_target, &GlobalObject::temporal_time_zone_prototype, epoch_nanoseconds, time_zone, calendar);
  44. if (vm.exception())
  45. return {};
  46. // 10. Return object.
  47. return object;
  48. }
  49. }