-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCallback.cpp
98 lines (93 loc) · 3.9 KB
/
Callback.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include "Callback.hpp"
#include "Context.hpp"
namespace instrumentr {
Callback::Callback(Type type, void* function, bool is_r_function)
: type_(type)
, function_(function)
, is_r_function_(is_r_function)
, status_({true}) {
if (is_r_callback()) {
r_function_name_ = Rf_install(callback_type_to_string(type_).c_str());
R_PreserveObject(r_function_name_);
R_PreserveObject(get_function<SEXP>());
}
}
SEXP Callback::create_class(const char* subclass) {
return Object::create_class({subclass, "instrumentr_callback"});
}
std::string callback_type_to_string(Callback::Type callback_type) {
switch (callback_type) {
case Callback::Type::Instrumentr:
return "instrumentr";
case Callback::Type::Application:
return "application";
case Callback::Type::ApplicationLoad:
return "instrumentr_application_load_callback";
case Callback::Type::ApplicationUnload:
return "instrumentr_application_unload_callback";
case Callback::Type::ApplicationAttach:
return "instrumentr_application_attach_callback";
case Callback::Type::ApplicationDetach:
return "instrumentr_application_detach_callback";
case Callback::Type::PackageLoad:
return "instrumentr_package_load_callback";
case Callback::Type::PackageUnload:
return "instrumentr_package_unload_callback";
case Callback::Type::PackageAttach:
return "instrumentr_package_attach_callback";
case Callback::Type::PackageDetach:
return "instrumentr_package_detach_callback";
case Callback::Type::FunctionAttach:
return "instrumentr_function_attach_callback";
case Callback::Type::FunctionDetach:
return "instrumentr_function_detach_callback";
case Callback::Type::CallEntry:
return "instrumentr_call_entry_callback";
case Callback::Type::CallExit:
return "instrumentr_call_exit_callback";
case Callback::Type::ObjectCoerce:
return "instrumentr_object_coerce_callback";
case Callback::Type::ObjectDuplicate:
return "instrumentr_object_duplicate_callback";
case Callback::Type::VectorCopy:
return "instrumentr_vector_copy_callback";
case Callback::Type::MatrixCopy:
return "instrumentr_matrix_copy_callback";
case Callback::Type::BuiltinCallEntry:
return "instrumentr_builtin_call_entry_callback";
case Callback::Type::BuiltinCallExit:
return "instrumentr_builtin_call_exit_callback";
case Callback::Type::SpecialCallEntry:
return "instrumentr_special_call_entry_callback";
case Callback::Type::SpecialCallExit:
return "instrumentr_special_call_exit_callback";
case Callback::Type::ClosureCallEntry:
return "instrumentr_closure_call_entry_callback";
case Callback::Type::ClosureCallExit:
return "instrumentr_closure_call_exit_callback";
case Callback::Type::EvalEntry:
return "instrumentr_eval_entry_callback";
case Callback::Type::EvalExit:
return "instrumentr_eval_exit_callback";
case Callback::Type::GcAllocation:
return "instrumentr_gc_allocation_callback";
case Callback::Type::GcUnmark:
return "instrumentr_gc_unmark_callback";
case Callback::Type::VariableDefinition:
return "instrumentr_variable_definition_callback";
case Callback::Type::VariableAssignment:
return "instrumentr_variable_assignment_callback";
case Callback::Type::VariableRemoval:
return "instrumentr_variable_removal_callback";
case Callback::Type::VariableLookup:
return "instrumentr_variable_lookup_callback";
case Callback::Type::ContextEntry:
return "instrumentr_context_entry_callback";
case Callback::Type::ContextExit:
return "instrumentr_context_exit_callback";
case Callback::Type::ContextJump:
return "instrumentr_context_jump_callback";
}
return "undefined";
}
} // namespace instrumentr