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.
NJS_BUILTIN_TRAVERSE_MATCH,
} type;
- njs_function_native_t native;
+ njs_function_t *func;
njs_lvlhsh_t keys;
njs_str_t match;
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;
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;
}
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;
njs_builtin_traverse_t ctx;
ctx.type = NJS_BUILTIN_TRAVERSE_MATCH;
- ctx.native = func;
+ ctx.func = function;
/* Global object. */
}
+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;
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;
}
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);
" 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"