私は、duktapeエンジンを使用して、共通のc関数を複数のjavascript関数にバインドしようとしています。duktapeは、複数のバインドされたjs関数の共通のc関数を使用します。
私の問題は、共通の関数内で呼び出し関数の名前を調べる必要があることです。私は頻繁に参照されるjavascriptスタックを使用してこれを実装することが可能なように感じる。
しかし、私はそれを実装する方法について具体的なアイデアはありません。誰にどのようにこれを行うにはアイデアがありますか?
以下私のmweを見つけることができます。機能duk_get_invoking_functionは、私の意図を強調する疑似コードを意味します。
#include "duktape.h"
duk_ret_t common_function(duk_context * ctx) {
const char * function_name;
//
// function_name = duk_get_invoking_function(ctx);
// e.g. function_name is "func_01"
//
return 0;
}
int main() {
duk_context * ctx;
ctx = duk_create_heap_default();
if (!ctx) {
return 1;
}
duk_push_c_function(ctx, common_function, DUK_VARARGS);
duk_put_global_string(ctx, "func_01");
duk_push_c_function(ctx, common_function, DUK_VARARGS);
duk_put_global_string(ctx, "func_02");
duk_push_c_function(ctx, common_function, DUK_VARARGS);
duk_put_global_string(ctx, "func_03");
duk_eval_string(ctx, "func_01('abc'); func_02(123); func_03();");
duk_destroy_heap(ctx);
return 0;
}
ありがとうございました!それは完全に動作します。私は 'duk_push_c_function(...)を使いました。 duk_push_string(ctx、 "name"); duk_push_string(ctx、 "func_01"); duk_def_prop(ctx、-3、DUK_DEFPROP_HAVE_VALUE); duk_put_global_string(ctx、 "func_01"); 登録時に関数プロパティ "name"を定義します。ハンドラでは、次のコードでこのプロパティにアクセスしています 'duk_push_current_function(ctx); duk_get_prop_string(ctx、-1、 "name"); function_name = duk_get_string(ctx、-1); ' – user3272529