Skip to content

Commit

Permalink
Remove unnecessary memory allocations
Browse files Browse the repository at this point in the history
  • Loading branch information
aviralg committed Feb 19, 2021
1 parent eb80545 commit 8321020
Show file tree
Hide file tree
Showing 19 changed files with 154 additions and 143 deletions.
12 changes: 11 additions & 1 deletion inst/include/ContextEntryCallback.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<Context>;

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();

Expand Down
12 changes: 11 additions & 1 deletion inst/include/ContextExitCallback.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<Context>;

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();

Expand Down
12 changes: 11 additions & 1 deletion inst/include/ContextJumpCallback.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<Context>;

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();

Expand Down
8 changes: 7 additions & 1 deletion inst/include/GcAllocationCallback.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<Context>;

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();

Expand Down
8 changes: 7 additions & 1 deletion inst/include/GcUnmarkCallback.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<Context>;

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();

Expand Down
9 changes: 7 additions & 2 deletions inst/include/VariableAssignmentCallback.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<Context>;

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);
Expand Down
9 changes: 7 additions & 2 deletions inst/include/VariableDefinitionCallback.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<Context>;

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);
Expand Down
9 changes: 7 additions & 2 deletions inst/include/VariableLookupCallback.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<Context>;

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);
Expand Down
10 changes: 9 additions & 1 deletion inst/include/VariableRemovalCallback.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<Context>;

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();

Expand Down
20 changes: 11 additions & 9 deletions src/ContextEntryCallback.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#include "ContextEntryCallback.hpp"
#include "Application.hpp"
#include "Context.hpp"

using instrumentr::Application;
Expand Down Expand Up @@ -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<Context>(r_context);

void ContextEntryCallback::invoke(ContextSPtr context,
ApplicationSPtr application,
void* call_context) {
if (is_c_callback()) {
ApplicationSPtr application = from_sexp<Application>(r_application);

callback_t callback = get_function<callback_t>();
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);
}
}

Expand Down
24 changes: 11 additions & 13 deletions src/ContextExitCallback.cpp
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -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<Context>(r_context);
void ContextExitCallback::invoke(ContextSPtr context,
ApplicationSPtr application,
void* call_context) {

if (is_c_callback()) {
ApplicationSPtr application = from_sexp<Application>(r_application);

callback_t callback = get_function<callback_t>();
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);
}
}

Expand Down
20 changes: 11 additions & 9 deletions src/ContextJumpCallback.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#include "ContextJumpCallback.hpp"
#include "Application.hpp"
#include "Context.hpp"

using instrumentr::Application;
Expand Down Expand Up @@ -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<Context>(r_context);

void ContextJumpCallback::invoke(ContextSPtr context,
ApplicationSPtr application,
void* call_context) {
if (is_c_callback()) {
ApplicationSPtr application = from_sexp<Application>(r_application);

callback_t callback = get_function<callback_t>();
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);
}
}

Expand Down
Loading

0 comments on commit 8321020

Please sign in to comment.