Commit fc06d395449 for php

commit fc06d3954499b092f0c665704bd24d69a07dcefc
Author: Daniel Scherzer <daniel.e.scherzer@gmail.com>
Date:   Sat Aug 8 08:52:59 2026 -0700

    [`%pS` migration] Use `%pS` in Zend/zend_execute.c

    In addition to the fixes within the zend_execute.c file, support for error
    strings with null bytes was added to `zend_type_error()`.

    Also update the ext/opcache helpers to match

diff --git a/Zend/tests/gh19304.phpt b/Zend/tests/gh19304.phpt
index f3f7fab3f1f..2d658948a4e 100644
--- a/Zend/tests/gh19304.phpt
+++ b/Zend/tests/gh19304.phpt
@@ -14,5 +14,5 @@
 }

 ?>
---EXPECT--
-TypeError: Cannot assign int to property class@anonymous::$v of type self
+--EXPECTF--
+TypeError: Cannot assign int to property class@anonymous%0%s::$v of type self
diff --git a/Zend/tests/temporary_cleaning/temporary_cleaning_013.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_013.phpt
index 6e6dc58baad..5d68d632a31 100644
--- a/Zend/tests/temporary_cleaning/temporary_cleaning_013.phpt
+++ b/Zend/tests/temporary_cleaning/temporary_cleaning_013.phpt
@@ -301,10 +301,10 @@ function __clone() { throw new Exception; }
 Deprecated: Creation of dynamic property class@anonymous::$foo is deprecated in %s on line %d
 caught Exception 14

-Notice: Indirect modification of overloaded element of ArrayAccess@anonymous has no effect in %s on line %d
+Notice: Indirect modification of overloaded element of ArrayAccess@anonymous%0%s has no effect in %s on line %d
 caught Exception 15

-Notice: Indirect modification of overloaded element of ArrayAccess@anonymous has no effect in %s on line %d
+Notice: Indirect modification of overloaded element of ArrayAccess@anonymous%0%s has no effect in %s on line %d
 caught Exception 16
 caught Exception 17
 caught Exception 18
diff --git a/Zend/tests/type_declarations/typed_properties_003.phpt b/Zend/tests/type_declarations/typed_properties_003.phpt
index 6cde9cc6043..51cdba919a1 100644
--- a/Zend/tests/type_declarations/typed_properties_003.phpt
+++ b/Zend/tests/type_declarations/typed_properties_003.phpt
@@ -9,7 +9,7 @@
 $var = &$thing->int;
 ?>
 --EXPECTF--
-Fatal error: Uncaught Error: Cannot access uninitialized non-nullable property class@anonymous::$int by reference in %s:%d
+Fatal error: Uncaught Error: Cannot access uninitialized non-nullable property class@anonymous%0%s:2$%x::$int by reference in %s:%d
 Stack trace:
 #0 {main}
   thrown in %s on line %d
diff --git a/Zend/tests/type_declarations/typed_properties_004.phpt b/Zend/tests/type_declarations/typed_properties_004.phpt
index eb8e1ef6b4a..32f2f35c5f0 100644
--- a/Zend/tests/type_declarations/typed_properties_004.phpt
+++ b/Zend/tests/type_declarations/typed_properties_004.phpt
@@ -11,7 +11,7 @@ public function __construct(string $string) {
 };
 ?>
 --EXPECTF--
-Fatal error: Uncaught TypeError: Cannot assign string to property class@anonymous::$int of type int in %s:%d
+Fatal error: Uncaught TypeError: Cannot assign string to property class@anonymous%0%s:2$%x::$int of type int in %s:%d
 Stack trace:
 #0 %s(%d): class@anonymous->__construct('PHP 7 is better...')
 #1 {main}
diff --git a/Zend/tests/type_declarations/typed_properties_005.phpt b/Zend/tests/type_declarations/typed_properties_005.phpt
index 71f264a926a..e92ec7256ca 100644
--- a/Zend/tests/type_declarations/typed_properties_005.phpt
+++ b/Zend/tests/type_declarations/typed_properties_005.phpt
@@ -13,7 +13,7 @@ public function __construct(Dummy $dummy) {
 };
 ?>
 --EXPECTF--
-Fatal error: Uncaught TypeError: Cannot assign Dummy to property class@anonymous::$std of type stdClass in %s:%d
+Fatal error: Uncaught TypeError: Cannot assign Dummy to property class@anonymous%0%s::$std of type stdClass in %s:%d
 Stack trace:
 #0 %s(%d): class@anonymous->__construct(Object(Dummy))
 #1 {main}
diff --git a/Zend/tests/type_declarations/typed_properties_033.phpt b/Zend/tests/type_declarations/typed_properties_033.phpt
index 76d57e4ec48..59d5943f1fe 100644
--- a/Zend/tests/type_declarations/typed_properties_033.phpt
+++ b/Zend/tests/type_declarations/typed_properties_033.phpt
@@ -25,7 +25,7 @@ public function &fetch() {
 var_dump($foo);
 ?>
 --EXPECTF--
-TypeError: Cannot assign float to reference held by property class@anonymous::$qux of type int
+TypeError: Cannot assign float to reference held by property class@anonymous%0%s::$qux of type int
 object(class@anonymous)#1 (4) {
   ["foo"]=>
   int(2)
diff --git a/Zend/tests/type_declarations/typed_properties_034.phpt b/Zend/tests/type_declarations/typed_properties_034.phpt
index dcda621774a..1ba07f59bb5 100644
--- a/Zend/tests/type_declarations/typed_properties_034.phpt
+++ b/Zend/tests/type_declarations/typed_properties_034.phpt
@@ -36,13 +36,13 @@ function foo(?int &$a) {

 var_dump($foo);
 ?>
---EXPECT--
+--EXPECTF--
 int(42)
-TypeError: Cannot assign null to property class@anonymous::$baz of type int
+TypeError: Cannot assign null to property class@anonymous%0%s::$baz of type int
 int(1)
 int(10)
 int(10)
-TypeError: Cannot assign null to reference held by property class@anonymous::$baz of type int
+TypeError: Cannot assign null to reference held by property class@anonymous%0%s::$baz of type int
 object(class@anonymous)#1 (2) {
   ["bar"]=>
   &int(10)
diff --git a/Zend/tests/type_declarations/typed_properties_038.phpt b/Zend/tests/type_declarations/typed_properties_038.phpt
index e9843aea359..0f7ac9b239c 100644
--- a/Zend/tests/type_declarations/typed_properties_038.phpt
+++ b/Zend/tests/type_declarations/typed_properties_038.phpt
@@ -40,22 +40,22 @@
 var_dump($foo);
 ?>
 --EXPECTF--
-TypeError: Cannot increment property class@anonymous::$bar of type int past its maximal value
+TypeError: Cannot increment property class@anonymous%0%s::$bar of type int past its maximal value
 object(class@anonymous)#1 (1) {
   ["bar"]=>
   int(%d)
 }
-TypeError: Cannot assign float to property class@anonymous::$bar of type int
+TypeError: Cannot assign float to property class@anonymous%0%s::$bar of type int
 object(class@anonymous)#1 (1) {
   ["bar"]=>
   int(%d)
 }
-TypeError: Cannot increment property class@anonymous::$bar of type int past its maximal value
+TypeError: Cannot increment property class@anonymous%0%s::$bar of type int past its maximal value
 object(class@anonymous)#1 (1) {
   ["bar"]=>
   int(%d)
 }
-TypeError: Cannot assign float to property class@anonymous::$bar of type int
+TypeError: Cannot assign float to property class@anonymous%0%s::$bar of type int
 object(class@anonymous)#1 (1) {
   ["bar"]=>
   int(%d)
diff --git a/Zend/tests/type_declarations/typed_properties_044.phpt b/Zend/tests/type_declarations/typed_properties_044.phpt
index 9933c15203a..f6a5b0cb361 100644
--- a/Zend/tests/type_declarations/typed_properties_044.phpt
+++ b/Zend/tests/type_declarations/typed_properties_044.phpt
@@ -47,12 +47,12 @@
 }

 ?>
---EXPECT--
+--EXPECTF--
 int(0)
 int(-2)
 int(-1)
 int(-1)
