Skip to content

Add new observer API #5857

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 57 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
6a73552
Add zend_observer API
morrisonlevi Jul 10, 2020
45a8540
Add temporary observer extension
morrisonlevi Jul 13, 2020
ecfca90
Fix some issues
nikic Jul 13, 2020
1e7c59d
Guard observer begin handler and start adding end handler
morrisonlevi Jul 13, 2020
01308fd
WIP .end handler
morrisonlevi Jul 15, 2020
dc74744
Update for zend_get_zval_ptr changes
morrisonlevi Jul 15, 2020
23b7d37
Expand ternary short-hand for Windows
morrisonlevi Jul 15, 2020
1553336
Try fixing missing symbol
morrisonlevi Jul 15, 2020
947c955
Free OP1 of INCLUDE_OR_EVAL later so observers can look at it
morrisonlevi Jul 24, 2020
fe6b447
Move observer arena allocation for call handers to first-time register
SammyK Jul 25, 2020
3f617d1
Refactor where function init/begin/end handlers are called
SammyK Aug 7, 2020
a3e0139
Remove fcall init handlers from zend_call_function()
SammyK Aug 7, 2020
e5e7bce
Clean up
SammyK Aug 7, 2020
e7badd9
Clean up one more
SammyK Aug 7, 2020
71bbb1f
Add observer hooks to zend_test extension
SammyK Aug 7, 2020
0b13ca6
Merge branch 'master' into levim/observer
SammyK Aug 10, 2020
9837e2b
Add test for magic
SammyK Aug 10, 2020
ef1bcdc
Add basic generator support
SammyK Aug 10, 2020
f6edb80
Make cleaner test output
SammyK Aug 10, 2020
c66d659
Pass proper return value for generators
SammyK Aug 11, 2020
a6faa3b
Expose return values in tests
SammyK Aug 11, 2020
5f24f65
Add more generator tests
SammyK Aug 11, 2020
9e9bfc9
Remove temporary observer extension
SammyK Aug 12, 2020
b5b2762
Merge branch 'master' into levim/observer
SammyK Aug 12, 2020
2958a20
Fix memleak on TMPVAR with eval()
SammyK Aug 12, 2020
95bcf05
Fix arena allocation again :facepalm:
SammyK Aug 12, 2020
1e3b6be
Whitespace
SammyK Aug 21, 2020
1445b3b
Disable observer API when loaded via dl()
SammyK Aug 21, 2020
228807a
Wrap up some TODOs and cleanup
SammyK Aug 21, 2020
fc73942
Implement ZEND_OBSERVE_RETURN
SammyK Aug 24, 2020
b4731c5
Clean up fcall observer
morrisonlevi Aug 24, 2020
c76e8f5
Revert "Implement ZEND_OBSERVE_RETURN"
SammyK Aug 25, 2020
bb429b0
Implement SPEC(OBSERVER) for return handlers
SammyK Aug 25, 2020
c57324d
Add SPEC(OBSERVER) to DO_FCALL and friends
SammyK Aug 26, 2020
e3cdb9f
Add SPEC(OBSERVER) to INCLUDE_OR_EVAL
SammyK Aug 26, 2020
791c921
Add SPEC(OBSERVER) to fcall INIT handlers
SammyK Aug 26, 2020
0f78895
Add test for observing eval
SammyK Aug 26, 2020
bf56f27
Add SPEC(OBSERVER) to ZEND_HANDLE_EXCEPTION
SammyK Aug 26, 2020
b8e1408
Do only one observer check in zend_generator_resume
SammyK Aug 26, 2020
7792c18
Add test for observing closures
SammyK Aug 26, 2020
f0da73f
Merge remote-tracking branch 'upstream/master' into levim/observer
SammyK Aug 26, 2020
3f93dc8
Check for ZEND_OBSERVER_ENABLED before installing observers for closures
SammyK Aug 26, 2020
00a038b
Install observers only if enabled
SammyK Aug 26, 2020
1d2f9f6
Disable JIT when observer extension present
SammyK Aug 27, 2020
d22d421
Add SKIPIF's to the observer tests
SammyK Aug 27, 2020
96d1040
Add observer to zend_call_function
SammyK Aug 27, 2020
639a09e
Move observer install to first time fcall
SammyK Aug 27, 2020
971824b
Move LOAD_OPLINE_EX() back to the end of DO_UCALL handler
SammyK Aug 27, 2020
f9e10a0
Rename ZEND_SHOULD_OBSERVE_FN to ZEND_OBSERVABLE_FN
SammyK Aug 27, 2020
e4a6c45
Mark SPEC(OBSERVER) handlers as ZEND_VM_COLD
SammyK Aug 27, 2020
58a075f
Only register zend_test as observer when enabled
SammyK Aug 27, 2020
1698665
Add zend_test.observer.show_output INI setting
SammyK Aug 28, 2020
6181716
Skip JIT tests on non-JIT builds
SammyK Aug 28, 2020
63dba3d
Update observer arena size
morrisonlevi Aug 31, 2020
1ca066b
Add ZEND_API to some observer functions
morrisonlevi Aug 31, 2020
85083ff
Fix C++ compat for zend_observer.h
morrisonlevi Aug 31, 2020
6d5faf5
Merge branch 'master' into levim/observer
morrisonlevi Sep 1, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add SPEC(OBSERVER) to fcall INIT handlers
  • Loading branch information
