1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

メモ: マクロ PHP_FUNCTION を展開する

Posted at

結論もどき

PHP_FUNCTION(array_reverse)

void zif_array_reverse(zend_execute_data *execute_data, zval *return_value)

読むソースコード

php/php-src: The PHP Interpreter

手元のソースコードのコミットは こちら

PHP_FUNCTION が使われているところの例

ext/standard/array.c
/* {{{ proto array array_reverse(array input [, bool preserve keys])
   Return input as a new array with the order of the entries reversed */
PHP_FUNCTION(array_reverse)
{
	zval	 *input,				/* Input array */
			 *entry;				/* An entry in the input array */
	zend_string *string_key;
	zend_ulong	  num_key;
	zend_bool preserve_keys = 0;	/* whether to preserve keys */

	ZEND_PARSE_PARAMETERS_START(1, 2)
		Z_PARAM_ARRAY(input)
		Z_PARAM_OPTIONAL
		Z_PARAM_BOOL(preserve_keys)
	ZEND_PARSE_PARAMETERS_END();

	/* Initialize return array */
	array_init_size(return_value, zend_hash_num_elements(Z_ARRVAL_P(input)));
	if ((HT_FLAGS(Z_ARRVAL_P(input)) & HASH_FLAG_PACKED) && !preserve_keys) {
		zend_hash_real_init_packed(Z_ARRVAL_P(return_value));
		ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(return_value)) {
			ZEND_HASH_REVERSE_FOREACH_VAL(Z_ARRVAL_P(input), entry) {
				if (UNEXPECTED(Z_ISREF_P(entry) &&
					Z_REFCOUNT_P(entry) == 1)) {
					entry = Z_REFVAL_P(entry);
				}
				Z_TRY_ADDREF_P(entry);
				ZEND_HASH_FILL_ADD(entry);
			} ZEND_HASH_FOREACH_END();
		} ZEND_HASH_FILL_END();
	} else {
		ZEND_HASH_REVERSE_FOREACH_KEY_VAL(Z_ARRVAL_P(input), num_key, string_key, entry) {
			if (string_key) {
				entry = zend_hash_add_new(Z_ARRVAL_P(return_value), string_key, entry);
			} else {
				if (preserve_keys) {
					entry = zend_hash_index_add_new(Z_ARRVAL_P(return_value), num_key, entry);
				} else {
					entry = zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), entry);
				}
			}
			zval_add_ref(entry);
		} ZEND_HASH_FOREACH_END();
	}
}
/* }}} */

PHP_FUNCTION の定義はこちら

main/php.h
#define PHP_FUNCTION			ZEND_FUNCTION

PHP_FUNCTION(array_reverse)

ZEND_FUNCTION(array_reverse)

ZEND_FUNCTION の定義はこちら

Zend/zend_API.h
#define ZEND_FUNCTION(name)				ZEND_NAMED_FUNCTION(zif_##name)

ZEND_FUNCTION(array_reverse)

ZEND_NAMED_FUNCTION(zif_array_reverse)

ZEND_NAMED_FUNCTION の定義はこちら

Zend/zend_API.h
#define ZEND_NAMED_FUNCTION(name)		void ZEND_FASTCALL name(INTERNAL_FUNCTION_PARAMETERS)

ZEND_NAMED_FUNCTION(zif_array_reverse)

void ZEND_FASTCALL zif_array_reverse(INTERNAL_FUNCTION_PARAMETERS)

ZEND_FASTCALL の定義はこちら

Zend/zend_portability.h
#if defined(__GNUC__) && ZEND_GCC_VERSION >= 3004 && defined(__i386__)
# define ZEND_FASTCALL __attribute__((fastcall))
#elif defined(_MSC_VER) && defined(_M_IX86) && _MSC_VER == 1700
# define ZEND_FASTCALL __fastcall
#elif defined(_MSC_VER) && _MSC_VER >= 1800 && !defined(__clang__)
# define ZEND_FASTCALL __vectorcall
#else
# define ZEND_FASTCALL
#endif

さっぱりわからないので else だと思い込むことにする。

void ZEND_FASTCALL zif_array_reverse(INTERNAL_FUNCTION_PARAMETERS)

void zif_array_reverse(INTERNAL_FUNCTION_PARAMETERS)

INTERNAL_FUNCTION_PARAMETERS の定義はこちら

Zend/zend.h
#define INTERNAL_FUNCTION_PARAMETERS zend_execute_data *execute_data, zval *return_value

void zif_array_reverse(INTERNAL_FUNCTION_PARAMETERS)

void zif_array_reverse(zend_execute_data *execute_data, zval *return_value)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?