@@ -34,6 +34,7 @@ ZEND_BEGIN_MODULE_GLOBALS(zend_test)
3434 int observer_observe_all ;
3535 int observer_observe_includes ;
3636 int observer_observe_functions ;
37+ zend_array * observer_observe_function_names ;
3738 int observer_show_return_type ;
3839 int observer_show_return_value ;
3940 int observer_show_init_backtrace ;
@@ -329,12 +330,33 @@ static ZEND_METHOD(ZendTestNS2_Foo, method) {
329330 ZEND_PARSE_PARAMETERS_NONE ();
330331}
331332
333+ static ZEND_INI_MH (zend_test_observer_OnUpdateCommaList )
334+ {
335+ zend_array * * p = (zend_array * * ) ZEND_INI_GET_ADDR ();
336+ if (* p ) {
337+ zend_hash_release (* p );
338+ }
339+ * p = NULL ;
340+ if (new_value && ZSTR_LEN (new_value )) {
341+ * p = malloc (sizeof (HashTable ));
342+ _zend_hash_init (* p , 8 , ZVAL_PTR_DTOR , 1 );
343+ const char * start = ZSTR_VAL (new_value ), * ptr ;
344+ while ((ptr = strchr (start , ',' ))) {
345+ zend_hash_str_add_empty_element (* p , start , ptr - start );
346+ start = ptr + 1 ;
347+ }
348+ zend_hash_str_add_empty_element (* p , start , ZSTR_VAL (new_value ) + ZSTR_LEN (new_value ) - start );
349+ }
350+ return SUCCESS ;
351+ }
352+
332353PHP_INI_BEGIN ()
333354 STD_PHP_INI_BOOLEAN ("zend_test.observer.enabled" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_enabled , zend_zend_test_globals , zend_test_globals )
334355 STD_PHP_INI_BOOLEAN ("zend_test.observer.show_output" , "1" , PHP_INI_SYSTEM , OnUpdateBool , observer_show_output , zend_zend_test_globals , zend_test_globals )
335356 STD_PHP_INI_BOOLEAN ("zend_test.observer.observe_all" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_observe_all , zend_zend_test_globals , zend_test_globals )
336357 STD_PHP_INI_BOOLEAN ("zend_test.observer.observe_includes" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_observe_includes , zend_zend_test_globals , zend_test_globals )
337358 STD_PHP_INI_BOOLEAN ("zend_test.observer.observe_functions" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_observe_functions , zend_zend_test_globals , zend_test_globals )
359+ STD_PHP_INI_ENTRY ("zend_test.observer.observe_function_names" , "" , PHP_INI_SYSTEM , zend_test_observer_OnUpdateCommaList , observer_observe_function_names , zend_zend_test_globals , zend_test_globals )
338360 STD_PHP_INI_BOOLEAN ("zend_test.observer.show_return_type" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_show_return_type , zend_zend_test_globals , zend_test_globals )
339361 STD_PHP_INI_BOOLEAN ("zend_test.observer.show_return_value" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_show_return_value , zend_zend_test_globals , zend_test_globals )
340362 STD_PHP_INI_BOOLEAN ("zend_test.observer.show_init_backtrace" , "0" , PHP_INI_SYSTEM , OnUpdateBool , observer_show_init_backtrace , zend_zend_test_globals , zend_test_globals )
@@ -584,10 +606,16 @@ static zend_observer_fcall_handlers observer_fcall_init(zend_execute_data *execu
584606
585607 if (ZT_G (observer_observe_all )) {
586608 return (zend_observer_fcall_handlers ){observer_begin , observer_end };
587- } else if (ZT_G (observer_observe_includes ) && !fbc -> common .function_name ) {
588- return (zend_observer_fcall_handlers ){observer_begin , observer_end };
589- } else if (ZT_G (observer_observe_functions ) && fbc -> common .function_name ) {
590- return (zend_observer_fcall_handlers ){observer_begin , observer_end };
609+ } else if (fbc -> common .function_name ) {
610+ if (ZT_G (observer_observe_functions )) {
611+ return (zend_observer_fcall_handlers ){observer_begin , observer_end };
612+ } else if (ZT_G (observer_observe_function_names ) && zend_hash_exists (ZT_G (observer_observe_function_names ), fbc -> common .function_name )) {
613+ return (zend_observer_fcall_handlers ){observer_begin , observer_end };
614+ }
615+ } else {
616+ if (ZT_G (observer_observe_includes )) {
617+ return (zend_observer_fcall_handlers ){observer_begin , observer_end };
618+ }
591619 }
592620 return (zend_observer_fcall_handlers ){NULL , NULL };
593621}
0 commit comments