www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 23385] New: Consider making currTime nogc and nothrow

https://issues.dlang.org/show_bug.cgi?id=23385

          Issue ID: 23385
           Summary: Consider making currTime  nogc and nothrow
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: phobos
          Assignee: nobody puremagic.com
          Reporter: andrej.mitrovich gmail.com

std.datetime.systime is an excellent abstraction over the OS-provided timers.
And yet we cannot check the current time in  nogc nothrow code.

With just a few changes we can make it  nogc, but it will probably take a bit
more care than that.

-----
diff --git a/std/datetime/systime.d b/std/datetime/systime.d
index fcb8184..0fb7b82 100755
--- a/std/datetime/systime.d
+++ b/std/datetime/systime.d
   -530,7 +530,7    public:
                        given $(REF DateTime,std,datetime,date) is assumed to
                        be in the given time zone.
       +/
-    this(DateTime dateTime, return scope immutable TimeZone tz = null) return
scope  safe nothrow
+    this(DateTime dateTime, return scope immutable TimeZone tz = null) return
scope  safe nothrow  nogc
     {
         try
             this(dateTime, Duration.zero, tz);
   -581,7 +581,7    public:
             $(REF DateTimeException,std,datetime,date) if `fracSecs` is
negative or if it's
             greater than or equal to one second.
       +/
-    this(DateTime dateTime, Duration fracSecs, return scope immutable TimeZone
tz = null) return scope  safe
+    this(DateTime dateTime, Duration fracSecs, return scope immutable TimeZone
tz = null) return scope  safe  nogc
     {
         enforce(fracSecs >= Duration.zero, new DateTimeException("A SysTime
cannot have negative fractional seconds."));
         enforce(fracSecs < seconds(1), new DateTimeException("Fractional
seconds must be less than one second."));
   -638,7 +638,7    public:
                    given $(REF Date,std,datetime,date) is assumed to be in the
                    given time zone.
       +/
-    this(Date date, return scope immutable TimeZone tz = null) return scope
 safe nothrow
+    this(Date date, return scope immutable TimeZone tz = null) return scope
 safe nothrow  nogc
     {
         _timezone = tz is null ? LocalTime() : tz;

   -691,7 +691,7    public:
                       $(LREF SysTime). If null,
                       $(REF LocalTime,std,datetime,timezone) will be used.
       +/
-    this(long stdTime, return scope immutable TimeZone tz = null) return scope
 safe pure nothrow
+    this(long stdTime, return scope immutable TimeZone tz = null) return scope
 safe pure nothrow  nogc
     {
         _stdTime = stdTime;
         _timezone = tz is null ? LocalTime() : tz;
   -10101,15 +10101,14    else version (Windows)

     private enum hnsecsFrom1601 = 504_911_232_000_000_000L;

-    long FILETIMEToStdTime(scope const FILETIME* ft)  safe
+    long FILETIMEToStdTime(scope const FILETIME* ft)  safe  nogc
     {
         ULARGE_INTEGER ul;
         ul.HighPart = ft.dwHighDateTime;
         ul.LowPart = ft.dwLowDateTime;
         ulong tempHNSecs = ul.QuadPart;

-        if (tempHNSecs > long.max - hnsecsFrom1601)
-            throw new DateTimeException("The given FILETIME cannot be
represented as a stdTime value.");
+        assert(!(tempHNSecs > long.max - hnsecsFrom1601));

         return cast(long) tempHNSecs + hnsecsFrom1601;
     }
-----

For now we have to resort to hacks like
https://p0nce.github.io/d-idioms/#Bypassing- nogc

--
Oct 04 2022