summaryrefslogtreecommitdiff
path: root/Zend/zend_execute_API.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-04-01 22:36:17 +0400
committerDmitry Stogov <dmitry@zend.com>2014-04-01 22:36:17 +0400
commit6b2ed577fd5c3eeee55be394d8faac50ab8602f9 (patch)
treef8f41cef4dd367e1313f0a69b3a4a2a8352bd9dd /Zend/zend_execute_API.c
parent8ddda2f649f3b13db3f4cfc48710637c823464d1 (diff)
downloadphp-git-6b2ed577fd5c3eeee55be394d8faac50ab8602f9.tar.gz
Avoid unnecessry reallocations
Diffstat (limited to 'Zend/zend_execute_API.c')
-rw-r--r--Zend/zend_execute_API.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 7400840a49..d5f70a15c9 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -1762,7 +1762,40 @@ ZEND_API void zend_detach_symbol_table(TSRMLS_D) /* {{{ */
}
/* }}} */
-ZEND_API int zend_set_local_var(const char *name, int len, zval *value, int force TSRMLS_DC) /* {{{ */
+ZEND_API int zend_set_local_var(zend_string *name, zval *value, int force TSRMLS_DC) /* {{{ */
+{
+ if (!EG(active_symbol_table)) {
+ int i;
+ zend_execute_data *execute_data = EG(current_execute_data);
+ zend_op_array *op_array = execute_data->op_array;
+ zend_ulong h = STR_HASH_VAL(name);
+
+ if (op_array) {
+ for (i = 0; i < op_array->last_var; i++) {
+ if (op_array->vars[i]->h == h &&
+ op_array->vars[i]->len == name->len &&
+ memcmp(op_array->vars[i]->val, name->val, name->len) == 0) {
+ ZVAL_COPY_VALUE(EX_VAR_NUM(i), value);
+ return SUCCESS;
+ }
+ }
+ }
+ if (force) {
+ zend_rebuild_symbol_table(TSRMLS_C);
+ if (EG(active_symbol_table)) {
+ zend_hash_update(&EG(active_symbol_table)->ht, name, value);
+ }
+ } else {
+ return FAILURE;
+ }
+ } else {
+ return (zend_hash_update_ind(&EG(active_symbol_table)->ht, name, value) != NULL) ? SUCCESS : FAILURE;
+ }
+ return SUCCESS;
+}
+/* }}} */
+
+ZEND_API int zend_set_local_var_str(const char *name, int len, zval *value, int force TSRMLS_DC) /* {{{ */
{
if (!EG(active_symbol_table)) {
int i;