[njs] Added support for module mode of execution.
Dmitry Volyntsev
xeioex at nginx.com
Fri Apr 12 16:58:14 UTC 2019
details: https://hg.nginx.org/njs/rev/f582672967ad
branches:
changeset: 886:f582672967ad
user: Dmitry Volyntsev <xeioex at nginx.com>
date: Wed Apr 10 17:46:29 2019 +0300
description:
Added support for module mode of execution.
According to ES6:15.2 global this is undefined in module
mode.
diffstat:
njs/njs.h | 1 +
njs/njs_generator.c | 13 ++++++++++++-
njs/njs_parser_terminal.c | 5 +++++
njs/njs_shell.c | 34 +++++++++++++++++++++++++++-------
njs/test/njs_expect_test.exp | 12 ++++++++++++
5 files changed, 57 insertions(+), 8 deletions(-)
diffs (144 lines):
diff -r 1213e0a2b485 -r f582672967ad njs/njs.h
--- a/njs/njs.h Fri Apr 12 18:36:02 2019 +0300
+++ b/njs/njs.h Wed Apr 10 17:46:29 2019 +0300
@@ -148,6 +148,7 @@ typedef struct {
uint8_t accumulative; /* 1 bit */
uint8_t backtrace; /* 1 bit */
uint8_t sandbox; /* 1 bit */
+ uint8_t module; /* 1 bit */
} njs_vm_opt_t;
diff -r 1213e0a2b485 -r f582672967ad njs/njs_generator.c
--- a/njs/njs_generator.c Fri Apr 12 18:36:02 2019 +0300
+++ b/njs/njs_generator.c Wed Apr 10 17:46:29 2019 +0300
@@ -382,7 +382,6 @@ njs_generator(njs_vm_t *vm, njs_generato
case NJS_TOKEN_NUMBER:
case NJS_TOKEN_STRING:
node->index = njs_value_index(vm, &node->u.value, generator->runtime);
-
if (nxt_fast_path(node->index != NJS_INDEX_NONE)) {
return NXT_OK;
}
@@ -431,6 +430,18 @@ njs_generator(njs_vm_t *vm, njs_generato
return njs_generate_name(vm, generator, node);
case NJS_TOKEN_GLOBAL_THIS:
+ if (vm->options.module) {
+ node->index = njs_value_index(vm, &node->u.value,
+ generator->runtime);
+ if (nxt_fast_path(node->index != NJS_INDEX_NONE)) {
+ return NXT_OK;
+ }
+
+ return NXT_ERROR;
+ }
+
+ /* Fall through. */
+
case NJS_TOKEN_NJS:
case NJS_TOKEN_MATH:
case NJS_TOKEN_JSON:
diff -r 1213e0a2b485 -r f582672967ad njs/njs_parser_terminal.c
--- a/njs/njs_parser_terminal.c Fri Apr 12 18:36:02 2019 +0300
+++ b/njs/njs_parser_terminal.c Wed Apr 10 17:46:29 2019 +0300
@@ -228,6 +228,11 @@ njs_parser_reference(njs_vm_t *vm, njs_p
node->token = NJS_TOKEN_GLOBAL_THIS;
+ if (vm->options.module) {
+ node->u.value = njs_value_undefined;
+ break;
+ }
+
/* Fall through. */
case NJS_TOKEN_NJS:
diff -r 1213e0a2b485 -r f582672967ad njs/njs_shell.c
--- a/njs/njs_shell.c Fri Apr 12 18:36:02 2019 +0300
+++ b/njs/njs_shell.c Wed Apr 10 17:46:29 2019 +0300
@@ -35,6 +35,7 @@ typedef struct {
nxt_int_t interactive;
nxt_int_t sandbox;
nxt_int_t quiet;
+ nxt_int_t module;
} njs_opts_t;
@@ -248,6 +249,7 @@ main(int argc, char **argv)
vm_options.accumulative = opts.interactive;
vm_options.backtrace = 1;
vm_options.sandbox = opts.sandbox;
+ vm_options.module = opts.module;
vm_options.ops = &njs_console_ops;
vm_options.external = &njs_console;
@@ -278,12 +280,13 @@ njs_get_options(njs_opts_t *opts, int ar
"Interactive njs shell.\n"
"\n"
"Options:\n"
- " -d print disassembled code.\n"
- " -q disable interactive introduction prompt.\n"
- " -s sandbox mode.\n"
- " -p set path prefix for modules.\n"
- " -v print njs version and exit.\n"
- " <filename> | - run code from a file or stdin.\n";
+ " -d print disassembled code.\n"
+ " -q disable interactive introduction prompt.\n"
+ " -s sandbox mode.\n"
+ " -t script|module source code type (script is default).\n"
+ " -p set path prefix for modules.\n"
+ " -v print njs version and exit.\n"
+ " <filename> | - run code from a file or stdin.\n";
ret = NXT_DONE;
@@ -317,8 +320,25 @@ njs_get_options(njs_opts_t *opts, int ar
opts->sandbox = 1;
break;
+ case 't':
+ if (++i < argc) {
+ if (strcmp(argv[i], "module") == 0) {
+ opts->module = 1;
+
+ } else if (strcmp(argv[i], "script") != 0) {
+ nxt_error("option \"-t\" unexpected source type: %s\n",
+ argv[i]);
+ return NXT_ERROR;
+ }
+
+ break;
+ }
+
+ nxt_error("option \"-t\" requires source type\n");
+ return NXT_ERROR;
+
case 'p':
- if (argv[++i] != NULL) {
+ if (++i < argc) {
opts->n_paths++;
paths = realloc(opts->paths, opts->n_paths * sizeof(char *));
if (paths == NULL) {
diff -r 1213e0a2b485 -r f582672967ad njs/test/njs_expect_test.exp
--- a/njs/test/njs_expect_test.exp Fri Apr 12 18:36:02 2019 +0300
+++ b/njs/test/njs_expect_test.exp Wed Apr 10 17:46:29 2019 +0300
@@ -658,6 +658,18 @@ njs_test {
"undefined\r\n"}
} "-s"
+# source type
+
+njs_test {
+ {"this\r\n"
+ "this\r\nundefined"}
+} "-t module"
+
+njs_test {
+ {"this.NaN\r\n"
+ "this.NaN\r\nNaN"}
+} "-t script"
+
# modules
njs_test {
More information about the nginx-devel
mailing list