2016-11-30 1 views
1

J'ai un projet C++ et j'utilise la bibliothèque JS duktape. J'ai besoin d'enregistrer la fonction globale dans JS et enregistrer le pointeur sur l'objet comme données de fermeture avec cette fonction, donc je peux accéder à ce pointeur quand la fonction est appelée.enregistrement de fermeture duktape

Je sais comment faire cela dans lua c api:

lua_pushlightuserdata(L, this); 
lua_pushcclosure(L, &someFunction, 1); 
lua_setglobal(L, "someFunction"); 

Tout d'abord je pousse le pointeur en tant que données de fermeture, puis pointeur de fonction. J'ai besoin de la même fonctionnalité dans l'API duktape.

Pouvez-vous me montrer du code avec l'enregistrement de fermeture et y accéder?

Répondre

1

Il n'y a pas d'analogie directe avec les valeurs associées à une "fermeture C" mais vous pouvez obtenir un résultat similaire d'autres façons.

Une façon simple est de stocker la valeur en tant que propriété de l'instance de fonction:

duk_push_c_function(ctx, someFunction, 1 /*nargs*/); 
duk_push_pointer(ctx, (void *) somePointer); 
duk_put_prop_string(ctx, -2, "_ptr"); 
duk_put_global_string(ctx, "someFunction"); 

Ensuite, lorsque la fonction est appelée, récupérer la valeur:

void *ptr; 

duk_push_current_function(ctx); 
duk_get_prop_string(ctx, -1, "_ptr"); 
ptr = duk_get_pointer(ctx, -1); 
duk_pop_2(ctx); /* pop pointer and function */ 

/* ready to use 'ptr' */ 

Si vous voulez Pour limiter l'accès à la valeur associée à partir du code Ecmascript, vous pouvez utiliser un internal string, par ex. "\xFF" "ptr".

0

J'ai eu un problème similaire. Après un peu de recherche, j'ai trouvé a Wiki on howto persist objects qui a fonctionné pour moi dans l'enregistrement d'une référence de fonction (rappel) pour une utilisation ultérieure.