diff options
Diffstat (limited to 'Python')
| -rw-r--r-- | Python/bltinmodule.c | 36 | ||||
| -rw-r--r-- | Python/compile.c | 8 | 
2 files changed, 32 insertions, 12 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 3e2f2a1..98285b9 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -184,13 +184,19 @@ static PyObject *  builtin_all(PyObject *self, PyObject *v)  {  	PyObject *it, *item; +	PyObject *(*iternext)(PyObject *); +	int cmp;  	it = PyObject_GetIter(v);  	if (it == NULL)  		return NULL; +	iternext = *Py_TYPE(it)->tp_iternext; -	while ((item = PyIter_Next(it)) != NULL) { -		int cmp = PyObject_IsTrue(item); +	for (;;) { +		item = iternext(it); +		if (item == NULL) +			break; +		cmp = PyObject_IsTrue(item);  		Py_DECREF(item);  		if (cmp < 0) {  			Py_DECREF(it); @@ -202,8 +208,12 @@ builtin_all(PyObject *self, PyObject *v)  		}  	}  	Py_DECREF(it); -	if (PyErr_Occurred()) -		return NULL; +	if (PyErr_Occurred()) { +		if (PyErr_ExceptionMatches(PyExc_StopIteration)) +			PyErr_Clear(); +		else +			return NULL; +	}  	Py_RETURN_TRUE;  } @@ -216,13 +226,19 @@ static PyObject *  builtin_any(PyObject *self, PyObject *v)  {  	PyObject *it, *item; +	PyObject *(*iternext)(PyObject *); +	int cmp;  	it = PyObject_GetIter(v);  	if (it == NULL)  		return NULL; +	iternext = *Py_TYPE(it)->tp_iternext; -	while ((item = PyIter_Next(it)) != NULL) { -		int cmp = PyObject_IsTrue(item); +	for (;;) { +		item = iternext(it); +		if (item == NULL) +			break; +		cmp = PyObject_IsTrue(item);  		Py_DECREF(item);  		if (cmp < 0) {  			Py_DECREF(it); @@ -234,8 +250,12 @@ builtin_any(PyObject *self, PyObject *v)  		}  	}  	Py_DECREF(it); -	if (PyErr_Occurred()) -		return NULL; +	if (PyErr_Occurred()) { +		if (PyErr_ExceptionMatches(PyExc_StopIteration)) +			PyErr_Clear(); +		else +			return NULL; +	}  	Py_RETURN_FALSE;  } diff --git a/Python/compile.c b/Python/compile.c index c3ef67a..e1f2a55 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -3172,7 +3172,7 @@ compiler_visit_expr(struct compiler *c, expr_ty e)  		return compiler_ifexp(c, e);  	case Dict_kind:  		n = asdl_seq_LEN(e->v.Dict.values); -		ADDOP_I(c, BUILD_MAP, (n>255 ? 255 : n)); +		ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n));  		for (i = 0; i < n; i++) {  			VISIT(c, expr,   				(expr_ty)asdl_seq_GET(e->v.Dict.values, i)); @@ -3648,10 +3648,10 @@ static int  instrsize(struct instr *instr)  {  	if (!instr->i_hasarg) -		return 1; +		return 1;	/* 1 byte for the opcode*/  	if (instr->i_oparg > 0xffff) -		return 6; -	return 3; +		return 6;	/* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */ +	return 3; 		/* 1 (opcode) + 2 (oparg) */  }  static int  | 
