[JSC][Temporal] Remove Temporal.Calendar object and update JS layer to Stage 4 spec
b35d67a
Temporal의 Stage 3 설계에서는 Temporal.Calendar가 독립적인 JS 생성자로 노출되었으나, Stage 4에서는 이를 폐기하고 내장 문자열 calendar ID 방식으로 전환했습니다. JSC는 여기서 더 나아가 문자열 대신 컴팩트한 CalendarID 정수 enum을 채택하고, CalendarICUBridge를 통해 ICU calendar 연산을 컴파일 타임에 분기하도록 구현했습니다. 이 정수값은 parser, 생성자, with() 메서드, 산술 연산 등 모든 Temporal 타입 경계를 통과합니다. 각 경계에서의 변환과 검증이 보안 관점에서 중요한 이유입니다.
Source/JavaScriptCore/runtime/TemporalCalendar.h
- class TemporalCalendar final : public JSNonFinalObject {
- String m_calendarId;
+ enum class CalendarID : uint8_t { ISO8601, Gregory, Japanese, /* ... */ };
이 commit은 동시에 여러 spec 준수 버그도 수정했습니다. PlainYearMonth는 calendar annotation이 없는 단순 YYYY-MM 형식을 거부하도록 변경되었고, PlainDateTime은 누락된 time 필드를 undefined 대신 0으로 기본값 처리합니다. PlainMonthDay.prototype.with()는 인식할 수 없는 필드에 TypeError를 발생시키며, PlainTime 생성자는 NaN을 거부하도록 수정되었습니다.
Significance
calendar를 다루는 모든 Temporal 타입의 생성자, parser, prototype 경계를 전반적으로 수정한 대규모 refactor입니다. 동시에 여러 spec 준수 버그가 수정되었다는 점은 기존 코드에 잠재적인 잘못된 동작이 존재했음을 시사합니다.
Audit directions
Aaaaaaaaaaaa Aa Aaaaa Aa Aa Aaaaaaaa Aaaa Aaaaaaa Aaaaaa Aaaaa Aaaaaa Aaaa Aa Aaaa Aaaaaaaa Aaaaa Aaa Aa Aaa Aaaaa Aaaa Aaa Aaa Aaa Aaaaaaaaaaa Aa Aa Aaaaaaaaaaaaaaaaaaaa Aaa Aaaa Aaaa Aaaa Aaaa Aa Aaa Aaaaaa Aa Aaa Aa Aaa Aaaa Aa Aaa Aaaaa Aaaa Aaaaa Aa Aa a Aa Aaa Aaaaaaaaaaaaa Aa Aa Aaa Aaaa Aa Aaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaaa Aaaa Aaa Aa Aa Aaaa Aaaaa Aaaaaaaaaaaaaa Aa Aaa Aaaa Aaa Aaa Aaa Aaaaaa Aaaaaaaaaa Aaaa Aa a Aaa Aaa Aaaaa Aa Aaaaaaaa Aaa Aaa a Aaaa Aaa Aaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aa Aaa a Aa Aaa Aaaaaaaaaa Aaaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaa a Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaa Aaaa Aaaa
🔒Integer enum dispatch and new validation paths across every Temporal constructor — audit directions for the calendar boundary transitions are included.
더 확인하려면 구독해 주세요