diff options
-rw-r--r-- | Include/pydebug.h | 4 | ||||
-rw-r--r-- | Lib/test/test_descr.py | 5 | ||||
-rw-r--r-- | Lib/test/test_generators.py | 12 | ||||
-rw-r--r-- | Lib/zipfile.py | 4 | ||||
-rw-r--r-- | Misc/NEWS | 21 | ||||
-rw-r--r-- | Modules/main.c | 5 | ||||
-rw-r--r-- | Python/ceval.c | 25 | ||||
-rw-r--r-- | Python/pythonrun.c | 4 |
8 files changed, 55 insertions, 25 deletions
diff --git a/Include/pydebug.h b/Include/pydebug.h index 9ecd8a0..d92161c 100644 --- a/Include/pydebug.h +++ b/Include/pydebug.h @@ -16,6 +16,10 @@ extern DL_IMPORT(int) Py_TabcheckFlag; extern DL_IMPORT(int) Py_UnicodeFlag; extern DL_IMPORT(int) Py_IgnoreEnvironmentFlag; extern DL_IMPORT(int) Py_DivisionWarningFlag; +/* _XXX Py_QnewFlag should go away in 2.3. It's true iff -Qnew is passed, + on the command line, and is used in 2.2 by ceval.c to make all "/" divisions + true divisions (which they will be in 2.3). */ +extern DL_IMPORT(int) _Py_QnewFlag; /* this is a wrapper around getenv() that pays attention to Py_IgnoreEnvironmentFlag. It should be used for getting variables like diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 481ca0f..a0958df 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -23,6 +23,11 @@ def testunop(a, res, expr="len(a)", meth="__len__"): def testbinop(a, b, res, expr="a+b", meth="__add__"): if verbose: print "checking", expr dict = {'a': a, 'b': b} + + # XXX Hack so this passes before 2.3 when -Qnew is specified. + if meth == "__div__" and 1/2 == 0.5: + meth = "__truediv__" + vereq(eval(expr, dict), res) t = type(a) m = getattr(t, meth) diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py index 118b1d9..2c319e5 100644 --- a/Lib/test/test_generators.py +++ b/Lib/test/test_generators.py @@ -182,7 +182,7 @@ Specification: Return Specification: Generators and Exception Propagation >>> def f(): - ... return 1/0 + ... return 1//0 >>> def g(): ... yield f() # the zero division exception propagates ... yield 42 # and we'll never get here @@ -206,7 +206,7 @@ Specification: Try/Except/Finally ... yield 1 ... try: ... yield 2 - ... 1/0 + ... 1//0 ... yield 3 # never get here ... except ZeroDivisionError: ... yield 4 @@ -253,7 +253,7 @@ Guido's binary tree example. ... n = len(list) ... if n == 0: ... return [] - ... i = n / 2 + ... i = n // 2 ... return Tree(list[i], tree(list[:i]), tree(list[i+1:])) >>> # Show it off: create a tree. @@ -691,7 +691,7 @@ SyntaxError: 'yield' not allowed in a 'try' block with a 'finally' clause (<stri >>> def f(): ... try: ... try: -... 1/0 +... 1//0 ... except ZeroDivisionError: ... yield 666 # bad because *outer* try has finally ... except: @@ -708,7 +708,7 @@ But this is fine: ... try: ... try: ... yield 12 -... 1/0 +... 1//0 ... except ZeroDivisionError: ... yield 666 ... except: @@ -751,7 +751,7 @@ SyntaxError: invalid syntax ... pass ... elif 0: ... try: -... 1/0 +... 1//0 ... except SyntaxError: ... pass ... else: diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 4b59ac6..0efcad3 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -117,7 +117,7 @@ class ZipInfo: """Return the per-file header as a string.""" dt = self.date_time dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2] - dostime = dt[3] << 11 | dt[4] << 5 | dt[5] / 2 + dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2) if self.flag_bits & 0x08: # Set these to zero because we write them after the file data CRC = compress_size = file_size = 0 @@ -468,7 +468,7 @@ class ZipFile: count = count + 1 dt = zinfo.date_time dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2] - dostime = dt[3] << 11 | dt[4] << 5 | dt[5] / 2 + dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2) centdir = struct.pack(structCentralDir, stringCentralDir, zinfo.create_version, zinfo.create_system, zinfo.extract_version, zinfo.reserved, @@ -39,6 +39,13 @@ Type/class unification and new-style classes Core and builtins +- -Qnew now works as documented in PEP 238: when -Qnew is passed on + the command line, all occurrences of "/" use true division instead + of classic division. See the PEP for details. Note that "all" + means all instances in library and 3rd-party modules, as well as in + your own code. As the PEP says, -Qnew is intended for use only in + educational environments with control over the libraries in use. + Extension modules - gc.get_referents was renamed to gc.get_referrers. @@ -712,11 +719,15 @@ Core warnings are issued. Using -Qwarn issues a run-time warning about all uses of classic division for int and long arguments; -Qwarnall also warns about classic division for float and complex arguments - (for use with fixdiv.py). Using -Qnew is questionable; it turns on - new division by default, but only in the __main__ module. You can - usefully combine -Qwarn or -Qwarnall and -Qnew: this gives the - __main__ module new division, and warns about classic division - everywhere else. + (for use with fixdiv.py). + [Note: the remainder of this paragraph (preserved below) became + obsolete in 2.2c1 -- -Qnew has global effect in 2.2] + <obsolete> + Using -Qnew is questionable; it turns on new division by default, but + only in the __main__ module. You can usefully combine -Qwarn or + -Qwarnall and -Qnew: this gives the __main__ module new division, and + warns about classic division everywhere else. + </obsolete> - Many built-in types can now be subclassed. This applies to int, long, float, str, unicode, and tuple. (The types complex, list and diff --git a/Modules/main.c b/Modules/main.c index eea848f..5f71ee2 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -169,8 +169,11 @@ Py_Main(int argc, char **argv) break; } if (strcmp(_PyOS_optarg, "new") == 0) { - /* XXX This only affects __main__ */ + /* This only affects __main__ */ cf.cf_flags |= CO_FUTURE_DIVISION; + /* And this tells the eval loop to treat + BINARY_DIVIDE as BINARY_TRUE_DIVIDE */ + _Py_QnewFlag = 1; break; } fprintf(stderr, diff --git a/Python/ceval.c b/Python/ceval.c index 5358517..76424e1 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -903,9 +903,22 @@ eval_frame(PyFrameObject *f) break; case BINARY_DIVIDE: + if (!_Py_QnewFlag) { + w = POP(); + v = POP(); + x = PyNumber_Divide(v, w); + Py_DECREF(v); + Py_DECREF(w); + PUSH(x); + if (x != NULL) continue; + break; + } + /* -Qnew is in effect: fall through to + BINARY_TRUE_DIVIDE */ + case BINARY_TRUE_DIVIDE: w = POP(); v = POP(); - x = PyNumber_Divide(v, w); + x = PyNumber_TrueDivide(v, w); Py_DECREF(v); Py_DECREF(w); PUSH(x); @@ -922,16 +935,6 @@ eval_frame(PyFrameObject *f) if (x != NULL) continue; break; - case BINARY_TRUE_DIVIDE: - w = POP(); - v = POP(); - x = PyNumber_TrueDivide(v, w); - Py_DECREF(v); - Py_DECREF(w); - PUSH(x); - if (x != NULL) continue; - break; - case BINARY_MODULO: w = POP(); v = POP(); diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 628058b..a8ad845 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -64,6 +64,10 @@ int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */ int Py_FrozenFlag; /* Needed by getpath.c */ int Py_UnicodeFlag = 0; /* Needed by compile.c */ int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */ +/* _XXX Py_QnewFlag should go away in 2.3. It's true iff -Qnew is passed, + on the command line, and is used in 2.2 by ceval.c to make all "/" divisions + true divisions (which they will be in 2.3). */ +int _Py_QnewFlag = 0; static int initialized = 0; |