[njs] Interactive shell: initial support of posted events.
Dmitry Volyntsev
xeioex at nginx.com
Fri Dec 28 09:46:26 UTC 2018
details: https://hg.nginx.org/njs/rev/f08c5fc1dea8
branches:
changeset: 703:f08c5fc1dea8
user: Dmitry Volyntsev <xeioex at nginx.com>
date: Fri Dec 28 12:43:36 2018 +0300
description:
Interactive shell: initial support of posted events.
diffstat:
njs/njs_shell.c | 49 ++++++++++++++++++++++++++++++++++++-------------
1 files changed, 36 insertions(+), 13 deletions(-)
diffs (103 lines):
diff -r bdd4c516a078 -r f08c5fc1dea8 njs/njs_shell.c
--- a/njs/njs_shell.c Fri Dec 28 12:43:22 2018 +0300
+++ b/njs/njs_shell.c Fri Dec 28 12:43:36 2018 +0300
@@ -54,7 +54,7 @@ static nxt_int_t njs_interactive_shell(n
njs_vm_opt_t *vm_options);
static nxt_int_t njs_process_file(njs_opts_t *opts, njs_vm_opt_t *vm_options);
static nxt_int_t njs_process_script(njs_vm_t *vm, njs_opts_t *opts,
- const nxt_str_t *script, nxt_str_t *out);
+ const nxt_str_t *script);
static nxt_int_t njs_editline_init(njs_vm_t *vm);
static char **njs_completion_handler(const char *text, int start, int end);
static char *njs_completion_generator(const char *text, int state);
@@ -297,7 +297,7 @@ static nxt_int_t
njs_interactive_shell(njs_opts_t *opts, njs_vm_opt_t *vm_options)
{
njs_vm_t *vm;
- nxt_str_t line, out;
+ nxt_str_t line;
vm = njs_vm_create(vm_options);
if (vm == NULL) {
@@ -335,9 +335,7 @@ njs_interactive_shell(njs_opts_t *opts,
add_history((char *) line.start);
- njs_process_script(vm, opts, &line, &out);
-
- printf("%.*s\n", (int) out.length, out.start);
+ njs_process_script(vm, opts, &line);
/* editline allocs a new buffer every time. */
free(line.start);
@@ -357,7 +355,7 @@ njs_process_file(njs_opts_t *opts, njs_v
ssize_t n;
njs_vm_t *vm;
nxt_int_t ret;
- nxt_str_t out, script;
+ nxt_str_t script;
struct stat sb;
file = opts->file;
@@ -448,9 +446,8 @@ njs_process_file(njs_opts_t *opts, njs_v
goto done;
}
- ret = njs_process_script(vm, opts, &script, &out);
+ ret = njs_process_script(vm, opts, &script);
if (ret != NXT_OK) {
- fprintf(stderr, "%.*s\n", (int) out.length, out.start);
ret = NXT_ERROR;
goto done;
}
@@ -473,9 +470,27 @@ close_fd:
}
+static void
+njs_output(njs_vm_t *vm, njs_opts_t *opts, njs_ret_t ret)
+{
+ nxt_str_t out;
+
+ if (njs_vm_retval_dump(vm, &out, 1) != NXT_OK) {
+ out = nxt_string_value("failed to get retval from VM");
+ ret = NJS_ERROR;
+ }
+
+ if (ret != NJS_OK) {
+ fprintf(stderr, "%.*s\n", (int) out.length, out.start);
+
+ } else if (opts->interactive) {
+ printf("%.*s\n", (int) out.length, out.start);
+ }
+}
+
+
static nxt_int_t
-njs_process_script(njs_vm_t *vm, njs_opts_t *opts, const nxt_str_t *script,
- nxt_str_t *out)
+njs_process_script(njs_vm_t *vm, njs_opts_t *opts, const nxt_str_t *script)
{
u_char *start;
nxt_int_t ret;
@@ -493,9 +508,17 @@ njs_process_script(njs_vm_t *vm, njs_opt
ret = njs_vm_start(vm);
}
- if (njs_vm_retval_dump(vm, out, 1) != NXT_OK) {
- *out = nxt_string_value("failed to get retval from VM");
- return NXT_ERROR;
+ njs_output(vm, opts, ret);
+
+ if (ret == NJS_OK) {
+ while (njs_vm_posted(vm)) {
+ ret = njs_vm_run(vm);
+
+ if (ret == NJS_ERROR) {
+ njs_output(vm, opts, ret);
+ return ret;
+ }
+ }
}
return ret;
More information about the nginx-devel
mailing list