[pypy-svn] r63146 - pypy/trunk/pypy/module/rctime

afa at codespeak.net afa at codespeak.net
Fri Mar 20 17:25:19 CET 2009


Author: afa
Date: Fri Mar 20 17:25:17 2009
New Revision: 63146

Modified:
   pypy/trunk/pypy/module/rctime/__init__.py
   pypy/trunk/pypy/module/rctime/interp_time.py
Log:
Initialize time.timezone &co when pypy-c loads the module,
*not* at translation time.


Modified: pypy/trunk/pypy/module/rctime/__init__.py
==============================================================================
--- pypy/trunk/pypy/module/rctime/__init__.py	(original)
+++ pypy/trunk/pypy/module/rctime/__init__.py	Fri Mar 20 17:25:17 2009
@@ -1,15 +1,11 @@
 
 from pypy.interpreter.mixedmodule import MixedModule
+import os
 
 class Module(MixedModule):
     applevel_name = 'time'
 
     interpleveldefs = {
-        'accept2dyear': 'interp_time.accept2dyear',
-        'timezone': 'interp_time.timezone',
-        'daylight': 'interp_time.daylight',
-        'tzname': 'interp_time.tzname',
-        'altzone': 'interp_time.altzone',
         'time': 'interp_time.time',
         'clock': 'interp_time.clock',
         'ctime': 'interp_time.ctime',
@@ -21,30 +17,20 @@
         'sleep' : 'interp_time.sleep',
     }
 
-    def buildloaders(cls):
-        from pypy.module.rctime import interp_time
-        import os
-        
-        if os.name == "posix":
-            Module.interpleveldefs['tzset'] = 'interp_time.tzset'
-
-        # this machinery is needed to expose constants
-        # that have to be initialized one time only
-        
-        Module.interpleveldefs["accept2dyear"] = 'space.wrap(%r)' %\
-            interp_time._init_accept2dyear()
-        
-        timezone, daylight, tzname, altzone = interp_time._init_timezone()
-        Module.interpleveldefs['timezone'] = 'space.wrap(%r)' % timezone
-        Module.interpleveldefs['daylight'] = 'space.wrap(%r)' % daylight
-        Module.interpleveldefs['tzname'] = \
-            'space.newtuple([space.wrap(%r), space.wrap(%r)])' % tuple(tzname)
-        Module.interpleveldefs['altzone'] = 'space.wrap(%r)' % altzone
-        super(Module, cls).buildloaders()
-    buildloaders = classmethod(buildloaders)
+    if os.name == "posix":
+        interpleveldefs['tzset'] = 'interp_time.tzset'
 
     appleveldefs = {
         'struct_time': 'app_time.struct_time',
         '__doc__': 'app_time.__doc__',
         'strptime': 'app_time.strptime',
     }
+
+    def startup(self, space):
+        # this machinery is needed to expose constants
+        # that have to be initialized one time only
+        from pypy.module.rctime import interp_time
+
+        interp_time._init_timezone(space)
+        interp_time._init_accept2dyear(space)
+

Modified: pypy/trunk/pypy/module/rctime/interp_time.py
==============================================================================
--- pypy/trunk/pypy/module/rctime/interp_time.py	(original)
+++ pypy/trunk/pypy/module/rctime/interp_time.py	Fri Mar 20 17:25:17 2009
@@ -86,27 +86,34 @@
 if _WIN:
     win_eci = ExternalCompilationInfo(
         includes = ["time.h"],
-        separate_module_sources = [ """
-        long get_timezone() { return timezone; }
-        int get_daylight() { return daylight; }
-        char** get_tzname() { return tzname; }
-        """
-        ],
-        export_symbols = ['_tzset', 'get_timezone', 'get_daylight', 'get_tzname'],
+        post_include_bits = ["long pypy_get_timezone();",
+                             "int pypy_get_daylight();",
+                             "char** pypy_get_tzname();"],
+        separate_module_sources = ["""
+        long pypy_get_timezone() { return timezone; }
+        int pypy_get_daylight() { return daylight; }
+        char** pypy_get_tzname() { return tzname; }
+        """],
+        export_symbols = [
+        '_tzset', 'pypy_get_timezone', 'pypy_get_daylight', 'pypy_get_tzname'],
         )
     # Ensure sure that we use _tzset() and timezone from the same C Runtime.
     c_tzset = external('_tzset', [], lltype.Void, win_eci)
-    c_get_timezone = external('get_timezone', [], rffi.LONG, win_eci)
-    c_get_daylight = external('get_daylight', [], rffi.INT, win_eci)
-    c_get_tzname = external('get_tzname', [], rffi.CCHARPP, win_eci)
+    c_get_timezone = external('pypy_get_timezone', [], rffi.LONG, win_eci)
+    c_get_daylight = external('pypy_get_daylight', [], rffi.INT, win_eci)
+    c_get_tzname = external('pypy_get_tzname', [], rffi.CCHARPP, win_eci)
 
 c_strftime = external('strftime', [rffi.CCHARP, rffi.SIZE_T, rffi.CCHARP, TM_P],
                       rffi.SIZE_T)
 
-def _init_accept2dyear():
-    return (1, 0)[bool(os.getenv("PYTHONY2K"))]
+def _init_accept2dyear(space):
+    if os.environ.get("PYTHONY2K"):
+        accept2dyear = 0
+    else:
+        accept2dyear = 1
+    _set_module_object(space, "accept2dyear", space.wrap(accept2dyear))
 
-def _init_timezone():
+def _init_timezone(space):
     timezone = daylight = altzone = 0
     tzname = ["", ""]
 
@@ -149,7 +156,11 @@
             daylight = int(janzone != julyzone)
             tzname = [janname, julyname]
 
-    return timezone, daylight, tzname, altzone
+    _set_module_object(space, "timezone", space.wrap(timezone))
+    _set_module_object(space, 'daylight', space.wrap(daylight))
+    tzname_w = [space.wrap(tzname[0]), space.wrap(tzname[1])] 
+    _set_module_object(space, 'tzname', space.newtuple(tzname_w))
+    _set_module_object(space, 'altzone', space.wrap(altzone))
 
 def _get_error_msg():
     errno = rposix.get_errno()
@@ -402,12 +413,7 @@
         c_tzset()
         
         # reset timezone, altzone, daylight and tzname
-        timezone, daylight, tzname, altzone = _init_timezone()
-        _set_module_object(space, "timezone", space.wrap(timezone))
-        _set_module_object(space, 'daylight', space.wrap(daylight))
-        tzname_w = [space.wrap(tzname[0]), space.wrap(tzname[1])] 
-        _set_module_object(space, 'tzname', space.newtuple(tzname_w))
-        _set_module_object(space, 'altzone', space.wrap(altzone))
+        timezone, daylight, tzname, altzone = _init_timezone(space)
     tzset.unwrap_spec = [ObjSpace]
 
 def strftime(space, format, w_tup=None):



More information about the Pypy-commit mailing list