class: UnixOperatingSystem
authorStefan Vogel <sv@exept.de>
Thu, 06 Nov 2014 14:13:24 +0100
changeset 16924 9f7829dbea64
parent 16923 719c8a7b1cdd
child 16925 62b6c12ce2d0
class: UnixOperatingSystem changed: #timeInfoFromSeconds:milliseconds:localTime: raise an TimeConversionError on error
UnixOperatingSystem.st
--- 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 $'
 ! !