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

Remove specialization of SPEC(OBSERVER) handlers

This commit is contained in:
Sammy Kaye Powers
2020-09-18 00:47:36 +03:00
committed by Dmitry Stogov
parent a9cbdafa69
commit 9e94bcfdbc
4 changed files with 374 additions and 1472 deletions

View File

@@ -3988,6 +3988,9 @@ ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL,OBSERVER))
} else {
zval retval;
ZEND_ASSERT(fbc->type == ZEND_INTERNAL_FUNCTION);
if (IS_OBSERVER) {
ret = NULL;
}
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
zend_deprecated_function(fbc);
@@ -4087,6 +4090,9 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL,OBSERVER))
} else {
zval retval;
ZEND_ASSERT(fbc->type == ZEND_INTERNAL_FUNCTION);
if (IS_OBSERVER) {
ret = NULL;
}
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
zend_deprecated_function(fbc);

File diff suppressed because it is too large Load Diff

View File

@@ -793,6 +793,7 @@ function gen_code($f, $spec, $kind, $code, $op1, $op2, $name, $extra_spec=null)
"/opline->extended_value\s*&\s*~\s*ZEND_ISEMPTY/" => isset($extra_spec['ISSET']) ?
($extra_spec['ISSET'] == 0 ? "\\0" : "opline->extended_value")
: "\\0",
"/IS_OBSERVER/" => isset($extra_spec['OBSERVER']) && $extra_spec['OBSERVER'] == 1 ? "1" : "0",
"/OBSERVER_FCALL_BEGIN_HANDLERS\(\s*(.*)\s*\)/" => isset($extra_spec['OBSERVER']) ?
($extra_spec['OBSERVER'] == 0 ? "" : "zend_observer_maybe_fcall_call_begin(\\1)")
: "",
@@ -1004,6 +1005,8 @@ function is_inline_hybrid_handler($name, $hot, $op1, $op2, $extra_spec) {
function gen_handler($f, $spec, $kind, $name, $op1, $op2, $use, $code, $lineno, $opcode, $extra_spec = null, &$switch_labels = array()) {
global $definition_file, $prefix, $opnames, $gen_order;
static $used_observer_handlers = array();
if (isset($opcode['alias']) && ($spec || $kind != ZEND_VM_KIND_SWITCH)) {
return;
}
@@ -1037,6 +1040,26 @@ function gen_handler($f, $spec, $kind, $name, $op1, $op2, $use, $code, $lineno,
}
}
/* Skip all specialization for OBSERVER handlers */
if (isset($extra_spec["OBSERVER"]) && $extra_spec["OBSERVER"] == 1) {
if (isset($extra_spec["RETVAL"])) {
if ($extra_spec["RETVAL"] == 0) {
unset($extra_spec["RETVAL"]);
} else {
return;
}
}
if ($op1 != "ANY" || $op2 != "ANY") {
if (!isset($used_observer_handlers[$kind][$opcode["op"]])) {
$used_observer_handlers[$kind][$opcode["op"]] = true;
$op1 = "ANY";
$op2 = "ANY";
} else {
return;
}
}
}
if (ZEND_VM_LINES) {
out($f, "#line $lineno \"$definition_file\"\n");
}
@@ -1364,6 +1387,17 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
}
}
/* Skip all specialization for OBSERVER handlers */
if (isset($extra_spec["OBSERVER"]) && $extra_spec["OBSERVER"] == 1) {
if (isset($extra_spec["RETVAL"])) {
unset($extra_spec["RETVAL"]);
}
if ($op1 != "ANY" || $op2 != "ANY") {
$op1 = "ANY";
$op2 = "ANY";
}
}
// Emit pointer to specialized handler
$spec_name = $dsc["op"]."_SPEC".$prefix[$op1].$prefix[$op2].extra_spec_name($extra_spec);
switch ($kind) {

View File

@@ -637,17 +637,17 @@
_(1349, ZEND_INIT_FCALL_BY_NAME_SPEC_CONST) \
_(1350, ZEND_DO_FCALL_SPEC_RETVAL_UNUSED) \
_(1351, ZEND_DO_FCALL_SPEC_RETVAL_USED) \
_(1352, ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_OBSERVER) \
_(1353, ZEND_DO_FCALL_SPEC_RETVAL_USED_OBSERVER) \
_(1352, ZEND_DO_FCALL_SPEC_OBSERVER) \
_(1353, ZEND_DO_FCALL_SPEC_OBSERVER) \
_(1354, ZEND_INIT_FCALL_SPEC_CONST) \
_(1355, ZEND_RETURN_SPEC_CONST) \
_(1356, ZEND_RETURN_SPEC_CONST_OBSERVER) \
_(1356, ZEND_RETURN_SPEC_OBSERVER) \
_(1357, ZEND_RETURN_SPEC_TMP) \
_(1358, ZEND_RETURN_SPEC_TMP_OBSERVER) \
_(1358, ZEND_RETURN_SPEC_OBSERVER) \
_(1359, ZEND_RETURN_SPEC_VAR) \
_(1360, ZEND_RETURN_SPEC_VAR_OBSERVER) \
_(1360, ZEND_RETURN_SPEC_OBSERVER) \
_(1363, ZEND_RETURN_SPEC_CV) \
_(1364, ZEND_RETURN_SPEC_CV_OBSERVER) \
_(1364, ZEND_RETURN_SPEC_OBSERVER) \
_(1365, ZEND_RECV_SPEC_UNUSED) \
_(1366, ZEND_RECV_INIT_SPEC_CONST) \
_(1367, ZEND_SEND_VAL_SPEC_CONST_CONST) \
@@ -719,13 +719,13 @@
_(1522, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED) \
_(1523, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV) \
_(1524, ZEND_INCLUDE_OR_EVAL_SPEC_CONST) \
_(1525, ZEND_INCLUDE_OR_EVAL_SPEC_CONST_OBSERVER) \
_(1525, ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER) \
_(1526, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR) \
_(1527, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_OBSERVER) \
_(1527, ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER) \
_(1528, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR) \
_(1529, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_OBSERVER) \
_(1529, ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER) \
_(1532, ZEND_INCLUDE_OR_EVAL_SPEC_CV) \
_(1533, ZEND_INCLUDE_OR_EVAL_SPEC_CV_OBSERVER) \
_(1533, ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER) \
_(1534, ZEND_UNSET_VAR_SPEC_CONST_UNUSED) \
_(1535, ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) \
_(1536, ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) \
@@ -1000,13 +1000,13 @@
_(1986, ZEND_CLONE_SPEC_UNUSED) \
_(1987, ZEND_CLONE_SPEC_CV) \
_(1988, ZEND_RETURN_BY_REF_SPEC_CONST) \
_(1989, ZEND_RETURN_BY_REF_SPEC_CONST_OBSERVER) \
_(1989, ZEND_RETURN_BY_REF_SPEC_OBSERVER) \
_(1990, ZEND_RETURN_BY_REF_SPEC_TMP) \
_(1991, ZEND_RETURN_BY_REF_SPEC_TMP_OBSERVER) \
_(1991, ZEND_RETURN_BY_REF_SPEC_OBSERVER) \
_(1992, ZEND_RETURN_BY_REF_SPEC_VAR) \
_(1993, ZEND_RETURN_BY_REF_SPEC_VAR_OBSERVER) \
_(1993, ZEND_RETURN_BY_REF_SPEC_OBSERVER) \
_(1996, ZEND_RETURN_BY_REF_SPEC_CV) \
_(1997, ZEND_RETURN_BY_REF_SPEC_CV_OBSERVER) \
_(1997, ZEND_RETURN_BY_REF_SPEC_OBSERVER) \
_(1998, ZEND_INIT_METHOD_CALL_SPEC_CONST_CONST) \
_(1999, ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR) \
_(2000, ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR) \
@@ -1111,12 +1111,12 @@
_(2193, ZEND_DO_ICALL_SPEC_RETVAL_USED) \
_(2194, ZEND_DO_UCALL_SPEC_RETVAL_UNUSED) \
_(2195, ZEND_DO_UCALL_SPEC_RETVAL_USED) \
_(2196, ZEND_DO_UCALL_SPEC_RETVAL_UNUSED_OBSERVER) \
_(2197, ZEND_DO_UCALL_SPEC_RETVAL_USED_OBSERVER) \
_(2196, ZEND_DO_UCALL_SPEC_OBSERVER) \
_(2197, ZEND_DO_UCALL_SPEC_OBSERVER) \
_(2198, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED) \
_(2199, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED) \
_(2200, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED_OBSERVER) \
_(2201, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED_OBSERVER) \
_(2200, ZEND_DO_FCALL_BY_NAME_SPEC_OBSERVER) \
_(2201, ZEND_DO_FCALL_BY_NAME_SPEC_OBSERVER) \
_(2212, ZEND_PRE_INC_OBJ_SPEC_VAR_CONST) \
_(2213, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \
_(2214, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \
@@ -1233,13 +1233,13 @@
_(2370, ZEND_YIELD_SPEC_CV_UNUSED) \
_(2371, ZEND_YIELD_SPEC_CV_CV) \
_(2372, ZEND_GENERATOR_RETURN_SPEC_CONST) \
_(2373, ZEND_GENERATOR_RETURN_SPEC_CONST_OBSERVER) \
_(2373, ZEND_GENERATOR_RETURN_SPEC_OBSERVER) \
_(2374, ZEND_GENERATOR_RETURN_SPEC_TMP) \
_(2375, ZEND_GENERATOR_RETURN_SPEC_TMP_OBSERVER) \
_(2375, ZEND_GENERATOR_RETURN_SPEC_OBSERVER) \
_(2376, ZEND_GENERATOR_RETURN_SPEC_VAR) \
_(2377, ZEND_GENERATOR_RETURN_SPEC_VAR_OBSERVER) \
_(2377, ZEND_GENERATOR_RETURN_SPEC_OBSERVER) \
_(2380, ZEND_GENERATOR_RETURN_SPEC_CV) \
_(2381, ZEND_GENERATOR_RETURN_SPEC_CV_OBSERVER) \
_(2381, ZEND_GENERATOR_RETURN_SPEC_OBSERVER) \
_(2382, ZEND_FAST_CALL_SPEC) \
_(2383, ZEND_FAST_RET_SPEC) \
_(2384, ZEND_RECV_VARIADIC_SPEC_UNUSED) \