From: Dmitry Volyntsev Date: Wed, 22 Jan 2020 12:29:47 +0000 (+0300) Subject: Fixed match of native function is backtraces. X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=19ff8127529f2ebc972e6fc9de373b09b11c53a6;p=njs.git Fixed match of native function is backtraces. Since 6df48738a043 native methods are not uniquely identifiable by a function pointer as several method may share common C function and differ only in magic argument. --- diff --git a/src/njs_builtin.c b/src/njs_builtin.c index 5206aed5..e047bdab 100644 --- a/src/njs_builtin.c +++ b/src/njs_builtin.c @@ -15,7 +15,7 @@ typedef struct { NJS_BUILTIN_TRAVERSE_MATCH, } type; - njs_function_native_t native; + njs_function_t *func; njs_lvlhsh_t keys; njs_str_t match; @@ -391,6 +391,7 @@ njs_builtin_traverse(njs_vm_t *vm, njs_traverse_t *traverse, void *data) u_char *p, *start, *end; njs_int_t ret, n; njs_str_t name; + njs_function_t *func; njs_object_prop_t *prop; njs_lvlhsh_query_t lhq; njs_builtin_traverse_t *ctx; @@ -401,10 +402,11 @@ njs_builtin_traverse(njs_vm_t *vm, njs_traverse_t *traverse, void *data) if (ctx->type == NJS_BUILTIN_TRAVERSE_MATCH) { prop = traverse->prop; + func = ctx->func; if (!(njs_is_function(&prop->value) && njs_function(&prop->value)->native - && njs_function(&prop->value)->u.native == ctx->native)) + && njs_native_function_same(njs_function(&prop->value), func))) { return NJS_OK; } @@ -739,7 +741,7 @@ njs_object_completions(njs_vm_t *vm, njs_object_t *object) njs_int_t -njs_builtin_match_native_function(njs_vm_t *vm, njs_function_native_t func, +njs_builtin_match_native_function(njs_vm_t *vm, njs_function_t *function, njs_str_t *name) { njs_int_t ret; @@ -750,7 +752,7 @@ njs_builtin_match_native_function(njs_vm_t *vm, njs_function_native_t func, njs_builtin_traverse_t ctx; ctx.type = NJS_BUILTIN_TRAVERSE_MATCH; - ctx.native = func; + ctx.func = function; /* Global object. */ diff --git a/src/njs_function.h b/src/njs_function.h index d736508b..cd3aca32 100644 --- a/src/njs_function.h +++ b/src/njs_function.h @@ -203,6 +203,13 @@ njs_function_apply(njs_vm_t *vm, njs_function_t *function, } +njs_inline njs_bool_t +njs_native_function_same(const njs_function_t *f1, const njs_function_t *f2) +{ + return f1->u.native == f2->u.native && f1->magic == f2->magic; +} + + extern const njs_object_type_init_t njs_function_type_init; extern const njs_object_init_t njs_function_instance_init; extern const njs_object_init_t njs_arrow_instance_init; diff --git a/src/njs_vm.c b/src/njs_vm.c index ffcd39b6..5ae059d1 100644 --- a/src/njs_vm.c +++ b/src/njs_vm.c @@ -991,8 +991,7 @@ njs_vm_add_backtrace_entry(njs_vm_t *vm, njs_arr_t *stack, function = function->u.bound_target; } - ret = njs_builtin_match_native_function(vm, function->u.native, - &be->name); + ret = njs_builtin_match_native_function(vm, function, &be->name); if (ret == NJS_OK) { return NJS_OK; } diff --git a/src/njs_vm.h b/src/njs_vm.h index 623a2176..dfa11921 100644 --- a/src/njs_vm.h +++ b/src/njs_vm.h @@ -302,7 +302,7 @@ njs_int_t njs_vm_backtrace_to_string(njs_vm_t *vm, njs_arr_t *stack, njs_int_t njs_builtin_objects_create(njs_vm_t *vm); njs_int_t njs_builtin_objects_clone(njs_vm_t *vm, njs_value_t *global); njs_int_t njs_builtin_match_native_function(njs_vm_t *vm, - njs_function_native_t func, njs_str_t *name); + njs_function_t *function, njs_str_t *name); njs_arr_t *njs_vm_completions(njs_vm_t *vm, njs_str_t *expression); diff --git a/src/test/njs_interactive_test.c b/src/test/njs_interactive_test.c index 39fd2854..685165c5 100644 --- a/src/test/njs_interactive_test.c +++ b/src/test/njs_interactive_test.c @@ -232,10 +232,15 @@ static njs_interactive_test_t njs_test[] = " at f (:1)\n" " at main (native)\n") }, - { njs_str("var fs = require('fs'); fs.readFile()" ENTER), - njs_str("TypeError: \"path\" must be a string\n" - " at fs.readFile (native)\n" - " at main (native)\n") }, + { njs_str("var fs = require('fs');" + "['readFile'," + " 'readFileSync'," + " 'writeFile'," + " 'writeFileSync'," + " 'appendFile'," + " 'appendFileSync']" + ".every(v=>{ try {fs[v]();} catch (e) { return e.stack.search(`fs.${v} `) >= 0}})" ENTER), + njs_str("true") }, { njs_str("parseInt({ toString: function() { return [1] } })" ENTER), njs_str("TypeError: Cannot convert object to primitive value\n"