diff options
author | Dmitry Stogov <dmitry@zend.com> | 2014-02-18 11:44:58 +0400 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2014-02-18 11:44:58 +0400 |
commit | 1c4f3d39a805323dc60f2bc1bfc96e39d608ac37 (patch) | |
tree | 0a78e184e192712e530cfb7007432f9c84e65b2e | |
parent | a0fe8e5a91024710372625555b7d84dc9726e2da (diff) | |
download | php-git-1c4f3d39a805323dc60f2bc1bfc96e39d608ac37.tar.gz |
Use better data structures (incomplete)
-rw-r--r-- | Zend/zend_execute.c | 83 | ||||
-rw-r--r-- | Zend/zend_vm_def.h | 7 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 57 | ||||
-rw-r--r-- | main/main.c | 2 |
4 files changed, 99 insertions, 50 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 68b6bef360..a3f99a2f1a 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -760,63 +760,60 @@ static inline zval* zend_assign_const_to_variable(zval *variable_ptr, zval *valu static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRMLS_DC) { - if (Z_ISREF_P(variable_ptr)) { + zval garbage; + + if (EXPECTED(!IS_REFCOUNTED(Z_TYPE_P(variable_ptr)))) { + ZVAL_COPY(variable_ptr, value); + return variable_ptr; + } else if (Z_ISREF_P(variable_ptr)) { variable_ptr = Z_REFVAL_P(variable_ptr); } - if (Z_TYPE_P(variable_ptr) == IS_OBJECT && + if (EXPECTED(!IS_REFCOUNTED(Z_TYPE_P(variable_ptr)))) { + ZVAL_COPY(variable_ptr, value); + } else if (Z_TYPE_P(variable_ptr) == IS_OBJECT && UNEXPECTED(Z_OBJ_HANDLER_P(variable_ptr, set) != NULL)) { Z_OBJ_HANDLER_P(variable_ptr, set)(variable_ptr, value TSRMLS_CC); - return variable_ptr; - } - -//??? -#if 0 - if (EXPECTED(!PZVAL_IS_REF(variable_ptr))) { + } else if (EXPECTED(variable_ptr != value)) { if (Z_REFCOUNT_P(variable_ptr)==1) { - if (UNEXPECTED(variable_ptr == value)) { - return variable_ptr; - } else if (EXPECTED(!PZVAL_IS_REF(value))) { - Z_ADDREF_P(value); - *variable_ptr_ptr = value; - ZEND_ASSERT(variable_ptr != &EG(uninitialized_zval)); - GC_REMOVE_ZVAL_FROM_BUFFER(variable_ptr); - zval_dtor(variable_ptr); - efree(variable_ptr); - return value; - } else { - goto copy_value; - } +//??? if (EXPECTED(!IS_REFCOUNTED(Z_TYPE_P(value)))) { +//??? _zval_dtor_func(variable_ptr ZEND_FILE_LINE_CC); +//??? ZVAL_COPY(variable_ptr, value); +//??? } else if (EXPECTED(!Z_ISREF_P(value))) { +//??? Z_ADDREF_P(value); +//??? *variable_ptr_ptr = value; +//??? ZEND_ASSERT(variable_ptr != &EG(uninitialized_zval)); +//??? GC_REMOVE_ZVAL_FROM_BUFFER(variable_ptr); +//??? zval_dtor(variable_ptr); +//??? ZVAL_COPY(variable_ptr, value); +//??? } else { + ZVAL_COPY_VALUE(&garbage, variable_ptr); + ZVAL_DUP(variable_ptr, value); + _zval_dtor_func(&garbage ZEND_FILE_LINE_CC); +//??? } } else { /* we need to split */ Z_DELREF_P(variable_ptr); GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr); - if (PZVAL_IS_REF(value)) { - ALLOC_ZVAL(variable_ptr); - *variable_ptr_ptr = variable_ptr; - INIT_PZVAL_COPY(variable_ptr, value); - zval_copy_ctor(variable_ptr); - return variable_ptr; + if (Z_ISREF_P(value)) { + ZVAL_DUP(variable_ptr, Z_REFVAL_P(value)); } else { - *variable_ptr_ptr = value; - Z_ADDREF_P(value); - return value; - } - } - } else { - if (EXPECTED(variable_ptr != value)) { -copy_value: - if (EXPECTED(Z_TYPE_P(variable_ptr) <= IS_BOOL)) { - /* nothing to destroy */ - ZVAL_DUP(variable_ptr, value); - } else { - ZVAL_COPY_VALUE(&garbage, variable_ptr); - ZVAL_DUP(variable_ptr, value); - _zval_dtor_func(&garbage ZEND_FILE_LINE_CC); + ZVAL_COPY(variable_ptr, value); } } +//??? } else { +//??? if (EXPECTED(variable_ptr != value)) { +//???copy_value: +//??? if (EXPECTED(Z_TYPE_P(variable_ptr) <= IS_BOOL)) { +//??? /* nothing to destroy */ +//??? ZVAL_DUP(variable_ptr, value); +//??? } else { +//??? ZVAL_COPY_VALUE(&garbage, variable_ptr); +//??? ZVAL_DUP(variable_ptr, value); +//??? _zval_dtor_func(&garbage ZEND_FILE_LINE_CC); +//??? } +//??? } return variable_ptr; } -#endif return variable_ptr; } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 647efe4231..9dc9f91d16 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -495,6 +495,9 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_helper, VAR|UNUSED|CV, CONST|TMP|VAR|UNU Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC); zval_ptr_dtor(objval); } else { + if (Z_ISREF_P(var_ptr)) { + var_ptr = Z_REFVAL_P(var_ptr); + } binary_op(var_ptr, var_ptr, value TSRMLS_CC); } @@ -1729,8 +1732,8 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV) ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); } - FREE_OP1_VAR_PTR(); - FREE_OP2_VAR_PTR(); +//??? FREE_OP1_VAR_PTR(); +//??? FREE_OP2_VAR_PTR(); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 6f6746c3bc..5420c8e418 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -13759,6 +13759,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CONST(int (*binar Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC); zval_ptr_dtor(objval); } else { + if (Z_ISREF_P(var_ptr)) { + var_ptr = Z_REFVAL_P(var_ptr); + } binary_op(var_ptr, var_ptr, value TSRMLS_CC); } @@ -16118,6 +16121,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_TMP(int (*binary_ Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC); zval_ptr_dtor(objval); } else { + if (Z_ISREF_P(var_ptr)) { + var_ptr = Z_REFVAL_P(var_ptr); + } binary_op(var_ptr, var_ptr, value TSRMLS_CC); } @@ -18079,6 +18085,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_VAR(int (*binary_ Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC); zval_ptr_dtor(objval); } else { + if (Z_ISREF_P(var_ptr)) { + var_ptr = Z_REFVAL_P(var_ptr); + } binary_op(var_ptr, var_ptr, value TSRMLS_CC); } @@ -19089,8 +19098,8 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); } - if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);}; - if (free_op2.var) {zval_ptr_dtor_nogc(free_op2.var);}; +//??? if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);}; +//??? if (free_op2.var) {zval_ptr_dtor_nogc(free_op2.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -20128,6 +20137,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_UNUSED(int (*bina Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC); zval_ptr_dtor(objval); } else { + if (Z_ISREF_P(var_ptr)) { + var_ptr = Z_REFVAL_P(var_ptr); + } binary_op(var_ptr, var_ptr, value TSRMLS_CC); } @@ -21470,6 +21482,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CV(int (*binary_o Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC); zval_ptr_dtor(objval); } else { + if (Z_ISREF_P(var_ptr)) { + var_ptr = Z_REFVAL_P(var_ptr); + } binary_op(var_ptr, var_ptr, value TSRMLS_CC); } @@ -22327,7 +22342,8 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); } - if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);}; +//??? if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);}; +//??? ; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -23283,6 +23299,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_CONST(int (*bi Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC); zval_ptr_dtor(objval); } else { + if (Z_ISREF_P(var_ptr)) { + var_ptr = Z_REFVAL_P(var_ptr); + } binary_op(var_ptr, var_ptr, value TSRMLS_CC); } @@ -24611,6 +24630,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_TMP(int (*bina Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC); zval_ptr_dtor(objval); } else { + if (Z_ISREF_P(var_ptr)) { + var_ptr = Z_REFVAL_P(var_ptr); + } binary_op(var_ptr, var_ptr, value TSRMLS_CC); } @@ -25851,6 +25873,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_VAR(int (*bina Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC); zval_ptr_dtor(objval); } else { + if (Z_ISREF_P(var_ptr)) { + var_ptr = Z_REFVAL_P(var_ptr); + } binary_op(var_ptr, var_ptr, value TSRMLS_CC); } @@ -27092,6 +27117,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(int (*b Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC); zval_ptr_dtor(objval); } else { + if (Z_ISREF_P(var_ptr)) { + var_ptr = Z_REFVAL_P(var_ptr); + } binary_op(var_ptr, var_ptr, value TSRMLS_CC); } @@ -27487,6 +27515,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_CV(int (*binar Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC); zval_ptr_dtor(objval); } else { + if (Z_ISREF_P(var_ptr)) { + var_ptr = Z_REFVAL_P(var_ptr); + } binary_op(var_ptr, var_ptr, value TSRMLS_CC); } @@ -30163,6 +30194,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_CONST(int (*binary Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC); zval_ptr_dtor(objval); } else { + if (Z_ISREF_P(var_ptr)) { + var_ptr = Z_REFVAL_P(var_ptr); + } binary_op(var_ptr, var_ptr, value TSRMLS_CC); } @@ -32303,6 +32337,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_TMP(int (*binary_o Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC); zval_ptr_dtor(objval); } else { + if (Z_ISREF_P(var_ptr)) { + var_ptr = Z_REFVAL_P(var_ptr); + } binary_op(var_ptr, var_ptr, value TSRMLS_CC); } @@ -34138,6 +34175,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_VAR(int (*binary_o Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC); zval_ptr_dtor(objval); } else { + if (Z_ISREF_P(var_ptr)) { + var_ptr = Z_REFVAL_P(var_ptr); + } binary_op(var_ptr, var_ptr, value TSRMLS_CC); } @@ -35141,7 +35181,8 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); } - if (free_op2.var) {zval_ptr_dtor_nogc(free_op2.var);}; +//??? ; +//??? if (free_op2.var) {zval_ptr_dtor_nogc(free_op2.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -36060,6 +36101,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_UNUSED(int (*binar Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC); zval_ptr_dtor(objval); } else { + if (Z_ISREF_P(var_ptr)) { + var_ptr = Z_REFVAL_P(var_ptr); + } binary_op(var_ptr, var_ptr, value TSRMLS_CC); } @@ -37270,6 +37314,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_CV(int (*binary_op Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC); zval_ptr_dtor(objval); } else { + if (Z_ISREF_P(var_ptr)) { + var_ptr = Z_REFVAL_P(var_ptr); + } binary_op(var_ptr, var_ptr, value TSRMLS_CC); } @@ -38120,6 +38167,8 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); } +//??? ; +//??? ; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); diff --git a/main/main.c b/main/main.c index b3dbfa0f8b..b2068cd137 100644 --- a/main/main.c +++ b/main/main.c @@ -1090,7 +1090,7 @@ static void php_error_cb(int type, const char *error_filename, const uint error_ if (PG(html_errors)) { if (type == E_ERROR || type == E_PARSE) { zend_string *buf = php_escape_html_entities(buffer, buffer_len, 0, ENT_COMPAT, NULL TSRMLS_CC); - php_printf("%s<br />\n<b>%s</b>: %s in <b>%s</b> on line <b>%d</b><br />\n%s", STR_PRINT(prepend_string), error_type_str, buf, error_filename, error_lineno, STR_PRINT(append_string)); + php_printf("%s<br />\n<b>%s</b>: %s in <b>%s</b> on line <b>%d</b><br />\n%s", STR_PRINT(prepend_string), error_type_str, buf->val, error_filename, error_lineno, STR_PRINT(append_string)); STR_FREE(buf); } else { php_printf("%s<br />\n<b>%s</b>: %s in <b>%s</b> on line <b>%d</b><br />\n%s", STR_PRINT(prepend_string), error_type_str, buffer, error_filename, error_lineno, STR_PRINT(append_string)); |