Into njs_vm_value_to_string() and njs_vm_backtrace_dump().
ctx->status = NGX_HTTP_INTERNAL_SERVER_ERROR;
if (njs_vm_call(ctx->vm, func, njs_value_arg(&ctx->request), 1) != NJS_OK) {
- njs_vm_retval_to_ext_string(ctx->vm, &exception);
+ njs_vm_retval_string(ctx->vm, &exception);
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
"js exception: %*s", exception.length, exception.start);
pending = njs_vm_pending(ctx->vm);
if (njs_vm_call(ctx->vm, func, njs_value_arg(&ctx->request), 1) != NJS_OK) {
- njs_vm_retval_to_ext_string(ctx->vm, &exception);
+ njs_vm_retval_string(ctx->vm, &exception);
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
"js exception: %*s", exception.length, exception.start);
return NGX_OK;
}
- if (njs_vm_retval_to_ext_string(ctx->vm, &value) != NJS_OK) {
+ if (njs_vm_retval_string(ctx->vm, &value) != NJS_OK) {
return NGX_ERROR;
}
cln->data = ctx;
if (njs_vm_start(ctx->vm) == NJS_ERROR) {
- njs_vm_retval_to_ext_string(ctx->vm, &exception);
+ njs_vm_retval_string(ctx->vm, &exception);
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
"js exception: %*s", exception.length, exception.start);
c = r->connection;
- if (njs_vm_value_to_ext_string(vm, &msg, njs_arg(args, nargs, 1), 0)
+ if (njs_vm_value_to_string(vm, &msg, njs_arg(args, nargs, 1))
== NJS_ERROR)
{
return NJS_ERROR;
arg = njs_arg(args, nargs, 2);
if (njs_value_is_string(arg)) {
- if (njs_vm_value_to_ext_string(vm, &args_arg, arg, 0) != NJS_OK) {
+ if (njs_vm_value_to_string(vm, &args_arg, arg) != NJS_OK) {
njs_vm_error(vm, "failed to convert args");
return NJS_ERROR;
}
rc = njs_vm_run(ctx->vm);
if (rc == NJS_ERROR) {
- njs_vm_retval_to_ext_string(ctx->vm, &exception);
+ njs_vm_retval_string(ctx->vm, &exception);
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
"js exception: %*s", exception.length, exception.start);
ngx_http_js_string(njs_vm_t *vm, const njs_value_t *value, nxt_str_t *str)
{
if (!njs_value_is_null_or_undefined(value)) {
- if (njs_vm_value_to_ext_string(vm, str, value, 0) == NJS_ERROR) {
+ if (njs_vm_value_to_string(vm, str, value) == NJS_ERROR) {
return NJS_ERROR;
}
rc = njs_vm_compile(jmcf->vm, &start, end);
if (rc != NJS_OK) {
- njs_vm_retval_to_ext_string(jmcf->vm, &text);
+ njs_vm_retval_string(jmcf->vm, &text);
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
"%*s, included",
exception:
- njs_vm_retval_to_ext_string(ctx->vm, &exception);
+ njs_vm_retval_string(ctx->vm, &exception);
ngx_log_error(NGX_LOG_ERR, c->log, 0, "js exception: %*s",
exception.length, exception.start);
exception:
- njs_vm_retval_to_ext_string(ctx->vm, &exception);
+ njs_vm_retval_string(ctx->vm, &exception);
ngx_log_error(NGX_LOG_ERR, c->log, 0, "js exception: %*s",
exception.length, exception.start);
pending = njs_vm_pending(ctx->vm);
if (njs_vm_call(ctx->vm, func, njs_value_arg(&ctx->args), 1) != NJS_OK) {
- njs_vm_retval_to_ext_string(ctx->vm, &exception);
+ njs_vm_retval_string(ctx->vm, &exception);
ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
"js exception: %*s", exception.length, exception.start);
return NGX_OK;
}
- if (njs_vm_retval_to_ext_string(ctx->vm, &value) != NJS_OK) {
+ if (njs_vm_retval_string(ctx->vm, &value) != NJS_OK) {
return NGX_ERROR;
}
cln->data = ctx;
if (njs_vm_start(ctx->vm) == NJS_ERROR) {
- njs_vm_retval_to_ext_string(ctx->vm, &exception);
+ njs_vm_retval_string(ctx->vm, &exception);
ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
"js exception: %*s", exception.length, exception.start);
c = s->connection;
- if (njs_vm_value_to_ext_string(vm, &msg, njs_arg(args, nargs, 1), 0)
+ if (njs_vm_value_to_string(vm, &msg, njs_arg(args, nargs, 1))
== NJS_ERROR)
{
return NJS_ERROR;
return NJS_ERROR;
}
- if (njs_vm_value_to_ext_string(vm, &name, njs_arg(args, nargs, 1), 0)
+ if (njs_vm_value_to_string(vm, &name, njs_arg(args, nargs, 1))
== NJS_ERROR)
{
njs_vm_error(vm, "failed to convert event arg");
return NJS_ERROR;
}
- if (njs_vm_value_to_ext_string(vm, &name, njs_arg(args, nargs, 1), 0)
+ if (njs_vm_value_to_string(vm, &name, njs_arg(args, nargs, 1))
== NJS_ERROR)
{
njs_vm_error(vm, "failed to convert event arg");
rc = njs_vm_run(ctx->vm);
if (rc == NJS_ERROR) {
- njs_vm_retval_to_ext_string(ctx->vm, &exception);
+ njs_vm_retval_string(ctx->vm, &exception);
ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
"js exception: %*s", exception.length, exception.start);
ngx_stream_js_string(njs_vm_t *vm, const njs_value_t *value, nxt_str_t *str)
{
if (!njs_value_is_null_or_undefined(value)) {
- if (njs_vm_value_to_ext_string(vm, str, value, 0) == NJS_ERROR) {
+ if (njs_vm_value_to_string(vm, str, value) == NJS_ERROR) {
return NJS_ERROR;
}
rc = njs_vm_compile(jmcf->vm, &start, end);
if (rc != NJS_OK) {
- njs_vm_retval_to_ext_string(jmcf->vm, &text);
+ njs_vm_retval_string(jmcf->vm, &text);
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
"%*s, included",
}
+nxt_array_t *
+njs_vm_backtrace(njs_vm_t *vm)
+{
+ if (vm->backtrace != NULL && !nxt_array_is_empty(vm->backtrace)) {
+ return vm->backtrace;
+ }
+
+ return NULL;
+}
+
+
+static njs_ret_t
+njs_vm_backtrace_dump(njs_vm_t *vm, nxt_str_t *dst, const njs_value_t *src)
+{
+ u_char *p, *start, *end;
+ size_t len, count;
+ nxt_uint_t i;
+ nxt_array_t *backtrace;
+ njs_backtrace_entry_t *be, *prev;
+
+ backtrace = njs_vm_backtrace(vm);
+
+ len = dst->length + 1;
+
+ count = 0;
+ prev = NULL;
+
+ be = backtrace->start;
+
+ for (i = 0; i < backtrace->items; i++) {
+ if (i != 0 && prev->name.start == be->name.start
+ && prev->line == be->line)
+ {
+ count++;
+
+ } else {
+
+ if (count != 0) {
+ len += nxt_length(" repeats times\n")
+ + NXT_INT_T_LEN;
+ count = 0;
+ }
+
+ len += be->name.length + nxt_length(" at ()\n");
+
+ if (be->line != 0) {
+ len += be->file.length + NXT_INT_T_LEN + 1;
+
+ } else {
+ len += nxt_length("native");
+ }
+ }
+
+ prev = be;
+ be++;
+ }
+
+ p = nxt_mp_alloc(vm->mem_pool, len);
+ if (p == NULL) {
+ njs_memory_error(vm);
+ return NXT_ERROR;
+ }
+
+ start = p;
+ end = start + len;
+
+ p = nxt_cpymem(p, dst->start, dst->length);
+ *p++ = '\n';
+
+ count = 0;
+ prev = NULL;
+
+ be = backtrace->start;
+
+ for (i = 0; i < backtrace->items; i++) {
+ if (i != 0 && prev->name.start == be->name.start
+ && prev->line == be->line)
+ {
+ count++;
+
+ } else {
+ if (count != 0) {
+ p = nxt_sprintf(p, end, " repeats %uz times\n",
+ count);
+ count = 0;
+ }
+
+ p = nxt_sprintf(p, end, " at %V ", &be->name);
+
+ if (be->line != 0) {
+ p = nxt_sprintf(p, end, "(%V:%uD)\n", &be->file,
+ be->line);
+
+ } else {
+ p = nxt_sprintf(p, end, "(native)\n");
+ }
+ }
+
+ prev = be;
+ be++;
+ }
+
+ dst->start = start;
+ dst->length = p - dst->start;
+
+ return NXT_OK;
+}
+
+
+njs_ret_t
+njs_vm_value_string(njs_vm_t *vm, nxt_str_t *dst, const njs_value_t *src)
+{
+ njs_ret_t ret;
+ nxt_uint_t exception;
+
+ if (nxt_slow_path(src->type == NJS_NUMBER
+ && njs_number(src) == 0
+ && signbit(njs_number(src))))
+ {
+ njs_string_get(&njs_string_minus_zero, dst);
+ return NXT_OK;
+ }
+
+ exception = 1;
+
+again:
+
+ ret = njs_vm_value_to_string(vm, dst, src);
+
+ if (nxt_fast_path(ret == NXT_OK)) {
+
+ if (njs_vm_backtrace(vm) != NULL) {
+ ret = njs_vm_backtrace_dump(vm, dst, src);
+ if (nxt_slow_path(ret != NXT_OK)) {
+ return NXT_ERROR;
+ }
+ }
+
+ return NXT_OK;
+ }
+
+ if (exception) {
+ exception = 0;
+
+ /* value evaluation threw an exception. */
+
+ vm->top_frame->trap_tries = 0;
+
+ src = &vm->retval;
+ goto again;
+ }
+
+ dst->length = 0;
+ dst->start = NULL;
+
+ return NXT_ERROR;
+}
+
+
njs_ret_t
-njs_vm_retval_to_ext_string(njs_vm_t *vm, nxt_str_t *dst)
+njs_vm_retval_string(njs_vm_t *vm, nxt_str_t *dst)
{
if (vm->top_frame == NULL) {
/* An exception was thrown during compilation. */
njs_vm_init(vm);
}
- return njs_vm_value_to_ext_string(vm, dst, &vm->retval, 1);
+ return njs_vm_value_string(vm, dst, &vm->retval);
}
uint32_t size);
NXT_EXPORT nxt_int_t njs_vm_value_string_copy(njs_vm_t *vm, nxt_str_t *retval,
const njs_value_t *value, uintptr_t *next);
-NXT_EXPORT njs_ret_t njs_vm_value_to_ext_string(njs_vm_t *vm, nxt_str_t *dst,
- const njs_value_t *src, nxt_uint_t handle_exception);
-NXT_EXPORT njs_ret_t njs_vm_retval_to_ext_string(njs_vm_t *vm, nxt_str_t *dst);
+
+/*
+ * Converts a value to string.
+ */
+NXT_EXPORT njs_ret_t njs_vm_value_to_string(njs_vm_t *vm, nxt_str_t *dst,
+ const njs_value_t *src);
+
+/*
+ * Calls njs_vm_value_to_string(), if exception was thrown adds backtrace.
+ */
+NXT_EXPORT njs_ret_t njs_vm_value_string(njs_vm_t *vm, nxt_str_t *dst,
+ const njs_value_t *src);
+NXT_EXPORT njs_ret_t njs_vm_retval_string(njs_vm_t *vm, nxt_str_t *dst);
NXT_EXPORT njs_ret_t njs_vm_value_dump(njs_vm_t *vm, nxt_str_t *dst,
const njs_value_t *value, nxt_uint_t console, nxt_uint_t indent);
exception:
- njs_vm_value_to_ext_string(vm, retval, &vm->retval, 1);
+ njs_vm_value_string(vm, retval, &vm->retval);
return NXT_OK;
}
pq = (njs_property_query_t *) vm->stash;
if (!njs_is_null_or_undefined(setval)) {
- ret = njs_vm_value_to_ext_string(vm, &s, setval, 0);
+ ret = njs_vm_value_to_string(vm, &s, setval);
if (nxt_slow_path(ret != NXT_OK)) {
return ret;
}
njs_ret_t
-njs_vm_value_to_ext_string(njs_vm_t *vm, nxt_str_t *dst, const njs_value_t *src,
- nxt_uint_t handle_exception)
+njs_vm_value_to_string(njs_vm_t *vm, nxt_str_t *dst, const njs_value_t *src)
{
- u_char *p, *start, *end;
- size_t len, size, count;
- njs_ret_t ret;
- nxt_uint_t i, exception;
- nxt_array_t *backtrace;
- njs_value_t value;
- njs_backtrace_entry_t *be, *prev;
-
- exception = handle_exception;
-
-again:
-
- if (nxt_fast_path(src != NULL)) {
-
- if (nxt_slow_path(src->type == NJS_OBJECT_INTERNAL_ERROR)) {
-
- /* MemoryError is a nonextensible internal error. */
-
- if (!src->data.u.object->extensible) {
- njs_string_get(&njs_string_memory_error, dst);
- return NXT_OK;
- }
- }
-
- value = *src;
-
- if (nxt_slow_path(!njs_is_primitive(&value))) {
+ u_char *start;
+ size_t size;
+ njs_ret_t ret;
+ njs_value_t value;
- ret = njs_object_value_to_string(vm, &value);
+ if (nxt_slow_path(src == NULL)) {
+ return NXT_ERROR;
+ }
- if (nxt_slow_path(ret != NXT_OK)) {
- goto fail;
- }
+ if (nxt_slow_path(src->type == NJS_OBJECT_INTERNAL_ERROR)) {
+ /* MemoryError is a nonextensible internal error. */
+ if (!src->data.u.object->extensible) {
+ njs_string_get(&njs_string_memory_error, dst);
+ return NXT_OK;
}
+ }
- if (nxt_slow_path((value.type == NJS_NUMBER
- && value.data.u.number == 0
- && signbit(value.data.u.number))))
- {
- value = njs_string_minus_zero;
- ret = NXT_OK;
+ value = *src;
- } else {
- ret = njs_primitive_value_to_string(vm, &value, &value);
+ if (nxt_slow_path(!njs_is_primitive(&value))) {
+ ret = njs_object_value_to_string(vm, &value);
+ if (nxt_slow_path(ret != NXT_OK)) {
+ return ret;
}
+ }
- if (nxt_fast_path(ret == NXT_OK)) {
- size = value.short_string.size;
-
- if (size != NJS_STRING_LONG) {
- start = nxt_mp_alloc(vm->mem_pool, size);
- if (nxt_slow_path(start == NULL)) {
- njs_memory_error(vm);
- return NXT_ERROR;
- }
+ ret = njs_primitive_value_to_string(vm, &value, &value);
- memcpy(start, value.short_string.start, size);
+ if (nxt_fast_path(ret == NXT_OK)) {
+ size = value.short_string.size;
- } else {
- size = value.long_string.size;
- start = value.long_string.data->start;
+ if (size != NJS_STRING_LONG) {
+ start = nxt_mp_alloc(vm->mem_pool, size);
+ if (nxt_slow_path(start == NULL)) {
+ njs_memory_error(vm);
+ return NXT_ERROR;
}
- dst->length = size;
- dst->start = start;
-
- if (exception && njs_vm_backtrace(vm) != NULL) {
-
- backtrace = njs_vm_backtrace(vm);
-
- len = dst->length + 1;
-
- count = 0;
- prev = NULL;
-
- be = backtrace->start;
-
- for (i = 0; i < backtrace->items; i++) {
- if (i != 0 && prev->name.start == be->name.start
- && prev->line == be->line)
- {
- count++;
-
- } else {
-
- if (count != 0) {
- len += nxt_length(" repeats times\n")
- + NXT_INT_T_LEN;
- count = 0;
- }
-
- len += be->name.length + nxt_length(" at ()\n");
-
- if (be->line != 0) {
- len += be->file.length + NXT_INT_T_LEN + 1;
+ memcpy(start, value.short_string.start, size);
- } else {
- len += nxt_length("native");
- }
- }
-
- prev = be;
- be++;
- }
-
- p = nxt_mp_alloc(vm->mem_pool, len);
- if (p == NULL) {
- njs_memory_error(vm);
- return NXT_ERROR;
- }
-
- start = p;
- end = start + len;
-
- p = nxt_cpymem(p, dst->start, dst->length);
- *p++ = '\n';
-
- count = 0;
- prev = NULL;
-
- be = backtrace->start;
-
- for (i = 0; i < backtrace->items; i++) {
- if (i != 0 && prev->name.start == be->name.start
- && prev->line == be->line)
- {
- count++;
-
- } else {
- if (count != 0) {
- p = nxt_sprintf(p, end, " repeats %uz times\n",
- count);
- count = 0;
- }
-
- p = nxt_sprintf(p, end, " at %V ", &be->name);
-
- if (be->line != 0) {
- p = nxt_sprintf(p, end, "(%V:%uD)\n", &be->file,
- be->line);
-
- } else {
- p = nxt_sprintf(p, end, "(native)\n");
- }
- }
-
- prev = be;
- be++;
- }
-
- dst->start = start;
- dst->length = p - dst->start;
- }
-
- return NXT_OK;
+ } else {
+ size = value.long_string.size;
+ start = value.long_string.data->start;
}
- }
-
-fail:
-
- if (handle_exception) {
- handle_exception = 0;
-
- /* value evaluation threw an exception. */
- vm->top_frame->trap_tries = 0;
-
- src = &vm->retval;
- goto again;
+ dst->length = size;
+ dst->start = start;
}
- dst->length = 0;
- dst->start = NULL;
-
- return NXT_ERROR;
+ return ret;
}
/*
* Prevent njs_vmcode_interpreter() to unwind the current frame if
* an exception happens. It preserves the current frame state if
- * njs_vm_value_to_ext_string() is called from within njs_vm_run().
+ * njs_vm_value_string() is called from within njs_vm_run().
*/
previous = vm->top_frame->previous;
vm->top_frame->previous = NULL;
return NXT_ERROR;
}
- return njs_vm_value_to_ext_string(vm, retval, value, 0);
+ return njs_vm_value_to_string(vm, retval, value);
}
}
-nxt_array_t *
-njs_vm_backtrace(njs_vm_t *vm)
-{
- if (vm->backtrace != NULL && !nxt_array_is_empty(vm->backtrace)) {
- return vm->backtrace;
- }
-
- return NULL;
-}
-
-
void
njs_debug(njs_index_t index, njs_value_t *value)
{
(void) njs_vm_start(nvm);
- if (njs_vm_retval_to_ext_string(nvm, &s) != NXT_OK) {
- nxt_printf("njs_vm_retval_to_ext_string() failed\n");
+ if (njs_vm_retval_string(nvm, &s) != NXT_OK) {
+ nxt_printf("njs_vm_retval_string() failed\n");
goto done;
}
" repeats 2 times\n"
" at main (native)\n") },
- /* Exception in njs_vm_retval_to_ext_string() */
+ /* Exception in njs_vm_retval_string() */
{ nxt_string("var o = { toString: function() { return [1] } }" ENTER
"o" ENTER),
}
}
- if (njs_vm_retval_to_ext_string(vm, &s) != NXT_OK) {
- nxt_printf("njs_vm_retval_to_ext_string() failed\n");
+ if (njs_vm_retval_string(vm, &s) != NXT_OK) {
+ nxt_printf("njs_vm_retval_string() failed\n");
goto done;
}
return NJS_ERROR;
}
- ret = njs_vm_value_to_ext_string(vm, &s, njs_arg(args, nargs, 1), 0);
+ ret = njs_vm_value_to_string(vm, &s, njs_arg(args, nargs, 1));
if (ret == NXT_OK && s.length == 3 && memcmp(s.start, "YES", 3) == 0) {
return njs_vm_value_string_set(vm, njs_vm_retval(vm), r->uri.start,
r->uri.length);
return NJS_ERROR;
}
- if (njs_vm_value_to_ext_string(vm, &uri, njs_arg(args, nargs, 1), 0)
- != NJS_OK)
- {
+ if (njs_vm_value_to_string(vm, &uri, njs_arg(args, nargs, 1)) != NJS_OK) {
return NJS_ERROR;
}
ret = njs_vm_start(nvm);
- if (njs_vm_retval_to_ext_string(nvm, &s) != NXT_OK) {
- nxt_printf("njs_vm_retval_to_ext_string() failed\n");
+ if (njs_vm_retval_string(nvm, &s) != NXT_OK) {
+ nxt_printf("njs_vm_retval_string() failed\n");
goto done;
}
} else {
- if (njs_vm_retval_to_ext_string(vm, &s) != NXT_OK) {
- nxt_printf("njs_vm_retval_to_ext_string() failed\n");
+ if (njs_vm_retval_string(vm, &s) != NXT_OK) {
+ nxt_printf("njs_vm_retval_string() failed\n");
goto done;
}
}
goto done;
}
- if (njs_vm_retval_to_ext_string(vm, &s) != NXT_OK) {
- nxt_printf("njs_vm_retval_to_ext_string() failed\n");
+ if (njs_vm_retval_string(vm, &s) != NXT_OK) {
+ nxt_printf("njs_vm_retval_string() failed\n");
goto done;
}
nxt_printf("njs_vm_json_test passed\n");
} else {
- if (njs_vm_retval_to_ext_string(vm, &s) != NXT_OK) {
- nxt_printf("njs_vm_retval_to_ext_string() failed\n");
+ if (njs_vm_retval_string(vm, &s) != NXT_OK) {
+ nxt_printf("njs_vm_retval_string() failed\n");
} else {
nxt_printf("%V\n", &s);