2012-08-10 3 views
0

현재 위치 추가 작업의 구현을 작성하고 있습니다. 하지만, 어떤 이유로 (때때로 사용자 정의 확장 클래스와 정수를 추가하는 동안) 결과로 읽기 전용 버퍼를 얻습니다.nb_inplace_add를 구현하면 읽기 전용 버퍼 객체가 반환됩니다.

관련 코드는 다음과 같습니다 대신 (단순히 "자신을"또는) (PyObject*)Tself를 반환하는, 내가 예외를 발생하면 원래 객체가 제대로 업데이 트를 얻을 수

static PyObject * 
ModPoly_InPlaceAdd(PyObject *self, PyObject *other) 
{ 

    if (!ModPoly_Check(self)) { 
     //Since it's in-place addition the control flow should never 
     // enter here(I suppose) 
     if (!ModPoly_Check(other)) { 
      PyErr_SetString(PyExc_TypeError, "Neither argument is a ModPolynomial."); 
      return NULL; 
     } 
     return ModPoly_InPlaceAdd(other, self); 
    } else { 
     if (!PyInt_Check(other) && !PyLong_Check(other)) { 
      Py_INCREF(Py_NotImplemented); 
      return Py_NotImplemented; 
     } 
    } 

    ModPoly *Tself = (ModPoly *)self; 
    PyObject *tmp, *tmp2; 
    tmp = PyNumber_Add(Tself->ob_item[0], other); 
    tmp2 = PyNumber_Remainder(tmp, Tself->n_modulus); 

    Py_DECREF(tmp); 
    tmp = Tself->ob_item[0]; 
    Tself->ob_item[0] = tmp2; 
    Py_DECREF(tmp); 
    return (PyObject *)Tself; 

} 

[일부 printf 사용하여 확인]. Py_RETURN_NONE 매크로를 사용하면 정확히 ModPolyNone (파이썬 쪽)으로 바뀝니다.

내가 뭘 잘못하고 있니? ModPoly 개체에 대한 포인터를 반환하는 중, 어떻게 이것이 버퍼가 될 수 있습니까? 그리고 나는 그 포인터에 어떤 조작도 보지 못했다.

예를 들어, 사용은 :

>>> from algebra import polynomials 
>>> pol = polynomials.ModPolynomial(3,17) 
>>> pol += 5 
>>> pol 
<read-only buffer ptr 0xf31420, size 4 at 0xe6faf0> 

나는 변화에게로 리턴 라인 시도했다 :

printf("%d\n", (int)ModPoly_Check(self)); 
return self; 

및 추가 할 때이 자리에서 (반환 값이 유형 ModPolynomial의 것을 의미 1를 인쇄 ...)

답변

1

the documentation에 따르면 개체에 대한 inplace 추가 작업에서 새 참조를 반환합니다.

을 호출하지 않고 self을 직접 반환하면 개체가 여전히 참조되어있는 동안 해당 개체가 해제됩니다. 다른 객체에 동일한 메모리가 할당되면 이러한 참조가 이제 새 객체를 제공합니다.

+0

네가 맞아. 이것은 내 첫 번째 C- 확장이며, 그래서 내가 언제 INCREF/DECREF해야하는지 이해하려고 노력하고있다. – Bakuriu