#include "zend_constants.h"
#include "zend_exceptions.h"
#include "zend_closures.h"
+#include "zend_dtrace.h"
#ifdef HAVE_STDARG_H
#include <stdarg.h>
zend_error(E_ERROR, "Cannot instantiate %s %v", what, class_type->name);
}
+#ifdef HAVE_DTRACE
+ if (DTRACE_OBJECT_CREATE_ENABLED()) {
+ char *s_classname, *filename;
+ int s_classname_len, lineno;
+
+ filename = dtrace_get_executed_filename(TSRMLS_C);
+ lineno = zend_get_executed_lineno(TSRMLS_C);
+ if (u_strlen(class_type->name.u) > 0) {
+ zend_unicode_to_string(ZEND_U_CONVERTER(UG(utf8_conv)), &s_classname, &s_classname_len, class_type->name.u, u_strlen(class_type->name.u) TSRMLS_CC);
+ }
+ DTRACE_OBJECT_CREATE(s_classname, filename, lineno);
+ if (s_classname != NULL) {
+ efree(s_classname);
+ }
+ }
+#endif /* HAVE_DTRACE */
+
zend_update_class_constants(class_type TSRMLS_CC);
Z_TYPE_P(arg) = IS_OBJECT;
#ifdef HAVE_DTRACE
/* PHP DTrace probes {{{ */
-static inline char *dtrace_get_executed_filename(TSRMLS_D)
+ZEND_API char *dtrace_get_executed_filename(TSRMLS_D)
{
if (EG(current_execute_data) && EG(current_execute_data)->op_array) {
return EG(current_execute_data)->op_array->filename;
probe execute__return(char* request_file, int lineno);
probe function__entry(char* function_name, char* request_file, int lineno, char* classname, char* scope);
probe function__return(char* function_name, char* request_file, int lineno, char* classname, char* scope);
+ probe object__create(char *classname, char* request_file, int lineno);
+ probe object__destroy(char *classname, char* request_file, int lineno);
};
#pragma D attributes Evolving/Evolving/Common provider php provider
ZEND_API zend_op_array *dtrace_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC);
ZEND_API void dtrace_execute(zend_op_array *op_array TSRMLS_DC);
ZEND_API void dtrace_execute_internal(zend_execute_data *execute_data_ptr, int return_value_used TSRMLS_DC);
+ZEND_API char *dtrace_get_executed_filename(TSRMLS_D);
#include <zend_dtrace_gen.h>
#endif /* HAVE_DTRACE */
#include "zend_API.h"
#include "zend_interfaces.h"
#include "zend_exceptions.h"
+#include "zend_dtrace.h"
ZEND_API void zend_object_std_init(zend_object *object, zend_class_entry *ce TSRMLS_DC) /* {{{ */
{
{
zend_function *destructor = object ? object->ce->destructor : NULL;
+#ifdef HAVE_DTRACE
+ if (DTRACE_OBJECT_DESTROY_ENABLED()) {
+ char *s_classname, *filename;
+ int s_classname_len, lineno;
+
+ filename = dtrace_get_executed_filename(TSRMLS_C);
+ lineno = zend_get_executed_lineno(TSRMLS_C);
+ if (u_strlen(object->ce->name.u) > 0) {
+ zend_unicode_to_string(ZEND_U_CONVERTER(UG(utf8_conv)), &s_classname, &s_classname_len, object->ce->name.u, u_strlen(object->ce->name.u) TSRMLS_CC);
+ }
+ DTRACE_OBJECT_DESTROY(s_classname, filename, lineno);
+ if (s_classname != NULL) {
+ efree(s_classname);
+ }
+ }
+#endif /* HAVE_DTRACE */
if (destructor) {
zval *obj;
zend_object_store_bucket *obj_bucket;
if test "$PHP_DTRACE" = "yes"; then
AC_CHECK_HEADERS([sys/sdt.h],
[PHP_ADD_DTRACE([Zend/zend_dtrace.d], [main/main.c, Zend/zend_API.c \
- Zend/zend_execute.c Zend/zend_exceptions.c \
+ Zend/zend_execute.c Zend/zend_exceptions.c Zend/zend_objects.c \
Zend/zend_dtrace.c Zend/zend.c])
PHP_INIT_DTRACE([Zend/zend_dtrace.d], [Zend/zend_dtrace_gen.h])
AC_DEFINE(HAVE_DTRACE, 1, [Whether to enable DTrace support])],