#ifndef V8_OBJECTS_JS_TEMPORAL_HELPERS_H_
#define V8_OBJECTS_JS_TEMPORAL_HELPERS_H_
#include "src/execution/isolate.h"
#include "src/heap/factory.h"
#include "src/objects/managed.h"
#include "src/objects/objects.h"
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define AT __FILE__ ":" TOSTRING(__LINE__)
#ifdef DEBUG
#define TEMPORAL_DEBUG_INFO AT
#else
#define TEMPORAL_DEBUG_INFO ""
#endif
#define NEW_TEMPORAL_TYPE_ERROR(str) \
NewTypeError(MessageTemplate::kTemporal, \
isolate->factory()->NewStringFromStaticChars(str))
#define NEW_TEMPORAL_RANGE_ERROR(str) \
NewRangeError(MessageTemplate::kTemporal, \
isolate->factory()->NewStringFromStaticChars(str))
#define NEW_TEMPORAL_RANGE_ERROR_WITH_ARG(str, arg) \
NewRangeError(MessageTemplate::kTemporalWithArg, \
isolate->factory()->NewStringFromStaticChars(str), arg)
#define NEW_TEMPORAL_TYPE_ERROR_WITH_ARG(str, arg) \
NewTypeError(MessageTemplate::kTemporalWithArg, \
isolate->factory()->NewStringFromStaticChars(str), arg)
namespace v8 {
namespace internal {
namespace temporal {
struct TimeDurationRecord {
double days;
double hours;
double minutes;
double seconds;
double milliseconds;
double microseconds;
double nanoseconds;
static Maybe<TimeDurationRecord> Create(Isolate* isolate, double days,
double hours, double minutes,
double seconds, double milliseconds,
double microseconds,
double nanoseconds);
};
struct DurationRecord {
double years;
double months;
double weeks;
TimeDurationRecord time_duration;
static Maybe<DurationRecord> Create(Isolate* isolate, double years,
double months, double weeks, double days,
double hours, double minutes,
double seconds, double milliseconds,
double microseconds, double nanoseconds);
static int32_t Sign(const DurationRecord& dur);
};
Maybe<DurationRecord> ToDurationRecord(
Isolate* isolate, DirectHandle<Object> temporal_duration_like_obj,
const DurationRecord& input);
bool IsValidDuration(Isolate* isolate, const DurationRecord& dur);
}
}
}
#endif