Преглед на файлове

Rewrite compound_to_time without using i128.

Jeroen van Rijn преди 11 месеца
родител
ревизия
daa0779c01
променени са 1 файла, в които са добавени 9 реда и са изтрити 6 реда
  1. 9 6
      core/time/time.odin

+ 9 - 6
core/time/time.odin

@@ -932,18 +932,21 @@ as the second return value. See `Time` for the representable range.
 compound_to_time :: proc "contextless" (datetime: dt.DateTime) -> (t: Time, ok: bool) {
 	unix_epoch := dt.DateTime{{1970, 1, 1}, {0, 0, 0, 0}}
 	delta, err := dt.sub(datetime, unix_epoch)
-	ok = err == .None
-
-	seconds     := delta.days    * 86_400 + delta.seconds
-	nanoseconds := i128(seconds) * 1e9    + i128(delta.nanos)
+	if err != .None {
+		return
+	}
 
+	seconds := delta.days * 86_400 + delta.seconds
 	// Can this moment be represented in i64 worth of nanoseconds?
 	// min(Time): 1677-09-21 00:12:44.145224192 +0000 UTC
 	// max(Time): 2262-04-11 23:47:16.854775807 +0000 UTC
-	if nanoseconds < i128(min(i64)) || nanoseconds > i128(max(i64)) {
+	if seconds < -9223372036 || (seconds == -9223372036 && delta.nanos < -854775808) {
+		return {}, false
+	}
+	if seconds > 9223372036 || (seconds == 9223372036 && delta.nanos > 854775807) {
 		return {}, false
 	}
-	return Time{_nsec=i64(nanoseconds)}, true
+	return Time{_nsec=seconds * 1e9 + delta.nanos}, true
 }
 
 /*