おぎろぐはてブロ

なんだかんだエンジニアになって10年以上

PHP_FUNCTIONマクロ

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 を参照。