static njs_bool_t njs_module_realpath_equal(const njs_str_t *path1,
const njs_str_t *path2);
static njs_int_t njs_module_read(njs_vm_t *vm, int fd, njs_str_t *body);
-static njs_module_t *njs_module_find(njs_vm_t *vm, njs_str_t *name);
+static njs_module_t *njs_module_find(njs_vm_t *vm, njs_str_t *name,
+ njs_bool_t local);
static njs_module_t *njs_module_add(njs_vm_t *vm, njs_str_t *name);
static njs_int_t njs_module_insert(njs_vm_t *vm, njs_module_t *module);
parser->node = NULL;
- module = njs_module_find(vm, &name);
+ module = njs_module_find(vm, &name, 0);
if (module != NULL) {
goto found;
}
static njs_module_t *
-njs_module_find(njs_vm_t *vm, njs_str_t *name)
+njs_module_find(njs_vm_t *vm, njs_str_t *name, njs_bool_t local)
{
+ njs_int_t ret;
+ njs_module_t *module, *shared;
+ njs_object_t *object;
njs_lvlhsh_query_t lhq;
lhq.key = *name;
return lhq.value;
}
+ if (njs_lvlhsh_find(&vm->shared->modules_hash, &lhq) == NJS_OK) {
+ shared = lhq.value;
+
+ if (!local) {
+ return shared;
+ }
+
+ module = njs_mp_alloc(vm->mem_pool, sizeof(njs_module_t));
+ if (njs_slow_path(module == NULL)) {
+ njs_memory_error(vm);
+ return NULL;
+ }
+
+ memcpy(module, shared, sizeof(njs_module_t));
+ object = &module->object;
+
+ object->__proto__ = &vm->prototypes[NJS_OBJ_TYPE_OBJECT].object;
+ object->shared = 0;
+ object->extensible = 1;
+ object->error_data = 0;
+ object->fast_array = 0;
+
+ lhq.replace = 0;
+ lhq.value = module;
+ lhq.pool = vm->mem_pool;
+
+ ret = njs_lvlhsh_insert(&vm->modules_hash, &lhq);
+ if (njs_fast_path(ret == NJS_OK)) {
+ return module;
+ }
+ }
+
return NULL;
}
ret = njs_name_copy(vm, &module->name, name);
if (njs_slow_path(ret != NJS_OK)) {
- njs_mp_free(vm->mem_pool, module);
njs_memory_error(vm);
return NULL;
}
lhq.proto = &njs_modules_hash_proto;
ret = njs_lvlhsh_insert(&vm->modules_hash, &lhq);
-
if (njs_fast_path(ret == NJS_OK)) {
return module;
}
njs_module_require(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
njs_index_t unused)
{
- njs_int_t ret;
- njs_object_t *object;
- njs_module_t *module;
- njs_lvlhsh_query_t lhq;
+ njs_int_t ret;
+ njs_str_t name;
+ njs_value_t *path;
+ njs_module_t *module;
if (nargs < 2) {
njs_type_error(vm, "missing path");
return NJS_ERROR;
}
- if (njs_slow_path(!njs_is_string(&args[1]))) {
- ret = njs_value_to_string(vm, &args[1], &args[1]);
- if (njs_slow_path(ret != NJS_OK)) {
- return ret;
- }
+ path = njs_argument(args, 1);
+ ret = njs_value_to_string(vm, path, path);
+ if (njs_slow_path(ret != NJS_OK)) {
+ return ret;
}
- njs_string_get(&args[1], &lhq.key);
- lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
- lhq.proto = &njs_modules_hash_proto;
-
- if (njs_lvlhsh_find(&vm->modules_hash, &lhq) == NJS_OK) {
- module = lhq.value;
-
- object = njs_mp_alloc(vm->mem_pool, sizeof(njs_object_t));
- if (njs_slow_path(object == NULL)) {
- njs_memory_error(vm);
- return NJS_ERROR;
- }
-
- *object = module->object;
- object->__proto__ = &vm->prototypes[NJS_OBJ_TYPE_OBJECT].object;
- object->shared = 0;
- object->extensible = 0;
- object->error_data = 0;
- object->fast_array = 0;
+ njs_string_get(path, &name);
- njs_set_object(&vm->retval, object);
+ module = njs_module_find(vm, &name, 1);
+ if (njs_slow_path(module == NULL)) {
+ njs_error(vm, "Cannot find module \"%V\"", &name);
- return NJS_OK;
+ return NJS_ERROR;
}
- njs_error(vm, "Cannot find module \"%V\"", &lhq.key);
-
- return NJS_ERROR;
+ njs_set_object(&vm->retval, &module->object);
+ return NJS_OK;
}