diff options
Diffstat (limited to 'Zend/zend_vm_execute.h')
| -rw-r--r-- | Zend/zend_vm_execute.h | 255 |
1 files changed, 230 insertions, 25 deletions
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 6cb693eced..a8afd94dba 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5890,11 +5890,19 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_TMP_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPC static int ZEND_FASTCALL ZEND_ADD_CHAR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); - zend_free_op free_op1; + zval *str = &EX_T(opline->result.u.var).tmp_var; + + if (IS_TMP_VAR == IS_UNUSED) { + /* Initialize for erealloc in add_char_to_string */ + Z_STRVAL_P(str) = NULL; + Z_STRLEN_P(str) = 0; + Z_TYPE_P(str) = IS_STRING; + + INIT_PZVAL(str); + } + + add_char_to_string(str, str, &opline->op2.u.constant); - add_char_to_string(&EX_T(opline->result.u.var).tmp_var, - _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), - &opline->op2.u.constant); /* FREE_OP is missing intentionally here - we're always working on the same temporary variable */ ZEND_VM_NEXT_OPCODE(); } @@ -5902,11 +5910,19 @@ static int ZEND_FASTCALL ZEND_ADD_CHAR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDL static int ZEND_FASTCALL ZEND_ADD_STRING_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); - zend_free_op free_op1; + zval *str = &EX_T(opline->result.u.var).tmp_var; + + if (IS_TMP_VAR == IS_UNUSED) { + /* Initialize for erealloc in add_string_to_string */ + Z_STRVAL_P(str) = NULL; + Z_STRLEN_P(str) = 0; + Z_TYPE_P(str) = IS_STRING; + + INIT_PZVAL(str); + } + + add_string_to_string(str, str, &opline->op2.u.constant); - add_string_to_string(&EX_T(opline->result.u.var).tmp_var, - _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), - &opline->op2.u.constant); /* FREE_OP is missing intentionally here - we're always working on the same temporary variable */ ZEND_VM_NEXT_OPCODE(); } @@ -6337,11 +6353,21 @@ static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); - zend_free_op free_op1, free_op2; + zend_free_op free_op2; + zval *str = &EX_T(opline->result.u.var).tmp_var; zval *var = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC); zval var_copy; int use_copy = 0; + if (IS_TMP_VAR == IS_UNUSED) { + /* Initialize for erealloc in add_string_to_string */ + Z_STRVAL_P(str) = NULL; + Z_STRLEN_P(str) = 0; + Z_TYPE_P(str) = IS_STRING; + + INIT_PZVAL(str); + } + if (Z_TYPE_P(var) != IS_STRING) { zend_make_printable_zval(var, &var_copy, &use_copy); @@ -6349,9 +6375,8 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ var = &var_copy; } } - add_string_to_string( &EX_T(opline->result.u.var).tmp_var, - _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), - var); + add_string_to_string(str, str, var); + if (use_copy) { zval_dtor(var); } @@ -6794,11 +6819,21 @@ static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); - zend_free_op free_op1, free_op2; + zend_free_op free_op2; + zval *str = &EX_T(opline->result.u.var).tmp_var; zval *var = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC); zval var_copy; int use_copy = 0; + if (IS_TMP_VAR == IS_UNUSED) { + /* Initialize for erealloc in add_string_to_string */ + Z_STRVAL_P(str) = NULL; + Z_STRLEN_P(str) = 0; + Z_TYPE_P(str) = IS_STRING; + + INIT_PZVAL(str); + } + if (Z_TYPE_P(var) != IS_STRING) { zend_make_printable_zval(var, &var_copy, &use_copy); @@ -6806,9 +6841,8 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ var = &var_copy; } } - add_string_to_string( &EX_T(opline->result.u.var).tmp_var, - _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), - var); + add_string_to_string(str, str, var); + if (use_copy) { zval_dtor(var); } @@ -7344,11 +7378,21 @@ static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); - zend_free_op free_op1; + + zval *str = &EX_T(opline->result.u.var).tmp_var; zval *var = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC); zval var_copy; int use_copy = 0; + if (IS_TMP_VAR == IS_UNUSED) { + /* Initialize for erealloc in add_string_to_string */ + Z_STRVAL_P(str) = NULL; + Z_STRLEN_P(str) = 0; + Z_TYPE_P(str) = IS_STRING; + + INIT_PZVAL(str); + } + if (Z_TYPE_P(var) != IS_STRING) { zend_make_printable_zval(var, &var_copy, &use_copy); @@ -7356,9 +7400,8 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_A var = &var_copy; } } - add_string_to_string( &EX_T(opline->result.u.var).tmp_var, - _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), - var); + add_string_to_string(str, str, var); + if (use_copy) { zval_dtor(var); } @@ -17682,6 +17725,46 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_ ZEND_VM_NEXT_OPCODE(); } +static int ZEND_FASTCALL ZEND_ADD_CHAR_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + zend_op *opline = EX(opline); + zval *str = &EX_T(opline->result.u.var).tmp_var; + + if (IS_UNUSED == IS_UNUSED) { + /* Initialize for erealloc in add_char_to_string */ + Z_STRVAL_P(str) = NULL; + Z_STRLEN_P(str) = 0; + Z_TYPE_P(str) = IS_STRING; + + INIT_PZVAL(str); + } + + add_char_to_string(str, str, &opline->op2.u.constant); + + /* FREE_OP is missing intentionally here - we're always working on the same temporary variable */ + ZEND_VM_NEXT_OPCODE(); +} + +static int ZEND_FASTCALL ZEND_ADD_STRING_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + zend_op *opline = EX(opline); + zval *str = &EX_T(opline->result.u.var).tmp_var; + + if (IS_UNUSED == IS_UNUSED) { + /* Initialize for erealloc in add_string_to_string */ + Z_STRVAL_P(str) = NULL; + Z_STRLEN_P(str) = 0; + Z_TYPE_P(str) = IS_STRING; + + INIT_PZVAL(str); + } + + add_string_to_string(str, str, &opline->op2.u.constant); + + /* FREE_OP is missing intentionally here - we're always working on the same temporary variable */ + ZEND_VM_NEXT_OPCODE(); +} + static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); @@ -18786,6 +18869,47 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HA ZEND_VM_NEXT_OPCODE(); } +static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + zend_op *opline = EX(opline); + zend_free_op free_op2; + zval *str = &EX_T(opline->result.u.var).tmp_var; + zval *var = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC); + zval var_copy; + int use_copy = 0; + + if (IS_UNUSED == IS_UNUSED) { + /* Initialize for erealloc in add_string_to_string */ + Z_STRVAL_P(str) = NULL; + Z_STRLEN_P(str) = 0; + Z_TYPE_P(str) = IS_STRING; + + INIT_PZVAL(str); + } + + if (Z_TYPE_P(var) != IS_STRING) { + zend_make_printable_zval(var, &var_copy, &use_copy); + + if (use_copy) { + var = &var_copy; + } + } + add_string_to_string(str, str, var); + + if (use_copy) { + zval_dtor(var); + } + /* original comment, possibly problematic: + * FREE_OP is missing intentionally here - we're always working on the same temporary variable + * (Zeev): I don't think it's problematic, we only use variables + * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're + * string offsets or overloaded objects + */ + zval_dtor(free_op2.var); + + ZEND_VM_NEXT_OPCODE(); +} + static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); @@ -19819,6 +19943,47 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HA ZEND_VM_NEXT_OPCODE(); } +static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + zend_op *opline = EX(opline); + zend_free_op free_op2; + zval *str = &EX_T(opline->result.u.var).tmp_var; + zval *var = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC); + zval var_copy; + int use_copy = 0; + + if (IS_UNUSED == IS_UNUSED) { + /* Initialize for erealloc in add_string_to_string */ + Z_STRVAL_P(str) = NULL; + Z_STRLEN_P(str) = 0; + Z_TYPE_P(str) = IS_STRING; + + INIT_PZVAL(str); + } + + if (Z_TYPE_P(var) != IS_STRING) { + zend_make_printable_zval(var, &var_copy, &use_copy); + + if (use_copy) { + var = &var_copy; + } + } + add_string_to_string(str, str, var); + + if (use_copy) { + zval_dtor(var); + } + /* original comment, possibly problematic: + * FREE_OP is missing intentionally here - we're always working on the same temporary variable + * (Zeev): I don't think it's problematic, we only use variables + * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're + * string offsets or overloaded objects + */ + if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; + + ZEND_VM_NEXT_OPCODE(); +} + static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); @@ -21123,6 +21288,46 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HAN ZEND_VM_NEXT_OPCODE(); } +static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + zend_op *opline = EX(opline); + + zval *str = &EX_T(opline->result.u.var).tmp_var; + zval *var = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC); + zval var_copy; + int use_copy = 0; + + if (IS_UNUSED == IS_UNUSED) { + /* Initialize for erealloc in add_string_to_string */ + Z_STRVAL_P(str) = NULL; + Z_STRLEN_P(str) = 0; + Z_TYPE_P(str) = IS_STRING; + + INIT_PZVAL(str); + } + + if (Z_TYPE_P(var) != IS_STRING) { + zend_make_printable_zval(var, &var_copy, &use_copy); + + if (use_copy) { + var = &var_copy; + } + } + add_string_to_string(str, str, var); + + if (use_copy) { + zval_dtor(var); + } + /* original comment, possibly problematic: + * FREE_OP is missing intentionally here - we're always working on the same temporary variable + * (Zeev): I don't think it's problematic, we only use variables + * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're + * string offsets or overloaded objects + */ + + ZEND_VM_NEXT_OPCODE(); +} + static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); @@ -31371,7 +31576,7 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, + ZEND_ADD_CHAR_SPEC_UNUSED_CONST_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -31396,7 +31601,7 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, + ZEND_ADD_STRING_SPEC_UNUSED_CONST_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -31422,10 +31627,10 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ADD_VAR_SPEC_UNUSED_TMP_HANDLER, + ZEND_ADD_VAR_SPEC_UNUSED_VAR_HANDLER, ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, + ZEND_ADD_VAR_SPEC_UNUSED_CV_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, |
