1. 내부적으로 c 를 사용하는 longjmp 메커니즘이 계약을 포기합니다. -응? 따라서 C 함수 foo 가 API 함수를 호출하고 이 API 함수 yield (yield 함수를 직접 또는 간접적으로 호출) 를 호출하는 경우 루아는 longjmp 가 c 스택의 스택 프레임을 제거하기 때문에 foo 를 반환할 수 없습니다.
2. 이러한 문제를 방지하기 위해 API 호출에서 yield 를 호출하면 오류가 발생한 API 외에 lua_yieldk, Lua _ call, lua_pcallk 의 세 가지 함수가 제공됩니다. Yield 가 발생하면 k 라는 들어오는 continuation 함수에서 계속 실행할 수 있습니다.
연속점을 설명하기 위해 몇 가지 용어를 미리 설정해야합니다. -응? 루아에서 호출된 C 함수의 경우 원래 함수라고 합니다. -응? 위에서 언급한 이 원시 함수에서 호출된 세 가지 C API 함수를 호출 함수라고 합니다. 호출 된 함수는 현재 스레드를 항복 할 수 있습니다. (yield 는 호출되는 함수가 lua_yieldk 이거나 lua_callk 또는 lua_pcallk 로 전달된 함수가 yield 를 호출할 때 발생합니다. ) 을 참조하십시오
4. 호출되는 함수를 실행할 때 실행 중인 스레드가 양보한다고 가정합니다. -응? 이 스레드가 다시 확장될 때 함수를 계속 호출하고자 합니다. 그러나 호출된 함수는 원래 함수로 돌아갈 수 없습니다. 이는 이전 yield 작업으로 인해 c 스택의 스택 프레임이 손상되었기 때문입니다. 대신 루아는 호출되는 함수의 인수로 주어진 continuation 함수를 호출합니다. 이름에서 알 수 있듯이, 연속 함수는 원래 함수의 임무를 이어갈 것이다.
5. 여기에 continuation 함수에 대한 추가 명시적 호출이 있습니다. Lua 는 필요할 때만 continuation 함수를 호출합니다. 오류 또는 yield 가 계속 실행되어야 하기 때문일 수 있습니다. Yield 가 없으면 호출되는 함수가 정상적으로 반환되면 lua_pcallk (및 lua_callk) 도 정상적으로 반환됩니다. (물론, 이 경우, 나중에 continuation 함수를 호출하지 않고, 원래 함수가 호출된 후에 직접 해야 할 일을 쓸 수 있습니다. ) 을 참조하십시오
루아는 연속 함수를 원래 함수로 취급합니다 6.Lua -응? 연속 함수는 원래 함수와 동일한 루아 스택을 받고, 수신된 루아 상태도 호출된 함수가 반환되면 있어야 할 상태와 일치합니다. 예를 들어 lua_callk 가 호출되면 이전에 스택에서 푸시된 함수 및 호출 매개 변수가 호출에서 생성된 반환 값으로 대체됩니다. ) 이때 같은 가치가 있습니다. 그것이 반환될 때 루아는 그것을 원래 함수의 반환으로 조작한다.
연속점을 설명하기 위해 몇 가지 용어를 미리 설정해야합니다. -응? 루아에서 호출된 C 함수의 경우 원래 함수라고 합니다. 위에서 언급한 이 원시 함수에서 호출된 세 가지 C API 함수를 호출 함수라고 합니다. 호출 된 함수는 현재 스레드를 항복 할 수 있습니다. (yield 는 호출되는 함수가 lua_yieldk 이거나 lua_callk 또는 lua_pcallk 로 전달된 함수가 yield 를 호출할 때 발생합니다. ) 을 참조하십시오
8. 호출되는 함수를 실행할 때 실행 중인 스레드가 양보한다고 가정합니다. -응? 이 스레드가 다시 확장될 때 함수를 계속 호출하고자 합니다. 그러나 호출된 함수는 원래 함수로 돌아갈 수 없습니다. 이는 이전 yield 작업으로 인해 c 스택의 스택 프레임이 손상되었기 때문입니다. 대신 루아는 호출되는 함수의 인수로 주어진 continuation 함수를 호출합니다. 이름에서 알 수 있듯이, 연속 함수는 원래 함수의 임무를 이어갈 것이다.
당신을 도울 수 있기를 바랍니다, 감사합니다!