diff options
author | 2023-10-11 01:59:09 -0700 | |
---|---|---|
committer | 2023-10-13 18:08:24 -0700 | |
commit | 9bc76f6628239f427c7b057a23a73e366fc0d509 (patch) | |
tree | c63a1c2a0d6ae31ef6706e7a305508be25e09a8f /src/bun.js/bindings/bindings.cpp | |
parent | 0a6ef179f89b71492458134aae4af9cd32b1e70d (diff) | |
download | bun-9bc76f6628239f427c7b057a23a73e366fc0d509.tar.gz bun-9bc76f6628239f427c7b057a23a73e366fc0d509.tar.zst bun-9bc76f6628239f427c7b057a23a73e366fc0d509.zip |
wip
Diffstat (limited to 'src/bun.js/bindings/bindings.cpp')
-rw-r--r-- | src/bun.js/bindings/bindings.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/bun.js/bindings/bindings.cpp b/src/bun.js/bindings/bindings.cpp index d06e8259e..a61a0221a 100644 --- a/src/bun.js/bindings/bindings.cpp +++ b/src/bun.js/bindings/bindings.cpp @@ -4689,6 +4689,40 @@ extern "C" EncodedJSValue JSC__JSValue__dateInstanceFromNullTerminatedString(JSC return JSValue::encode(date); } +// this is largely copied from dateProtoFuncToISOString +extern "C" int JSC__JSValue__toISOString(JSC::JSGlobalObject* globalObject, EncodedJSValue dateValue, char buffer[28]) +{ + JSC::DateInstance* thisDateObj = JSC::jsDynamicCast<JSC::DateInstance*>(JSC::JSValue::decode(dateValue)); + if (!thisDateObj) + return -1; + + if (!std::isfinite(thisDateObj->internalNumber())) + return -1; + + auto& vm = globalObject->vm(); + + const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTimeUTC(vm.dateCache); + if (!gregorianDateTime) + return -1; + + // If the year is outside the bounds of 0 and 9999 inclusive we want to use the extended year format (ES 15.9.1.15.1). + int ms = static_cast<int>(fmod(thisDateObj->internalNumber(), msPerSecond)); + if (ms < 0) + ms += msPerSecond; + + int charactersWritten; + if (gregorianDateTime->year() > 9999 || gregorianDateTime->year() < 0) + charactersWritten = snprintf(buffer, sizeof(buffer), "%+07d-%02d-%02dT%02d:%02d:%02d.%03dZ", gregorianDateTime->year(), gregorianDateTime->month() + 1, gregorianDateTime->monthDay(), gregorianDateTime->hour(), gregorianDateTime->minute(), gregorianDateTime->second(), ms); + else + charactersWritten = snprintf(buffer, sizeof(buffer), "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ", gregorianDateTime->year(), gregorianDateTime->month() + 1, gregorianDateTime->monthDay(), gregorianDateTime->hour(), gregorianDateTime->minute(), gregorianDateTime->second(), ms); + + ASSERT(charactersWritten > 0 && static_cast<unsigned>(charactersWritten) < sizeof(buffer)); + if (static_cast<unsigned>(charactersWritten) >= sizeof(buffer)) + return -1; + + return charactersWritten; +} + #pragma mark - WebCore::DOMFormData CPP_DECL void WebCore__DOMFormData__append(WebCore__DOMFormData* arg0, ZigString* arg1, ZigString* arg2) |