From: Dmitry Volyntsev Date: Thu, 6 Feb 2020 17:23:12 +0000 (+0300) Subject: Moving modules_hash to njs_vm_shared_t. X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=dd89233fa214453b8a345069da6c0e1ce89f6afa;p=njs.git Moving modules_hash to njs_vm_shared_t. As it is shared between VM instances. --- diff --git a/src/njs_builtin.c b/src/njs_builtin.c index e047bdab..35daa71e 100644 --- a/src/njs_builtin.c +++ b/src/njs_builtin.c @@ -208,7 +208,7 @@ njs_builtin_objects_create(njs_vm_t *vm) return NJS_ERROR; } - njs_lvlhsh_init(&vm->modules_hash); + njs_lvlhsh_init(&shared->modules_hash); lhq.replace = 0; lhq.pool = vm->mem_pool; @@ -258,7 +258,7 @@ njs_builtin_objects_create(njs_vm_t *vm) lhq.proto = &njs_modules_hash_proto; lhq.value = module; - ret = njs_lvlhsh_insert(&vm->modules_hash, &lhq); + ret = njs_lvlhsh_insert(&shared->modules_hash, &lhq); if (njs_fast_path(ret != NJS_OK)) { return NJS_ERROR; } diff --git a/src/njs_module.c b/src/njs_module.c index f527dfec..b8224396 100644 --- a/src/njs_module.c +++ b/src/njs_module.c @@ -24,7 +24,8 @@ static njs_int_t njs_module_absolute_path(njs_vm_t *vm, 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); @@ -111,7 +112,7 @@ njs_parser_module(njs_vm_t *vm, njs_parser_t *parser) parser->node = NULL; - module = njs_module_find(vm, &name); + module = njs_module_find(vm, &name, 0); if (module != NULL) { goto found; } @@ -413,8 +414,11 @@ const njs_lvlhsh_proto_t njs_modules_hash_proto 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; @@ -425,6 +429,38 @@ njs_module_find(njs_vm_t *vm, njs_str_t *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; } @@ -444,7 +480,6 @@ njs_module_add(njs_vm_t *vm, njs_str_t *name) 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; } @@ -457,7 +492,6 @@ njs_module_add(njs_vm_t *vm, njs_str_t *name) lhq.proto = &njs_modules_hash_proto; ret = njs_lvlhsh_insert(&vm->modules_hash, &lhq); - if (njs_fast_path(ret == NJS_OK)) { return module; } @@ -507,49 +541,31 @@ njs_int_t 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; } diff --git a/src/njs_vm.c b/src/njs_vm.c index 5ae059d1..2d6fe22e 100644 --- a/src/njs_vm.c +++ b/src/njs_vm.c @@ -44,6 +44,8 @@ njs_vm_create(njs_vm_opt_t *options) return NULL; } + njs_lvlhsh_init(&vm->values_hash); + vm->options = *options; if (options->shared != NULL) { @@ -56,8 +58,6 @@ njs_vm_create(njs_vm_opt_t *options) } } - njs_lvlhsh_init(&vm->values_hash); - vm->external = options->external; vm->external_objects = njs_arr_create(vm->mem_pool, 4, sizeof(void *)); @@ -302,6 +302,8 @@ njs_vm_init(njs_vm_t *vm) return NJS_ERROR; } + njs_lvlhsh_init(&vm->modules_hash); + njs_lvlhsh_init(&vm->events_hash); njs_queue_init(&vm->posted_events); njs_queue_init(&vm->promise_events); diff --git a/src/njs_vm.h b/src/njs_vm.h index dfa11921..c24e5ac4 100644 --- a/src/njs_vm.h +++ b/src/njs_vm.h @@ -276,6 +276,8 @@ struct njs_vm_shared_s { njs_lvlhsh_t arguments_object_instance_hash; njs_lvlhsh_t regexp_instance_hash; + njs_lvlhsh_t modules_hash; + njs_lvlhsh_t env_hash; njs_object_t string_object; diff --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c index 1f42cf8a..6c64385a 100644 --- a/src/test/njs_unit_test.c +++ b/src/test/njs_unit_test.c @@ -15825,6 +15825,15 @@ static njs_unit_test_t njs_test[] = { njs_str("var fs = require('fs'); typeof fs"), njs_str("object") }, + { njs_str("var fs = require('fs'); Object.isExtensible(fs)"), + njs_str("true") }, + + { njs_str("require('fs') === require('fs')"), + njs_str("true") }, + + { njs_str("require('fs').a = 1; require('fs').a"), + njs_str("1") }, + /* require('fs').readFile() */ { njs_str("var fs = require('fs');" @@ -16472,6 +16481,9 @@ static njs_unit_test_t njs_shared_test[] = { njs_str("import cr from 'crypto'; cr.createHash('md5')"), njs_str("[object Hash]") }, + { njs_str("var fs = require('fs'); fs.a = 1; fs.a"), + njs_str("1") }, + { njs_str("isFinite()"), njs_str("false") },