summaryrefslogtreecommitdiff
path: root/Zend/zend_execute.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-02-18 16:27:38 +0400
committerDmitry Stogov <dmitry@zend.com>2014-02-18 16:27:38 +0400
commit5de7115679522dec2f4725104c6f8c6e4a7bd8e4 (patch)
tree4c3ec266ea19dec3ca82e348c1e73483d1899715 /Zend/zend_execute.c
parent1c4f3d39a805323dc60f2bc1bfc96e39d608ac37 (diff)
downloadphp-git-5de7115679522dec2f4725104c6f8c6e4a7bd8e4.tar.gz
Use better data structures (incomplete; able to run bench.php)
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r--Zend/zend_execute.c134
1 files changed, 127 insertions, 7 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index a3f99a2f1a..cf3f84e2b5 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -72,9 +72,9 @@ static zend_always_inline void zend_pzval_unlock_func(zval *z, zend_free_op *sho
Z_SET_REFCOUNT_P(z, 1);
//??? Z_UNSET_ISREF_P(z);
if (Z_ISREF_P(z)) {
- zend_reference *ref = Z_REF_P(z);
- ZVAL_COPY_VALUE(z, &ref->val);
- efree(ref);
+//??? zend_reference *ref = Z_REF_P(z);
+//??? ZVAL_COPY_VALUE(z, &ref->val);
+//??? efree(ref);
}
should_free->var = z;
/* should_free->is_var = 1; */
@@ -82,9 +82,9 @@ static zend_always_inline void zend_pzval_unlock_func(zval *z, zend_free_op *sho
if (unref && Z_ISREF_P(z) && Z_REFCOUNT_P(z) == 1) {
//??? Z_UNSET_ISREF_P(z);
if (Z_ISREF_P(z)) {
- zend_reference *ref = Z_REF_P(z);
- ZVAL_COPY_VALUE(z, &ref->val);
- efree(ref);
+//??? zend_reference *ref = Z_REF_P(z);
+//??? ZVAL_COPY_VALUE(z, &ref->val);
+//??? efree(ref);
}
}
}
@@ -189,7 +189,27 @@ static zend_always_inline zval *_get_zval_ptr_tmp(zend_uint var, const zend_exec
static zend_always_inline zval *_get_zval_ptr_var(zend_uint var, const zend_execute_data *execute_data, zend_free_op *should_free TSRMLS_DC)
{
- return should_free->var = EX_VAR(var);
+ zval *ret = EX_VAR(var);
+
+ if (UNEXPECTED(Z_TYPE_P(ret) == IS_INDIRECT)) {
+ ret = Z_INDIRECT_P(ret);
+ }
+ should_free->var = ret;
+ return ret;
+}
+
+static zend_always_inline zval *_get_zval_ptr_var_deref(zend_uint var, const zend_execute_data *execute_data, zend_free_op *should_free TSRMLS_DC)
+{
+ zval *ret = EX_VAR(var);
+
+ if (UNEXPECTED(Z_TYPE_P(ret) == IS_INDIRECT)) {
+ ret = Z_INDIRECT_P(ret);
+ }
+ should_free->var = ret;
+ if (UNEXPECTED(Z_TYPE_P(ret) == IS_REFERENCE)) {
+ ret = Z_REFVAL_P(ret);
+ }
+ return ret;
}
static zend_never_inline zval *_get_zval_cv_lookup(zend_uint var, int type TSRMLS_DC)
@@ -301,6 +321,18 @@ static zend_always_inline zval *_get_zval_ptr_cv(zend_uint var, int type TSRMLS_
return ret;
}
+static zend_always_inline zval *_get_zval_ptr_cv_deref(zend_uint var, int type TSRMLS_DC)
+{
+ zval *ret = EX_VAR_NUM_2(EG(current_execute_data), var);
+
+ if (UNEXPECTED(Z_TYPE_P(ret) == IS_UNDEF)) {
+ return _get_zval_cv_lookup(var, type TSRMLS_CC);
+ } else if (UNEXPECTED(Z_TYPE_P(ret) == IS_REFERENCE)) {
+ ret = Z_REFVAL_P(ret);
+ }
+ return ret;
+}
+
static zend_always_inline zval *_get_zval_ptr_cv_BP_VAR_R(const zend_execute_data *execute_data, zend_uint var TSRMLS_DC)
{
zval *ret = EX_VAR_NUM(var);
@@ -311,6 +343,18 @@ static zend_always_inline zval *_get_zval_ptr_cv_BP_VAR_R(const zend_execute_dat
return ret;
}
+static zend_always_inline zval *_get_zval_ptr_cv_deref_BP_VAR_R(const zend_execute_data *execute_data, zend_uint var TSRMLS_DC)
+{
+ zval *ret = EX_VAR_NUM(var);
+
+ if (UNEXPECTED(Z_TYPE_P(ret) == IS_UNDEF)) {
+ return _get_zval_cv_lookup_BP_VAR_R(var TSRMLS_CC);
+ } else if (UNEXPECTED(Z_TYPE_P(ret) == IS_REFERENCE)) {
+ ret = Z_REFVAL_P(ret);
+ }
+ return ret;
+}
+
static zend_always_inline zval *_get_zval_ptr_cv_BP_VAR_UNSET(const zend_execute_data *execute_data, zend_uint var TSRMLS_DC)
{
zval *ret = EX_VAR_NUM(var);
@@ -321,6 +365,18 @@ static zend_always_inline zval *_get_zval_ptr_cv_BP_VAR_UNSET(const zend_execute
return ret;
}
+static zend_always_inline zval *_get_zval_ptr_cv_deref_BP_VAR_UNSET(const zend_execute_data *execute_data, zend_uint var TSRMLS_DC)
+{
+ zval *ret = EX_VAR_NUM(var);
+
+ if (UNEXPECTED(Z_TYPE_P(ret) == IS_UNDEF)) {
+ return _get_zval_cv_lookup_BP_VAR_UNSET(var TSRMLS_CC);
+ } else if (UNEXPECTED(Z_TYPE_P(ret) == IS_REFERENCE)) {
+ ret = Z_REFVAL_P(ret);
+ }
+ return ret;
+}
+
static zend_always_inline zval *_get_zval_ptr_cv_BP_VAR_IS(const zend_execute_data *execute_data, zend_uint var TSRMLS_DC)
{
zval *ret = EX_VAR_NUM(var);
@@ -331,6 +387,18 @@ static zend_always_inline zval *_get_zval_ptr_cv_BP_VAR_IS(const zend_execute_da
return ret;
}
+static zend_always_inline zval *_get_zval_ptr_cv_deref_BP_VAR_IS(const zend_execute_data *execute_data, zend_uint var TSRMLS_DC)
+{
+ zval *ret = EX_VAR_NUM(var);
+
+ if (UNEXPECTED(Z_TYPE_P(ret) == IS_UNDEF)) {
+ return _get_zval_cv_lookup_BP_VAR_IS(var TSRMLS_CC);
+ } else if (UNEXPECTED(Z_TYPE_P(ret) == IS_REFERENCE)) {
+ ret = Z_REFVAL_P(ret);
+ }
+ return ret;
+}
+
static zend_always_inline zval *_get_zval_ptr_cv_BP_VAR_RW(const zend_execute_data *execute_data, zend_uint var TSRMLS_DC)
{
zval *ret = EX_VAR_NUM(var);
@@ -341,6 +409,18 @@ static zend_always_inline zval *_get_zval_ptr_cv_BP_VAR_RW(const zend_execute_da
return ret;
}
+static zend_always_inline zval *_get_zval_ptr_cv_deref_BP_VAR_RW(const zend_execute_data *execute_data, zend_uint var TSRMLS_DC)
+{
+ zval *ret = EX_VAR_NUM(var);
+
+ if (UNEXPECTED(Z_TYPE_P(ret) == IS_UNDEF)) {
+ return _get_zval_cv_lookup_BP_VAR_RW(var TSRMLS_CC);
+ } else if (UNEXPECTED(Z_TYPE_P(ret) == IS_REFERENCE)) {
+ ret = Z_REFVAL_P(ret);
+ }
+ return ret;
+}
+
static zend_always_inline zval *_get_zval_ptr_cv_BP_VAR_W(const zend_execute_data *execute_data, zend_uint var TSRMLS_DC)
{
zval *ret = EX_VAR_NUM(var);
@@ -351,6 +431,18 @@ static zend_always_inline zval *_get_zval_ptr_cv_BP_VAR_W(const zend_execute_dat
return ret;
}
+static zend_always_inline zval *_get_zval_ptr_cv_deref_BP_VAR_W(const zend_execute_data *execute_data, zend_uint var TSRMLS_DC)
+{
+ zval *ret = EX_VAR_NUM(var);
+
+ if (UNEXPECTED(Z_TYPE_P(ret) == IS_UNDEF)) {
+ return _get_zval_cv_lookup_BP_VAR_W(var TSRMLS_CC);
+ } else if (UNEXPECTED(Z_TYPE_P(ret) == IS_REFERENCE)) {
+ ret = Z_REFVAL_P(ret);
+ }
+ return ret;
+}
+
static inline zval *_get_zval_ptr(int op_type, const znode_op *node, const zend_execute_data *execute_data, zend_free_op *should_free, int type TSRMLS_DC)
{
/* should_free->is_var = 0; */
@@ -379,6 +471,34 @@ static inline zval *_get_zval_ptr(int op_type, const znode_op *node, const zend_
return NULL;
}
+static inline zval *_get_zval_ptr_deref(int op_type, const znode_op *node, const zend_execute_data *execute_data, zend_free_op *should_free, int type TSRMLS_DC)
+{
+/* should_free->is_var = 0; */
+ switch (op_type) {
+ case IS_CONST:
+ should_free->var = 0;
+ return node->zv;
+ break;
+ case IS_TMP_VAR:
+ should_free->var = TMP_FREE(EX_VAR(node->var));
+ return EX_VAR(node->var);
+ break;
+ case IS_VAR:
+ return _get_zval_ptr_var_deref(node->var, execute_data, should_free TSRMLS_CC);
+ break;
+ case IS_UNUSED:
+ should_free->var = 0;
+ return NULL;
+ break;
+ case IS_CV:
+ should_free->var = 0;
+ return _get_zval_ptr_cv_deref(node->var, type TSRMLS_CC);
+ break;
+ EMPTY_SWITCH_DEFAULT_CASE()
+ }
+ return NULL;
+}
+
//???
#if 0
static zend_always_inline zval **_get_zval_ptr_ptr_var(zend_uint var, const zend_execute_data *execute_data, zend_free_op *should_free TSRMLS_DC)