Llamando a Funciones del Usuario
Para llamar a funciones del usuario desde una función interna,
deberá usar la función call_user_function().
call_user_function() devuelve SUCCESS si tiene
éxito y FAILURE en caso de que la función no sea hallada. ¡Deberá
comprobar ese valor de retorno! Si devuelve SUCCESS, debe usted
ocuparse de destruir el pval devuelto (o devolverlo como el valor
de retorno de su función). Si devuelve FAILURE, el valor de valret
no está definido y no debe tocarlo.
Todas las funciones internas que llaman a funciones de
usuario deben ser reentrantes. Entre
otras cosas, esto quiere decir que no se utilicen variables
globales ni estáticas.
call_user_function() lleva 6 argumentos:
HashTable *tabla_funciones
Esta es la matriz asociativa en la que se buscará la función.
pval *objeto
Este es un puntero a un objeto sobre el que se invoca la función.
Deberá valer NULL si se llama a una función global. Si no es NULL
(es decir, si apunta a un objeto), el argumento tabla_funciones se
ignora y se toma su valor a partir de la codificación del objeto.
El objeto *puede* ser modificado por dicha función (ésta accede
a él a través de $this). Si por alguna razón no desea que eso
ocurra, envíe entonces una copia del objeto.
pval *nombre_func
El nombre de la función a llamar. Debe ser un pval de tipo
IS_STRING, con nombre_func.str.val y nombre_func.str.len
fijados a los valores apropiados. El nombre_func es modificado
por call_user_function(), que lo convierte a minúsculas. Si
necesita preservar el nombre, envíe una copia del mismo.
pval *valret
Un puntero a una estructura pval, en la que se guarda el valor
de returno de la función. Hay que asignar espacio a la estructura
previamente, porque la función call_user_function()
NO lo asigna por sí misma.
int num_params
El número de parámetros que se pasan a la función.
pval *params[]
Una matriz de punteros a los valores que se pasarán como argumentos
a la función. El primer argumento está en el elemento 0, el segundo
en el elemento 1, etc. La matriz es una matriz de punteros a pval. Los
punteros se envían tal cual a la función, lo que quiere decir que si
la función modifica sus argumentos, se modifican los valores originales
(paso por referencia). Si no desea ese comportamiento, pase una copia.