1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

Merge branch 'PHP-8.3'

This commit is contained in:
Bob Weinand
2024-03-18 19:06:12 +01:00
3 changed files with 25 additions and 2 deletions

View File

@@ -1996,9 +1996,9 @@ static void zend_add_trait_method(zend_class_entry *ce, zend_string *name, zend_
} else { } else {
new_fn = zend_arena_alloc(&CG(arena), sizeof(zend_op_array)); new_fn = zend_arena_alloc(&CG(arena), sizeof(zend_op_array));
memcpy(new_fn, fn, sizeof(zend_op_array)); memcpy(new_fn, fn, sizeof(zend_op_array));
new_fn->op_array.fn_flags |= ZEND_ACC_TRAIT_CLONE;
new_fn->op_array.fn_flags &= ~ZEND_ACC_IMMUTABLE; new_fn->op_array.fn_flags &= ~ZEND_ACC_IMMUTABLE;
} }
new_fn->common.fn_flags |= ZEND_ACC_TRAIT_CLONE;
/* Reassign method name, in case it is an alias. */ /* Reassign method name, in case it is an alias. */
new_fn->common.function_name = name; new_fn->common.function_name = name;

View File

@@ -0,0 +1,23 @@
--TEST--
GH-13712 (Segmentation fault for enabled observers when calling trait method of internal trait when opcache is loaded)
--EXTENSIONS--
opcache
zend_test
--INI--
zend_test.observer.enabled=1
opcache.enable=1
opcache.enable_cli=1
--FILE--
<?php
class Foo {
use _ZendTestTrait;
}
$f = new Foo();
var_dump($f->testMethod());
?>
--EXPECTF--
<!-- init '%s' -->
<!-- init Foo::testMethod() -->
<!-- init var_dump() -->
bool(true)

View File

@@ -730,7 +730,7 @@ static void zend_persist_class_method(zval *zv, zend_class_entry *ce)
} }
// Real dynamically created internal functions like enum methods must have their own run_time_cache pointer. They're always on the same scope as their defining class. // Real dynamically created internal functions like enum methods must have their own run_time_cache pointer. They're always on the same scope as their defining class.
// However, copies - as caused by inheritance of internal methods - must retain the original run_time_cache pointer, shared with the source function. // However, copies - as caused by inheritance of internal methods - must retain the original run_time_cache pointer, shared with the source function.
if (!op_array->scope || op_array->scope == ce) { if (!op_array->scope || (op_array->scope == ce && !(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE))) {
ZEND_MAP_PTR_NEW(op_array->run_time_cache); ZEND_MAP_PTR_NEW(op_array->run_time_cache);
} }
} }