-TypeError: Cannot increment a reference held by property class@anonymous::$bar of type ?int past its maximal value
-TypeError: Cannot increment a reference held by property class@anonymous::$bar of type ?int past its maximal value
-TypeError: Cannot decrement a reference held by property class@anonymous::$bar of type ?int past its minimal value
-TypeError: Cannot decrement a reference held by property class@anonymous::$bar of type ?int past its minimal value
+TypeError: Cannot increment a reference held by property class@anonymous%0%s::$bar of type ?int past its maximal value
+TypeError: Cannot increment a reference held by property class@anonymous%0%s::$bar of type ?int past its maximal value
+TypeError: Cannot decrement a reference held by property class@anonymous%0%s::$bar of type ?int past its minimal value
+TypeError: Cannot decrement a reference held by property class@anonymous%0%s::$bar of type ?int past its minimal value
diff --git a/Zend/tests/type_declarations/typed_properties_062.phpt b/Zend/tests/type_declarations/typed_properties_062.phpt
index ba12c77a184..10cfbc53838 100644
--- a/Zend/tests/type_declarations/typed_properties_062.phpt
+++ b/Zend/tests/type_declarations/typed_properties_062.phpt
@@ -61,21 +61,21 @@
 var_dump($a->foo);

 ?>
---EXPECT--
+--EXPECTF--
 int(2)
 int(21)
-TypeError: Cannot assign string to reference held by property class@anonymous::$foo of type int
+TypeError: Cannot assign string to reference held by property class@anonymous%0%s::$foo of type int
 int(21)
 int(20)
 int(19)
-TypeError: Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value
+TypeError: Cannot decrement a reference held by property class@anonymous%0%s::$foo of type int past its minimal value
 integer
-TypeError: Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value
+TypeError: Cannot decrement a reference held by property class@anonymous%0%s::$foo of type int past its minimal value
 integer
-TypeError: Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value
+TypeError: Cannot increment a reference held by property class@anonymous%0%s::$foo of type int past its maximal value
 integer
-TypeError: Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value
+TypeError: Cannot increment a reference held by property class@anonymous%0%s::$foo of type int past its maximal value
 integer
-TypeError: Cannot assign array to reference held by property class@anonymous::$foo of type int
+TypeError: Cannot assign array to reference held by property class@anonymous%0%s::$foo of type int
 int(0)
 int(1)
diff --git a/Zend/tests/type_declarations/typed_properties_063.phpt b/Zend/tests/type_declarations/typed_properties_063.phpt
index 6a299a11afd..046f797289b 100644
--- a/Zend/tests/type_declarations/typed_properties_063.phpt
+++ b/Zend/tests/type_declarations/typed_properties_063.phpt
@@ -60,21 +60,21 @@
 var_dump($a->foo);

 ?>
---EXPECT--
+--EXPECTF--
 int(2)
 int(21)
-TypeError: Cannot assign string to reference held by property class@anonymous::$foo of type int
+TypeError: Cannot assign string to reference held by property class@anonymous%0%s::$foo of type int
 int(21)
 int(20)
 int(19)
-TypeError: Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value
+TypeError: Cannot decrement a reference held by property class@anonymous%0%s::$foo of type int past its minimal value
 integer
-TypeError: Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value
+TypeError: Cannot decrement a reference held by property class@anonymous%0%s::$foo of type int past its minimal value
 integer
-TypeError: Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value
+TypeError: Cannot increment a reference held by property class@anonymous%0%s::$foo of type int past its maximal value
 integer
-TypeError: Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value
+TypeError: Cannot increment a reference held by property class@anonymous%0%s::$foo of type int past its maximal value
 integer
-TypeError: Cannot assign array to reference held by property class@anonymous::$foo of type int
+TypeError: Cannot assign array to reference held by property class@anonymous%0%s::$foo of type int
 int(0)
 int(1)
diff --git a/Zend/tests/type_declarations/typed_properties_064.phpt b/Zend/tests/type_declarations/typed_properties_064.phpt
index 4880707f8f6..e725440812f 100644
--- a/Zend/tests/type_declarations/typed_properties_064.phpt
+++ b/Zend/tests/type_declarations/typed_properties_064.phpt
@@ -60,21 +60,21 @@
 var_dump($a->foo);

 ?>
---EXPECT--
+--EXPECTF--
 int(2)
 int(21)
-TypeError: Cannot assign string to reference held by property class@anonymous::$foo of type int
+TypeError: Cannot assign string to reference held by property class@anonymous%0%s::$foo of type int
 int(21)
 int(20)
 int(19)
-TypeError: Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value
+TypeError: Cannot decrement a reference held by property class@anonymous%0%s::$foo of type int past its minimal value
 integer
-TypeError: Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value
+TypeError: Cannot decrement a reference held by property class@anonymous%0%s::$foo of type int past its minimal value
 integer
-TypeError: Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value
+TypeError: Cannot increment a reference held by property class@anonymous%0%s::$foo of type int past its maximal value
 integer
-TypeError: Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value
+TypeError: Cannot increment a reference held by property class@anonymous%0%s::$foo of type int past its maximal value
 integer
-TypeError: Cannot assign array to reference held by property class@anonymous::$foo of type int
+TypeError: Cannot assign array to reference held by property class@anonymous%0%s::$foo of type int
 int(0)
 int(1)
diff --git a/Zend/tests/type_declarations/typed_properties_065.phpt b/Zend/tests/type_declarations/typed_properties_065.phpt
index a4d0aa4c0c0..c3e7abda334 100644
--- a/Zend/tests/type_declarations/typed_properties_065.phpt
+++ b/Zend/tests/type_declarations/typed_properties_065.phpt
@@ -52,7 +52,7 @@ function offsetUnset($o): void { print "offsetUnset() ?!?"; }
 echo gettype($a->foo),"\n";

 ?>
---EXPECT--
+--EXPECTF--
 offsetSet(2)
 int(1)
 offsetSet(11)
@@ -61,11 +61,11 @@ function offsetUnset($o): void { print "offsetUnset() ?!?"; }
 int(1)
 int(0)
 int(-1)
-TypeError: Cannot decrement a reference held by property ArrayAccess@anonymous::$foo of type int past its minimal value
+TypeError: Cannot decrement a reference held by property ArrayAccess@anonymous%0%s::$foo of type int past its minimal value
 integer
-TypeError: Cannot decrement a reference held by property ArrayAccess@anonymous::$foo of type int past its minimal value
+TypeError: Cannot decrement a reference held by property ArrayAccess@anonymous%0%s::$foo of type int past its minimal value
 integer
-TypeError: Cannot increment a reference held by property ArrayAccess@anonymous::$foo of type int past its maximal value
+TypeError: Cannot increment a reference held by property ArrayAccess@anonymous%0%s::$foo of type int past its maximal value
 integer
-TypeError: Cannot increment a reference held by property ArrayAccess@anonymous::$foo of type int past its maximal value
+TypeError: Cannot increment a reference held by property ArrayAccess@anonymous%0%s::$foo of type int past its maximal value
 integer
diff --git a/Zend/tests/type_declarations/typed_properties_078.phpt b/Zend/tests/type_declarations/typed_properties_078.phpt
index 346516b4b22..1de60d852d4 100644
--- a/Zend/tests/type_declarations/typed_properties_078.phpt
+++ b/Zend/tests/type_declarations/typed_properties_078.phpt
@@ -42,18 +42,18 @@
 var_dump($ref instanceof ArrayIterator);

 ?>
---EXPECT--
+--EXPECTF--
 array(0) {
 }
-TypeError: Cannot assign array to property class@anonymous::$t of type ?Traversable
+TypeError: Cannot assign array to property class@anonymous%0%s::$t of type ?Traversable
 array(0) {
 }
 array(1) {
   [0]=>
   int(1)
 }
-TypeError: Cannot assign ArrayIterator to reference held by property class@anonymous::$a of type ?array
+TypeError: Cannot assign ArrayIterator to reference held by property class@anonymous%0%s::$a of type ?array
 bool(false)
-TypeError: Cannot assign array to reference held by property class@anonymous::$t of type ?Traversable
+TypeError: Cannot assign array to reference held by property class@anonymous%0%s::$t of type ?Traversable
 bool(false)
 bool(true)
