njs_int_t
-njs_module_require(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
+njs_module_require(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
+ njs_index_t unused)
{
+ njs_object_t *object;
njs_module_t *module;
njs_lvlhsh_query_t lhq;
if (njs_lvlhsh_find(&vm->modules_hash, &lhq) == NJS_OK) {
module = lhq.value;
- module->object.__proto__ = &vm->prototypes[NJS_PROTOTYPE_OBJECT].object;
- njs_set_object(&vm->retval, &module->object);
+ 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_PROTOTYPE_OBJECT].object;
+ object->shared = 0;
+
+ njs_set_object(&vm->retval, object);
return NJS_OK;
}
};
+static njs_unit_test_t njs_shared_test[] =
+{
+ { 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 'crypto'; cr.createHash"),
+ njs_str("[object Function]") },
+
+ { njs_str("import cr from 'crypto'; cr.createHash('md5')"),
+ njs_str("[object Hash]") },
+};
+
+
static njs_unit_test_t njs_tz_test[] =
{
{ njs_str("var d = new Date(1); d = d + ''; d.slice(0, 33)"),
njs_bool_t disassemble;
njs_bool_t verbose;
njs_bool_t module;
+ njs_uint_t repeat;
} njs_opts_t;
njs_vm_t *vm, *nvm;
njs_int_t ret;
njs_str_t s;
- njs_uint_t i;
+ njs_uint_t i, repeat;
njs_stat_t prev;
njs_bool_t success;
njs_vm_opt_t options;
njs_disassembler(vm);
}
- nvm = njs_vm_clone(vm, NULL);
- if (nvm == NULL) {
- njs_printf("njs_vm_clone() failed\n");
- goto done;
- }
+ repeat = opts->repeat;
- ret = njs_vm_start(nvm);
+ do {
+ if (nvm != NULL) {
+ njs_vm_destroy(nvm);
+ }
+
+ nvm = njs_vm_clone(vm, NULL);
+ if (nvm == NULL) {
+ njs_printf("njs_vm_clone() failed\n");
+ goto done;
+ }
+
+ ret = njs_vm_start(nvm);
+ } while (--repeat != 0);
if (njs_vm_retval_string(nvm, &s) != NJS_OK) {
njs_printf("njs_vm_retval_string() failed\n");
njs_memzero(&stat, sizeof(njs_stat_t));
+ opts.repeat = 1;
+
ret = njs_unit_test(njs_test, njs_nitems(njs_test), "script tests",
&opts, &stat);
if (ret != NJS_OK) {
return ret;
}
+ opts.module = 0;
+ opts.repeat = 128;
+
+ ret = njs_unit_test(njs_shared_test, njs_nitems(njs_shared_test),
+ "shared tests", &opts, &stat);
+ if (ret != NJS_OK) {
+ return ret;
+ }
+
njs_printf("TOTAL: %s [%ui/%ui]\n", stat.failed ? "FAILED" : "PASSED",
stat.passed, stat.passed + stat.failed);