diff options
| -rwxr-xr-x | ext/spl/spl_array.c | 3 | ||||
| -rwxr-xr-x | ext/spl/spl_directory.c | 1 | ||||
| -rwxr-xr-x | ext/spl/spl_engine.c | 9 | ||||
| -rwxr-xr-x | ext/spl/spl_engine.h | 21 | ||||
| -rwxr-xr-x | ext/spl/spl_foreach.c | 5 |
5 files changed, 27 insertions, 12 deletions
diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 3f658abd8a..6c066a1589 100755 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -24,7 +24,6 @@ #include "php_ini.h" #include "ext/standard/info.h" #include "zend_compile.h" -#include "zend_execute_locks.h" #include "php_spl.h" #include "spl_functions.h" @@ -101,7 +100,7 @@ ZEND_EXECUTE_HOOK_FUNCTION(ZEND_FETCH_DIM_R) if (!spl_fetch_dimension_address(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), BP_VAR_R TSRMLS_CC)) { if (EX(opline)->extended_value == ZEND_FETCH_ADD_LOCK) { - PZVAL_LOCK(*EX_T(EX(opline)->op1.u.var).var.ptr_ptr); + spl_pzval_lock_func(*EX_T(EX(opline)->op1.u.var).var.ptr_ptr); } spl_unlock_zval_ptr_ptr(&EX(opline)->op1, EX(Ts) TSRMLS_CC); diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 4b546cb21f..1e6d7bc204 100755 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -26,7 +26,6 @@ #include "php_ini.h" #include "ext/standard/info.h" #include "zend_compile.h" -#include "zend_execute_locks.h" #include "zend_default_classes.h" #include "php_spl.h" diff --git a/ext/spl/spl_engine.c b/ext/spl/spl_engine.c index 48a0f1b9de..349a599784 100755 --- a/ext/spl/spl_engine.c +++ b/ext/spl/spl_engine.c @@ -24,7 +24,6 @@ #include "php_ini.h" #include "ext/standard/info.h" #include "zend_compile.h" -#include "zend_execute_locks.h" #include "php_spl.h" #include "spl_functions.h" @@ -72,9 +71,9 @@ void spl_unlock_zval_ptr_ptr(znode *node, temp_variable *Ts TSRMLS_DC) { if (node->op_type==IS_VAR) { if (T(node->u.var).var.ptr_ptr) { - PZVAL_UNLOCK(*T(node->u.var).var.ptr_ptr); + spl_pzval_unlock_func(*T(node->u.var).var.ptr_ptr TSRMLS_CC); } else if (T(node->u.var).EA.type==IS_STRING_OFFSET) { - PZVAL_UNLOCK(T(node->u.var).EA.data.str_offset.str); + spl_pzval_unlock_func(T(node->u.var).EA.data.str_offset.str TSRMLS_CC); } } } @@ -93,7 +92,7 @@ zval * spl_get_zval_ptr(znode *node, temp_variable *Ts, zval **should_free TSRML break; case IS_VAR: if (T(node->u.var).var.ptr) { - PZVAL_UNLOCK(T(node->u.var).var.ptr); + spl_pzval_unlock_func(T(node->u.var).var.ptr TSRMLS_CC); *should_free = 0; return T(node->u.var).var.ptr; } else { @@ -116,7 +115,7 @@ zval * spl_get_zval_ptr(znode *node, temp_variable *Ts, zval **should_free TSRML T->tmp_var.value.str.val = estrndup(&c, 1); T->tmp_var.value.str.len = 1; } - PZVAL_UNLOCK(str); + spl_pzval_unlock_func(str TSRMLS_CC); T->tmp_var.refcount=1; T->tmp_var.is_ref=1; T->tmp_var.type = IS_STRING; diff --git a/ext/spl/spl_engine.h b/ext/spl/spl_engine.h index e4c0e93a4a..19f4ccc83b 100755 --- a/ext/spl/spl_engine.h +++ b/ext/spl/spl_engine.h @@ -23,7 +23,6 @@ #include "php_spl.h" #include "zend_compile.h" -#include "zend_execute_locks.h" #undef EX #define EX(element) execute_data->element @@ -76,6 +75,26 @@ typedef enum { spl_is_a spl_implements(zend_class_entry *ce); +/* Use this only insode OPCODE-Hooks */ +static inline void spl_pzval_unlock_func(zval *z TSRMLS_DC) +{ + z->refcount--; + if (!z->refcount) { + z->refcount = 1; + z->is_ref = 0; + EG(garbage)[EG(garbage_ptr)++] = z; + } +} + +/* Use this only insode OPCODE-Hooks */ +static inline void spl_pzval_lock_func(zval *z) +{ + z->refcount++; +} + +/* Use this only insode OPCODE-Hooks */ +#define SELECTIVE_PZVAL_LOCK(pzv, pzn) if (!((pzn)->u.EA.type & EXT_TYPE_UNUSED)) { spl_pzval_lock_func(pzv); } + #endif /* SPL_ENGINE_H */ /* diff --git a/ext/spl/spl_foreach.c b/ext/spl/spl_foreach.c index d57d048fde..54d4e06a45 100755 --- a/ext/spl/spl_foreach.c +++ b/ext/spl/spl_foreach.c @@ -24,7 +24,6 @@ #include "php_ini.h" #include "ext/standard/info.h" #include "zend_compile.h" -#include "zend_execute_locks.h" #include "php_spl.h" #include "spl_functions.h" @@ -77,7 +76,7 @@ ZEND_EXECUTE_HOOK_FUNCTION(ZEND_FE_RESET) php_error_docref(NULL TSRMLS_CC, E_WARNING, "Objects created by %s::new_iterator() must implement spl_forward", obj_ce->name); ZEND_EXECUTE_HOOK_ORIGINAL(ZEND_FE_RESET); } - PZVAL_LOCK(retval); + spl_pzval_lock_func(retval); } else if (is_a & SPL_IS_A_FORWARD) { spl_unlock_zval_ptr_ptr(&EX(opline)->op1, EX(Ts) TSRMLS_CC); retval = *obj; @@ -252,7 +251,7 @@ ZEND_EXECUTE_HOOK_FUNCTION(ZEND_SWITCH_FREE) FREE_ZVAL(tmp); spl_unlock_zval_ptr_ptr(&EX(opline)->op1, EX(Ts) TSRMLS_CC); - PZVAL_LOCK(*obj); + spl_pzval_lock_func(*obj); SET_UNUSED(*op2); } |
