2012-05-11 3 views
1

나는 다음과 같은 코드 보았을 때 나는 파이썬을위한 C 확장을 배울려고하기 때문에이 파일 methodobject.c을 읽고 있었다 :파이썬 C 코드에서 C 코드가 ptr을 반환하여 변수를 스택에 넣습니다. 내가 뭘 놓치고 있니?

PyObject * 
PyCFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) 
{ 
    PyCFunctionObject* f = (PyCFunctionObject*)func; 
    PyCFunction meth = PyCFunction_GET_FUNCTION(func); 
    PyObject *self = PyCFunction_GET_SELF(func); 
    Py_ssize_t size; 

    switch (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST)) { 
    case METH_VARARGS: 
     if (kw == NULL || PyDict_Size(kw) == 0) 
      return (*meth)(self, arg); 
     break; 

을 더 내가

return (*meth)(self, arg); 
보고

더 깨달을수록 나는 그것을 이해하지 못한다. I 생각해 보면은 self (로컬로 선언 된 포인터)와 arg (외부로 PyCFunctionCall로 전달 된 포인터)를 취하는 함수 인 meth에 대한 포인터를 반환한다고 생각합니다. 그러나 마치 meth & 자기가 스택에 할당 된 것처럼 보이기 때문에 PyCFunctionCall이 종료되면 해제되고 전달 된 변수에 문제가 발생합니다.

무엇이 여기에 있습니까?

답변

3

반환 값이 meth(self, arg)이 아니라 meth입니다. 포인터가 (*meth)으로 파생 된 다음 해당 위치의 함수에 selfarg이 전달된다는 점에 유의하십시오.

따라서 return이 발생하기 전에 meth(self, arg)이 완전히 평가되고 스택 변수가 반환되지 않습니다.

편집 : meth(self, arg)이라고 말하면 the_function_pointed_to_by_meth(self, arg)입니다.

+0

아 !!! 고맙습니다. 나는 멍청이처럼 느껴지지만 적어도 나는 깨달은 사람이다. – user1245262

+0

그래서 우리가 여기에 있습니다. @ams 메모처럼 너무 나쁘지는 않습니다. 함수 포인터 구문이 혼란 스러울 수 있습니다. – JoeFish

4

meth은 함수 포인터입니다. 함수 의 결과는 이고, 인수는 (self, arg)입니다. *meth (meth가 가리키는 주소)에 반환합니다.

+0

감사합니다. 나는 정말로 벽에 머리를 두드리는 소리를 내고 있었다. 지금 나는 이것을 묻기 위해 약간 어리 석다 고 느끼고있다. 그러나 그것은 나의 오인 동의를 붙잡기 위해 나로 하여금 걸리게했을 것이다. – user1245262

2

(*meth)(self, arg)입니다.

함수 포인터이 로컬 변수입니다. return은 통화에서 되돌아 오는 것만 전달합니다.

함수 포인터 구문이 혼란 스럽습니다. :)

+0

고맙습니다. 나는 지금 바보 같지만 안심하고 덜 혼란 스럽다. – user1245262