diff --git a/HISTORY b/HISTORY index 381763b..36cadd2 100644 --- a/HISTORY +++ b/HISTORY @@ -1,5 +1,5 @@ -Version 1.24 2016-02-11 +Version 1.24 2016-02-15 * php extension compiled on PHP 7 * add skiplist which support stable sort * make.sh: use sed to replace perl @@ -11,6 +11,7 @@ Version 1.24 2016-02-11 * add fast_blocked_queue.[hc] * iovent bug fixed for FreeBSD * sysinfo for FreeBSD + * add php7_ext_wrapper.h for php7 migration Version 1.23 2015-11-16 * sched_thread.c: task can execute in a new thread diff --git a/src/Makefile.in b/src/Makefile.in index 1c9f473..53f233f 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -29,7 +29,8 @@ HEADER_FILES = common_define.h hash.h chain.h logger.h base64.h \ fast_timer.h process_ctrl.h fast_mblock.h \ connection_pool.h fast_mpool.h fast_allocator.h \ fast_buffer.h skiplist.h multi_skiplist.h flat_skiplist.h \ - skiplist_common.h system_info.h fast_blocked_queue.h + skiplist_common.h system_info.h fast_blocked_queue.h \ + php7_ext_wrapper.h ALL_OBJS = $(FAST_STATIC_OBJS) $(FAST_SHARED_OBJS) diff --git a/src/php7_ext_wrapper.h b/src/php7_ext_wrapper.h new file mode 100644 index 0000000..34206eb --- /dev/null +++ b/src/php7_ext_wrapper.h @@ -0,0 +1,160 @@ +/* php7 extension wrapper + * for compatibility, these wrapper functions are designed for old php version. + */ + +#ifndef _PHP7_EXT_WRAPPER_H +#define _PHP7_EXT_WRAPPER_H + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#ifdef ZTS +#include "TSRM.h" +#endif + +#include +#include + +#if PHP_MAJOR_VERSION < 7 +typedef int zend_size_t; +#define ZEND_RETURN_STRINGL_DUP(s, l) RETURN_STRINGL(s, l, 1) +#define ZEND_RETURN_STRINGL_EX(s, l, callback) \ + do { \ + RETVAL_STRINGL(s, l, 1); \ + callback(s); /* generally for free the pointer */ \ + return; \ + } while (0) + +#define ZEND_TYPE_OF(z) (z)->type +#define ZEND_IS_BOOL(z) (ZEND_TYPE_OF(z) == IS_BOOL) +#define ZEND_IS_TRUE(z) ((z)->value.lval != 0) +#define Z_CE_P(z) ((zend_class_entry *)(z)) + +//#define zend_get_object_wrapper(obj) zend_object_store_get_object(obj) + +#define zend_hash_update_wrapper zend_hash_update +#define zend_call_user_function_wrapper call_user_function + +#define zend_add_assoc_long_ex(z, key, key_len, n) \ + add_assoc_long_ex(z, key, key_len, n) + +#define zend_add_assoc_stringl_ex(z, key, key_len, str, length, dup) \ + add_assoc_stringl_ex(z, key, key_len, str, length, dup) + +#define zend_add_assoc_zval_ex(z, key, key_len, value) \ + add_assoc_zval_ex(z, key, key_len, value) + +#define zend_add_assoc_bool_ex(z, key, key_len, b) \ + add_assoc_bool_ex(z, key, key_len, b) + +static inline int zend_hash_find_wrapper(HashTable *ht, char *key, int key_len, + zval **value) +{ + zval **pp; + + pp = NULL; + if (zend_hash_find(ht, key, key_len, (void **)&pp) == SUCCESS) + { + *value = *pp; + return SUCCESS; + } + else + { + *value = NULL; + return FAILURE; + } +} + +static inline int zend_get_configuration_directive_wrapper(char *name, int len, + zval **value) +{ + return zend_get_configuration_directive(name, len, *value); +} + +#else + +typedef size_t zend_size_t; +#define ZEND_RETURN_STRINGL_DUP(s, l) RETURN_STRINGL(s, l) +#define ZEND_RETURN_STRINGL_EX(s, l, callback) \ + do { \ + RETVAL_STRINGL(s, l); \ + callback(s); \ + return; \ + } while (0) + +#define ZEND_TYPE_OF(z) Z_TYPE_P(z) +#define ZEND_IS_BOOL(z) (Z_TYPE_P(z) == IS_TRUE || Z_TYPE_P(z) == IS_FALSE) +#define ZEND_IS_TRUE(z) (Z_TYPE_P(z) == IS_TRUE) +#define Z_STRVAL_PP(s) Z_STRVAL_P(*s) +#define Z_STRLEN_PP(s) Z_STRLEN_P(*s) +//#define zend_get_object_wrapper(obj) (void *)((char *)(Z_OBJ_P(obj)) - XtOffsetOf(php_fdfs_t, zo)) + +#define MAKE_STD_ZVAL(p) zval _stack_zval_##p; p = &(_stack_zval_##p) +#define ALLOC_INIT_ZVAL(p) MAKE_STD_ZVAL(p) +#define INIT_ZVAL(z) + +#define zend_add_assoc_long_ex(z, key, key_len, n) \ + add_assoc_long_ex(z, key, key_len - 1, n) + +#define zend_add_assoc_stringl_ex(z, key, key_len, str, length, dup) \ + add_assoc_stringl_ex(z, key, key_len - 1, str, length) + +#define zend_add_assoc_zval_ex(z, key, key_len, value) \ + add_assoc_zval_ex(z, key, key_len - 1, value) + +#define zend_add_assoc_bool_ex(z, key, key_len, b) \ + add_assoc_bool_ex(z, key, key_len - 1, b) + +static inline int zend_hash_find_wrapper(HashTable *ht, char *key, int key_len, + zval **value) +{ + zval zkey; + ZVAL_STRINGL(&zkey, key, key_len - 1); + *value = zend_hash_find(ht, Z_STR(zkey)); + return (*value != NULL ? SUCCESS : FAILURE); +} + +static inline int zend_hash_update_wrapper(HashTable *ht, char *k, int len, + void *val, int size, void *ptr) +{ + zval key; + ZVAL_STRINGL(&key, k, len - 1); + return zend_hash_update(ht, Z_STR(key), val) ? SUCCESS : FAILURE; +} + +static inline int zend_call_user_function_wrapper(HashTable *function_table, + zval *object, zval *function_name, zval *retval_ptr, + uint32_t param_count, zval **params TSRMLS_DC) +{ + int i; + zval real_params[64]; + + if (param_count > 64) + { + return FAILURE; + } + + for(i=0; i