PHP_FUNCTION(fname) は、以下のようなマクロで、
// main/php.h: #define PHP_FUNCTION ZEND_FUNCTION // Zend/zend_API.h: #define ZEND_FUNCTION(name) ZEND_NAMED_FUNCTION(ZEND_FN(name)) #define ZEND_FN(name) zif_##name #define ZEND_NAMED_FUNCTION(name) void name(INTERNAL_FUNCTION_PARAMETERS) // Zend/zend.h: #define INTERNAL_FUNCTION_PARAMETERS int ht, zval *return_value, zval *this_ptr, int return_value_used TSRMLS_DC
以下のように変換される。
void zif_fname(int ht, zval *return_value, zval *this_ptr, int return_value_used TSRMLS_DC)
パラメータは、
- int ht: なんだろこれ。ハッシュテーブルかとおもいきやintなのな。Extending and Embedding PHP (Developer's Library)にはdeprecatedって書いてあった。
- zval *return_value: 関数の戻り値となるもの。RETVAL_LONG(10)とかすると、このzvalに設定されます
- int return_value_used: 関数の戻り値が戻ったコードで参照されているか。読まれないなら戻り値を作らないってことができます。
関数に渡される引数(zend_parse_parametersして取ってくるデータ)は、 p = EG(argument_stack).top_element-2; とかして、スタックに積まれているらしいものを取っています。 zend_API.c を参照。