SammyK committed Aug 26, 2020
commit 791c921b1fd4aec427851314b82cafa43e2e6ad4
6 changes: 1 addition & 5 deletions Zend/zend_execute.c
Original file line number Diff line number Diff line change
Expand Up @@ -3552,10 +3552,6 @@ static zend_always_inline void init_func_run_time_cache_i(zend_op_array *op_arra
run_time_cache = zend_arena_alloc(&CG(arena), op_array->cache_size);
memset(run_time_cache, 0, op_array->cache_size);
ZEND_MAP_PTR_SET(op_array->run_time_cache, run_time_cache);

if (ZEND_SHOULD_OBSERVE_FN(op_array->fn_flags)) {
zend_observer_fcall_install((zend_function*) op_array);
}
}
/* }}} */

Expand Down Expand Up @@ -3613,7 +3609,7 @@ static zend_always_inline void i_init_code_execute_data(zend_execute_data *execu
zend_attach_symbol_table(execute_data);

if (!ZEND_MAP_PTR(op_array->run_time_cache)) {
void *ptr = NULL;
void *ptr;

ZEND_ASSERT(op_array->fn_flags & ZEND_ACC_HEAP_RT_CACHE);
ptr = emalloc(op_array->cache_size + sizeof(void*));
Expand Down
23 changes: 16 additions & 7 deletions Zend/zend_vm_def.h
Original file line number Diff line number Diff line change
Expand Up @@ -3383,7 +3383,7 @@ ZEND_VM_C_LABEL(try_class_name):
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}

ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, NUM|CACHE_SLOT)
ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, NUM|CACHE_SLOT, SPEC(OBSERVER))
{
USE_OPLINE
zval *function_name;
Expand Down Expand Up @@ -3487,6 +3487,7 @@ ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV,
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
OBSERVER_FCALL_INSTALL((zend_function*)&fbc->op_array);
}
}

Expand Down Expand Up @@ -3526,7 +3527,7 @@ ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV,
ZEND_VM_NEXT_OPCODE();
}

ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR, CONST|TMPVAR|UNUSED|CONSTRUCTOR|CV, NUM|CACHE_SLOT)
ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR, CONST|TMPVAR|UNUSED|CONSTRUCTOR|CV, NUM|CACHE_SLOT, SPEC(OBSERVER))
{
USE_OPLINE
zval *function_name;
Expand Down Expand Up @@ -3609,6 +3610,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
}
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
OBSERVER_FCALL_INSTALL((zend_function*)&fbc->op_array);
}
if (OP2_TYPE != IS_CONST) {
FREE_OP2();
Expand All @@ -3625,6 +3627,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
fbc = ce->constructor;
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
OBSERVER_FCALL_INSTALL((zend_function*)&fbc->op_array);
}
}

Expand Down Expand Up @@ -3658,7 +3661,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
ZEND_VM_NEXT_OPCODE();
}

