diff options
-rw-r--r-- | Lib/test/test_hash.py | 9 | ||||
-rw-r--r-- | Lib/urllib.py | 4 | ||||
-rw-r--r-- | Objects/longobject.c | 8 | ||||
-rw-r--r-- | Python/ceval.c | 46 | ||||
-rw-r--r-- | Python/compile.c | 2 |
5 files changed, 44 insertions, 25 deletions
diff --git a/Lib/test/test_hash.py b/Lib/test/test_hash.py index eff0c7c..a0364f2 100644 --- a/Lib/test/test_hash.py +++ b/Lib/test/test_hash.py @@ -18,10 +18,19 @@ class HashEqualityTestCase(unittest.TestCase): def test_numeric_literals(self): self.same_hash(1, 1, 1.0, 1.0+0.0j) + self.same_hash(0, 0.0, 0.0+0.0j) + self.same_hash(-1, -1.0, -1.0+0.0j) + self.same_hash(-2, -2.0, -2.0+0.0j) def test_coerced_integers(self): self.same_hash(int(1), int(1), float(1), complex(1), int('1'), float('1.0')) + self.same_hash(int(-2**31), float(-2**31)) + self.same_hash(int(1-2**31), float(1-2**31)) + self.same_hash(int(2**31-1), float(2**31-1)) + # for 64-bit platforms + self.same_hash(int(2**31), float(2**31)) + self.same_hash(int(-2**63), float(-2**63)) def test_coerced_floats(self): self.same_hash(int(1.23e300), float(1.23e300)) diff --git a/Lib/urllib.py b/Lib/urllib.py index 04fd50a..b2542fc 100644 --- a/Lib/urllib.py +++ b/Lib/urllib.py @@ -357,7 +357,9 @@ class URLopener: raise IOError('http protocol error', 0, 'got a bad status line', None) - if response.status == 200: + # According to RFC 2616, "2xx" code indicates that the client's + # request was successfully received, understood, and accepted. + if not (200 <= response.status < 300): return addinfourl(response.fp, response.msg, "http:" + url) else: return self.http_error( diff --git a/Objects/longobject.c b/Objects/longobject.c index 1c127ba..7f09bb6 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -2197,10 +2197,18 @@ long_hash(PyLongObject *v) i = -(i); } #define LONG_BIT_PyLong_SHIFT (8*sizeof(long) - PyLong_SHIFT) + /* The following loop produces a C long x such that (unsigned long)x + is congruent to the absolute value of v modulo ULONG_MAX. The + resulting x is nonzero if and only if v is. */ while (--i >= 0) { /* Force a native long #-bits (32 or 64) circular shift */ x = ((x << PyLong_SHIFT) & ~PyLong_MASK) | ((x >> LONG_BIT_PyLong_SHIFT) & PyLong_MASK); x += v->ob_digit[i]; + /* If the addition above overflowed (thinking of x as + unsigned), we compensate by incrementing. This preserves + the value modulo ULONG_MAX. */ + if ((unsigned long)x < v->ob_digit[i]) + x++; } #undef LONG_BIT_PyLong_SHIFT x = x * sign; diff --git a/Python/ceval.c b/Python/ceval.c index fa08fe6..07e4013 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -431,7 +431,7 @@ void Py_SetRecursionLimit(int new_limit) { recursion_limit = new_limit; - _Py_CheckRecursionLimit = recursion_limit; + _Py_CheckRecursionLimit = recursion_limit; } /* the macro Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall() @@ -469,7 +469,7 @@ _Py_CheckRecursiveCall(char *where) where); return -1; } - _Py_CheckRecursionLimit = recursion_limit; + _Py_CheckRecursionLimit = recursion_limit; return 0; } @@ -805,11 +805,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) Py_MakePendingCalls() above. */ if (--_Py_Ticker < 0) { - if (*next_instr == SETUP_FINALLY) { - /* Make the last opcode before - a try: finally: block uninterruptable. */ - goto fast_next_opcode; - } + if (*next_instr == SETUP_FINALLY) { + /* Make the last opcode before + a try: finally: block uninterruptable. */ + goto fast_next_opcode; + } _Py_Ticker = _Py_CheckInterval; tstate->tick_counter++; #ifdef WITH_TSC @@ -2500,7 +2500,7 @@ fast_yield: } /* pop frame */ - exit_eval_frame: +exit_eval_frame: Py_LeaveRecursiveCall(); tstate->frame = f->f_back; @@ -2761,9 +2761,9 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals, return PyGen_New(f); } - retval = PyEval_EvalFrameEx(f,0); + retval = PyEval_EvalFrameEx(f,0); - fail: /* Jump here from prelude on failure */ +fail: /* Jump here from prelude on failure */ /* decref'ing the frame can cause __del__ methods to get invoked, which can call back into Python. While we're done with the @@ -2772,7 +2772,7 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals, */ assert(tstate != NULL); ++tstate->recursion_depth; - Py_DECREF(f); + Py_DECREF(f); --tstate->recursion_depth; return retval; } @@ -3186,18 +3186,18 @@ maybe_call_line_trace(Py_tracefunc func, PyObject *obj, represents a jump backwards, call the trace function. */ if ((frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub)) { - int line; - PyAddrPair bounds; + int line; + PyAddrPair bounds; - line = PyCode_CheckLineNumber(frame->f_code, frame->f_lasti, - &bounds); - if (line >= 0) { + line = PyCode_CheckLineNumber(frame->f_code, frame->f_lasti, + &bounds); + if (line >= 0) { frame->f_lineno = line; result = call_trace(func, obj, frame, PyTrace_LINE, Py_None); - } - *instr_lb = bounds.ap_lower; - *instr_ub = bounds.ap_upper; + } + *instr_lb = bounds.ap_lower; + *instr_ub = bounds.ap_upper; } else if (frame->f_lasti <= *instr_prev) { result = call_trace(func, obj, frame, PyTrace_LINE, Py_None); @@ -3583,9 +3583,9 @@ update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack, PyObject *value = EXT_POP(*pp_stack); PyObject *key = EXT_POP(*pp_stack); if (PyDict_GetItem(kwdict, key) != NULL) { - PyErr_Format(PyExc_TypeError, - "%.200s%s got multiple values " - "for keyword argument '%.200s'", + PyErr_Format(PyExc_TypeError, + "%.200s%s got multiple values " + "for keyword argument '%.200s'", PyEval_GetFuncName(func), PyEval_GetFuncDesc(func), PyUnicode_AsString(key)); @@ -3763,7 +3763,7 @@ ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk) PCALL(PCALL_OTHER); #endif result = PyObject_Call(func, callargs, kwdict); - ext_call_fail: +ext_call_fail: Py_XDECREF(callargs); Py_XDECREF(kwdict); Py_XDECREF(stararg); diff --git a/Python/compile.c b/Python/compile.c index e569102..d20da0a 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1428,7 +1428,7 @@ compiler_function(struct compiler *c, stmt_ty s) st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0); docstring = compiler_isdocstring(st); - if (docstring) + if (docstring && Py_OptimizeFlag < 2) first_const = st->v.Expr.value->v.Str.s; if (compiler_add_o(c, c->u->u_consts, first_const) < 0) { compiler_exit_scope(c); |