diff --git a/Zend/zend.c b/Zend/zend.c
index 55ad84f189f..e44fa3c1a77 100644
--- a/Zend/zend.c
+++ b/Zend/zend.c
@@ -1876,12 +1876,11 @@ ZEND_API ZEND_COLD void zend_illegal_container_offset(const zend_string *contain
 ZEND_API ZEND_COLD void zend_type_error(const char *format, ...) /* {{{ */
 {
 	va_list va;
-	char *message = NULL;

 	va_start(va, format);
-	zend_vspprintf(&message, 0, format, va);
-	zend_throw_exception(zend_ce_type_error, message, 0);
-	efree(message);
+	zend_string *message = zend_vstrpprintf(0, format, va);
+	zend_throw_exception_ex(zend_ce_type_error, 0, "%pS", message);
+	zend_string_release(message);
 	va_end(va);
 } /* }}} */

diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index bac0095d1c4..3133caea2e0 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -296,7 +296,7 @@ static zend_never_inline ZEND_COLD zval* zval_undefined_cv(uint32_t var EXECUTE_
 {
 	if (EXPECTED(EG(exception) == NULL)) {
 		zend_string *cv = CV_DEF_OF(EX_VAR_TO_NUM(var));
-		zend_error_unchecked(E_WARNING, "Undefined variable $%S", cv);
+		zend_error(E_WARNING, "Undefined variable $%pS", cv);
 	}
 	return &EG(uninitialized_zval);
 }
@@ -629,8 +629,8 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_cannot_pass_by_reference_ex(const zen
 	zend_string *func_name = get_function_or_method_name(func);
 	const char *param_name = get_function_arg_name(func, arg_num);

-	zend_throw_error(NULL, "%s(): Argument #%d%s%s%s could not be passed by reference",
-		ZSTR_VAL(func_name), arg_num, param_name ? " ($" : "", param_name ? param_name : "", param_name ? ")" : ""
+	zend_throw_error(NULL, "%pS(): Argument #%d%s%s%s could not be passed by reference",
+		func_name, arg_num, param_name ? " ($" : "", param_name ? param_name : "", param_name ? ")" : ""
 	);

 	zend_string_release(func_name);
@@ -645,9 +645,9 @@ ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_cannot_pass_by_refe
 static zend_never_inline ZEND_COLD void zend_throw_auto_init_in_prop_error(const zend_property_info *prop) {
 	zend_string *type_str = zend_type_to_string(prop->type);
 	zend_type_error(
-		"Cannot auto-initialize an array inside property %s::$%s of type %s",
-		ZSTR_VAL(prop->ce->name), zend_get_unmangled_property_name(prop->name),
-		ZSTR_VAL(type_str)
+		"Cannot auto-initialize an array inside property %pS::$%s of type %pS",
+		prop->ce->name, zend_get_unmangled_property_name(prop->name),
+		type_str
 	);
 	zend_string_release(type_str);
 }
@@ -655,9 +655,9 @@ static zend_never_inline ZEND_COLD void zend_throw_auto_init_in_prop_error(const
 static zend_never_inline ZEND_COLD void zend_throw_auto_init_in_ref_error(const zend_property_info *prop) {
 	zend_string *type_str = zend_type_to_string(prop->type);
 	zend_type_error(
-		"Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s",
-		ZSTR_VAL(prop->ce->name), zend_get_unmangled_property_name(prop->name),
-		ZSTR_VAL(type_str)
+		"Cannot auto-initialize an array inside a reference held by property %pS::$%s of type %pS",
+		prop->ce->name, zend_get_unmangled_property_name(prop->name),
+		type_str
 	);
 	zend_string_release(type_str);
 }
@@ -665,8 +665,8 @@ static zend_never_inline ZEND_COLD void zend_throw_auto_init_in_ref_error(const
 static zend_never_inline ZEND_COLD void zend_throw_access_uninit_prop_by_ref_error(
 		const zend_property_info *prop) {
 	zend_throw_error(NULL,
-		"Cannot access uninitialized non-nullable property %s::$%s by reference",
-		ZSTR_VAL(prop->ce->name),
+		"Cannot access uninitialized non-nullable property %pS::$%s by reference",
+		prop->ce->name,
 		zend_get_unmangled_property_name(prop->name));
 }

@@ -681,21 +681,21 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_throw_non_object_erro
 	 || opline->opcode == ZEND_POST_INC_OBJ
 	 || opline->opcode == ZEND_POST_DEC_OBJ) {
 		zend_throw_error(NULL,
-			"Attempt to increment/decrement property \"%s\" on %s",
-			ZSTR_VAL(property_name), zend_zval_value_name(object)
+			"Attempt to increment/decrement property \"%pS\" on %s",
+			property_name, zend_zval_value_name(object)
 		);
 	} else if (opline->opcode == ZEND_FETCH_OBJ_W
 			|| opline->opcode == ZEND_FETCH_OBJ_RW
 			|| opline->opcode == ZEND_FETCH_OBJ_FUNC_ARG
 			|| opline->opcode == ZEND_ASSIGN_OBJ_REF) {
 		zend_throw_error(NULL,
-			"Attempt to modify property \"%s\" on %s",
-			ZSTR_VAL(property_name), zend_zval_value_name(object)
+			"Attempt to modify property \"%pS\" on %s",
+			property_name, zend_zval_value_name(object)
 		);
 	} else {
 		zend_throw_error(NULL,
-			"Attempt to assign property \"%s\" on %s",
-			ZSTR_VAL(property_name), zend_zval_value_name(object)
+			"Attempt to assign property \"%pS\" on %s",
+			property_name, zend_zval_value_name(object)
 		);
 	}
 	zend_tmp_string_release(tmp_property_name);
@@ -742,13 +742,13 @@ ZEND_API zend_never_inline ZEND_COLD void zend_verify_arg_error(
 	ZEND_ASSERT(zf->common.type == ZEND_USER_FUNCTION
 		&& "Arginfo verification is not performed for internal functions");
 	if (ptr && ptr->func && ZEND_USER_CODE(ptr->func->common.type)) {
-		zend_argument_type_error(arg_num, "must be of type %s, %s given, called in %s on line %d",
-			ZSTR_VAL(need_msg), given_msg,
-			ZSTR_VAL(ptr->func->op_array.filename), ptr->opline->lineno
+		zend_argument_type_error(arg_num, "must be of type %pS, %s given, called in %pS on line %d",
+			need_msg, given_msg,
+			ptr->func->op_array.filename, ptr->opline->lineno
 		);
 	} else {
 		zend_argument_type_error(arg_num,
-			"must be of type %s, %s given", ZSTR_VAL(need_msg), given_msg);
+			"must be of type %pS, %s given", need_msg, given_msg);
 	}

 	zend_string_release(need_msg);
@@ -867,8 +867,8 @@ static zend_never_inline ZEND_COLD void zend_verify_class_constant_type_error(co
 {
 	zend_string *type_str = zend_type_to_string(c->type);

-	zend_type_error("Cannot assign %s to class constant %s::%s of type %s",
-		zend_zval_type_name(constant), ZSTR_VAL(c->ce->name), ZSTR_VAL(name), ZSTR_VAL(type_str));
+	zend_type_error("Cannot assign %s to class constant %pS::%pS of type %pS",
+		zend_zval_type_name(constant), c->ce->name, name, type_str);

 	zend_string_release(type_str);
 }
@@ -883,11 +883,11 @@ static zend_never_inline ZEND_COLD void zend_verify_property_type_error(const ze
 	}

 	type_str = zend_type_to_string(info->type);
-	zend_type_error("Cannot assign %s to property %s::$%s of type %s",
+	zend_type_error("Cannot assign %s to property %pS::$%s of type %pS",
 		zend_zval_value_name(property),
-		ZSTR_VAL(info->ce->name),
+		info->ce->name,
 		zend_get_unmangled_property_name(info->name),
-		ZSTR_VAL(type_str));
+		type_str);
 	zend_string_release(type_str);
 }

@@ -899,12 +899,12 @@ static zend_never_inline ZEND_COLD void zend_magic_get_property_type_inconsisten
 	}

 	zend_string *type_str = zend_type_to_string(info->type);
-	zend_type_error("Value of type %s returned from %s::__get() must be compatible with unset property %s::$%s of type %s",
+	zend_type_error("Value of type %s returned from %pS::__get() must be compatible with unset property %pS::$%s of type %pS",
 		zend_zval_type_name(property),
-		ZSTR_VAL(info->ce->name),
-		ZSTR_VAL(info->ce->name),
+		info->ce->name,
+		info->ce->name,
 		zend_get_unmangled_property_name(info->name),
-		ZSTR_VAL(type_str));
+		type_str);
 	zend_string_release(type_str);
 }

@@ -923,7 +923,7 @@ zend_never_inline ZEND_COLD void zend_match_unhandled_error(const zval *value)
 	smart_str_0(&msg);

 	zend_throw_exception_ex(
-		zend_ce_unhandled_match_error, 0, "Unhandled match case %s", ZSTR_VAL(msg.s));
+		zend_ce_unhandled_match_error, 0, "Unhandled match case %pS", msg.s);

 	smart_str_free(&msg);
 }
@@ -941,8 +941,8 @@ ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_readonly_property_m

 ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_readonly_property_indirect_modification_error(const zend_property_info *info)
 {
-	zend_throw_error(NULL, "Cannot indirectly modify readonly property %s::$%s",
-		ZSTR_VAL(info->ce->name), zend_get_unmangled_property_name(info->name));
+	zend_throw_error(NULL, "Cannot indirectly modify readonly property %pS::$%s",
+		info->ce->name, zend_get_unmangled_property_name(info->name));
 }

 ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_invalid_class_constant_type_error(const uint8_t type)
@@ -952,8 +952,8 @@ ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_invalid_class_const

 ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_object_released_while_assigning_to_property_error(const zend_property_info *info)
 {
-	zend_throw_error(NULL, "Object was released while assigning to property %s::$%s",
-		ZSTR_VAL(info->ce->name), zend_get_unmangled_property_name(info->name));
+	zend_throw_error(NULL, "Object was released while assigning to property %pS::$%s",
+		info->ce->name, zend_get_unmangled_property_name(info->name));
 }

 ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_asymmetric_visibility_property_modification_error(
@@ -978,11 +978,11 @@ ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_asymmetric_visibili
 		}
 	}

-	zend_throw_error(NULL, "Cannot %s %s property %s::$%s from %s%s",
+	zend_throw_error(NULL, "Cannot %s %s property %pS::$%pS from %s%s",
 		operation,
 		visibility,
-		ZSTR_VAL(prop_info->ce->name),
-		ZSTR_VAL(prop_info->name),
+		prop_info->ce->name,
+		prop_info->name,
 		scope ? "scope " : "global scope", scope ? ZSTR_VAL(scope->name) : "");
 }

@@ -1378,17 +1378,17 @@ static void zend_verify_internal_func_info(const zend_function *fn, const zval *
 	/* Always check refcount of arrays, as immutable arrays are RCN. */
 	if (Z_REFCOUNTED_P(retval) || Z_TYPE_P(retval) == IS_ARRAY) {
 		if (!(type_mask & MAY_BE_RC1)) {
-			zend_error_noreturn(E_CORE_ERROR, "%s() missing rc1", ZSTR_VAL(name));
+			zend_error_noreturn(E_CORE_ERROR, "%pS() missing rc1", name);
 		}
 		if (Z_REFCOUNT_P(retval) > 1 && !(type_mask & MAY_BE_RCN)) {
-			zend_error_noreturn(E_CORE_ERROR, "%s() missing rcn", ZSTR_VAL(name));
+			zend_error_noreturn(E_CORE_ERROR, "%pS() missing rcn", name);
 		}
 	}

 	const uint32_t type = 1u << Z_TYPE_P(retval);
 	if (!(type_mask & type)) {
-		zend_error_noreturn(E_CORE_ERROR, "%s() missing type %s",
-			ZSTR_VAL(name), zend_get_type_by_const(Z_TYPE_P(retval)));
+		zend_error_noreturn(E_CORE_ERROR, "%pS() missing type %s",
+			name, zend_get_type_by_const(Z_TYPE_P(retval)));
 	}

 	if (Z_TYPE_P(retval) == IS_ARRAY) {
@@ -1400,20 +1400,20 @@ static void zend_verify_internal_func_info(const zend_function *fn, const zval *
 			if (str) {
 				if (!(type_mask & MAY_BE_ARRAY_KEY_STRING)) {
 					zend_error_noreturn(E_CORE_ERROR,
-						"%s() missing array_key_string", ZSTR_VAL(name));
+						"%pS() missing array_key_string", name);
 				}
 			} else {
 				if (!(type_mask & MAY_BE_ARRAY_KEY_LONG)) {
 					zend_error_noreturn(E_CORE_ERROR,
-						"%s() missing array_key_long", ZSTR_VAL(name));
+						"%pS() missing array_key_long", name);
 				}
 			}

 			const uint32_t array_type = 1u << (Z_TYPE_P(val) + MAY_BE_ARRAY_SHIFT);
 			if (!(type_mask & array_type)) {
 				zend_error_noreturn(E_CORE_ERROR,
-					"%s() missing array element type %s",
-					ZSTR_VAL(name), zend_get_type_by_const(Z_TYPE_P(retval)));
+					"%pS() missing array element type %s",
+					name, zend_get_type_by_const(Z_TYPE_P(retval)));
 			}

 			/* Don't check all elements of large arrays. */
@@ -1431,20 +1431,20 @@ ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_missing_arg_error(c
 	const zend_execute_data *ptr = EX(prev_execute_data);

 	if (ptr && ptr->func && ZEND_USER_CODE(ptr->func->common.type)) {
-		zend_throw_error(zend_ce_argument_count_error, "Too few arguments to function %s%s%s(), %d passed in %s on line %d and %s %d expected",
+		zend_throw_error(zend_ce_argument_count_error, "Too few arguments to function %s%s%pS(), %d passed in %pS on line %d and %s %d expected",
 			EX(func)->common.scope ? ZSTR_VAL(EX(func)->common.scope->name) : "",
 			EX(func)->common.scope ? "::" : "",
-			ZSTR_VAL(EX(func)->common.function_name),
+			EX(func)->common.function_name,
 			EX_NUM_ARGS(),
-			ZSTR_VAL(ptr->func->op_array.filename),
+			ptr->func->op_array.filename,
 			ptr->opline->lineno,
 			EX(func)->common.required_num_args == EX(func)->common.num_args ? "exactly" : "at least",
 			EX(func)->common.required_num_args);
 	} else {
-		zend_throw_error(zend_ce_argument_count_error, "Too few arguments to function %s%s%s(), %d passed and %s %d expected",
+		zend_throw_error(zend_ce_argument_count_error, "Too few arguments to function %s%s%pS(), %d passed and %s %d expected",
 			EX(func)->common.scope ? ZSTR_VAL(EX(func)->common.scope->name) : "",
 			EX(func)->common.scope ? "::" : "",
-			ZSTR_VAL(EX(func)->common.function_name),
+			EX(func)->common.function_name,
 			EX_NUM_ARGS(),
 			EX(func)->common.required_num_args == EX(func)->common.num_args ? "exactly" : "at least",
 			EX(func)->common.required_num_args);
@@ -1461,8 +1461,8 @@ ZEND_API zend_never_inline ZEND_COLD void zend_verify_return_error(const zend_fu
 	zend_verify_type_error_common(
 		zf, arg_info, value, &fname, &fsep, &fclass, &need_msg, &given_msg);

-	zend_type_error("%s%s%s(): Return value must be of type %s, %s returned",
-		fclass, fsep, fname, ZSTR_VAL(need_msg), given_msg);
+	zend_type_error("%s%s%s(): Return value must be of type %pS, %s returned",
+		fclass, fsep, fname, need_msg, given_msg);

 	zend_string_release(need_msg);
 }
@@ -1471,8 +1471,8 @@ ZEND_API zend_never_inline ZEND_COLD void zend_verify_never_error(const zend_fun
 {
 	zend_string *func_name = get_function_or_method_name(zf);

-	zend_type_error("%s(): never-returning %s must not implicitly return",
-		ZSTR_VAL(func_name), zf->common.scope ? "method" : "function");
+	zend_type_error("%pS(): never-returning %s must not implicitly return",
+		func_name, zf->common.scope ? "method" : "function");

 	zend_string_release(func_name);
 }
@@ -1488,8 +1488,8 @@ static zend_never_inline ZEND_COLD void zend_verify_internal_return_error(const
 	zend_verify_type_error_common(
 		zf, arg_info, value, &fname, &fsep, &fclass, &need_msg, &given_msg);

-	zend_error_noreturn(E_CORE_ERROR, "%s%s%s(): Return value must be of type %s, %s returned",
-		fclass, fsep, fname, ZSTR_VAL(need_msg), given_msg);
+	zend_error_noreturn(E_CORE_ERROR, "%s%s%s(): Return value must be of type %pS, %s returned",
+		fclass, fsep, fname, need_msg, given_msg);
 }

 static zend_never_inline ZEND_COLD void zend_verify_void_return_error(const zend_function *zf, const char *returned_msg, const char *returned_kind)
@@ -1566,7 +1566,7 @@ ZEND_API bool zend_never_inline zend_verify_class_constant_type(const zend_class

 static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_use_object_as_array(const zend_object *object)
 {
-	zend_throw_error(NULL, "Cannot use object of type %s as array", ZSTR_VAL(object->ce->name));
+	zend_throw_error(NULL, "Cannot use object of type %pS as array", object->ce->name);
 }

 static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_illegal_array_offset_access(const zval *offset)
@@ -1758,7 +1758,7 @@ static zend_never_inline zend_long zend_check_string_offset(const zval *dim, int
 			if (IS_LONG == is_numeric_string_ex(Z_STRVAL_P(dim), Z_STRLEN_P(dim), &offset, NULL,
 					/* allow errors */ true, NULL, &trailing_data)) {
 				if (UNEXPECTED(trailing_data) && type != BP_VAR_UNSET) {
-					zend_error(E_WARNING, "Illegal string offset \"%s\"", Z_STRVAL_P(dim));
+					zend_error(E_WARNING, "Illegal string offset \"%pS\"", Z_STR_P(dim));
 				}
 				return offset;
 			}
@@ -1878,9 +1878,9 @@ ZEND_COLD static zend_result ZEND_FASTCALL get_deprecation_suffix_from_attribute
 	}

 	/* Construct the suffix. */
-	*message_suffix = zend_strpprintf_unchecked(
+	*message_suffix = zend_strpprintf(
 		0,
-		"%s%S%s%S",
+		"%s%pS%s%pS",
 		ZSTR_LEN(since) > 0 ? " since " : "",
 		since,
 		ZSTR_LEN(message) > 0 ? ", " : "",
@@ -1907,14 +1907,14 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_deprecated_function(const zend_functi
 	int code = fbc->type == ZEND_INTERNAL_FUNCTION ? E_DEPRECATED : E_USER_DEPRECATED;

 	if (fbc->common.scope) {
-		zend_error_unchecked(code, "Method %s::%s() is deprecated%S",
-			ZSTR_VAL(fbc->common.scope->name),
-			ZSTR_VAL(fbc->common.function_name),
+		zend_error(code, "Method %pS::%pS() is deprecated%pS",
+			fbc->common.scope->name,
+			fbc->common.function_name,
 			message_suffix
 		);
 	} else {
-		zend_error_unchecked(code, "Function %s() is deprecated%S",
-			ZSTR_VAL(fbc->common.function_name),
+		zend_error(code, "Function %pS() is deprecated%pS",
+			fbc->common.function_name,
 			message_suffix
 		);
 	}
@@ -1961,9 +1961,9 @@ ZEND_COLD static zend_result ZEND_FASTCALL get_nodiscard_suffix_from_attribute(H
 	}

 	/* Construct the suffix. */
-	*message_suffix = zend_strpprintf_unchecked(
+	*message_suffix = zend_strpprintf(
 		0,
-		"%s%S",
+		"%s%pS",
 		ZSTR_LEN(message) > 0 ? ", " : "",
 		message
 	);
@@ -1988,14 +1988,14 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_nodiscard_function(const zend_functio
 	int code = fbc->type == ZEND_INTERNAL_FUNCTION ? E_WARNING : E_USER_WARNING;

 	if (fbc->common.scope) {
-		zend_error_unchecked(code, "The return value of method %s::%s() should either be used or intentionally ignored by casting it as (void)%S",
-			ZSTR_VAL(fbc->common.scope->name),
-			ZSTR_VAL(fbc->common.function_name),
+		zend_error(code, "The return value of method %pS::%pS() should either be used or intentionally ignored by casting it as (void)%pS",
+			fbc->common.scope->name,
+			fbc->common.function_name,
 			message_suffix
 		);
 	} else {
-		zend_error_unchecked(code, "The return value of function %s() should either be used or intentionally ignored by casting it as (void)%S",
-			ZSTR_VAL(fbc->common.function_name),
+		zend_error(code, "The return value of function %pS() should either be used or intentionally ignored by casting it as (void)%pS",
+			fbc->common.function_name,
 			message_suffix
 		);
 	}
@@ -2014,10 +2014,10 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_deprecated_class_constant(const zend_
 	int code = c->ce->type == ZEND_INTERNAL_CLASS ? E_DEPRECATED : E_USER_DEPRECATED;
 	char *type = (ZEND_CLASS_CONST_FLAGS(c) & ZEND_CLASS_CONST_IS_CASE) ? "Enum case" : "Constant";

-	zend_error_unchecked(code, "%s %s::%s is deprecated%S",
+	zend_error(code, "%s %pS::%pS is deprecated%pS",
 		type,
-		ZSTR_VAL(c->ce->name),
-		ZSTR_VAL(constant_name),
+		c->ce->name,
+		constant_name,
 		message_suffix
 	);

@@ -2034,8 +2034,8 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_deprecated_constant(const zend_consta

 	int code = ZEND_CONSTANT_MODULE_NUMBER(c) == PHP_USER_CONSTANT ? E_USER_DEPRECATED : E_DEPRECATED;

-	zend_error_unchecked(code, "Constant %s is deprecated%S",
-		ZSTR_VAL(constant_name),
+	zend_error(code, "Constant %pS is deprecated%pS",
+		constant_name,
 		message_suffix
 	);

@@ -2054,9 +2054,9 @@ ZEND_API ZEND_COLD void zend_use_of_deprecated_trait(

 	int code = trait->type == ZEND_INTERNAL_CLASS ? E_DEPRECATED : E_USER_DEPRECATED;

-	zend_error_unchecked(code, "Trait %s used by %s is deprecated%S",
-		ZSTR_VAL(trait->name),
-		ZSTR_VAL(used_by),
+	zend_error(code, "Trait %pS used by %pS is deprecated%pS",
+		trait->name,
+		used_by,
 		message_suffix
 	);

@@ -2223,18 +2223,18 @@ static zend_never_inline ZEND_COLD zend_long zend_throw_incdec_ref_error(const z
 	zend_string *type_str = zend_type_to_string(error_prop->type);
 	if (ZEND_IS_INCREMENT(opline->opcode)) {
 		zend_type_error(
-			"Cannot increment a reference held by property %s::$%s of type %s past its maximal value",
-			ZSTR_VAL(error_prop->ce->name),
+			"Cannot increment a reference held by property %pS::$%s of type %pS past its maximal value",
+			error_prop->ce->name,
 			zend_get_unmangled_property_name(error_prop->name),
-			ZSTR_VAL(type_str));
+			type_str);
 		zend_string_release(type_str);
 		return ZEND_LONG_MAX;
 	} else {
 		zend_type_error(
-			"Cannot decrement a reference held by property %s::$%s of type %s past its minimal value",
-			ZSTR_VAL(error_prop->ce->name),
+			"Cannot decrement a reference held by property %pS::$%s of type %pS past its minimal value",
+			error_prop->ce->name,
 			zend_get_unmangled_property_name(error_prop->name),
-			ZSTR_VAL(type_str));
+			type_str);
 		zend_string_release(type_str);
 		return ZEND_LONG_MIN;
 	}
@@ -2243,17 +2243,17 @@ static zend_never_inline ZEND_COLD zend_long zend_throw_incdec_ref_error(const z
 static zend_never_inline ZEND_COLD zend_long zend_throw_incdec_prop_error(const zend_property_info *prop OPLINE_DC) {
 	zend_string *type_str = zend_type_to_string(prop->type);
 	if (ZEND_IS_INCREMENT(opline->opcode)) {
-		zend_type_error("Cannot increment property %s::$%s of type %s past its maximal value",
-			ZSTR_VAL(prop->ce->name),
+		zend_type_error("Cannot increment property %pS::$%s of type %pS past its maximal value",
+			prop->ce->name,
 			zend_get_unmangled_property_name(prop->name),
-			ZSTR_VAL(type_str));
+			type_str);
 		zend_string_release(type_str);
 		return ZEND_LONG_MAX;
 	} else {
-		zend_type_error("Cannot decrement property %s::$%s of type %s past its minimal value",
-			ZSTR_VAL(prop->ce->name),
+		zend_type_error("Cannot decrement property %pS::$%s of type %pS past its minimal value",
+			prop->ce->name,
 			zend_get_unmangled_property_name(prop->name),
-			ZSTR_VAL(type_str));
+			type_str);
 		zend_string_release(type_str);
 		return ZEND_LONG_MIN;
 	}
@@ -2533,7 +2533,7 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_undefined_offset(zend

 static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_undefined_index(const zend_string *offset)
 {
-	zend_error(E_WARNING, "Undefined array key \"%s\"", ZSTR_VAL(offset));
+	zend_error(E_WARNING, "Undefined array key \"%pS\"", offset);
 }

 ZEND_API ZEND_COLD zval* ZEND_FASTCALL zend_undefined_offset_write(HashTable *ht, zend_long lval)
@@ -2584,31 +2584,31 @@ ZEND_API ZEND_COLD zval* ZEND_FASTCALL zend_undefined_index_write(HashTable *ht,

 ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_undefined_method(const zend_class_entry *ce, const zend_string *method)
 {
-	zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(ce->name), ZSTR_VAL(method));
+	zend_throw_error(NULL, "Call to undefined method %pS::%pS()", ce->name, method);
 }

 static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_invalid_method_call(const zval *object, const zval *function_name)
 {
-	zend_throw_error(NULL, "Call to a member function %s() on %s",
-		Z_STRVAL_P(function_name), zend_zval_value_name(object));
+	zend_throw_error(NULL, "Call to a member function %pS() on %s",
+		Z_STR_P(function_name), zend_zval_value_name(object));
 }

 ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_non_static_method_call(const zend_function *fbc)
 {
 	zend_throw_error(
 		zend_ce_error,
-		"Non-static method %s::%s() cannot be called statically",
-		ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+		"Non-static method %pS::%pS() cannot be called statically",
+		fbc->common.scope->name, fbc->common.function_name);
 }

 ZEND_COLD void ZEND_FASTCALL zend_param_must_be_ref(const zend_function *func, uint32_t arg_num)
 {
 	const char *arg_name = get_function_arg_name(func, arg_num);

-	zend_error(E_WARNING, "%s%s%s(): Argument #%d%s%s%s must be passed by reference, value given",
+	zend_error(E_WARNING, "%s%s%pS(): Argument #%d%s%s%s must be passed by reference, value given",
 		func->common.scope ? ZSTR_VAL(func->common.scope->name) : "",
 		func->common.scope ? "::" : "",
-		ZSTR_VAL(func->common.function_name),
+		func->common.function_name,
 		arg_num,
 		arg_name ? " ($" : "",
 		arg_name ? arg_name : "",
@@ -3001,7 +3001,7 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval *
 			zend_class_entry *ce = obj->ce;

 			ZVAL_NULL(result);
-			zend_error(E_NOTICE, "Indirect modification of overloaded element of %s has no effect", ZSTR_VAL(ce->name));
+			zend_error(E_NOTICE, "Indirect modification of overloaded element of %pS has no effect", ce->name);
 		} else if (EXPECTED(retval && Z_TYPE_P(retval) != IS_UNDEF)) {
 			if (!Z_ISREF_P(retval)) {
 				if (result != retval) {
@@ -3010,7 +3010,7 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval *
 				}
 				if (Z_TYPE_P(retval) != IS_OBJECT) {
 					zend_class_entry *ce = obj->ce;
-					zend_error(E_NOTICE, "Indirect modification of overloaded element of %s has no effect", ZSTR_VAL(ce->name));
+					zend_error(E_NOTICE, "Indirect modification of overloaded element of %pS has no effect", ce->name);
 				}
 			} else if (UNEXPECTED(Z_REFCOUNT_P(retval) == 1)) {
 				ZVAL_UNREF(retval);
@@ -3116,7 +3116,7 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, c
 					if (IS_LONG == is_numeric_string_ex(Z_STRVAL_P(dim), Z_STRLEN_P(dim), &offset,
 							NULL, /* allow errors */ true, NULL, &trailing_data)) {
 						if (UNEXPECTED(trailing_data)) {
-							zend_error(E_WARNING, "Illegal string offset \"%s\"", Z_STRVAL_P(dim));
+							zend_error(E_WARNING, "Illegal string offset \"%pS\"", Z_STR_P(dim));
 						}
 						goto out;
 					}
@@ -3862,8 +3862,8 @@ static zend_always_inline zval* zend_fetch_static_property_address(zend_property
 		if ((fetch_type == BP_VAR_R || fetch_type == BP_VAR_RW)
 				&& UNEXPECTED(Z_TYPE_P(result) == IS_UNDEF)
 				&& ZEND_TYPE_IS_SET(property_info->type)) {
-			zend_throw_error(NULL, "Typed static property %s::$%s must not be accessed before initialization",
-				ZSTR_VAL(property_info->ce->name),
+			zend_throw_error(NULL, "Typed static property %pS::$%s must not be accessed before initialization",
+				property_info->ce->name,
 				zend_get_unmangled_property_name(property_info->name));
 			return NULL;
 		}
@@ -3931,14 +3931,14 @@ ZEND_API zval* ZEND_FASTCALL zend_fetch_static_property(zend_execute_data *ex, i
 ZEND_API zend_never_inline ZEND_COLD void zend_throw_ref_type_error_type(const zend_property_info *prop1, const zend_property_info *prop2, const zval *zv) {
 	zend_string *type1_str = zend_type_to_string(prop1->type);
 	zend_string *type2_str = zend_type_to_string(prop2->type);
-	zend_type_error("Reference with value of type %s held by property %s::$%s of type %s is not compatible with property %s::$%s of type %s",
+	zend_type_error("Reference with value of type %s held by property %pS::$%s of type %pS is not compatible with property %pS::$%s of type %pS",
 		zend_zval_type_name(zv),
-		ZSTR_VAL(prop1->ce->name),
+		prop1->ce->name,
 		zend_get_unmangled_property_name(prop1->name),
-		ZSTR_VAL(type1_str),
-		ZSTR_VAL(prop2->ce->name),
+		type1_str,
+		prop2->ce->name,
 		zend_get_unmangled_property_name(prop2->name),
-		ZSTR_VAL(type2_str)
+		type2_str
 	);
 	zend_string_release(type1_str);
 	zend_string_release(type2_str);
@@ -3946,11 +3946,11 @@ ZEND_API zend_never_inline ZEND_COLD void zend_throw_ref_type_error_type(const z

 ZEND_API zend_never_inline ZEND_COLD void zend_throw_ref_type_error_zval(const zend_property_info *prop, const zval *zv) {
 	zend_string *type_str = zend_type_to_string(prop->type);
-	zend_type_error("Cannot assign %s to reference held by property %s::$%s of type %s",
+	zend_type_error("Cannot assign %s to reference held by property %pS::$%s of type %pS",
 		zend_zval_value_name(zv),
-		ZSTR_VAL(prop->ce->name),
+		prop->ce->name,
 		zend_get_unmangled_property_name(prop->name),
-		ZSTR_VAL(type_str)
+		type_str
 	);
 	zend_string_release(type_str);
 }
@@ -3958,14 +3958,14 @@ ZEND_API zend_never_inline ZEND_COLD void zend_throw_ref_type_error_zval(const z
 static zend_never_inline ZEND_COLD void zend_throw_conflicting_coercion_error(const zend_property_info *prop1, const zend_property_info *prop2, const zval *zv) {
 	zend_string *type1_str = zend_type_to_string(prop1->type);
 	zend_string *type2_str = zend_type_to_string(prop2->type);
-	zend_type_error("Cannot assign %s to reference held by property %s::$%s of type %s and property %s::$%s of type %s, as this would result in an inconsistent type conversion",
+	zend_type_error("Cannot assign %s to reference held by property %pS::$%s of type %pS and property %pS::$%s of type %pS, as this would result in an inconsistent type conversion",
 		zend_zval_value_name(zv),
-		ZSTR_VAL(prop1->ce->name),
+		prop1->ce->name,
 		zend_get_unmangled_property_name(prop1->name),
-		ZSTR_VAL(type1_str),
-		ZSTR_VAL(prop2->ce->name),
+		type1_str,
+		prop2->ce->name,
 		zend_get_unmangled_property_name(prop2->name),
-		ZSTR_VAL(type2_str)
+		type2_str
 	);
 	zend_string_release(type1_str);
 	zend_string_release(type2_str);
@@ -5205,7 +5205,7 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_string(zend_s
 	} else {
 		fbc = zend_fetch_function(function);
 		if (UNEXPECTED(fbc == NULL)) {
-			zend_throw_error(NULL, "Call to undefined function %s()", ZSTR_VAL(function));
+			zend_throw_error(NULL, "Call to undefined function %pS()", function);
 			return NULL;
 		}
 		called_scope = NULL;
@@ -5247,7 +5247,7 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_object(zend_o
 			}
 		}
 	} else {
-		zend_throw_error(NULL, "Object of type %s is not callable", ZSTR_VAL(function->ce->name));
+		zend_throw_error(NULL, "Object of type %pS is not callable", function->ce->name);
 		return NULL;
 	}

@@ -5443,7 +5443,7 @@ static zend_never_inline bool ZEND_FASTCALL zend_fe_reset_iterator(zval *array_p
 			OBJ_RELEASE(&iter->std);
 		}
 		if (!EG(exception)) {
-			zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
+			zend_throw_exception_ex(NULL, 0, "Object of type %pS did not create an Iterator", ce->name);
 		}
 		ZVAL_UNDEF(EX_VAR(opline->result.var));
 		return 1;
@@ -5495,7 +5495,7 @@ static zend_always_inline zend_result _zend_quick_get_constant(

 	if (!c) {
 		if (!check_defined_only) {
-			zend_throw_error(NULL, "Undefined constant \"%s\"", Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)));
+			zend_throw_error(NULL, "Undefined constant \"%pS\"", Z_STR_P(RT_CONSTANT(opline, opline->op2)));
 			ZVAL_UNDEF(EX_VAR(opline->result.var));
 		}
 		return FAILURE;
@@ -5578,7 +5578,7 @@ zval * ZEND_FASTCALL zend_handle_named_arg(
 	const zend_function *fbc = call->func;
 	uint32_t arg_offset = zend_get_arg_offset_by_name(fbc, arg_name, cache_slot);
 	if (UNEXPECTED(arg_offset == (uint32_t) -1)) {
-		zend_throw_error(NULL, "Unknown named parameter $%s", ZSTR_VAL(arg_name));
+		zend_throw_error(NULL, "Unknown named parameter $%pS", arg_name);
 		return NULL;
 	}

@@ -5592,8 +5592,8 @@ zval * ZEND_FASTCALL zend_handle_named_arg(

 		arg = zend_hash_add_empty_element(call->extra_named_params, arg_name);
 		if (!arg) {
-			zend_throw_error(NULL, "Named parameter $%s overwrites previous argument",
-				ZSTR_VAL(arg_name));
+			zend_throw_error(NULL, "Named parameter $%pS overwrites previous argument",
+				arg_name);
 			return NULL;
 		}
 		*arg_num_ptr = arg_offset + 1;
@@ -5624,8 +5624,8 @@ zval * ZEND_FASTCALL zend_handle_named_arg(
 		arg = ZEND_CALL_VAR_NUM(call, arg_offset);

 		if (UNEXPECTED(!Z_ISUNDEF_P(arg))) {
-			zend_throw_error(NULL, "Named parameter $%s overwrites previous %s",
-				ZSTR_VAL(arg_name), Z_TYPE_P(arg) == _IS_PLACEHOLDER ? "placeholder" : "argument");
+			zend_throw_error(NULL, "Named parameter $%pS overwrites previous %s",
+				arg_name, Z_TYPE_P(arg) == _IS_PLACEHOLDER ? "placeholder" : "argument");
 			return NULL;
 		}
 	}
diff --git a/ext/opcache/jit/zend_jit_helpers.c b/ext/opcache/jit/zend_jit_helpers.c
index 660a17c0568..5fe56dcc714 100644
--- a/ext/opcache/jit/zend_jit_helpers.c
+++ b/ext/opcache/jit/zend_jit_helpers.c
@@ -109,8 +109,8 @@ static ZEND_COLD void ZEND_FASTCALL zend_jit_invalid_method_call(zval *object)
 		}
 		object = &EG(uninitialized_zval);
 	}
-	zend_throw_error(NULL, "Call to a member function %s() on %s",
-		Z_STRVAL_P(function_name), zend_zval_value_name(object));
+	zend_throw_error(NULL, "Call to a member function %pS() on %s",
+		Z_STR_P(function_name), zend_zval_value_name(object));
 }

 static ZEND_COLD void ZEND_FASTCALL zend_jit_invalid_method_call_tmp(zval *object)
@@ -584,7 +584,7 @@ static void ZEND_FASTCALL zend_jit_fetch_dim_r_helper(zend_array *ht, zval *dim,
 	}
 	retval = zend_hash_find(ht, offset_key);
 	if (!retval) {
-		zend_error(E_WARNING, "Undefined array key \"%s\"", ZSTR_VAL(offset_key));
+		zend_error(E_WARNING, "Undefined array key \"%pS\"", offset_key);
 		ZVAL_NULL(result);
 		return;
 	}
@@ -1188,7 +1188,7 @@ static zend_never_inline zend_long zend_check_string_offset(zval *dim, int type)
 					/* allow errors */ true, NULL, &trailing_data)) {
 				if (UNEXPECTED(trailing_data)
 				 && EG(current_execute_data)->opline->opcode != ZEND_FETCH_DIM_UNSET) {
-					zend_error(E_WARNING, "Illegal string offset \"%s\"", Z_STRVAL_P(dim));
+					zend_error(E_WARNING, "Illegal string offset \"%pS\"", Z_STR_P(dim));
 				}
 				return offset;
 			}
@@ -1538,7 +1538,7 @@ static zend_always_inline void ZEND_FASTCALL zend_jit_fetch_dim_obj_helper(zval
 			zend_class_entry *ce = obj->ce;

 			ZVAL_NULL(result);
-			zend_error(E_NOTICE, "Indirect modification of overloaded element of %s has no effect", ZSTR_VAL(ce->name));
+			zend_error(E_NOTICE, "Indirect modification of overloaded element of %pS has no effect", ce->name);
 		} else if (EXPECTED(retval && Z_TYPE_P(retval) != IS_UNDEF)) {
 			if (!Z_ISREF_P(retval)) {
 				if (result != retval) {
@@ -1547,7 +1547,7 @@ static zend_always_inline void ZEND_FASTCALL zend_jit_fetch_dim_obj_helper(zval
 				}
 				if (Z_TYPE_P(retval) != IS_OBJECT) {
 					zend_class_entry *ce = obj->ce;
-					zend_error(E_NOTICE, "Indirect modification of overloaded element of %s has no effect", ZSTR_VAL(ce->name));
+					zend_error(E_NOTICE, "Indirect modification of overloaded element of %pS has no effect", ce->name);
 				}
 			} else if (UNEXPECTED(Z_REFCOUNT_P(retval) == 1)) {
 				ZVAL_UNREF(retval);
@@ -2232,10 +2232,10 @@ static zend_always_inline bool check_type_array_assignable(zend_type type) {
 static zend_never_inline ZEND_COLD void zend_throw_auto_init_in_prop_error(zend_property_info *prop, const char *type) {
 	zend_string *type_str = zend_type_to_string(prop->type);
 	zend_type_error(
-		"Cannot auto-initialize an %s inside property %s::$%s of type %s",
+		"Cannot auto-initialize an %s inside property %pS::$%s of type %pS",
 		type,
-		ZSTR_VAL(prop->ce->name), zend_get_unmangled_property_name(prop->name),
-		ZSTR_VAL(type_str)
+		prop->ce->name, zend_get_unmangled_property_name(prop->name),
+		type_str
 	);
 	zend_string_release(type_str);
 }
@@ -2243,8 +2243,8 @@ static zend_never_inline ZEND_COLD void zend_throw_auto_init_in_prop_error(zend_
 static zend_never_inline ZEND_COLD void zend_throw_access_uninit_prop_by_ref_error(
 		zend_property_info *prop) {
 	zend_throw_error(NULL,
-		"Cannot access uninitialized non-nullable property %s::$%s by reference",
-		ZSTR_VAL(prop->ce->name),
+		"Cannot access uninitialized non-nullable property %pS::$%s by reference",
+		prop->ce->name,
 		zend_get_unmangled_property_name(prop->name));
 }

@@ -2351,9 +2351,9 @@ static void ZEND_FASTCALL zend_jit_check_array_promotion(zval *val, zend_propert
 		&& (ZEND_TYPE_FULL_MASK(prop->type) & MAY_BE_ARRAY) == 0) {
 		zend_string *type_str = zend_type_to_string(prop->type);
 		zend_type_error(
-			"Cannot auto-initialize an array inside property %s::$%s of type %s",
-			ZSTR_VAL(prop->ce->name), zend_get_unmangled_property_name(prop->name),
-			ZSTR_VAL(type_str)
+			"Cannot auto-initialize an array inside property %pS::$%s of type %pS",
+			prop->ce->name, zend_get_unmangled_property_name(prop->name),
+			type_str
 		);
 		zend_string_release(type_str);
 		ZVAL_ERROR(result);
@@ -2490,10 +2490,10 @@ static ZEND_COLD void zend_jit_throw_inc_ref_error(zend_reference *ref, zend_pro
 	zend_string *type_str = zend_type_to_string(error_prop->type);

 	zend_type_error(
-		"Cannot increment a reference held by property %s::$%s of type %s past its maximal value",
-		ZSTR_VAL(error_prop->ce->name),
+		"Cannot increment a reference held by property %pS::$%s of type %pS past its maximal value",
+		error_prop->ce->name,
 		zend_get_unmangled_property_name(error_prop->name),
-		ZSTR_VAL(type_str));
+		type_str);
 	zend_string_release(type_str);
 }

@@ -2502,10 +2502,10 @@ static ZEND_COLD void zend_jit_throw_dec_ref_error(zend_reference *ref, zend_pro
 	zend_string *type_str = zend_type_to_string(error_prop->type);

 	zend_type_error(
-		"Cannot decrement a reference held by property %s::$%s of type %s past its minimal value",
-		ZSTR_VAL(error_prop->ce->name),
+		"Cannot decrement a reference held by property %pS::$%s of type %pS past its minimal value",
+		error_prop->ce->name,
 		zend_get_unmangled_property_name(error_prop->name),
-		ZSTR_VAL(type_str));
+		type_str);
 	zend_string_release(type_str);
 }

@@ -2662,14 +2662,14 @@ static void ZEND_FASTCALL zend_jit_invalid_property_read(zval *container, const
 	zend_error(E_WARNING, "Attempt to read property \"%s\" on %s", property_name, zend_zval_value_name(container));
 }

-static void ZEND_FASTCALL zend_jit_invalid_property_write(zval *container, const char *property_name)
+static void ZEND_FASTCALL zend_jit_invalid_property_write(zval *container, zend_string *property_name)
 {
 	zend_throw_error(NULL,
-		"Attempt to modify property \"%s\" on %s",
+		"Attempt to modify property \"%pS\" on %s",
 		property_name, zend_zval_value_name(container));
 }

-static void ZEND_FASTCALL zend_jit_invalid_property_incdec(zval *container, const char *property_name)
+static void ZEND_FASTCALL zend_jit_invalid_property_incdec(zval *container, zend_string *property_name)
 {
 	zend_execute_data *execute_data = EG(current_execute_data);
 	const zend_op *opline = EX(opline);
@@ -2683,21 +2683,21 @@ static void ZEND_FASTCALL zend_jit_invalid_property_incdec(zval *container, cons
 		ZVAL_UNDEF(EX_VAR(opline->result.var));
 	}
 	zend_throw_error(NULL,
-		"Attempt to increment/decrement property \"%s\" on %s",
+		"Attempt to increment/decrement property \"%pS\" on %s",
 		property_name, zend_zval_value_name(container));
 	if (opline->op1_type == IS_VAR) {
 		zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	}
 }

-static void ZEND_FASTCALL zend_jit_invalid_property_assign(zval *container, const char *property_name)
+static void ZEND_FASTCALL zend_jit_invalid_property_assign(zval *container, zend_string *property_name)
 {
 	zend_throw_error(NULL,
-		"Attempt to assign property \"%s\" on %s",
+		"Attempt to assign property \"%pS\" on %s",
 		property_name, zend_zval_value_name(container));
 }

-static void ZEND_FASTCALL zend_jit_invalid_property_assign_op(zval *container, const char *property_name)
+static void ZEND_FASTCALL zend_jit_invalid_property_assign_op(zval *container, zend_string *property_name)
 {
 	if (Z_TYPE_P(container) == IS_UNDEF) {
 		const zend_execute_data *execute_data = EG(current_execute_data);
@@ -2962,10 +2962,10 @@ static void ZEND_FASTCALL zend_jit_assign_obj_op_helper(zend_object *zobj, zend_
 static ZEND_COLD zend_long _zend_jit_throw_inc_prop_error(zend_property_info *prop)
 {
 	zend_string *type_str = zend_type_to_string(prop->type);
-	zend_type_error("Cannot increment property %s::$%s of type %s past its maximal value",
-		ZSTR_VAL(prop->ce->name),
+	zend_type_error("Cannot increment property %pS::$%s of type %pS past its maximal value",
+		prop->ce->name,
 		zend_get_unmangled_property_name(prop->name),
-		ZSTR_VAL(type_str));
+		type_str);
 	zend_string_release(type_str);
 	return ZEND_LONG_MAX;
 }
@@ -2973,10 +2973,10 @@ static ZEND_COLD zend_long _zend_jit_throw_inc_prop_error(zend_property_info *pr
 static ZEND_COLD zend_long _zend_jit_throw_dec_prop_error(zend_property_info *prop)
 {
 	zend_string *type_str = zend_type_to_string(prop->type);
-	zend_type_error("Cannot decrement property %s::$%s of type %s past its minimal value",
-		ZSTR_VAL(prop->ce->name),
+	zend_type_error("Cannot decrement property %pS::$%s of type %pS past its minimal value",
+		prop->ce->name,
 		zend_get_unmangled_property_name(prop->name),
-		ZSTR_VAL(type_str));
+		type_str);
 	zend_string_release(type_str);
 	return ZEND_LONG_MIN;
 }
@@ -3408,8 +3408,8 @@ static void ZEND_FASTCALL zend_jit_uninit_static_prop(void)
 	uint32_t cache_slot = opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS;
 	const zend_property_info *property_info = CACHED_PTR(cache_slot + sizeof(void *) * 2);

-	zend_throw_error(NULL, "Typed static property %s::$%s must not be accessed before initialization",
-		ZSTR_VAL(property_info->ce->name),
+	zend_throw_error(NULL, "Typed static property %pS::$%s must not be accessed before initialization",
+		property_info->ce->name,
 		zend_get_unmangled_property_name(property_info->name));
 }

diff --git a/ext/opcache/jit/zend_jit_ir.c b/ext/opcache/jit/zend_jit_ir.c
index 146bdc0a5f0..8bbc96159d4 100644
--- a/ext/opcache/jit/zend_jit_ir.c
+++ b/ext/opcache/jit/zend_jit_ir.c
@@ -14424,7 +14424,7 @@ static int zend_jit_fetch_obj(zend_jit_ctx         *jit,
 					}
 					if (opline->opcode == ZEND_FETCH_OBJ_W) {
 						ir_CALL_2(IR_VOID, ir_CONST_FC_FUNC(zend_jit_invalid_property_write),
-							op1_ref, ir_CONST_ADDR(Z_STRVAL_P(member)));
+							op1_ref, ir_CONST_ADDR(Z_STR_P(member)));
 						jit_set_Z_TYPE_INFO(jit, res_addr, _IS_ERROR);
 					} else {
 						ir_CALL_2(IR_VOID, ir_CONST_FC_FUNC(zend_jit_invalid_property_read),
@@ -15003,7 +15003,7 @@ static int zend_jit_assign_obj(zend_jit_ctx         *jit,
 				jit_SET_EX_OPLINE(jit, opline);
 				ir_CALL_2(IR_VOID, ir_CONST_FC_FUNC(zend_jit_invalid_property_assign),
 					jit_ZVAL_ADDR(jit, op1_addr),
-					ir_CONST_ADDR(ZSTR_VAL(name)));
+					ir_CONST_ADDR(name));

 				if (RETURN_VALUE_USED(opline) && Z_MODE(res_addr) != IS_REG) {
 					jit_set_Z_TYPE_INFO(jit, res_addr, IS_NULL);
@@ -15352,7 +15352,7 @@ static int zend_jit_assign_obj_op(zend_jit_ctx         *jit,
 						ir_CONST_FC_FUNC(zend_jit_invalid_property_assign_op) :
 						ir_CONST_FC_FUNC(zend_jit_invalid_property_assign),
 					jit_ZVAL_ADDR(jit, op1_addr),
-					ir_CONST_ADDR(ZSTR_VAL(name)));
+					ir_CONST_ADDR(name));

 				may_throw = true;

@@ -15784,7 +15784,7 @@ static int zend_jit_incdec_obj(zend_jit_ctx         *jit,
 				jit_SET_EX_OPLINE(jit, opline);
 				ir_CALL_2(IR_VOID, ir_CONST_FC_FUNC(zend_jit_invalid_property_incdec),
 					jit_ZVAL_ADDR(jit, op1_addr),
-					ir_CONST_ADDR(ZSTR_VAL(name)));
+					ir_CONST_ADDR(name));

 				ir_IJMP(jit_STUB_ADDR(jit, jit_stub_exception_handler));
 				ir_IF_TRUE(if_obj);