From 832102076f1a19ca9cc8784d83ec5a5c43543048 Mon Sep 17 00:00:00 2001 From: Aviral Goel Date: Fri, 19 Feb 2021 14:56:10 -0500 Subject: [PATCH] Remove unnecessary memory allocations --- inst/include/ContextEntryCallback.hpp | 12 +++- inst/include/ContextExitCallback.hpp | 12 +++- inst/include/ContextJumpCallback.hpp | 12 +++- inst/include/GcAllocationCallback.hpp | 8 ++- inst/include/GcUnmarkCallback.hpp | 8 ++- inst/include/VariableAssignmentCallback.hpp | 9 ++- inst/include/VariableDefinitionCallback.hpp | 9 ++- inst/include/VariableLookupCallback.hpp | 9 ++- inst/include/VariableRemovalCallback.hpp | 10 ++- src/ContextEntryCallback.cpp | 20 +++--- src/ContextExitCallback.cpp | 24 +++---- src/ContextJumpCallback.cpp | 20 +++--- src/GcAllocationCallback.cpp | 12 ++-- src/GcUnmarkCallback.cpp | 12 ++-- src/VariableAssignmentCallback.cpp | 11 ++- src/VariableDefinitionCallback.cpp | 11 ++- src/VariableLookupCallback.cpp | 11 ++- src/VariableRemovalCallback.cpp | 11 ++- src/rdyntrace.cpp | 76 ++++----------------- 19 files changed, 154 insertions(+), 143 deletions(-) diff --git a/inst/include/ContextEntryCallback.hpp b/inst/include/ContextEntryCallback.hpp index aaef835..cc96baa 100644 --- a/inst/include/ContextEntryCallback.hpp +++ b/inst/include/ContextEntryCallback.hpp @@ -2,16 +2,26 @@ #define INSTRUMENTR_CONTEXT_ENTRY_CALLBACK_HPP #include "Callback.hpp" +#include "Application.hpp" + +using instrumentr::Application; +using instrumentr::ApplicationSPtr; namespace instrumentr { +class Context; + +using ContextSPtr = std::shared_ptr; + class ContextEntryCallback: public Callback { public: ContextEntryCallback(void* function, bool is_r_callback) : Callback(Type::ContextEntry, function, is_r_callback) { } - void invoke(SEXP r_context, SEXP r_application, SEXP r_call_context); + void invoke(ContextSPtr context, + ApplicationSPtr application, + void* call_context); static void initialize(); diff --git a/inst/include/ContextExitCallback.hpp b/inst/include/ContextExitCallback.hpp index d13644d..359c5fe 100644 --- a/inst/include/ContextExitCallback.hpp +++ b/inst/include/ContextExitCallback.hpp @@ -2,16 +2,26 @@ #define INSTRUMENTR_CONTEXT_EXIT_CALLBACK_HPP #include "Callback.hpp" +#include "Application.hpp" + +using instrumentr::Application; +using instrumentr::ApplicationSPtr; namespace instrumentr { +class Context; + +using ContextSPtr = std::shared_ptr; + class ContextExitCallback: public Callback { public: ContextExitCallback(void* function, bool is_r_callback) : Callback(Type::ContextExit, function, is_r_callback) { } - void invoke(SEXP r_context, SEXP r_application, SEXP r_call_context); + void invoke(ContextSPtr context, + ApplicationSPtr application, + void* call_context); static void initialize(); diff --git a/inst/include/ContextJumpCallback.hpp b/inst/include/ContextJumpCallback.hpp index d2af24b..531f3bf 100644 --- a/inst/include/ContextJumpCallback.hpp +++ b/inst/include/ContextJumpCallback.hpp @@ -2,16 +2,26 @@ #define INSTRUMENTR_CONTEXT_JUMP_CALLBACK_HPP #include "Callback.hpp" +#include "Application.hpp" + +using instrumentr::Application; +using instrumentr::ApplicationSPtr; namespace instrumentr { +class Context; + +using ContextSPtr = std::shared_ptr; + class ContextJumpCallback: public Callback { public: ContextJumpCallback(void* function, bool is_r_callback) : Callback(Type::ContextJump, function, is_r_callback) { } - void invoke(SEXP r_context, SEXP r_application, SEXP r_call_context); + void invoke(ContextSPtr context, + ApplicationSPtr application, + void* call_context); static void initialize(); diff --git a/inst/include/GcAllocationCallback.hpp b/inst/include/GcAllocationCallback.hpp index bd1d064..a6adfa6 100644 --- a/inst/include/GcAllocationCallback.hpp +++ b/inst/include/GcAllocationCallback.hpp @@ -2,16 +2,22 @@ #define INSTRUMENTR_GC_ALLOCATION_CALLBACK_HPP #include "Callback.hpp" +#include "Application.hpp" namespace instrumentr { +class Context; + +using ContextSPtr = std::shared_ptr; + class GcAllocationCallback: public Callback { public: GcAllocationCallback(void* function, bool is_r_callback) : Callback(Type::GcAllocation, function, is_r_callback) { } - void invoke(SEXP r_context, SEXP r_application, SEXP r_object); + void + invoke(ContextSPtr context, ApplicationSPtr application, SEXP r_object); static void initialize(); diff --git a/inst/include/GcUnmarkCallback.hpp b/inst/include/GcUnmarkCallback.hpp index b167e61..fb027ec 100644 --- a/inst/include/GcUnmarkCallback.hpp +++ b/inst/include/GcUnmarkCallback.hpp @@ -2,16 +2,22 @@ #define INSTRUMENTR_GC_UNMARK_CALLBACK_HPP #include "Callback.hpp" +#include "Application.hpp" namespace instrumentr { +class Context; + +using ContextSPtr = std::shared_ptr; + class GcUnmarkCallback: public Callback { public: GcUnmarkCallback(void* function, bool is_r_callback) : Callback(Type::GcUnmark, function, is_r_callback) { } - void invoke(SEXP r_context, SEXP r_application, SEXP r_object); + void + invoke(ContextSPtr context, ApplicationSPtr application, SEXP r_object); static void initialize(); diff --git a/inst/include/VariableAssignmentCallback.hpp b/inst/include/VariableAssignmentCallback.hpp index ec67327..18b58e9 100644 --- a/inst/include/VariableAssignmentCallback.hpp +++ b/inst/include/VariableAssignmentCallback.hpp @@ -2,17 +2,22 @@ #define INSTRUMENTR_VARIABLE_ASSIGNMENT_CALLBACK_HPP #include "Callback.hpp" +#include "Application.hpp" namespace instrumentr { +class Context; + +using ContextSPtr = std::shared_ptr; + class VariableAssignmentCallback: public Callback { public: VariableAssignmentCallback(void* function, bool is_r_callback) : Callback(Type::VariableAssignment, function, is_r_callback) { } - void invoke(SEXP r_context, - SEXP r_application, + void invoke(ContextSPtr context, + ApplicationSPtr application, SEXP r_variable, SEXP r_value, SEXP r_rho); diff --git a/inst/include/VariableDefinitionCallback.hpp b/inst/include/VariableDefinitionCallback.hpp index 5cc2001..9cd88dc 100644 --- a/inst/include/VariableDefinitionCallback.hpp +++ b/inst/include/VariableDefinitionCallback.hpp @@ -2,17 +2,22 @@ #define INSTRUMENTR_VARIABLE_DEFINITION_CALLBACK_HPP #include "Callback.hpp" +#include "Application.hpp" namespace instrumentr { +class Context; + +using ContextSPtr = std::shared_ptr; + class VariableDefinitionCallback: public Callback { public: VariableDefinitionCallback(void* function, bool is_r_callback) : Callback(Type::VariableDefinition, function, is_r_callback) { } - void invoke(SEXP r_context, - SEXP r_application, + void invoke(ContextSPtr context, + ApplicationSPtr application, SEXP r_variable, SEXP r_value, SEXP r_rho); diff --git a/inst/include/VariableLookupCallback.hpp b/inst/include/VariableLookupCallback.hpp index 0e1dfc4..e4ec180 100644 --- a/inst/include/VariableLookupCallback.hpp +++ b/inst/include/VariableLookupCallback.hpp @@ -2,17 +2,22 @@ #define INSTRUMENTR_VARIABLE_LOOKUP_CALLBACK_HPP #include "Callback.hpp" +#include "Application.hpp" namespace instrumentr { +class Context; + +using ContextSPtr = std::shared_ptr; + class VariableLookupCallback: public Callback { public: VariableLookupCallback(void* function, bool is_r_callback) : Callback(Type::VariableLookup, function, is_r_callback) { } - void invoke(SEXP r_context, - SEXP r_application, + void invoke(ContextSPtr context, + ApplicationSPtr application, SEXP r_variable, SEXP r_value, SEXP r_rho); diff --git a/inst/include/VariableRemovalCallback.hpp b/inst/include/VariableRemovalCallback.hpp index 853f78d..b48d7e8 100644 --- a/inst/include/VariableRemovalCallback.hpp +++ b/inst/include/VariableRemovalCallback.hpp @@ -2,16 +2,24 @@ #define INSTRUMENTR_VARIABLE_REMOVAL_CALLBACK_HPP #include "Callback.hpp" +#include "Application.hpp" namespace instrumentr { +class Context; + +using ContextSPtr = std::shared_ptr; + class VariableRemovalCallback: public Callback { public: VariableRemovalCallback(void* function, bool is_r_callback) : Callback(Type::VariableRemoval, function, is_r_callback) { } - void invoke(SEXP r_context, SEXP r_application, SEXP r_variable, SEXP r_rho); + void invoke(ContextSPtr context, + ApplicationSPtr application, + SEXP r_variable, + SEXP r_rho); static void initialize(); diff --git a/src/ContextEntryCallback.cpp b/src/ContextEntryCallback.cpp index 8c6e5fe..0f9fff6 100644 --- a/src/ContextEntryCallback.cpp +++ b/src/ContextEntryCallback.cpp @@ -1,5 +1,4 @@ #include "ContextEntryCallback.hpp" -#include "Application.hpp" #include "Context.hpp" using instrumentr::Application; @@ -29,25 +28,28 @@ SEXP ContextEntryCallback::get_class() { return class_; } -void ContextEntryCallback::invoke(SEXP r_context, - SEXP r_application, - SEXP r_call_context) { - ContextSPtr context = from_sexp(r_context); - +void ContextEntryCallback::invoke(ContextSPtr context, + ApplicationSPtr application, + void* call_context) { if (is_c_callback()) { - ApplicationSPtr application = from_sexp(r_application); - callback_t callback = get_function(); - callback(context, application, R_ExternalPtrAddr(r_call_context)); + callback(context, application, call_context); } /**/ else { SEXP r_function_name = get_function_name(); SEXP r_environment = context->get_environment(); + SEXP r_context = to_sexp(context); + SEXP r_application = to_sexp(application); + SEXP r_call_context = + PROTECT(R_MakeExternalPtr(call_context, R_NilValue, R_NilValue)); + Rf_eval( Rf_lang4(r_function_name, r_context, r_application, r_call_context), r_environment); + + UNPROTECT(1); } } diff --git a/src/ContextExitCallback.cpp b/src/ContextExitCallback.cpp index cfbd85b..a2d8300 100644 --- a/src/ContextExitCallback.cpp +++ b/src/ContextExitCallback.cpp @@ -1,12 +1,6 @@ #include "ContextExitCallback.hpp" -#include "Application.hpp" #include "Context.hpp" -using instrumentr::Application; -using instrumentr::ApplicationSPtr; -using instrumentr::Context; -using instrumentr::ContextSPtr; - namespace instrumentr { typedef void (*callback_t)(ContextSPtr context, @@ -29,25 +23,29 @@ SEXP ContextExitCallback::get_class() { return class_; } -void ContextExitCallback::invoke(SEXP r_context, - SEXP r_application, - SEXP r_call_context) { - ContextSPtr context = from_sexp(r_context); +void ContextExitCallback::invoke(ContextSPtr context, + ApplicationSPtr application, + void* call_context) { if (is_c_callback()) { - ApplicationSPtr application = from_sexp(r_application); - callback_t callback = get_function(); - callback(context, application, R_ExternalPtrAddr(r_call_context)); + callback(context, application, call_context); } /**/ else { SEXP r_function_name = get_function_name(); SEXP r_environment = context->get_environment(); + SEXP r_context = to_sexp(context); + SEXP r_application = to_sexp(application); + SEXP r_call_context = + PROTECT(R_MakeExternalPtr(call_context, R_NilValue, R_NilValue)); + Rf_eval( Rf_lang4(r_function_name, r_context, r_application, r_call_context), r_environment); + + UNPROTECT(1); } } diff --git a/src/ContextJumpCallback.cpp b/src/ContextJumpCallback.cpp index 07901dc..51f98d1 100644 --- a/src/ContextJumpCallback.cpp +++ b/src/ContextJumpCallback.cpp @@ -1,5 +1,4 @@ #include "ContextJumpCallback.hpp" -#include "Application.hpp" #include "Context.hpp" using instrumentr::Application; @@ -29,25 +28,28 @@ SEXP ContextJumpCallback::get_class() { return class_; } -void ContextJumpCallback::invoke(SEXP r_context, - SEXP r_application, - SEXP r_call_context) { - ContextSPtr context = from_sexp(r_context); - +void ContextJumpCallback::invoke(ContextSPtr context, + ApplicationSPtr application, + void* call_context) { if (is_c_callback()) { - ApplicationSPtr application = from_sexp(r_application); - callback_t callback = get_function(); - callback(context, application, R_ExternalPtrAddr(r_call_context)); + callback(context, application, call_context); } /**/ else { SEXP r_function_name = get_function_name(); SEXP r_environment = context->get_environment(); + SEXP r_context = to_sexp(context); + SEXP r_application = to_sexp(application); + SEXP r_call_context = + PROTECT(R_MakeExternalPtr(call_context, R_NilValue, R_NilValue)); + Rf_eval( Rf_lang4(r_function_name, r_context, r_application, r_call_context), r_environment); + + UNPROTECT(1); } } diff --git a/src/GcAllocationCallback.cpp b/src/GcAllocationCallback.cpp index 4bf193a..69930a6 100644 --- a/src/GcAllocationCallback.cpp +++ b/src/GcAllocationCallback.cpp @@ -1,5 +1,4 @@ #include "GcAllocationCallback.hpp" -#include "Application.hpp" #include "Context.hpp" namespace instrumentr { @@ -24,14 +23,10 @@ SEXP GcAllocationCallback::get_class() { return class_; } -void GcAllocationCallback::invoke(SEXP r_context, - SEXP r_application, +void GcAllocationCallback::invoke(ContextSPtr context, + ApplicationSPtr application, SEXP r_object) { - ContextSPtr context = from_sexp(r_context); - if (is_c_callback()) { - ApplicationSPtr application = from_sexp(r_application); - callback_t callback = get_function(); callback(context, application, r_object); } @@ -40,6 +35,9 @@ void GcAllocationCallback::invoke(SEXP r_context, SEXP r_function_name = get_function_name(); SEXP r_environment = context->get_environment(); + SEXP r_context = to_sexp(context); + SEXP r_application = to_sexp(application); + Rf_eval(Rf_lang4(r_function_name, r_context, r_application, r_object), r_environment); } diff --git a/src/GcUnmarkCallback.cpp b/src/GcUnmarkCallback.cpp index d906239..1d36916 100644 --- a/src/GcUnmarkCallback.cpp +++ b/src/GcUnmarkCallback.cpp @@ -1,5 +1,4 @@ #include "GcUnmarkCallback.hpp" -#include "Application.hpp" #include "Context.hpp" namespace instrumentr { @@ -24,14 +23,10 @@ SEXP GcUnmarkCallback::get_class() { return class_; } -void GcUnmarkCallback::invoke(SEXP r_context, - SEXP r_application, +void GcUnmarkCallback::invoke(ContextSPtr context, + ApplicationSPtr application, SEXP r_object) { - ContextSPtr context = from_sexp(r_context); - if (is_c_callback()) { - ApplicationSPtr application = from_sexp(r_application); - callback_t callback = get_function(); callback(context, application, r_object); } @@ -40,6 +35,9 @@ void GcUnmarkCallback::invoke(SEXP r_context, SEXP r_function_name = get_function_name(); SEXP r_environment = context->get_environment(); + SEXP r_context = to_sexp(context); + SEXP r_application = to_sexp(application); + Rf_eval(Rf_lang4(r_function_name, r_context, r_application, r_object), r_environment); } diff --git a/src/VariableAssignmentCallback.cpp b/src/VariableAssignmentCallback.cpp index d30c074..13a735d 100644 --- a/src/VariableAssignmentCallback.cpp +++ b/src/VariableAssignmentCallback.cpp @@ -26,16 +26,12 @@ SEXP VariableAssignmentCallback::get_class() { return class_; } -void VariableAssignmentCallback::invoke(SEXP r_context, - SEXP r_application, +void VariableAssignmentCallback::invoke(ContextSPtr context, + ApplicationSPtr application, SEXP r_variable, SEXP r_value, SEXP r_rho) { - ContextSPtr context = from_sexp(r_context); - if (is_c_callback()) { - ApplicationSPtr application = from_sexp(r_application); - callback_t callback = get_function(); callback(context, application, r_variable, r_value, r_rho); } @@ -44,6 +40,9 @@ void VariableAssignmentCallback::invoke(SEXP r_context, SEXP r_function_name = get_function_name(); SEXP r_environment = context->get_environment(); + SEXP r_context = to_sexp(context); + SEXP r_application = to_sexp(application); + Rf_eval(Rf_lang6(r_function_name, r_context, r_application, diff --git a/src/VariableDefinitionCallback.cpp b/src/VariableDefinitionCallback.cpp index bb4f15d..8b6c3bb 100644 --- a/src/VariableDefinitionCallback.cpp +++ b/src/VariableDefinitionCallback.cpp @@ -26,16 +26,12 @@ SEXP VariableDefinitionCallback::get_class() { return class_; } -void VariableDefinitionCallback::invoke(SEXP r_context, - SEXP r_application, +void VariableDefinitionCallback::invoke(ContextSPtr context, + ApplicationSPtr application, SEXP r_variable, SEXP r_value, SEXP r_rho) { - ContextSPtr context = from_sexp(r_context); - if (is_c_callback()) { - ApplicationSPtr application = from_sexp(r_application); - callback_t callback = get_function(); callback(context, application, r_variable, r_value, r_rho); } @@ -44,6 +40,9 @@ void VariableDefinitionCallback::invoke(SEXP r_context, SEXP r_function_name = get_function_name(); SEXP r_environment = context->get_environment(); + SEXP r_context = to_sexp(context); + SEXP r_application = to_sexp(application); + Rf_eval(Rf_lang6(r_function_name, r_context, r_application, diff --git a/src/VariableLookupCallback.cpp b/src/VariableLookupCallback.cpp index 0d0d0d6..0800792 100644 --- a/src/VariableLookupCallback.cpp +++ b/src/VariableLookupCallback.cpp @@ -26,16 +26,12 @@ SEXP VariableLookupCallback::get_class() { return class_; } -void VariableLookupCallback::invoke(SEXP r_context, - SEXP r_application, +void VariableLookupCallback::invoke(ContextSPtr context, + ApplicationSPtr application, SEXP r_variable, SEXP r_value, SEXP r_rho) { - ContextSPtr context = from_sexp(r_context); - if (is_c_callback()) { - ApplicationSPtr application = from_sexp(r_application); - callback_t callback = get_function(); callback(context, application, r_variable, r_value, r_rho); } @@ -44,6 +40,9 @@ void VariableLookupCallback::invoke(SEXP r_context, SEXP r_function_name = get_function_name(); SEXP r_environment = context->get_environment(); + SEXP r_context = to_sexp(context); + SEXP r_application = to_sexp(application); + Rf_eval(Rf_lang6(r_function_name, r_context, r_application, diff --git a/src/VariableRemovalCallback.cpp b/src/VariableRemovalCallback.cpp index f42c0e3..a6af195 100644 --- a/src/VariableRemovalCallback.cpp +++ b/src/VariableRemovalCallback.cpp @@ -25,15 +25,11 @@ SEXP VariableRemovalCallback::get_class() { return class_; } -void VariableRemovalCallback::invoke(SEXP r_context, - SEXP r_application, +void VariableRemovalCallback::invoke(ContextSPtr context, + ApplicationSPtr application, SEXP r_variable, SEXP r_rho) { - ContextSPtr context = from_sexp(r_context); - if (is_c_callback()) { - ApplicationSPtr application = from_sexp(r_application); - callback_t callback = get_function(); callback(context, application, r_variable, r_rho); } @@ -42,6 +38,9 @@ void VariableRemovalCallback::invoke(SEXP r_context, SEXP r_function_name = get_function_name(); SEXP r_environment = context->get_environment(); + SEXP r_context = to_sexp(context); + SEXP r_application = to_sexp(application); + Rf_eval( Rf_lang5( r_function_name, r_context, r_application, r_variable, r_rho), diff --git a/src/rdyntrace.cpp b/src/rdyntrace.cpp index 3c4a3b5..d865260 100644 --- a/src/rdyntrace.cpp +++ b/src/rdyntrace.cpp @@ -388,10 +388,8 @@ void dyntrace_gc_allocation(dyntracer_t* dyntracer, SEXP r_object) { context->initialize_callback_invocation(callback); ApplicationSPtr application = context->get_application(); - SEXP r_context = to_sexp(context); - SEXP r_application = to_sexp(application); - callback->invoke(r_context, r_application, r_object); + callback->invoke(context, application, r_object); context->finalize_callback_invocation(); } @@ -408,10 +406,8 @@ void dyntrace_gc_unmark(dyntracer_t* dyntracer, SEXP r_object) { context->initialize_callback_invocation(callback); ApplicationSPtr application = context->get_application(); - SEXP r_context = to_sexp(context); - SEXP r_application = to_sexp(application); - callback->invoke(r_context, r_application, r_object); + callback->invoke(context, application, r_object); context->finalize_callback_invocation(); } @@ -433,15 +429,9 @@ void dyntrace_variable_definition(dyntracer_t* dyntracer, context->initialize_callback_invocation(callback); ApplicationSPtr application = context->get_application(); - SEXP r_application = to_sexp(application); - SEXP r_context = to_sexp(context); - - SEXP r_variable = PROTECT(mkString(CHAR(PRINTNAME(r_symbol)))); callback->invoke( - r_context, r_application, r_variable, r_value, r_rho); - - UNPROTECT(1); + context, application, r_symbol, r_value, r_rho); context->finalize_callback_invocation(); } @@ -463,15 +453,9 @@ void dyntrace_variable_assignment(dyntracer_t* dyntracer, context->initialize_callback_invocation(callback); ApplicationSPtr application = context->get_application(); - SEXP r_application = to_sexp(application); - SEXP r_context = to_sexp(context); - - SEXP r_variable = PROTECT(mkString(CHAR(PRINTNAME(r_symbol)))); callback->invoke( - r_context, r_application, r_variable, r_value, r_rho); - - UNPROTECT(1); + context, application, r_symbol, r_value, r_rho); context->finalize_callback_invocation(); } @@ -492,14 +476,8 @@ void dyntrace_variable_removal(dyntracer_t* dyntracer, context->initialize_callback_invocation(callback); ApplicationSPtr application = context->get_application(); - SEXP r_application = to_sexp(application); - SEXP r_context = to_sexp(context); - - SEXP r_variable = PROTECT(mkString(CHAR(PRINTNAME(r_symbol)))); - callback->invoke(r_context, r_application, r_variable, r_rho); - - UNPROTECT(1); + callback->invoke(context, application, r_symbol, r_rho); context->finalize_callback_invocation(); } @@ -521,15 +499,9 @@ void dyntrace_variable_lookup(dyntracer_t* dyntracer, context->initialize_callback_invocation(callback); ApplicationSPtr application = context->get_application(); - SEXP r_context = to_sexp(context); - SEXP r_application = to_sexp(application); - - SEXP r_variable = PROTECT(mkString(CHAR(PRINTNAME(r_symbol)))); callback->invoke( - r_context, r_application, r_variable, r_value, r_rho); - - UNPROTECT(1); + context, application, r_symbol, r_value, r_rho); context->finalize_callback_invocation(); } @@ -548,13 +520,8 @@ void dyntrace_context_entry(dyntracer_t* dyntracer, void* call_context) { context->initialize_callback_invocation(callback); ApplicationSPtr application = context->get_application(); - SEXP r_context = to_sexp(context); - SEXP r_application = to_sexp(application); - - SEXP r_call_context = - R_MakeExternalPtr(call_context, R_NilValue, R_NilValue); - callback->invoke(r_context, r_application, r_call_context); + callback->invoke(context, application, call_context); context->finalize_callback_invocation(); } @@ -565,20 +532,14 @@ void dyntrace_context_exit(dyntracer_t* dyntracer, void* call_context) { ContextSPtr context = extract_context_from_dyntracer(dyntracer); if (context->is_tracing_enabled() && context->has_context_exit_callback()) { - ContextExitCallbackSPtr callback = - context->get_context_exit_callback(); + ContextExitCallbackSPtr callback = context->get_context_exit_callback(); if (callback->is_active()) { context->initialize_callback_invocation(callback); ApplicationSPtr application = context->get_application(); - SEXP r_context = to_sexp(context); - SEXP r_application = to_sexp(application); - SEXP r_call_context = - R_MakeExternalPtr(call_context, R_NilValue, R_NilValue); - - callback->invoke(r_context, r_application, r_call_context); + callback->invoke(context, application, call_context); context->finalize_callback_invocation(); } @@ -592,20 +553,14 @@ void dyntrace_context_jump(dyntracer_t* dyntracer, ContextSPtr context = extract_context_from_dyntracer(dyntracer); if (context->is_tracing_enabled() && context->has_context_jump_callback()) { - ContextJumpCallbackSPtr callback = - context->get_context_jump_callback(); + ContextJumpCallbackSPtr callback = context->get_context_jump_callback(); if (callback->is_active()) { context->initialize_callback_invocation(callback); ApplicationSPtr application = context->get_application(); - SEXP r_context = to_sexp(context); - SEXP r_application = to_sexp(application); - - SEXP r_call_context = - R_MakeExternalPtr(call_context, R_NilValue, R_NilValue); - callback->invoke(r_context, r_application, r_call_context); + callback->invoke(context, application, call_context); context->finalize_callback_invocation(); } @@ -635,12 +590,9 @@ dyntracer_t* rdyntrace_create_dyntracer() { dyntrace_closure_call_entry); dyntracer_set_closure_exit_callback(dyntracer, dyntrace_closure_call_exit); - dyntracer_set_context_entry_callback(dyntracer, - dyntrace_context_entry); - dyntracer_set_context_exit_callback(dyntracer, - dyntrace_context_exit); - dyntracer_set_context_jump_callback(dyntracer, - dyntrace_context_jump); + dyntracer_set_context_entry_callback(dyntracer, dyntrace_context_entry); + dyntracer_set_context_exit_callback(dyntracer, dyntrace_context_exit); + dyntracer_set_context_jump_callback(dyntracer, dyntrace_context_jump); dyntracer_set_eval_entry_callback(dyntracer, dyntrace_eval_entry); dyntracer_set_eval_exit_callback(dyntracer, dyntrace_eval_exit);