Skip to content

Commit

Permalink
Make InvocationContext available to replaced functions also
Browse files Browse the repository at this point in the history
  • Loading branch information
oleavr committed Jan 22, 2016
1 parent e29eb4c commit fdce440
Show file tree
Hide file tree
Showing 9 changed files with 241 additions and 129 deletions.
25 changes: 24 additions & 1 deletion bindings/gumjs/gumdukcore.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#include "gumdukcore.h"

#include "gumdukinterceptor.h"
#include "gumdukmacros.h"

#include <ffi.h>
Expand Down Expand Up @@ -441,6 +442,7 @@ static const GumDukPropertyEntry gumjs_cpu_context_values[] =
void
_gum_duk_core_init (GumDukCore * self,
GumDukScript * script,
GumDukInterceptor * interceptor,
GAsyncQueue * incoming_messages,
GumDukMessageEmitter message_emitter,
GumScriptScheduler * scheduler,
Expand All @@ -452,6 +454,7 @@ _gum_duk_core_init (GumDukCore * self,
g_object_unref (self->backend);

self->script = script;
self->interceptor = interceptor;
self->incoming_messages = incoming_messages;
self->message_emitter = message_emitter;
self->scheduler = scheduler;
Expand Down Expand Up @@ -1700,6 +1703,8 @@ gum_duk_native_callback_invoke (ffi_cif * cif,
ffi_type * rtype = cif->rtype;
GumFFIValue * retval = return_value;
guint i;
GumInvocationContext * ic;
GumDukInvocationContext * jic = NULL;
gboolean success;

_gum_duk_scope_enter (&scope, core);
Expand All @@ -1716,10 +1721,28 @@ gum_duk_native_callback_invoke (ffi_cif * cif,

duk_push_heapptr (ctx, self->func);

ic = gum_interceptor_get_current_invocation ();
if (ic != NULL)
{
jic = _gum_duk_interceptor_obtain_invocation_context (core->interceptor);
_gum_duk_invocation_context_reset (jic, ic, 0);
duk_push_heapptr (ctx, jic->object);
}
else
{
duk_push_undefined (ctx);
}

for (i = 0; i != cif->nargs; i++)
gum_duk_push_ffi_value (ctx, args[i], cif->arg_types[i], core);

success = _gum_duk_scope_call (&scope, cif->nargs);
success = _gum_duk_scope_call_method (&scope, cif->nargs);

if (jic != NULL)
{
_gum_duk_invocation_context_reset (jic, NULL, 0);
_gum_duk_interceptor_release_invocation_context (core->interceptor, jic);
}

if (success && cif->rtype != &ffi_type_void)
{
Expand Down
8 changes: 5 additions & 3 deletions bindings/gumjs/gumdukcore.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
G_BEGIN_DECLS

typedef struct _GumDukCore GumDukCore;
typedef struct _GumDukInterceptor GumDukInterceptor;
typedef struct _GumDukScope GumDukScope;
typedef gpointer GumDukHeapPtr;
typedef struct _GumDukWeakRef GumDukWeakRef;
Expand All @@ -41,6 +42,7 @@ struct _GumDukCore
{
GumDukScript * script;
GumDukScriptBackend * backend;
GumDukInterceptor * interceptor;
GAsyncQueue * incoming_messages;
GumDukMessageEmitter message_emitter;
GumScriptScheduler * scheduler;
Expand Down Expand Up @@ -109,9 +111,9 @@ struct _GumDukNativeResource
};

G_GNUC_INTERNAL void _gum_duk_core_init (GumDukCore * self,
GumDukScript * script, GAsyncQueue * incoming_messages,
GumDukMessageEmitter message_emitter, GumScriptScheduler * scheduler,
duk_context * ctx);
GumDukScript * script, GumDukInterceptor * interceptor,
GAsyncQueue * incoming_messages, GumDukMessageEmitter message_emitter,
GumScriptScheduler * scheduler, duk_context * ctx);
G_GNUC_INTERNAL void _gum_duk_core_flush (GumDukCore * self);
G_GNUC_INTERNAL void _gum_duk_core_dispose (GumDukCore * self);
G_GNUC_INTERNAL void _gum_duk_core_finalize (GumDukCore * self);
Expand Down
Loading

0 comments on commit fdce440

Please sign in to comment.