ZEND_VM_HOT_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST, NUM|CACHE_SLOT)
ZEND_VM_HOT_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST, NUM|CACHE_SLOT, SPEC(OBSERVER))
{
USE_OPLINE
zend_function *fbc;
Expand All @@ -3675,6 +3678,7 @@ ZEND_VM_HOT_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST, NUM|CACHE_SLOT)
fbc = Z_FUNC_P(func);
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
OBSERVER_FCALL_INSTALL((zend_function*)&fbc->op_array);
}
CACHE_PTR(opline->result.num, fbc);
}
Expand Down Expand Up @@ -3741,7 +3745,7 @@ ZEND_VM_C_LABEL(try_function_name):
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}

ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM)
ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM, SPEC(OBSERVER))
{
USE_OPLINE
zval *function_name;
Expand Down Expand Up @@ -3787,6 +3791,7 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM)

if (EXPECTED(func->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&func->op_array))) {
init_func_run_time_cache(&func->op_array);
OBSERVER_FCALL_INSTALL((zend_function*)&func->op_array);
}
} else {
zend_type_error("%s(): Argument #1 ($function) must be a valid callback, %s", Z_STRVAL_P(RT_CONSTANT(opline, opline->op1)), error);
Expand All @@ -3803,7 +3808,7 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM)
ZEND_VM_NEXT_OPCODE();
}

ZEND_VM_HOT_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST, NUM|CACHE_SLOT)
ZEND_VM_HOT_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST, NUM|CACHE_SLOT, SPEC(OBSERVER))
{
USE_OPLINE
zval *func_name;
Expand All @@ -3824,6 +3829,7 @@ ZEND_VM_HOT_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST, NUM|CACHE_SLOT)
fbc = Z_FUNC_P(func);
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
OBSERVER_FCALL_INSTALL((zend_function*)&fbc->op_array);
}
CACHE_PTR(opline->result.num, fbc);
}
Expand All @@ -3836,7 +3842,7 @@ ZEND_VM_HOT_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST, NUM|CACHE_SLOT)
ZEND_VM_NEXT_OPCODE();
}

ZEND_VM_HOT_HANDLER(61, ZEND_INIT_FCALL, NUM, CONST, NUM|CACHE_SLOT)
ZEND_VM_HOT_HANDLER(61, ZEND_INIT_FCALL, NUM, CONST, NUM|CACHE_SLOT, SPEC(OBSERVER))
{
USE_OPLINE
zval *fname;
Expand All @@ -3854,6 +3860,7 @@ ZEND_VM_HOT_HANDLER(61, ZEND_INIT_FCALL, NUM, CONST, NUM|CACHE_SLOT)
fbc = Z_FUNC_P(func);
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
OBSERVER_FCALL_INSTALL((zend_function*)&fbc->op_array);
}
CACHE_PTR(opline->result.num, fbc);
}
Expand Down Expand Up @@ -5580,7 +5587,7 @@ ZEND_VM_C_LABEL(case_double):
ZEND_VM_DISPATCH_TO_HELPER(zend_case_helper, op_1, op1, op_2, op2);
}

ZEND_VM_HANDLER(68, ZEND_NEW, UNUSED|CLASS_FETCH|CONST|VAR, UNUSED|CACHE_SLOT, NUM)
ZEND_VM_HANDLER(68, ZEND_NEW, UNUSED|CLASS_FETCH|CONST|VAR, UNUSED|CACHE_SLOT, NUM, SPEC(OBSERVER))
{
USE_OPLINE
zval *result;
Expand Down Expand Up @@ -5634,6 +5641,7 @@ ZEND_VM_HANDLER(68, ZEND_NEW, UNUSED|CLASS_FETCH|CONST|VAR, UNUSED|CACHE_SLOT, N
} else {
if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&constructor->op_array))) {
init_func_run_time_cache(&constructor->op_array);
OBSERVER_FCALL_INSTALL((zend_function*)&constructor->op_array);
}
/* We are not handling overloaded classes right now */
call = zend_vm_stack_push_call_frame(
Expand Down Expand Up @@ -8455,6 +8463,7 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY, SPEC(OBSERVER))
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
if (UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
OBSERVER_FCALL_INSTALL((zend_function*)&fbc->op_array);
}
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
Expand Down
Loading