summaryrefslogtreecommitdiff
path: root/Zend/zend_vm_execute.h
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_vm_execute.h')
-rw-r--r--Zend/zend_vm_execute.h255
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,