Mercurial > cpython-lru_cache-weakref
view Python/pytime.c @ 64620:25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
namespace if it occurs as a free variable in a nested block. This limitation
of the compiler has been lifted, and a new opcode introduced (DELETE_DEREF).
This sample was valid in 2.6, but fails to compile in 3.x without this change::
>>> def f():
... def print_error():
... print(e)
... try:
... something
... except Exception as e:
... print_error()
... # implicit "del e" here
This sample has always been invalid in Python, and now works::
>>> def outer(x):
... def inner():
... return x
... inner()
... del x
There is no need to bump the PYC magic number: the new opcode is used
for code that did not compile before.
| author | Amaury Forgeot d'Arc <amauryfa@gmail.com> |
|---|---|
| date | Fri, 10 Sep 2010 21:39:53 +0000 |
| parents | c16803bbd790 |
| children | bee7943d38c6 |
line wrap: on
line source
#include "Python.h" #ifdef __APPLE__ #if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_FTIME) /* * _PyTime_gettimeofday falls back to ftime when getttimeofday fails because the latter * might fail on some platforms. This fallback is unwanted on MacOSX because * that makes it impossible to use a binary build on OSX 10.4 on earlier * releases of the OS. Therefore claim we don't support ftime. */ # undef HAVE_FTIME #endif #endif #ifdef HAVE_FTIME #include <sys/timeb.h> #if !defined(MS_WINDOWS) && !defined(PYOS_OS2) extern int ftime(struct timeb *); #endif /* MS_WINDOWS */ #endif /* HAVE_FTIME */ void _PyTime_gettimeofday(_PyTime_timeval *tp) { /* There are three ways to get the time: (1) gettimeofday() -- resolution in microseconds (2) ftime() -- resolution in milliseconds (3) time() -- resolution in seconds In all cases the return value in a timeval struct. Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may fail, so we fall back on ftime() or time(). Note: clock resolution does not imply clock accuracy! */ #ifdef HAVE_GETTIMEOFDAY #ifdef GETTIMEOFDAY_NO_TZ if (gettimeofday(tp) == 0) return; #else /* !GETTIMEOFDAY_NO_TZ */ if (gettimeofday(tp, (struct timezone *)NULL) == 0) return; #endif /* !GETTIMEOFDAY_NO_TZ */ #endif /* !HAVE_GETTIMEOFDAY */ #if defined(HAVE_FTIME) { struct timeb t; ftime(&t); tp->tv_sec = t.time; tp->tv_usec = t.millitm * 1000; } #else /* !HAVE_FTIME */ tp->tv_sec = time(NULL); tp->tv_usec = 0; #endif /* !HAVE_FTIME */ return; } void _PyTime_Init() { /* Do nothing. Needed to force linking. */ }
