--- /dev/null
+--TEST--
+Exception with delayed message computation
+--FILE--
+<?php
+
+class MyException extends Exception {
+ public $message;
+ public $messageCallback;
+
+ public function __construct() {
+ $this->messageCallback = static function() {
+ return "Foobar";
+ };
+ $this->message = new class($this->message, $this->messageCallback) {
+ private $message;
+ private $messageCallback;
+
+ public function __construct(&$message, &$messageCallback)
+ {
+ $this->message = &$message;
+ $this->messageCallback = &$messageCallback;
+ }
+
+ public function __toString(): string
+ {
+ $messageCallback = $this->messageCallback;
+ $this->messageCallback = null;
+ return $this->message = $messageCallback();
+ }
+ };
+ }
+}
+
+throw new MyException;
+
+?>
+--EXPECTF--
+Fatal error: Uncaught MyException: Foobar in %s:%d
+Stack trace:
+#0 {main}
+ thrown in %s on line %d
ZEND_PARSE_PARAMETERS_NONE();
prop = GET_PROPERTY(ZEND_THIS, ZEND_STR_MESSAGE);
- ZVAL_DEREF(prop);
- ZVAL_COPY(return_value, prop);
+ RETURN_STR(zval_get_string(prop));
}
/* }}} */
zend_class_entry *ce = readobj->ce;
if (ce->__tostring) {
zval retval;
+ GC_ADDREF(readobj);
zend_call_method_with_0_params(readobj, ce, &ce->__tostring, "__tostring", &retval);
+ zend_object_release(readobj);
if (EXPECTED(Z_TYPE(retval) == IS_STRING)) {
ZVAL_COPY_VALUE(writeobj, &retval);
return SUCCESS;