summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xext/spl/spl_array.c3
-rwxr-xr-xext/spl/spl_directory.c1
-rwxr-xr-xext/spl/spl_engine.c9
-rwxr-xr-xext/spl/spl_engine.h21
-rwxr-xr-xext/spl/spl_foreach.c5
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);
}