¿Qué hace el departamento de TI?
1. Utiliza internamente el mecanismo longjmp de C para renunciar a un contrato. ? Entonces, si una función c foo llama a una función API, y esta función API produce (llama directa o indirectamente a la función de rendimiento). Lua no puede devolver foo porque longjmp eliminará el marco de la pila de C.
2. Para evitar este tipo de problemas, al llamar a rendimiento en una llamada API, además de aquellas API que arrojan errores, también se proporcionan tres funciones: lua_yieldk, Lua_call y lua_pcallk. Cuando se produce el rendimiento, pueden continuar ejecutándose desde la función de continuación pasada (el parámetro se denomina k).
3. Necesitamos presuponer algunos términos para explicar el punto de continuación. ? Para las funciones c llamadas desde Lua, las llamamos funciones originales. ? Las tres funciones de la API de C mencionadas anteriormente, llamadas desde esta función original, se denominan funciones. La función que se llama puede poner de rodillas al hilo actual. (El rendimiento ocurre cuando la función llamada es lua_yieldk, o cuando la función pasada en lua_callk o lua_pcallk llama a rendimiento).
4. Supongamos que el hilo en ejecución cede mientras ejecuta la función llamada. ? Cuando este hilo se extiende nuevamente, desea continuar la operación de la función llamada. Sin embargo, es imposible que la función llamada vuelva a la función original. Esto se debe a que la operación de rendimiento anterior destruyó el marco de la pila de C. En cambio, Lua llama a la función de continuación dada como argumento de la función llamada. Como sugiere el nombre, la función de continuación continuará las tareas de la función original.
5. Tenga en cuenta la llamada explícita adicional a la función de continuación aquí: Lua solo llamará a la función de continuación cuando sea necesario, ya sea debido a un error o porque el rendimiento debe continuar ejecutándose. Si no hay rendimiento y la función llamada regresa normalmente, entonces lua_pcallk (y lua_callk) también regresarán normalmente. (Por supuesto, en este ejemplo, no puede llamar a la función de continuación más tarde, pero escriba el trabajo que debe realizarse directamente después de llamar a la función original).
Lua tratará la función de continuación. como la función original. ? La función de continuación recibirá la misma pila de Lua que la función original, y el estado de Lua recibido será consistente con el estado que debería tener la función llamada si regresa. (Por ejemplo, después de llamar a lua_callk, las funciones y los parámetros de llamada previamente insertados en la pila se reemplazan por los valores de retorno generados por la llamada). También tiene el mismo valor en este momento. Cuando regrese, Lua operará en él como el retorno de la función original.
7. Necesitamos presuponer algunos términos para explicar el punto de continuación. ? Para las funciones c llamadas desde Lua, las llamamos funciones originales. Las tres funciones de la API de C mencionadas anteriormente, llamadas desde esta función original, se denominan funciones. La función que se llama puede poner de rodillas al hilo actual. (El rendimiento ocurre cuando la función llamada es lua_yieldk, o cuando la función pasada en lua_callk o lua_pcallk llama a rendimiento).
8. Supongamos que el hilo en ejecución cede mientras ejecuta la función llamada. ? Cuando este hilo se extiende nuevamente, desea continuar la operación de la función llamada. Sin embargo, es imposible que la función llamada vuelva a la función original. Esto se debe a que la operación de rendimiento anterior destruyó el marco de la pila de C. En cambio, Lua llama a la función de continuación dada como argumento de la función llamada. Como sugiere el nombre, la función de continuación continuará las tareas de la función original.
Espero que esto ayude, ¡gracias!