diff options
| author | Dmitry Stogov <dmitry@zend.com> | 2014-02-18 16:27:38 +0400 |
|---|---|---|
| committer | Dmitry Stogov <dmitry@zend.com> | 2014-02-18 16:27:38 +0400 |
| commit | 5de7115679522dec2f4725104c6f8c6e4a7bd8e4 (patch) | |
| tree | 4c3ec266ea19dec3ca82e348c1e73483d1899715 /Zend/zend_execute.c | |
| parent | 1c4f3d39a805323dc60f2bc1bfc96e39d608ac37 (diff) | |
| download | php-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.c | 134 |
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) |
