diff options
author | sebres <sebres@users.sourceforge.net> | 2024-03-12 01:33:38 (GMT) |
---|---|---|
committer | sebres <sebres@users.sourceforge.net> | 2024-03-12 01:33:38 (GMT) |
commit | 83a74db91df83a3a4505472cd965d6d74e8ee7bc (patch) | |
tree | 0c8d9ec780a172f8ce37f17ed8512c83c2b0f696 /generic | |
parent | ec9410157e93cbeb66c19fcffc9f31b291d1a01b (diff) | |
download | tcl-83a74db91df83a3a4505472cd965d6d74e8ee7bc.zip tcl-83a74db91df83a3a4505472cd965d6d74e8ee7bc.tar.gz tcl-83a74db91df83a3a4505472cd965d6d74e8ee7bc.tar.bz2 |
consider TZ-epoch in base-cache (ensure cache of base is correct for :localtime if TZ changing)
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tclClock.c | 11 | ||||
-rw-r--r-- | generic/tclDate.h | 4 |
2 files changed, 14 insertions, 1 deletions
diff --git a/generic/tclClock.c b/generic/tclClock.c index e156cf3..1c9f77e 100644 --- a/generic/tclClock.c +++ b/generic/tclClock.c @@ -2249,6 +2249,9 @@ ConvertUTCToLocal( return TCL_ERROR; } + /* signal we need to revalidate TZ epoch next time fields gets used. */ + fields->flags |= CLF_CTZ; + /* we cannot cache (ranges unknown yet) */ } else { Tcl_WideInt rangesVal[2]; @@ -2258,6 +2261,9 @@ ConvertUTCToLocal( return TCL_ERROR; } + /* converted using table (TZ isn't :localtime) */ + fields->flags &= ~CLF_CTZ; + /* Cache the last conversion */ if (ltzoc != NULL) { /* slot was found above */ /* timezoneObj and changeover are the same */ @@ -3491,7 +3497,10 @@ baseNow: /* check base fields already cached (by TZ, last-second cache) */ if ( dataPtr->lastBase.timezoneObj == opts->timezoneObj - && dataPtr->lastBase.date.seconds == baseVal) { + && dataPtr->lastBase.date.seconds == baseVal + && (!(dataPtr->lastBase.date.flags & CLF_CTZ) + || dataPtr->lastTZEpoch == TzsetIfNecessary()) + ) { memcpy(date, &dataPtr->lastBase.date, ClockCacheableDateFieldsSize); } else { /* extact fields from base */ diff --git a/generic/tclDate.h b/generic/tclDate.h index 6e82a3f..0fd0fef 100644 --- a/generic/tclDate.h +++ b/generic/tclDate.h @@ -150,6 +150,8 @@ typedef enum ClockMsgCtLiteral { typedef enum {BCE=1, CE=0} ERA_ENUM; +#define CLF_CTZ (1 << 4) + typedef struct TclDateFields { /* Cacheable fields: */ @@ -175,6 +177,8 @@ typedef struct TclDateFields { int secondOfMin; /* Seconds of minute (in-between time only calculation) */ int secondOfDay; /* Seconds of day (in-between time only calculation) */ + int flags; /* 0 or CLF_CTZ */ + /* Non cacheable fields: */ Tcl_Obj *tzName; /* Name (or corresponding DST-abbreviation) of the |