Skip to content

Instantly share code, notes, and snippets.

@xeioex
Created February 11, 2019 17:57
Show Gist options
  • Save xeioex/11395b51a23b4c8344a86bfcb4f4110d to your computer and use it in GitHub Desktop.
Save xeioex/11395b51a23b4c8344a86bfcb4f4110d to your computer and use it in GitHub Desktop.
diff --git a/njs/njs.c b/njs/njs.c
--- a/njs/njs.c
+++ b/njs/njs.c
@@ -339,8 +339,9 @@ njs_vm_clone(njs_vm_t *vm, njs_external_
nvm->variables_hash = vm->variables_hash;
nvm->values_hash = vm->values_hash;
+
+ nvm->modules = vm->modules;
nvm->modules_hash = vm->modules_hash;
- nvm->modules_list = vm->modules_list;
nvm->externals_hash = vm->externals_hash;
nvm->external_prototypes_hash = vm->external_prototypes_hash;
@@ -588,7 +589,7 @@ njs_vm_start(njs_vm_t *vm)
{
njs_ret_t ret;
- ret = njs_module_invoke(vm);
+ ret = njs_module_load(vm);
if (nxt_slow_path(ret != NXT_OK)) {
return ret;
}
diff --git a/njs/njs_module.c b/njs/njs_module.c
--- a/njs/njs_module.c
+++ b/njs/njs_module.c
@@ -23,20 +23,20 @@ static njs_module_t *njs_module_add(njs_
nxt_int_t
-njs_module_invoke(njs_vm_t *vm)
+njs_module_load(njs_vm_t *vm)
{
nxt_int_t ret;
nxt_uint_t i;
njs_value_t *value;
njs_module_t **item, *module;
- if (vm->modules_list == NULL) {
+ if (vm->modules == NULL) {
return NXT_OK;
}
- item = vm->modules_list->start;
+ item = vm->modules->start;
- for (i = 0; i < vm->modules_list->items; i++) {
+ for (i = 0; i < vm->modules->items; i++) {
module = *item;
if (module->function.native) {
@@ -81,17 +81,16 @@ njs_parser_module(njs_vm_t *vm, njs_pars
prev = parser->lexer;
- nxt_memzero(&lexer, sizeof(njs_lexer_t));
-
nxt_memzero(&body, sizeof(nxt_str_t));
ret = njs_module_read(vm, parser, name, &file, &body);
if (nxt_slow_path(ret != NXT_OK)) {
- njs_parser_syntax_error(vm, parser,
- "Cannot find module \"%V\"", name);
+ njs_parser_syntax_error(vm, parser, "Cannot find module \"%V\"", name);
goto fail;
}
+ nxt_memzero(&lexer, sizeof(njs_lexer_t));
+
lexer.file = file;
lexer.start = body.start;
lexer.end = body.start + body.length;
@@ -117,7 +116,7 @@ njs_parser_module(njs_vm_t *vm, njs_pars
module->function.u.lambda = parser->node->u.value.data.u.lambda;
- free(body.start);
+ nxt_mp_free(vm->mem_pool, body.start);
parser->lexer = prev;
@@ -132,23 +131,21 @@ found:
if (module->index == 0) {
scope = njs_parser_global_scope(vm);
- module->index = njs_scope_next_index(vm, scope,
- NJS_SCOPE_INDEX_LOCAL,
+ module->index = njs_scope_next_index(vm, scope, NJS_SCOPE_INDEX_LOCAL,
&njs_value_void);
if (nxt_slow_path(module->index == NJS_INDEX_ERROR)) {
return NJS_TOKEN_ERROR;
}
- if (vm->modules_list == NULL) {
- vm->modules_list = nxt_array_create(4, sizeof(njs_module_t *),
- &njs_array_mem_proto,
- vm->mem_pool);
- if (nxt_slow_path(vm->modules_list == NULL)) {
+ if (vm->modules == NULL) {
+ vm->modules = nxt_array_create(4, sizeof(njs_module_t *),
+ &njs_array_mem_proto, vm->mem_pool);
+ if (nxt_slow_path(vm->modules == NULL)) {
return NJS_TOKEN_ERROR;
}
}
- value = nxt_array_add(vm->modules_list, &njs_array_mem_proto, vm->mem_pool);
+ value = nxt_array_add(vm->modules, &njs_array_mem_proto, vm->mem_pool);
if (nxt_slow_path(value == NULL)) {
return NJS_TOKEN_ERROR;
}
@@ -165,7 +162,7 @@ found:
fail:
if (body.start != NULL) {
- free(body.start);
+ nxt_mp_free(vm->mem_pool, body.start);
}
parser->lexer = prev;
@@ -174,6 +171,9 @@ fail:
}
+#define NJS_MODULE_START "function() {"
+#define NJS_MODULE_END "}"
+
static nxt_int_t
njs_module_read(njs_vm_t *vm, njs_parser_t *parser, nxt_str_t *name,
nxt_str_t *source, nxt_str_t *body)
@@ -195,7 +195,7 @@ njs_module_read(njs_vm_t *vm, njs_parser
source->start = (u_char *) file;
source->length = strlen(file);
- body->length = nxt_length(NJS_MODULE_BODY_START);
+ body->length = nxt_length(NJS_MODULE_START);
fd = open(file, O_RDONLY);
if (fd == -1) {
@@ -210,15 +210,14 @@ njs_module_read(njs_vm_t *vm, njs_parser
body->length += sb.st_size;
}
- body->length += nxt_length(NJS_MODULE_BODY_END);
+ body->length += nxt_length(NJS_MODULE_END);
- body->start = malloc(body->length);
+ body->start = nxt_mp_alloc(vm->mem_pool, body->length);
if (body->start == NULL) {
goto fail;
}
- p = nxt_cpymem(body->start, NJS_MODULE_BODY_START,
- nxt_length(NJS_MODULE_BODY_START));
+ p = nxt_cpymem(body->start, NJS_MODULE_START, nxt_length(NJS_MODULE_START));
n = read(fd, p, sb.st_size);
@@ -232,7 +231,7 @@ njs_module_read(njs_vm_t *vm, njs_parser
p += n;
- memcpy(p, NJS_MODULE_BODY_END, nxt_length(NJS_MODULE_BODY_END));
+ memcpy(p, NJS_MODULE_END, nxt_length(NJS_MODULE_END));
close(fd);
@@ -241,7 +240,7 @@ njs_module_read(njs_vm_t *vm, njs_parser
fail:
if (body->start != NULL) {
- free(body->start);
+ nxt_mp_free(vm->mem_pool, body->start);
}
close(fd);
@@ -309,7 +308,6 @@ njs_module_add(njs_vm_t *vm, njs_parser_
if (nxt_fast_path(ret != NXT_OK)) {
nxt_mp_free(vm->mem_pool, module);
- njs_type_error(vm, "lvlhsh insert failed");
return NULL;
}
diff --git a/njs/njs_module.h b/njs/njs_module.h
--- a/njs/njs_module.h
+++ b/njs/njs_module.h
@@ -16,11 +16,7 @@ typedef struct {
} njs_module_t;
-#define NJS_MODULE_BODY_START "function() {"
-#define NJS_MODULE_BODY_END "}"
-
-
-nxt_int_t njs_module_invoke(njs_vm_t *vm);
+nxt_int_t njs_module_load(njs_vm_t *vm);
njs_token_t njs_parser_module(njs_vm_t *vm, njs_parser_t *parser);
njs_ret_t njs_module_require(njs_vm_t *vm, njs_value_t *args,
nxt_uint_t nargs, njs_index_t unused);
diff --git a/njs/njs_parser.c b/njs/njs_parser.c
--- a/njs/njs_parser.c
+++ b/njs/njs_parser.c
@@ -680,12 +680,7 @@ njs_parser_lambda(njs_vm_t *vm, njs_pars
}
}
- token = njs_parser_token(parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
-
- return token;
+ return njs_parser_token(parser);
}
@@ -2031,7 +2026,7 @@ njs_parser_module_lambda(njs_vm_t *vm, n
return NJS_TOKEN_ERROR;
}
- parent->right = njs_parser_chain_top(parser);;
+ parent->right = njs_parser_chain_top(parser);
parser->node = parent;
diff --git a/njs/njs_vm.h b/njs/njs_vm.h
--- a/njs/njs_vm.h
+++ b/njs/njs_vm.h
@@ -1039,8 +1039,9 @@ struct njs_vm_s {
nxt_lvlhsh_t variables_hash;
nxt_lvlhsh_t values_hash;
+
+ nxt_array_t *modules;
nxt_lvlhsh_t modules_hash;
- nxt_array_t *modules_list;
uint32_t event_id;
nxt_lvlhsh_t events_hash;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment