memcpy(module, shrd, sizeof(njs_mod_t));
- object = njs_object_value_copy(vm, &module->value);
- if (njs_slow_path(object == NULL)) {
- return NULL;
+ if (module->function.native) {
+ object = njs_object_value_copy(vm, &module->value);
+ if (njs_slow_path(object == NULL)) {
+ return NULL;
+ }
}
fhq.replace = 0;
ret = njs_flathsh_insert(&vm->modules_hash, &fhq);
if (njs_slow_path(ret != NJS_OK)) {
+ njs_internal_error(vm, "flathsh insert failed");
return NULL;
}
struct njs_mod_s {
njs_str_t name;
njs_value_t value;
- njs_index_t index;
njs_function_t function;
};
done:
- if (module->index == 0) {
- module->index = vm->shared->module_items++;
- }
-
return module;
}
{
vm->active_frame = NULL;
vm->top_frame = NULL;
- vm->modules = NULL;
+ njs_flathsh_init(&vm->modules_hash);
return njs_object_make_shared(vm, njs_object(&vm->global_value));
}
njs_flathsh_t values_hash;
- njs_arr_t *modules;
njs_flathsh_t modules_hash;
uint32_t event_id;
njs_flathsh_t arguments_object_instance_hash;
njs_flathsh_t regexp_instance_hash;
- size_t module_items;
njs_flathsh_t modules_hash;
njs_flathsh_t env_hash;
static njs_jump_off_t
njs_vmcode_import(njs_vm_t *vm, njs_mod_t *module, njs_value_t *retval)
{
- njs_int_t ret;
- njs_arr_t *m;
- njs_value_t *value;
- njs_object_t *object;
-
- if (vm->modules == NULL) {
- vm->modules = njs_arr_create(vm->mem_pool, 4, sizeof(njs_value_t));
- if (njs_slow_path(vm->modules == NULL)) {
- njs_memory_error(vm);
- return NJS_ERROR;
- }
-
- m = vm->modules;
-
- value = njs_arr_add_multiple(m, vm->shared->module_items);
- if (njs_slow_path(value == NULL)) {
- njs_memory_error(vm);
- return NJS_ERROR;
- }
+ njs_int_t ret;
+ njs_mod_t *m;
- njs_memzero(m->start, m->items * sizeof(njs_value_t));
+ m = njs_module_find(vm, &module->name, 0);
+ if (njs_slow_path(m == NULL)) {
+ return NJS_ERROR;
}
- njs_assert(module->index < vm->modules->items);
-
- value = njs_arr_item(vm->modules, module->index);
-
- if (!njs_is_null(value)) {
- njs_value_assign(retval, value);
+ if (!njs_is_null(&m->value)) {
+ njs_value_assign(retval, &m->value);
return sizeof(njs_vmcode_import_t);
}
- if (module->function.native) {
- njs_value_assign(value, &module->value);
-
- object = njs_object_value_copy(vm, value);
- if (njs_slow_path(object == NULL)) {
- return NJS_ERROR;
- }
+ njs_set_invalid(&m->value);
- } else {
- njs_set_invalid(value);
- ret = njs_vm_invoke(vm, &module->function, NULL, 0, value);
- if (ret == NJS_ERROR) {
- return ret;
- }
+ ret = njs_vm_invoke(vm, &m->function, NULL, 0, &m->value);
+ if (ret == NJS_ERROR) {
+ return ret;
}
- njs_value_assign(retval, value);
+ njs_value_assign(retval, &m->value);
return sizeof(njs_vmcode_import_t);
}
static njs_unit_test_t njs_shared_test[] =
{
+ { njs_str("var cr = require('unknown')"),
+ njs_str("Error: Cannot load module \"unknown\"\n"
+ " at require (native)\n"
+ " at main (:1)\n") },
+
{ njs_str("var cr = require('crypto'); cr.createHash"),
njs_str("[object Function]") },
{ njs_str("var cr = require('crypto'); cr.createHash('md5')"),
njs_str("[object Hash]") },
+ { njs_str("import cr from 'unknown'"),
+ njs_str("Error: Cannot load module \"unknown\"") },
+
{ njs_str("import cr from 'crypto'; cr.createHash"),
njs_str("[object Function]") },
}
+static njs_mod_t *
+njs_unit_test_module_loader(njs_vm_t *vm, njs_external_ptr_t external,
+ njs_str_t *name)
+{
+ njs_vm_error(vm, "Cannot load module \"%V\"", name);
+
+ return NULL;
+}
+
+
static njs_int_t
njs_process_test(njs_external_state_t *state, njs_opts_t *opts,
njs_unit_test_t *expected)
goto done;
}
+ njs_vm_set_module_loader(vm, njs_unit_test_module_loader, NULL);
+
if (opts->preload) {
start = preload.start;
end = start + preload.length;