1

我正在尝试使用 duktape 引擎将一个常见的 c 函数绑定到多个 javascript 函数。

我的问题是我需要在通用 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;
}
4

1 回答 1

2

如果我理解正确,您希望多个 Ecmascript 函数对象绑定到同一个本机函数——当调用该本机函数时,找出调用中使用了哪个 Ecmascript 函数对象。

如果是这样,您不需要查看调用堆栈来执行此操作:每个 duk_push_c_function() 都会创建一个指向相同本机函数的新 Ecmascript 函数对象。当调用原生函数时,您可以使用 duk_push_current_function() 来访问调用中使用的 Ecmascript 函数。然后,您可以根据创建它们时设置的属性来区分 Ecmascript 函数对象。

于 2017-05-25T20:32:22.810 回答