2017-05-25 2 views
1

私は、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; 
} 

答えて

2

は私が正しく理解した場合には、複数のECMAScript関数オブジェクトが同じネイティブ関数にバインドする - とそのネイティブ関数が呼び出されたとき、呼び出しに使用したのECMAScript関数オブジェクトを見つけ出します。

もしそうなら、これを行うためにコールスタックを見る必要はありません。各duk_push_c_function()は同じネイティブ関数を指す新しいEcmascript関数オブジェクトを作成します。ネイティブ関数が呼び出されると、duk_push_current_function()を使用して呼び出しで使用されているEcmascript関数にアクセスできます。これにより、例えば、以下に基づいてEcmascript関数オブジェクトを区別することができます。それらのプロパティは、作成時に設定します。

+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

関連する問題