blob: 785ae8de112738ce80cda834666d7e078a2cace4 [file] [log] [blame] [edit]
// Copyright 2021 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef V8_TEMPORAL_TEMPORAL_PARSER_H_
#define V8_TEMPORAL_TEMPORAL_PARSER_H_
#include "src/base/optional.h"
#include "src/execution/isolate.h"
namespace v8 {
namespace internal {
/**
* ParsedISO8601Result contains the parsed result of ISO 8601 grammar
* documented in #sec-temporal-iso8601grammar
* for TemporalInstantString, TemporalZonedDateTimeString,
* TemporalCalendarString, TemporalDateString, TemporalDateTimeString,
* TemporalMonthDayString, TemporalRelativeToString, TemporalTimeString,
* TemporalTimeZoneString, and TemporalYearMonthString. For all the fields
* represented by int32_t, a special value kMinInt31 is used to represent the
* field is "undefined" after parsing.
*/
struct ParsedISO8601Result {
int32_t date_year; // DateYear production
int32_t date_month; // DateMonth production
int32_t date_day; // DateDay production
int32_t time_hour; // TimeHour production
int32_t time_minute; // TimeMinute production
int32_t time_second; // TimeSecond production
int32_t
time_nanosecond; // TimeFractionalPart production stored in nanosecond
int32_t tzuo_sign; // TimeZoneUTCOffsetSign production
int32_t tzuo_hour; // TimeZoneUTCOffsetHour production
int32_t tzuo_minute; // TimeZoneUTCOffsetMinute production
int32_t tzuo_second; // TimeZoneUTCOffsetSecond production
int32_t
tzuo_nanosecond; // TimeZoneUTCOffsetFractionalPart stored in nanosecond
bool utc_designator; // UTCDesignator is presented
int32_t tzi_name_start; // Starting offset of TimeZoneIANAName in the input
// string.
int32_t tzi_name_length; // Length of TimeZoneIANAName production
int32_t calendar_name_start; // Starting offset of CalendarName production in
// the input string.
int32_t calendar_name_length; // Length of CalendarName production.
int32_t offset_string_start; // Starting offset of TimeZoneNumericUTCOffset
// in the input string.
int32_t
offset_string_length; // Length of TimeZoneNumericUTCOffset production
ParsedISO8601Result()
: date_year(kMinInt31),
date_month(kMinInt31),
date_day(kMinInt31),
time_hour(kMinInt31),
time_minute(kMinInt31),
time_second(kMinInt31),
time_nanosecond(kMinInt31),
tzuo_sign(kMinInt31),
tzuo_hour(kMinInt31),
tzuo_minute(kMinInt31),
tzuo_second(kMinInt31),
tzuo_nanosecond(kMinInt31),
utc_designator(false),
tzi_name_start(0),
tzi_name_length(0),
calendar_name_start(0),
calendar_name_length(0),
offset_string_start(0),
offset_string_length(0) {}
bool date_year_is_undefined() const { return date_year == kMinInt31; }
bool date_month_is_undefined() const { return date_month == kMinInt31; }
bool date_day_is_undefined() const { return date_day == kMinInt31; }
bool time_hour_is_undefined() const { return time_hour == kMinInt31; }
bool time_minute_is_undefined() const { return time_minute == kMinInt31; }
bool time_second_is_undefined() const { return time_second == kMinInt31; }
bool time_nanosecond_is_undefined() const {
return time_nanosecond == kMinInt31;
}
bool tzuo_hour_is_undefined() const { return tzuo_hour == kMinInt31; }
bool tzuo_minute_is_undefined() const { return tzuo_minute == kMinInt31; }
bool tzuo_second_is_undefined() const { return tzuo_second == kMinInt31; }
bool tzuo_sign_is_undefined() const { return tzuo_sign == kMinInt31; }
bool tzuo_nanosecond_is_undefined() const {
return tzuo_nanosecond == kMinInt31;
}
};
/**
* ParsedISO8601Duration contains the parsed result of ISO 8601 grammar
* documented in #prod-TemporalDurationString
* for TemporalDurationString.
* A special value kEmpty is used to represent the
* field is "undefined" after parsing for all fields except sign.
*/
struct ParsedISO8601Duration {
int64_t sign; // Sign production
int64_t years; // DurationYears production
int64_t months; // DurationMonths production
int64_t weeks; // DurationWeeks production
int64_t days; // DurationDays production
int64_t whole_hours; // DurationWholeHours production
int64_t hours_fraction; // DurationHoursFraction, in unit of 1e-9 hours
int64_t whole_minutes; // DurationWholeMinutes production
int64_t minutes_fraction; // DurationMinuteFraction, in unit of 1e-9 minutes
int64_t whole_seconds; // DurationWholeSeconds production
int64_t seconds_fraction; // DurationSecondFraction, in unit of nanosecond (
// 1e-9 seconds).
static constexpr int64_t kEmpty = -1;
ParsedISO8601Duration()
: sign(1),
years(kEmpty),
months(kEmpty),
weeks(kEmpty),
days(kEmpty),
whole_hours(kEmpty),
hours_fraction(kEmpty),
whole_minutes(kEmpty),
minutes_fraction(kEmpty),
whole_seconds(kEmpty),
seconds_fraction(kEmpty) {}
};
/**
* TemporalParser is low level parsing functions to support the implementation
* of various ParseTemporal*String Abstract Operations listed after
* #sec-temporal-parsetemporalinstantstring.
* All the methods take an Isolate, a Handle<String> as input, and also a
* pointer to a bool to answer the "satisfy the syntax of a Temporal*String"
* question and return the parsed result.
*/
class V8_EXPORT_PRIVATE TemporalParser {
public:
#define DEFINE_PARSE_METHOD(R, NAME) \
V8_WARN_UNUSED_RESULT static base::Optional<R> Parse##NAME( \
Isolate* isolate, Handle<String> iso_string)
DEFINE_PARSE_METHOD(ParsedISO8601Result, TemporalDateString);
DEFINE_PARSE_METHOD(ParsedISO8601Result, TemporalDateTimeString);
DEFINE_PARSE_METHOD(ParsedISO8601Result, TemporalTimeString);
DEFINE_PARSE_METHOD(ParsedISO8601Result, TemporalYearMonthString);
DEFINE_PARSE_METHOD(ParsedISO8601Result, TemporalMonthDayString);
DEFINE_PARSE_METHOD(ParsedISO8601Result, TemporalInstantString);
DEFINE_PARSE_METHOD(ParsedISO8601Result, TemporalZonedDateTimeString);
DEFINE_PARSE_METHOD(ParsedISO8601Result, TemporalTimeZoneString);
DEFINE_PARSE_METHOD(ParsedISO8601Result, TemporalRelativeToString);
DEFINE_PARSE_METHOD(ParsedISO8601Result, TemporalCalendarString);
DEFINE_PARSE_METHOD(ParsedISO8601Duration, TemporalDurationString);
DEFINE_PARSE_METHOD(ParsedISO8601Result, TimeZoneNumericUTCOffset);
};
#undef DEFINE_PARSE_METHOD
} // namespace internal
} // namespace v8
#endif // V8_TEMPORAL_TEMPORAL_PARSER_H_