summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2020-11-11 13:07:12 +0300
committerDmitry Stogov <dmitry@zend.com>2020-11-11 13:07:12 +0300
commita15d215f756c3c0172760c6253867d2d998c1ab0 (patch)
treeac7744408a1789aba29d5f01d3314d8f7664234c /Zend
parente169ad3b61260e16dcfb24731064181ddbba6a9c (diff)
parent855d8fa68fd0456afbfb9e7ecd50a20e41334fd1 (diff)
downloadphp-git-a15d215f756c3c0172760c6253867d2d998c1ab0.tar.gz
Merge branch 'PHP-8.0'
* PHP-8.0: [Observer] Save opline before calling begin/end handlers
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend_vm_def.h15
-rw-r--r--Zend/zend_vm_execute.h42
-rwxr-xr-xZend/zend_vm_gen.php1
3 files changed, 45 insertions, 13 deletions
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index cff1012aca..c8e7774efc 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -3956,8 +3956,9 @@ ZEND_VM_HOT_HANDLER(130, ZEND_DO_UCALL, ANY, ANY, SPEC(RETVAL,OBSERVER))
call->prev_execute_data = execute_data;
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
- ZEND_OBSERVER_FCALL_BEGIN(execute_data);
LOAD_OPLINE_EX();
+ ZEND_OBSERVER_SAVE_OPLINE();
+ ZEND_OBSERVER_FCALL_BEGIN(execute_data);
ZEND_VM_ENTER_EX();
}
@@ -3981,8 +3982,9 @@ ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL,OBSERVER))
call->prev_execute_data = execute_data;
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
- ZEND_OBSERVER_FCALL_BEGIN(execute_data);
LOAD_OPLINE_EX();
+ ZEND_OBSERVER_SAVE_OPLINE();
+ ZEND_OBSERVER_FCALL_BEGIN(execute_data);
ZEND_VM_ENTER_EX();
} else {
@@ -4075,13 +4077,15 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL,OBSERVER))
call->prev_execute_data = execute_data;
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 1 EXECUTE_DATA_CC);
- ZEND_OBSERVER_FCALL_BEGIN(execute_data);
if (EXPECTED(zend_execute_ex == execute_ex)) {
LOAD_OPLINE_EX();
+ ZEND_OBSERVER_SAVE_OPLINE();
+ ZEND_OBSERVER_FCALL_BEGIN(execute_data);
ZEND_VM_ENTER_EX();
} else {
SAVE_OPLINE_EX();
+ ZEND_OBSERVER_FCALL_BEGIN(execute_data);
execute_data = EX(prev_execute_data);
LOAD_OPLINE();
ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
@@ -4299,6 +4303,7 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER))
}
}
}
+ ZEND_OBSERVER_SAVE_OPLINE();
ZEND_OBSERVER_FCALL_END(execute_data, return_value);
ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
}
@@ -8511,12 +8516,14 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY, SPEC(OBSERVER))
}
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
- ZEND_OBSERVER_FCALL_BEGIN(execute_data);
if (EXPECTED(zend_execute_ex == execute_ex)) {
LOAD_OPLINE_EX();
+ ZEND_OBSERVER_SAVE_OPLINE();
+ ZEND_OBSERVER_FCALL_BEGIN(execute_data);
ZEND_VM_ENTER_EX();
} else {
SAVE_OPLINE_EX();
+ ZEND_OBSERVER_FCALL_BEGIN(execute_data);
execute_data = EX(prev_execute_data);
LOAD_OPLINE();
ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 1786cfcc83..6fca6f4d13 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -1350,9 +1350,9 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_UCALL_SPEC_RETV
call->prev_execute_data = execute_data;
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
-
LOAD_OPLINE_EX();
+
ZEND_VM_ENTER_EX();
}
@@ -1374,9 +1374,9 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_UCALL_SPEC_RETV
call->prev_execute_data = execute_data;
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
-
LOAD_OPLINE_EX();
+
ZEND_VM_ENTER_EX();
}
@@ -1398,8 +1398,9 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_UCALL_SPEC_OBS
call->prev_execute_data = execute_data;
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
- zend_observer_fcall_begin(execute_data);
LOAD_OPLINE_EX();
+ SAVE_OPLINE();
+ zend_observer_fcall_begin(execute_data);
ZEND_VM_ENTER_EX();
}
@@ -1423,9 +1424,9 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S
call->prev_execute_data = execute_data;
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
-
LOAD_OPLINE_EX();
+
ZEND_VM_ENTER_EX();
} else {
zval retval;
@@ -1517,9 +1518,9 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S
call->prev_execute_data = execute_data;
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
-
LOAD_OPLINE_EX();
+
ZEND_VM_ENTER_EX();
} else {
zval retval;
@@ -1611,8 +1612,9 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_
call->prev_execute_data = execute_data;
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
- zend_observer_fcall_begin(execute_data);
LOAD_OPLINE_EX();
+ SAVE_OPLINE();
+ zend_observer_fcall_begin(execute_data);
ZEND_VM_ENTER_EX();
} else {
@@ -1708,9 +1710,12 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
if (EXPECTED(zend_execute_ex == execute_ex)) {
LOAD_OPLINE_EX();
+
+
ZEND_VM_ENTER_EX();
} else {
SAVE_OPLINE_EX();
+
execute_data = EX(prev_execute_data);
LOAD_OPLINE();
ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
@@ -1813,9 +1818,12 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
if (EXPECTED(zend_execute_ex == execute_ex)) {
LOAD_OPLINE_EX();
+
+
ZEND_VM_ENTER_EX();
} else {
SAVE_OPLINE_EX();
+
execute_data = EX(prev_execute_data);
LOAD_OPLINE();
ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
@@ -1915,13 +1923,15 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_OBS
call->prev_execute_data = execute_data;
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 1 EXECUTE_DATA_CC);
- zend_observer_fcall_begin(execute_data);
if (EXPECTED(zend_execute_ex == execute_ex)) {
LOAD_OPLINE_EX();
+ SAVE_OPLINE();
+ zend_observer_fcall_begin(execute_data);
ZEND_VM_ENTER_EX();
} else {
SAVE_OPLINE_EX();
+ zend_observer_fcall_begin(execute_data);
execute_data = EX(prev_execute_data);
LOAD_OPLINE();
ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
@@ -3136,12 +3146,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(Z
}
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
-
if (EXPECTED(zend_execute_ex == execute_ex)) {
LOAD_OPLINE_EX();
+
+
ZEND_VM_ENTER_EX();
} else {
SAVE_OPLINE_EX();
+
execute_data = EX(prev_execute_data);
LOAD_OPLINE();
ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
@@ -3270,12 +3282,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_OBSERVER_
}
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
- zend_observer_fcall_begin(execute_data);
if (EXPECTED(zend_execute_ex == execute_ex)) {
LOAD_OPLINE_EX();
+ SAVE_OPLINE();
+ zend_observer_fcall_begin(execute_data);
ZEND_VM_ENTER_EX();
} else {
SAVE_OPLINE_EX();
+ zend_observer_fcall_begin(execute_data);
execute_data = EX(prev_execute_data);
LOAD_OPLINE();
ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
@@ -4069,6 +4083,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_
}
}
+
ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
@@ -4141,6 +4156,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_OBSER
}
}
}
+ SAVE_OPLINE();
zend_observer_fcall_end(execute_data, return_value);
ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
@@ -18574,6 +18590,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HA
}
}
+
ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
@@ -21139,6 +21156,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HA
}
}
+
ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
@@ -37670,6 +37688,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HAN
}
}
+
ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
@@ -54736,6 +54755,7 @@ zend_leave_helper_SPEC_LABEL:
}
}
+
goto zend_leave_helper_SPEC_LABEL;
}
@@ -54809,6 +54829,7 @@ zend_leave_helper_SPEC_LABEL:
}
}
}
+ SAVE_OPLINE();
zend_observer_fcall_end(execute_data, return_value);
goto zend_leave_helper_SPEC_LABEL;
}
@@ -56344,6 +56365,7 @@ zend_leave_helper_SPEC_LABEL:
}
}
+
goto zend_leave_helper_SPEC_LABEL;
}
@@ -56642,6 +56664,7 @@ zend_leave_helper_SPEC_LABEL:
}
}
+
goto zend_leave_helper_SPEC_LABEL;
}
@@ -57756,6 +57779,7 @@ zend_leave_helper_SPEC_LABEL:
}
}
+
goto zend_leave_helper_SPEC_LABEL;
}
diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php
index 3346a59cfa..f8baea0d05 100755
--- a/Zend/zend_vm_gen.php
+++ b/Zend/zend_vm_gen.php
@@ -794,6 +794,7 @@ function gen_code($f, $spec, $kind, $code, $op1, $op2, $name, $extra_spec=null)
($extra_spec['ISSET'] == 0 ? "\\0" : "opline->extended_value")
: "\\0",
"/ZEND_OBSERVER_ENABLED/" => isset($extra_spec['OBSERVER']) && $extra_spec['OBSERVER'] == 1 ? "1" : "0",
+ "/ZEND_OBSERVER_SAVE_OPLINE\(\)/" => isset($extra_spec['OBSERVER']) && $extra_spec['OBSERVER'] == 1 ? "SAVE_OPLINE()" : "",
"/ZEND_OBSERVER_FCALL_BEGIN\(\s*(.*)\s*\)/" => isset($extra_spec['OBSERVER']) ?
($extra_spec['OBSERVER'] == 0 ? "" : "zend_observer_fcall_begin(\\1)")
: "",