Browse Source

Fixed bug #42772 (Storing $this in a static var fails while handling a cast to string)

PECL
Dmitry Stogov 19 years ago
parent
commit
1491992f76
  1. 18
      Zend/tests/bug42772.phpt
  2. 19
      Zend/zend_vm_def.h
  3. 76
      Zend/zend_vm_execute.h

18
Zend/tests/bug42772.phpt

@ -0,0 +1,18 @@
--TEST--
Bug #42772 (Storing $this in a static var fails while handling a cast to string)
--FILE--
<?php
class Foo {
static public $foo;
function __toString() {
self::$foo = $this;
return 'foo';
}
}
$foo = (string)new Foo();
var_dump(Foo::$foo);
?>
--EXPECT--
object(Foo)#1 (0) {
}

19
Zend/zend_vm_def.h

@ -2797,9 +2797,11 @@ ZEND_VM_HANDLER(21, ZEND_CAST, CONST|TMP|VAR|CV, ANY)
zval *expr = GET_OP1_ZVAL_PTR(BP_VAR_R);
zval *result = &EX_T(opline->result.u.var).tmp_var;
*result = *expr;
if (!IS_OP1_TMP_FREE()) {
zendi_zval_copy_ctor(*result);
if (opline->extended_value != IS_STRING) {
*result = *expr;
if (!IS_OP1_TMP_FREE()) {
zendi_zval_copy_ctor(*result);
}
}
switch (opline->extended_value) {
case IS_NULL:
@ -2818,10 +2820,17 @@ ZEND_VM_HANDLER(21, ZEND_CAST, CONST|TMP|VAR|CV, ANY)
zval var_copy;
int use_copy;
zend_make_printable_zval(result, &var_copy, &use_copy);
zend_make_printable_zval(expr, &var_copy, &use_copy);
if (use_copy) {
zval_dtor(result);
*result = var_copy;
if (IS_OP1_TMP_FREE()) {
FREE_OP1();
}
} else {
*result = *expr;
if (!IS_OP1_TMP_FREE()) {
zendi_zval_copy_ctor(*result);
}
}
break;
}

76
Zend/zend_vm_execute.h

@ -1648,9 +1648,11 @@ static int ZEND_CAST_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
zval *expr = &opline->op1.u.constant;
zval *result = &EX_T(opline->result.u.var).tmp_var;
*result = *expr;
if (!0) {
zendi_zval_copy_ctor(*result);
if (opline->extended_value != IS_STRING) {
*result = *expr;
if (!0) {
zendi_zval_copy_ctor(*result);
}
}
switch (opline->extended_value) {
case IS_NULL:
@ -1669,10 +1671,17 @@ static int ZEND_CAST_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
zval var_copy;
int use_copy;
zend_make_printable_zval(result, &var_copy, &use_copy);
zend_make_printable_zval(expr, &var_copy, &use_copy);
if (use_copy) {
zval_dtor(result);
*result = var_copy;
if (0) {
}
} else {
*result = *expr;
if (!0) {
zendi_zval_copy_ctor(*result);
}
}
break;
}
@ -4715,9 +4724,11 @@ static int ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
zval *expr = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
zval *result = &EX_T(opline->result.u.var).tmp_var;
*result = *expr;
if (!1) {
zendi_zval_copy_ctor(*result);
if (opline->extended_value != IS_STRING) {
*result = *expr;
if (!1) {
zendi_zval_copy_ctor(*result);
}
}
switch (opline->extended_value) {
case IS_NULL:
@ -4736,10 +4747,17 @@ static int ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
zval var_copy;
int use_copy;
zend_make_printable_zval(result, &var_copy, &use_copy);
zend_make_printable_zval(expr, &var_copy, &use_copy);
if (use_copy) {
zval_dtor(result);
*result = var_copy;
if (1) {
zval_dtor(free_op1.var);
}
} else {
*result = *expr;
if (!1) {
zendi_zval_copy_ctor(*result);
}
}
break;
}
@ -7861,9 +7879,11 @@ static int ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
zval *expr = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
zval *result = &EX_T(opline->result.u.var).tmp_var;
*result = *expr;
if (!0) {
zendi_zval_copy_ctor(*result);
if (opline->extended_value != IS_STRING) {
*result = *expr;
if (!0) {
zendi_zval_copy_ctor(*result);
}
}
switch (opline->extended_value) {
case IS_NULL:
@ -7882,10 +7902,17 @@ static int ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
zval var_copy;
int use_copy;
zend_make_printable_zval(result, &var_copy, &use_copy);
zend_make_printable_zval(expr, &var_copy, &use_copy);
if (use_copy) {
zval_dtor(result);
*result = var_copy;
if (0) {
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
}
} else {
*result = *expr;
if (!0) {
zendi_zval_copy_ctor(*result);
}
}
break;
}
@ -20474,9 +20501,11 @@ static int ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
zval *expr = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
zval *result = &EX_T(opline->result.u.var).tmp_var;
*result = *expr;
if (!0) {
zendi_zval_copy_ctor(*result);
if (opline->extended_value != IS_STRING) {
*result = *expr;
if (!0) {
zendi_zval_copy_ctor(*result);
}
}
switch (opline->extended_value) {
case IS_NULL:
@ -20495,10 +20524,17 @@ static int ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
zval var_copy;
int use_copy;
zend_make_printable_zval(result, &var_copy, &use_copy);
zend_make_printable_zval(expr, &var_copy, &use_copy);
if (use_copy) {
zval_dtor(result);
*result = var_copy;
if (0) {
}
} else {
*result = *expr;
if (!0) {
zendi_zval_copy_ctor(*result);
}
}
break;
}

Loading…
Cancel
Save