From 62867f008d56f8f4ad2f5896bb1105bae5e583e0 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 5 Dec 2014 15:07:49 +0300 Subject: [PATCH] Improved ECHO and PRINT --- Zend/zend_vm_def.h | 21 ++++-- Zend/zend_vm_execute.h | 157 ++++++++++++++++++++++------------------- 2 files changed, 103 insertions(+), 75 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index a653786f75..5d757d5a45 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -989,23 +989,36 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) ZEND_VM_NEXT_OPCODE(); } -ZEND_VM_HANDLER(40, ZEND_ECHO, CONST|TMP|VAR|CV, ANY) +ZEND_VM_HANDLER(40, ZEND_ECHO, CONST|TMPVAR|CV, ANY) { USE_OPLINE zend_free_op free_op1; zval *z; SAVE_OPLINE(); - z = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R); + z = GET_OP1_ZVAL_PTR(BP_VAR_R); - zend_print_variable(z TSRMLS_CC); + if (Z_TYPE_P(z) == IS_STRING) { + zend_string *str = Z_STR_P(z); + + if (str->len != 0) { + zend_write(str->val, str->len); + } + } else { + zend_string *str = _zval_get_string_func(z TSRMLS_CC); + + if (str->len != 0) { + zend_write(str->val, str->len); + } + zend_string_release(str); + } FREE_OP1(); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } -ZEND_VM_HANDLER(41, ZEND_PRINT, CONST|TMP|VAR|CV, ANY) +ZEND_VM_HANDLER(41, ZEND_PRINT, CONST|TMPVAR|CV, ANY) { USE_OPLINE diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index b6ed040c44..b95cd8d6d6 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -2364,7 +2364,20 @@ static int ZEND_FASTCALL ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) SAVE_OPLINE(); z = opline->op1.zv; - zend_print_variable(z TSRMLS_CC); + if (Z_TYPE_P(z) == IS_STRING) { + zend_string *str = Z_STR_P(z); + + if (str->len != 0) { + zend_write(str->val, str->len); + } + } else { + zend_string *str = _zval_get_string_func(z TSRMLS_CC); + + if (str->len != 0) { + zend_write(str->val, str->len); + } + zend_string_release(str); + } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -8635,30 +8648,6 @@ static int ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG ZEND_VM_NEXT_OPCODE(); } -static int ZEND_FASTCALL ZEND_ECHO_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - zend_free_op free_op1; - zval *z; - - SAVE_OPLINE(); - z = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1); - - zend_print_variable(z TSRMLS_CC); - - zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); -} - -static int ZEND_FASTCALL ZEND_PRINT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - ZVAL_LONG(EX_VAR(opline->result.var), 1); - return ZEND_ECHO_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); -} - static int ZEND_FASTCALL ZEND_JMPZ_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -13165,30 +13154,6 @@ static int ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG ZEND_VM_NEXT_OPCODE(); } -static int ZEND_FASTCALL ZEND_ECHO_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - zend_free_op free_op1; - zval *z; - - SAVE_OPLINE(); - z = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1); - - zend_print_variable(z TSRMLS_CC); - - zval_ptr_dtor_nogc(free_op1); - CHECK_EXCEPTION(); - ZEND_VM_NEXT_OPCODE(); -} - -static int ZEND_FASTCALL ZEND_PRINT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - ZVAL_LONG(EX_VAR(opline->result.var), 1); - return ZEND_ECHO_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); -} - static int ZEND_FASTCALL ZEND_JMPZ_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -27303,9 +27268,22 @@ static int ZEND_FASTCALL ZEND_ECHO_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) zval *z; SAVE_OPLINE(); - z = _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC); + z = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC); - zend_print_variable(z TSRMLS_CC); + if (Z_TYPE_P(z) == IS_STRING) { + zend_string *str = Z_STR_P(z); + + if (str->len != 0) { + zend_write(str->val, str->len); + } + } else { + zend_string *str = _zval_get_string_func(z TSRMLS_CC); + + if (str->len != 0) { + zend_write(str->val, str->len); + } + zend_string_release(str); + } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -36726,6 +36704,43 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEN ZEND_VM_NEXT_OPCODE(); } +static int ZEND_FASTCALL ZEND_ECHO_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *z; + + SAVE_OPLINE(); + z = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + if (Z_TYPE_P(z) == IS_STRING) { + zend_string *str = Z_STR_P(z); + + if (str->len != 0) { + zend_write(str->val, str->len); + } + } else { + zend_string *str = _zval_get_string_func(z TSRMLS_CC); + + if (str->len != 0) { + zend_write(str->val, str->len); + } + zend_string_release(str); + } + + zval_ptr_dtor_nogc(free_op1); + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + +static int ZEND_FASTCALL ZEND_PRINT_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + ZVAL_LONG(EX_VAR(opline->result.var), 1); + return ZEND_ECHO_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); +} + static int ZEND_FASTCALL ZEND_FREE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -39195,16 +39210,16 @@ void zend_init_opcodes_handlers(void) ZEND_ECHO_SPEC_CONST_HANDLER, ZEND_ECHO_SPEC_CONST_HANDLER, ZEND_ECHO_SPEC_CONST_HANDLER, - ZEND_ECHO_SPEC_TMP_HANDLER, - ZEND_ECHO_SPEC_TMP_HANDLER, - ZEND_ECHO_SPEC_TMP_HANDLER, - ZEND_ECHO_SPEC_TMP_HANDLER, - ZEND_ECHO_SPEC_TMP_HANDLER, - ZEND_ECHO_SPEC_VAR_HANDLER, - ZEND_ECHO_SPEC_VAR_HANDLER, - ZEND_ECHO_SPEC_VAR_HANDLER, - ZEND_ECHO_SPEC_VAR_HANDLER, - ZEND_ECHO_SPEC_VAR_HANDLER, + ZEND_ECHO_SPEC_TMPVAR_HANDLER, + ZEND_ECHO_SPEC_TMPVAR_HANDLER, + ZEND_ECHO_SPEC_TMPVAR_HANDLER, + ZEND_ECHO_SPEC_TMPVAR_HANDLER, + ZEND_ECHO_SPEC_TMPVAR_HANDLER, + ZEND_ECHO_SPEC_TMPVAR_HANDLER, + ZEND_ECHO_SPEC_TMPVAR_HANDLER, + ZEND_ECHO_SPEC_TMPVAR_HANDLER, + ZEND_ECHO_SPEC_TMPVAR_HANDLER, + ZEND_ECHO_SPEC_TMPVAR_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -39220,16 +39235,16 @@ void zend_init_opcodes_handlers(void) ZEND_PRINT_SPEC_CONST_HANDLER, ZEND_PRINT_SPEC_CONST_HANDLER, ZEND_PRINT_SPEC_CONST_HANDLER, - ZEND_PRINT_SPEC_TMP_HANDLER, - ZEND_PRINT_SPEC_TMP_HANDLER, - ZEND_PRINT_SPEC_TMP_HANDLER, - ZEND_PRINT_SPEC_TMP_HANDLER, - ZEND_PRINT_SPEC_TMP_HANDLER, - ZEND_PRINT_SPEC_VAR_HANDLER, - ZEND_PRINT_SPEC_VAR_HANDLER, - ZEND_PRINT_SPEC_VAR_HANDLER, - ZEND_PRINT_SPEC_VAR_HANDLER, - ZEND_PRINT_SPEC_VAR_HANDLER, + ZEND_PRINT_SPEC_TMPVAR_HANDLER, + ZEND_PRINT_SPEC_TMPVAR_HANDLER, + ZEND_PRINT_SPEC_TMPVAR_HANDLER, + ZEND_PRINT_SPEC_TMPVAR_HANDLER, + ZEND_PRINT_SPEC_TMPVAR_HANDLER, + ZEND_PRINT_SPEC_TMPVAR_HANDLER, + ZEND_PRINT_SPEC_TMPVAR_HANDLER, + ZEND_PRINT_SPEC_TMPVAR_HANDLER, + ZEND_PRINT_SPEC_TMPVAR_HANDLER, + ZEND_PRINT_SPEC_TMPVAR_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, -- 2.49.0