class: UnixOperatingSystem
changed: #timeInfoFromSeconds:milliseconds:localTime:
raise an TimeConversionError on error
--- a/UnixOperatingSystem.st Thu Nov 06 13:55:27 2014 +0100
+++ b/UnixOperatingSystem.st Thu Nov 06 14:13:24 2014 +0100
@@ -9573,59 +9573,68 @@
dst yDay wDay info|
%{
- struct tm tmValue;
+ struct tm tmValue, *result;
time_t tt;
- tt = __longIntVal(osSeconds);
+ tt = __signedLongIntVal(osSeconds);
+ if (tt == 0 && !__isSmallInteger(tt))
+ goto error;
/* try cache */
{
- OBJ lastSeconds, lastTimeInfo;
-
- lastSeconds = @global(LastTimeInfoSeconds);
- if (lastSeconds
- && (__longIntVal(lastSeconds) == tt)
- && (@global(LastTimeInfoMilliseconds) == osMilliseconds)
- && (@global(LastTimeInfoIsLocal) == isLocalTime)
- ) {
- lastTimeInfo = @global(LastTimeInfo);
- if (lastTimeInfo != nil) {
- RETURN (lastTimeInfo);
- }
- }
+ OBJ lastSeconds, lastTimeInfo;
+
+ lastSeconds = @global(LastTimeInfoSeconds);
+ if (lastSeconds
+ && (__longIntVal(lastSeconds) == tt)
+ && (@global(LastTimeInfoMilliseconds) == osMilliseconds)
+ && (@global(LastTimeInfoIsLocal) == isLocalTime)
+ ) {
+ lastTimeInfo = @global(LastTimeInfo);
+ if (lastTimeInfo != nil) {
+ RETURN (lastTimeInfo);
+ }
+ }
}
if (isLocalTime == true) {
- localtime_r(&tt, &tmValue);
+ result = localtime_r(&tt, &tmValue);
} else {
- gmtime_r(&tt, &tmValue);
- }
- hours = __mkSmallInteger(tmValue.tm_hour);
- minutes = __mkSmallInteger(tmValue.tm_min);
- seconds = __mkSmallInteger(tmValue.tm_sec);
-
- year = __mkSmallInteger(tmValue.tm_year + 1900);
- month = __mkSmallInteger(tmValue.tm_mon + 1);
- day = __mkSmallInteger(tmValue.tm_mday);
-
- yDay = __mkSmallInteger(tmValue.tm_yday+1);
- wDay = __mkSmallInteger(tmValue.tm_wday == 0 ? 7 : tmValue.tm_wday);
- utcOffset = __mkSmallInteger(TIMEZONE(&tmValue));
- dst = (tmValue.tm_isdst == 0 ? false : true);
-%}.
+ result = gmtime_r(&tt, &tmValue);
+ }
+ if (result != NULL) {
+ hours = __mkSmallInteger(tmValue.tm_hour);
+ minutes = __mkSmallInteger(tmValue.tm_min);
+ seconds = __mkSmallInteger(tmValue.tm_sec);
+
+ year = __mkSmallInteger(tmValue.tm_year + 1900);
+ month = __mkSmallInteger(tmValue.tm_mon + 1);
+ day = __mkSmallInteger(tmValue.tm_mday);
+
+ yDay = __mkSmallInteger(tmValue.tm_yday+1);
+ wDay = __mkSmallInteger(tmValue.tm_wday == 0 ? 7 : tmValue.tm_wday);
+ utcOffset = __mkSmallInteger(TIMEZONE(&tmValue));
+ dst = (tmValue.tm_isdst == 0 ? false : true);
+ }
+error:;
+%}.
+ year isNil ifTrue:[
+ TimeConversionError raiseErrorString:' - out of range'.
+ ].
+
info := self timeInfoClass new.
info
- year:year
- month:month
- day:day
- hours:hours
- minutes:minutes
- seconds:seconds
- milliseconds:osMilliseconds
- utcOffset:utcOffset
- dst:dst
- dayInYear:yDay
- dayInWeek:wDay.
+ year:year
+ month:month
+ day:day
+ hours:hours
+ minutes:minutes
+ seconds:seconds
+ milliseconds:osMilliseconds
+ utcOffset:utcOffset
+ dst:dst
+ dayInYear:yDay
+ dayInWeek:wDay.
%{
@global(LastTimeInfo) = info; __GSTORE(info);
@@ -9637,8 +9646,13 @@
^ info
"
- OperatingSystem timeInfoFromSeconds:0 localTime:false
- OperatingSystem timeInfoFromSeconds:3600 localTime:false
+ OperatingSystem timeInfoFromSeconds:3600 milliseconds:0 localTime:false
+ OperatingSystem timeInfoFromSeconds:3600 milliseconds:0 localTime:true
+ OperatingSystem timeInfoFromSeconds:7200 milliseconds:0 localTime:true
+
+ OperatingSystem timeInfoFromSeconds:16r7FFFFFFF milliseconds:0 localTime:false
+ OperatingSystem timeInfoFromSeconds:16r7FFFFFFF + 1 milliseconds:0 localTime:false
+ OperatingSystem timeInfoFromSeconds:0 milliseconds:0 localTime:true
"
! !
@@ -13501,11 +13515,11 @@
!UnixOperatingSystem class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/UnixOperatingSystem.st,v 1.383 2014-11-06 11:43:00 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/UnixOperatingSystem.st,v 1.384 2014-11-06 13:13:24 stefan Exp $'
!
version_CVS
- ^ '$Header: /cvs/stx/stx/libbasic/UnixOperatingSystem.st,v 1.383 2014-11-06 11:43:00 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/UnixOperatingSystem.st,v 1.384 2014-11-06 13:13:24 stefan Exp $'
! !