@@ -403,10 +403,28 @@ deque_extend(dequeobject *deque, PyObject *iterable)
403403
404404 iternext = * Py_TYPE (it )-> tp_iternext ;
405405 while ((item = iternext (it )) != NULL ) {
406- if (deque_append_internal (deque , item , maxlen ) < 0 ) {
407- Py_DECREF (item );
408- Py_DECREF (it );
409- return NULL ;
406+ if (deque -> rightindex == BLOCKLEN - 1 ) {
407+ block * b = newblock ();
408+ if (b == NULL ) {
409+ Py_DECREF (item );
410+ Py_DECREF (it );
411+ return NULL ;
412+ }
413+ b -> leftlink = deque -> rightblock ;
414+ CHECK_END (deque -> rightblock -> rightlink );
415+ deque -> rightblock -> rightlink = b ;
416+ deque -> rightblock = b ;
417+ MARK_END (b -> rightlink );
418+ deque -> rightindex = -1 ;
419+ }
420+ Py_SIZE (deque )++ ;
421+ deque -> rightindex ++ ;
422+ deque -> rightblock -> data [deque -> rightindex ] = item ;
423+ if (NEEDS_TRIM (deque , maxlen )) {
424+ PyObject * olditem = deque_popleft (deque , NULL );
425+ Py_DECREF (olditem );
426+ } else {
427+ deque -> state ++ ;
410428 }
411429 }
412430 return finalize_iterator (it );
@@ -450,10 +468,28 @@ deque_extendleft(dequeobject *deque, PyObject *iterable)
450468
451469 iternext = * Py_TYPE (it )-> tp_iternext ;
452470 while ((item = iternext (it )) != NULL ) {
453- if (deque_appendleft_internal (deque , item , maxlen ) < 0 ) {
454- Py_DECREF (item );
455- Py_DECREF (it );
456- return NULL ;
471+ if (deque -> leftindex == 0 ) {
472+ block * b = newblock ();
473+ if (b == NULL ) {
474+ Py_DECREF (item );
475+ Py_DECREF (it );
476+ return NULL ;
477+ }
478+ b -> rightlink = deque -> leftblock ;
479+ CHECK_END (deque -> leftblock -> leftlink );
480+ deque -> leftblock -> leftlink = b ;
481+ deque -> leftblock = b ;
482+ MARK_END (b -> leftlink );
483+ deque -> leftindex = BLOCKLEN ;
484+ }
485+ Py_SIZE (deque )++ ;
486+ deque -> leftindex -- ;
487+ deque -> leftblock -> data [deque -> leftindex ] = item ;
488+ if (NEEDS_TRIM (deque , maxlen )) {
489+ PyObject * olditem = deque_pop (deque , NULL );
490+ Py_DECREF (olditem );
491+ } else {
492+ deque -> state ++ ;
457493 }
458494 }
459495 return finalize_iterator (it );
0 commit comments