#include <nxt_mem_cache_pool.h>
#include <njscript.h>
-#include <njs_vm.h>
-#include <njs_string.h>
#define NGX_HTTP_JS_MCP_CLUSTER_SIZE (2 * ngx_pagesize)
}
if (njs_vm_call(ctx->vm, func, ctx->args, 2) != NJS_OK) {
- njs_vm_retval(ctx->vm, &exception);
+ njs_vm_retval_to_ext_string(ctx->vm, &exception);
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
"js exception: %*s", exception.length, exception.start);
}
if (njs_vm_call(ctx->vm, func, ctx->args, 2) != NJS_OK) {
- njs_vm_retval(ctx->vm, &exception);
+ njs_vm_retval_to_ext_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(ctx->vm, &value) != NJS_OK) {
+ if (njs_vm_retval_to_ext_string(ctx->vm, &value) != NJS_OK) {
return NGX_ERROR;
}
r = njs_value_data(njs_argument(args, 0));
c = r->connection;
- if (njs_value_to_ext_string(vm, &msg, njs_argument(args, 1)) == NJS_ERROR)
+ if (njs_vm_value_to_ext_string(vm, &msg, njs_argument(args, 1), 0)
+ == NJS_ERROR)
{
return NJS_ERROR;
}
rc = njs_vm_compile(jlcf->vm, &start, end);
if (rc != NJS_OK) {
- njs_vm_retval(jlcf->vm, &text);
+ njs_vm_retval_to_ext_string(jlcf->vm, &text);
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
"%*s, included",
#include <nxt_mem_cache_pool.h>
#include <njscript.h>
-#include <njs_vm.h>
-#include <njs_string.h>
#define NGX_STREAM_JS_MCP_CLUSTER_SIZE (2 * ngx_pagesize)
}
if (njs_vm_call(ctx->vm, func, ctx->arg, 1) != NJS_OK) {
- njs_vm_retval(ctx->vm, &exception);
+ njs_vm_retval_to_ext_string(ctx->vm, &exception);
ngx_log_error(NGX_LOG_ERR, c->log, 0, "js exception: %*s",
exception.length, exception.start);
return NGX_ERROR;
}
- if (ctx->vm->retval.type == NJS_VOID) {
+ if (njs_value_is_void(njs_vm_retval(ctx->vm))) {
return NGX_OK;
}
- if (njs_vm_retval(ctx->vm, &value) != NJS_OK) {
+ if (njs_vm_retval_to_ext_string(ctx->vm, &value) != NJS_OK) {
return NGX_ERROR;
}
ctx->buf = in->buf;
if (njs_vm_call(ctx->vm, func, ctx->arg, 1) != NJS_OK) {
- njs_vm_retval(ctx->vm, &exception);
+ njs_vm_retval_to_ext_string(ctx->vm, &exception);
ngx_log_error(NGX_LOG_ERR, c->log, 0, "js exception: %*s",
exception.length, exception.start);
return NGX_ERROR;
}
- if (ctx->vm->retval.type != NJS_VOID) {
- if (njs_vm_retval(ctx->vm, &value) != NJS_OK) {
+ if (!njs_value_is_void(njs_vm_retval(ctx->vm))) {
+ if (njs_vm_retval_to_ext_string(ctx->vm, &value) != NJS_OK) {
return NGX_ERROR;
}
}
if (njs_vm_call(ctx->vm, func, ctx->arg, 1) != NJS_OK) {
- njs_vm_retval(ctx->vm, &exception);
+ njs_vm_retval_to_ext_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(ctx->vm, &value) != NJS_OK) {
+ if (njs_vm_retval_to_ext_string(ctx->vm, &value) != NJS_OK) {
return NGX_ERROR;
}
b = ctx->filter ? ctx->buf : c->buffer;
- *value = (b && b->last_buf ? njs_value_true : njs_value_false);
+ njs_value_boolean_set(value, b && b->last_buf);
return NJS_OK;
}
s = (ngx_stream_session_t *) obj;
ctx = ngx_stream_get_module_ctx(s, ngx_stream_js_module);
- *value = (ctx->from_upstream ? njs_value_true : njs_value_false);
+ njs_value_boolean_set(value, ctx->from_upstream);
return NJS_OK;
}
s = njs_value_data(njs_argument(args, 0));
c = s->connection;
- if (njs_value_to_ext_string(vm, &msg, njs_argument(args, 1)) == NJS_ERROR) {
+ if (njs_vm_value_to_ext_string(vm, &msg, njs_argument(args, 1), 0)
+ == NJS_ERROR)
+ {
return NJS_ERROR;
}
ngx_stream_js_ext_get_code(njs_vm_t *vm, njs_value_t *value, void *obj,
uintptr_t data)
{
- ngx_memzero(value, sizeof(njs_value_t));
-
- value->data.type = NJS_NUMBER;
- value->data.u.number = data;
+ njs_value_number_set(value, (double) data);
return NJS_OK;
}
rc = njs_vm_compile(jscf->vm, &start, end);
if (rc != NJS_OK) {
- njs_vm_retval(jscf->vm, &text);
+ njs_vm_retval_to_ext_string(jscf->vm, &text);
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
"%*s, included",
}
}
- if (njs_vm_retval(vm, out) != NXT_OK) {
+ if (njs_vm_retval_to_ext_string(vm, out) != NXT_OK) {
return NXT_ERROR;
}
msg.start = NULL;
if (nargs >= 2
- && njs_value_to_ext_string(vm, &msg, njs_argument(args, 1))
+ && njs_vm_value_to_ext_string(vm, &msg, njs_argument(args, 1), 0)
== NJS_ERROR)
{
static njs_ret_t
njs_array_prototype_length(njs_vm_t *vm, njs_value_t *array)
{
- njs_number_set(&vm->retval, array->data.u.array->length);
+ njs_value_number_set(&vm->retval, array->data.u.array->length);
njs_release(vm, array);
}
}
- njs_number_set(&vm->retval, array->length);
+ njs_value_number_set(&vm->retval, array->length);
}
return NXT_OK;
} while (n > 1);
}
- njs_number_set(&vm->retval, array->length);
+ njs_value_number_set(&vm->retval, array->length);
}
return NXT_OK;
done:
- njs_number_set(&vm->retval, index);
+ njs_value_number_set(&vm->retval, index);
return NXT_OK;
}
done:
- njs_number_set(&vm->retval, index);
+ njs_value_number_set(&vm->retval, index);
return NXT_OK;
}
index = -1;
}
- njs_number_set(&vm->retval, index);
+ njs_value_number_set(&vm->retval, index);
return NXT_OK;
}
arguments[1] = *value;
- njs_number_set(&arguments[2], n);
+ njs_value_number_set(&arguments[2], n);
arguments[3] = args[0];
arguments[2] = array->start[n];
- njs_number_set(&arguments[3], n);
+ njs_value_number_set(&arguments[3], n);
arguments[4] = args[0];
n = iter->index;
arguments[1] = args[0].data.u.array->start[n];
- njs_number_set(&arguments[2], n);
+ njs_value_number_set(&arguments[2], n);
arguments[3] = args[0];
arguments[2] = array->start[n];
- njs_number_set(&arguments[3], n);
+ njs_value_number_set(&arguments[3], n);
arguments[4] = args[0];
ret = njs_string_cmp(&args[1], &args[2]);
- njs_number_set(&vm->retval, ret);
+ njs_value_number_set(&vm->retval, ret);
return NXT_OK;
}
done:
- njs_number_set(&vm->retval, time);
+ njs_value_number_set(&vm->retval, time);
return NXT_OK;
}
njs_date_now(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
njs_index_t unused)
{
- njs_number_set(&vm->retval, njs_gettime());
+ njs_value_number_set(&vm->retval, njs_gettime());
return NXT_OK;
}
time = NAN;
}
- njs_number_set(&vm->retval, time);
+ njs_value_number_set(&vm->retval, time);
return NXT_OK;
}
njs_date_prototype_value_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
njs_index_t unused)
{
- njs_number_set(&vm->retval, args[0].data.u.date->time);
+ njs_value_number_set(&vm->retval, args[0].data.u.date->time);
return NXT_OK;
}
value = tm.tm_year + 1900;
}
- njs_number_set(&vm->retval, value);
+ njs_value_number_set(&vm->retval, value);
return NXT_OK;
}
value = tm.tm_year + 1900;
}
- njs_number_set(&vm->retval, value);
+ njs_value_number_set(&vm->retval, value);
return NXT_OK;
}
value = tm.tm_mon;
}
- njs_number_set(&vm->retval, value);
+ njs_value_number_set(&vm->retval, value);
return NXT_OK;
}
value = tm.tm_mon;
}
- njs_number_set(&vm->retval, value);
+ njs_value_number_set(&vm->retval, value);
return NXT_OK;
}
value = tm.tm_mday;
}
- njs_number_set(&vm->retval, value);
+ njs_value_number_set(&vm->retval, value);
return NXT_OK;
}
value = tm.tm_mday;
}
- njs_number_set(&vm->retval, value);
+ njs_value_number_set(&vm->retval, value);
return NXT_OK;
}
value = tm.tm_wday;
}
- njs_number_set(&vm->retval, value);
+ njs_value_number_set(&vm->retval, value);
return NXT_OK;
}
value = tm.tm_wday;
}
- njs_number_set(&vm->retval, value);
+ njs_value_number_set(&vm->retval, value);
return NXT_OK;
}
value = tm.tm_hour;
}
- njs_number_set(&vm->retval, value);
+ njs_value_number_set(&vm->retval, value);
return NXT_OK;
}
value = tm.tm_hour;
}
- njs_number_set(&vm->retval, value);
+ njs_value_number_set(&vm->retval, value);
return NXT_OK;
}
value = tm.tm_min;
}
- njs_number_set(&vm->retval, value);
+ njs_value_number_set(&vm->retval, value);
return NXT_OK;
}
value = tm.tm_min;
}
- njs_number_set(&vm->retval, value);
+ njs_value_number_set(&vm->retval, value);
return NXT_OK;
}
value = (int64_t) (value / 1000) % 60;
}
- njs_number_set(&vm->retval, value);
+ njs_value_number_set(&vm->retval, value);
return NXT_OK;
}
value = (int64_t) value % 1000;
}
- njs_number_set(&vm->retval, value);
+ njs_value_number_set(&vm->retval, value);
return NXT_OK;
}
value = - nxt_timezone(&tm) / 60;
}
- njs_number_set(&vm->retval, value);
+ njs_value_number_set(&vm->retval, value);
return NXT_OK;
}
}
args[0].data.u.date->time = time;
- njs_number_set(&vm->retval, time);
+ njs_value_number_set(&vm->retval, time);
return NXT_OK;
}
}
args[0].data.u.date->time = time;
- njs_number_set(&vm->retval, time);
+ njs_value_number_set(&vm->retval, time);
return NXT_OK;
}
}
args[0].data.u.date->time = time;
- njs_number_set(&vm->retval, time);
+ njs_value_number_set(&vm->retval, time);
return NXT_OK;
}
}
args[0].data.u.date->time = time;
- njs_number_set(&vm->retval, time);
+ njs_value_number_set(&vm->retval, time);
return NXT_OK;
}
}
args[0].data.u.date->time = time;
- njs_number_set(&vm->retval, time);
+ njs_value_number_set(&vm->retval, time);
return NXT_OK;
}
}
args[0].data.u.date->time = time;
- njs_number_set(&vm->retval, time);
+ njs_value_number_set(&vm->retval, time);
return NXT_OK;
}
}
args[0].data.u.date->time = time;
- njs_number_set(&vm->retval, time);
+ njs_value_number_set(&vm->retval, time);
return NXT_OK;
}
}
args[0].data.u.date->time = time;
- njs_number_set(&vm->retval, time);
+ njs_value_number_set(&vm->retval, time);
return NXT_OK;
}
}
args[0].data.u.date->time = time;
- njs_number_set(&vm->retval, time);
+ njs_value_number_set(&vm->retval, time);
return NXT_OK;
}
}
args[0].data.u.date->time = time;
- njs_number_set(&vm->retval, time);
+ njs_value_number_set(&vm->retval, time);
return NXT_OK;
}
}
args[0].data.u.date->time = time;
- njs_number_set(&vm->retval, time);
+ njs_value_number_set(&vm->retval, time);
return NXT_OK;
}
}
args[0].data.u.date->time = time;
- njs_number_set(&vm->retval, time);
+ njs_value_number_set(&vm->retval, time);
return NXT_OK;
}
}
args[0].data.u.date->time = time;
- njs_number_set(&vm->retval, time);
+ njs_value_number_set(&vm->retval, time);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = 32;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
}
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = 0;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = -INFINITY;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = INFINITY;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = nxt_random(&vm->random) / 4294967296.0;
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
done:
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
num = njs_string_to_number(&args[1], 1);
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
(void) njs_string_prop(&string, ®exp->string);
index = njs_string_index(&string, regexp->last_index);
- njs_number_set(&vm->retval, index);
+ njs_value_number_set(&vm->retval, index);
return NXT_OK;
}
/* TODO: Non UTF-8 position */
- njs_number_set(&prop->value, regexp->last_index + captures[0]);
+ njs_value_number_set(&prop->value, regexp->last_index + captures[0]);
if (regexp->pattern->global) {
regexp->last_index += captures[1];
length = (length == 0) ? size : length;
}
- njs_number_set(&vm->retval, length);
+ njs_value_number_set(&vm->retval, length);
njs_release(vm, value);
done:
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return NXT_OK;
}
done:
- njs_number_set(&vm->retval, index);
+ njs_value_number_set(&vm->retval, index);
return NXT_OK;
}
done:
- njs_number_set(&vm->retval, index);
+ njs_value_number_set(&vm->retval, index);
return NXT_OK;
}
done:
- njs_number_set(&vm->retval, index);
+ njs_value_number_set(&vm->retval, index);
return NXT_OK;
}
}
/* The offset of the matched substring. */
- njs_number_set(&arguments[n + 1], captures[0]);
+ njs_value_number_set(&arguments[n + 1], captures[0]);
/* The whole string being examined. */
length = njs_string_length(r->utf8, r->part[0].start, r->part[0].size);
arguments[1] = args[1];
/* The offset of the matched substring. */
- njs_number_set(&arguments[2], r->part[0].size);
+ njs_value_number_set(&arguments[2], r->part[0].size);
/* The whole string being examined. */
arguments[3] = args[0];
njs_ret_t njs_string_new(njs_vm_t *vm, njs_value_t *value, const u_char *start,
uint32_t size, uint32_t length);
-u_char *njs_string_alloc(njs_vm_t *vm, njs_value_t *value, uint32_t size,
- uint32_t length);
void njs_string_copy(njs_value_t *dst, njs_value_t *src);
njs_ret_t njs_string_validate(njs_vm_t *vm, njs_string_prop_t *string,
njs_value_t *value);
#include <njs_parser.h>
#include <njs_regexp.h>
#include <string.h>
+#include <stdio.h>
/* The values must be greater than NXT_OK. */
}
if (ext->set != NULL) {
- ret = njs_value_to_ext_string(vm, &s, value);
+ ret = njs_vm_value_to_ext_string(vm, &s, value, 0);
if (nxt_slow_path(ret != NXT_OK)) {
return ret;
}
n = next->index++;
if (njs_is_valid(&array->start[n])) {
- njs_number_set(retval, n);
+ njs_value_number_set(retval, n);
return code->offset;
}
njs_release(vm, reference);
- njs_number_set(reference, num);
+ njs_value_number_set(reference, num);
vm->retval = *reference;
return sizeof(njs_vmcode_3addr_t);
njs_release(vm, reference);
- njs_number_set(reference, num);
+ njs_value_number_set(reference, num);
vm->retval = *reference;
return sizeof(njs_vmcode_3addr_t);
njs_release(vm, reference);
- njs_number_set(reference, num + 1.0);
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(reference, num + 1.0);
+ njs_value_number_set(&vm->retval, num);
return sizeof(njs_vmcode_3addr_t);
}
njs_release(vm, reference);
- njs_number_set(reference, num - 1.0);
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(reference, num - 1.0);
+ njs_value_number_set(&vm->retval, num);
return sizeof(njs_vmcode_3addr_t);
}
njs_vmcode_unary_plus(njs_vm_t *vm, njs_value_t *value, njs_value_t *invld)
{
if (nxt_fast_path(njs_is_numeric(value))) {
- njs_number_set(&vm->retval, value->data.u.number);
+ njs_value_number_set(&vm->retval, value->data.u.number);
return sizeof(njs_vmcode_2addr_t);
}
njs_vmcode_unary_negation(njs_vm_t *vm, njs_value_t *value, njs_value_t *invld)
{
if (nxt_fast_path(njs_is_numeric(value))) {
- njs_number_set(&vm->retval, - value->data.u.number);
+ njs_value_number_set(&vm->retval, - value->data.u.number);
return sizeof(njs_vmcode_2addr_t);
}
if (nxt_fast_path(njs_is_numeric(val1) && njs_is_numeric(val2))) {
num = val1->data.u.number + val2->data.u.number;
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return sizeof(njs_vmcode_3addr_t);
}
if (nxt_fast_path(njs_is_numeric(val1) && njs_is_numeric(val2))) {
num = val1->data.u.number - val2->data.u.number;
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return sizeof(njs_vmcode_3addr_t);
}
if (nxt_fast_path(njs_is_numeric(val1) && njs_is_numeric(val2))) {
num = val1->data.u.number * val2->data.u.number;
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return sizeof(njs_vmcode_3addr_t);
}
num = NAN;
}
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return sizeof(njs_vmcode_3addr_t);
}
if (nxt_fast_path(njs_is_numeric(val1) && njs_is_numeric(val2))) {
num = val1->data.u.number / val2->data.u.number;
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return sizeof(njs_vmcode_3addr_t);
}
if (nxt_fast_path(njs_is_numeric(val1) && njs_is_numeric(val2))) {
num = fmod(val1->data.u.number, val2->data.u.number);
- njs_number_set(&vm->retval, num);
+ njs_value_number_set(&vm->retval, num);
return sizeof(njs_vmcode_3addr_t);
}
num1 = njs_number_to_integer(val1->data.u.number);
num2 = njs_number_to_integer(val2->data.u.number);
- njs_number_set(&vm->retval, num1 << (num2 & 0x1f));
+ njs_value_number_set(&vm->retval, num1 << (num2 & 0x1f));
return sizeof(njs_vmcode_3addr_t);
}
num1 = njs_number_to_integer(val1->data.u.number);
num2 = njs_number_to_integer(val2->data.u.number);
- njs_number_set(&vm->retval, num1 >> (num2 & 0x1f));
+ njs_value_number_set(&vm->retval, num1 >> (num2 & 0x1f));
return sizeof(njs_vmcode_3addr_t);
}
num1 = njs_number_to_integer(val1->data.u.number);
num2 = njs_number_to_integer(val2->data.u.number);
- njs_number_set(&vm->retval, num1 >> (num2 & 0x1f));
+ njs_value_number_set(&vm->retval, num1 >> (num2 & 0x1f));
return sizeof(njs_vmcode_3addr_t);
}
if (nxt_fast_path(njs_is_numeric(value))) {
num = njs_number_to_integer(value->data.u.number);
- njs_number_set(&vm->retval, ~num);
+ njs_value_number_set(&vm->retval, ~num);
return sizeof(njs_vmcode_2addr_t);
}
num1 = njs_number_to_integer(val1->data.u.number);
num2 = njs_number_to_integer(val2->data.u.number);
- njs_number_set(&vm->retval, num1 & num2);
+ njs_value_number_set(&vm->retval, num1 & num2);
return sizeof(njs_vmcode_3addr_t);
}
num1 = njs_number_to_integer(val1->data.u.number);
num2 = njs_number_to_integer(val2->data.u.number);
- njs_number_set(&vm->retval, num1 ^ num2);
+ njs_value_number_set(&vm->retval, num1 ^ num2);
return sizeof(njs_vmcode_3addr_t);
}
num1 = njs_number_to_integer(val1->data.u.number);
num2 = njs_number_to_integer(val2->data.u.number);
- njs_number_set(&vm->retval, num1 | num2);
+ njs_value_number_set(&vm->retval, num1 | num2);
return sizeof(njs_vmcode_3addr_t);
}
num = njs_string_to_number(value, 0);
}
- njs_number_set(value, num);
+ njs_value_number_set(value, num);
}
ret = sizeof(njs_vmcode_1addr_t);
num = njs_string_to_number(value, 0);
}
- njs_number_set(value, num);
+ njs_value_number_set(value, num);
}
*vm->top_frame->trap_values[1].data.u.value = *value;
njs_ret_t
-njs_value_to_ext_string(njs_vm_t *vm, nxt_str_t *dst, const njs_value_t *src)
+njs_vm_value_to_ext_string(njs_vm_t *vm, nxt_str_t *dst, const njs_value_t *src,
+ nxt_uint_t handle_exception)
{
- u_char *start;
- size_t size;
- njs_ret_t ret;
- njs_value_t value;
+ u_char *p, *start;
+ size_t len, size;
+ njs_ret_t ret;
+ nxt_uint_t i, exception;
+ nxt_array_t *backtrace;
+ njs_value_t value;
+ njs_backtrace_entry_t *be;
+
+ exception = handle_exception;
+
+again:
if (nxt_fast_path(src != NULL)) {
dst->length = size;
dst->start = start;
+ if (exception && njs_vm_backtrace(vm) != NULL) {
+
+ backtrace = njs_vm_backtrace(vm);
+
+ len = dst->length + 1;
+
+ be = backtrace->start;
+
+ for (i = 0; i < backtrace->items; i++) {
+ if (be[i].line != 0) {
+ len += sizeof(" at (:)\n") - 1 + 10
+ + be[i].name.length;
+
+ } else {
+ len += sizeof(" at (native)\n") - 1
+ + be[i].name.length;
+ }
+ }
+
+ p = nxt_mem_cache_alloc(vm->mem_cache_pool, len);
+ if (p == NULL) {
+ return NXT_ERROR;
+ }
+
+ start = p;
+
+ p = nxt_cpymem(p, dst->start, dst->length);
+ *p++ = '\n';
+
+ for (i = 0; i < backtrace->items; i++) {
+ if (be[i].line != 0) {
+ p += sprintf((char *) p, " at %.*s (:%u)\n",
+ (int) be[i].name.length, be[i].name.start,
+ be[i].line);
+
+ } else {
+ p += sprintf((char *) p, " at %.*s (native)\n",
+ (int) be[i].name.length, be[i].name.start);
+ }
+ }
+
+ dst->start = start;
+ dst->length = p - dst->start;
+ }
+
return NXT_OK;
}
}
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 = 0;
dst->start = NULL;
nxt_noinline void
-njs_number_set(njs_value_t *value, double num)
+njs_value_void_set(njs_value_t *value)
+{
+ *value = njs_value_void;
+}
+
+
+nxt_noinline void
+njs_value_boolean_set(njs_value_t *value, int yn)
+{
+ *value = yn ? njs_value_true : njs_value_false;
+}
+
+
+nxt_noinline void
+njs_value_number_set(njs_value_t *value, double num)
{
value->data.u.number = num;
value->type = NJS_NUMBER;
}
-njs_ret_t
-njs_void_set(njs_value_t *value)
+nxt_noinline void *
+njs_value_data(njs_value_t *value)
{
- *value = njs_value_void;
- return NXT_OK;
+ return value->data.u.data;
}
-void *
-njs_value_data(njs_value_t *value)
+nxt_noinline nxt_int_t
+njs_value_is_void(njs_value_t *value)
{
- return value->data.u.data;
+ return value->type == NJS_VOID;
}
return NXT_ERROR;
}
- return njs_value_to_ext_string(vm, retval, value);
+ return njs_vm_value_to_ext_string(vm, retval, value, 0);
}
}
+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)
{
njs_ret_t njs_native_function_arguments(njs_vm_t *vm, njs_value_t *args,
uint8_t *args_types, nxt_uint_t nargs);
-njs_ret_t njs_value_to_ext_string(njs_vm_t *vm, nxt_str_t *dst,
- const njs_value_t *src);
-void njs_number_set(njs_value_t *value, double num);
-
nxt_int_t njs_builtin_objects_create(njs_vm_t *vm);
nxt_int_t njs_builtin_objects_clone(njs_vm_t *vm);
nxt_int_t njs_builtin_match_native_function(njs_vm_t *vm,
njs_function_t *function, nxt_str_t *name);
+nxt_array_t *njs_vm_backtrace(njs_vm_t *vm);
void *njs_lvlhsh_alloc(void *data, size_t size, nxt_uint_t nalloc);
void njs_lvlhsh_free(void *data, void *p, size_t size);
#include <njs_parser.h>
#include <njs_regexp.h>
#include <string.h>
-#include <stdio.h>
static nxt_int_t njs_vm_init(njs_vm_t *vm);
} else if (vm->retval.type == NJS_STRING) {
- if (njs_value_to_ext_string(vm, &s, &vm->retval) == NJS_OK) {
+ if (njs_vm_value_to_ext_string(vm, &s, &vm->retval, 0) == NJS_OK) {
nxt_thread_log_debug("VM: '%V'", &s);
}
}
-njs_ret_t
-njs_vm_return_string(njs_vm_t *vm, u_char *start, size_t size)
+nxt_noinline njs_value_t *
+njs_vm_retval(njs_vm_t *vm)
{
- return njs_string_create(vm, &vm->retval, start, size, 0);
+ return &vm->retval;
}
-nxt_int_t
-njs_vm_retval(njs_vm_t *vm, nxt_str_t *retval)
+njs_ret_t njs_vm_retval_to_ext_string(njs_vm_t *vm, nxt_str_t *retval)
{
- u_char *p, *start;
- size_t len;
- nxt_int_t ret;
- nxt_uint_t i;
- nxt_array_t *backtrace;
- njs_backtrace_entry_t *be;
-
if (vm->top_frame == NULL) {
/* An exception was thrown during compilation. */
njs_vm_init(vm);
}
- ret = njs_value_to_ext_string(vm, retval, &vm->retval);
-
- if (ret != NXT_OK) {
- /* retval evaluation threw an exception. */
-
- vm->top_frame->trap_tries = 0;
-
- ret = njs_value_to_ext_string(vm, retval, &vm->retval);
- if (ret != NXT_OK) {
- return ret;
- }
- }
-
- backtrace = njs_vm_backtrace(vm);
-
- if (backtrace != NULL) {
-
- len = retval->length + 1;
-
- be = backtrace->start;
-
- for (i = 0; i < backtrace->items; i++) {
- if (be[i].line != 0) {
- len += sizeof(" at (:)\n") - 1 + 10 + be[i].name.length;
-
- } else {
- len += sizeof(" at (native)\n") - 1 + be[i].name.length;
- }
- }
-
- p = nxt_mem_cache_alloc(vm->mem_cache_pool, len);
- if (p == NULL) {
- return NXT_ERROR;
- }
-
- start = p;
-
- p = nxt_cpymem(p, retval->start, retval->length);
- *p++ = '\n';
-
- for (i = 0; i < backtrace->items; i++) {
- if (be[i].line != 0) {
- p += sprintf((char *) p, " at %.*s (:%u)\n",
- (int) be[i].name.length, be[i].name.start,
- be[i].line);
-
- } else {
- p += sprintf((char *) p, " at %.*s (native)\n",
- (int) be[i].name.length, be[i].name.start);
- }
- }
-
- retval->start = start;
- retval->length = p - retval->start;
- }
-
- return NXT_OK;
-}
-
-
-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;
+ return njs_vm_value_to_ext_string(vm, retval, &vm->retval, 1);
}
/*
* Copyright (C) Igor Sysoev
* Copyright (C) NGINX, Inc.
+ *
+ * njsScript public header.
*/
#ifndef _NJSCRIPT_H_INCLUDED_
njs_opaque_value_t *args, nxt_uint_t nargs);
NXT_EXPORT nxt_int_t njs_vm_run(njs_vm_t *vm);
-NXT_EXPORT njs_function_t *njs_vm_function(njs_vm_t *vm, nxt_str_t *name);
-NXT_EXPORT njs_ret_t njs_vm_return_string(njs_vm_t *vm, u_char *start,
- size_t size);
-NXT_EXPORT nxt_int_t njs_vm_retval(njs_vm_t *vm, nxt_str_t *retval);
-NXT_EXPORT nxt_array_t *njs_vm_backtrace(njs_vm_t *vm);
-
NXT_EXPORT void njs_disassembler(njs_vm_t *vm);
+NXT_EXPORT nxt_array_t *njs_vm_completions(njs_vm_t *vm, nxt_str_t *expression);
+
+NXT_EXPORT njs_function_t *njs_vm_function(njs_vm_t *vm, nxt_str_t *name);
+NXT_EXPORT njs_value_t *njs_vm_retval(njs_vm_t *vm);
+NXT_EXPORT u_char * njs_string_alloc(njs_vm_t *vm, njs_value_t *value,
+ uint32_t size, uint32_t length);
NXT_EXPORT njs_ret_t njs_string_create(njs_vm_t *vm, njs_value_t *value,
u_char *start, size_t size, size_t length);
-NXT_EXPORT njs_ret_t njs_void_set(njs_value_t *value);
-NXT_EXPORT void *njs_value_data(njs_value_t *value);
NXT_EXPORT nxt_int_t njs_value_string_copy(njs_vm_t *vm, nxt_str_t *retval,
njs_value_t *value, uintptr_t *next);
-NXT_EXPORT nxt_array_t *njs_vm_completions(njs_vm_t *vm, nxt_str_t *expression);
+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 *retval);
+
+NXT_EXPORT void njs_value_void_set(njs_value_t *value);
+NXT_EXPORT void njs_value_boolean_set(njs_value_t *value, int yn);
+NXT_EXPORT void njs_value_number_set(njs_value_t *value, double num);
+NXT_EXPORT void *njs_value_data(njs_value_t *value);
+
+NXT_EXPORT nxt_int_t njs_value_is_void(njs_value_t *value);
extern const nxt_mem_proto_t njs_vm_mem_cache_pool_proto;
(void) njs_vm_run(nvm);
- if (njs_vm_retval(nvm, &s) != NXT_OK) {
+ if (njs_vm_retval_to_ext_string(nvm, &s) != NXT_OK) {
return NXT_ERROR;
}
"console.ll()\r\nTypeError: cannot find property 'll' of an external object"}
}
-# Exception in njs_vm_retval()
+# Exception in njs_vm_retval_to_ext_string()
njs_test {
{"var o = { toString: function() { return [1] } }\r\n"
"undefined\r\n>> "}
" at fs.readFile (native)\n"
" at main (native)\n") },
- /* Exception in njs_vm_retval() */
+ /* Exception in njs_vm_retval_to_ext_string() */
{ nxt_string("var o = { toString: function() { return [1] } }" ENTER
"o" ENTER),
}
}
- if (njs_vm_retval(vm, &s) != NXT_OK) {
+ if (njs_vm_retval_to_ext_string(vm, &s) != NXT_OK) {
return NXT_ERROR;
}
if (ret == NXT_OK && s.length == 3 && memcmp(s.start, "YES", 3) == 0) {
r = njs_value_data(njs_argument(args, 0));
- njs_vm_return_string(vm, r->uri.start, r->uri.length);
+ njs_string_create(vm, njs_vm_retval(vm), r->uri.start,
+ r->uri.length, 0);
return NXT_OK;
}
ret = njs_vm_run(nvm);
- if (njs_vm_retval(nvm, &s) != NXT_OK) {
+ if (njs_vm_retval_to_ext_string(nvm, &s) != NXT_OK) {
return NXT_ERROR;
}
} else {
- if (njs_vm_retval(vm, &s) != NXT_OK) {
+ if (njs_vm_retval_to_ext_string(vm, &s) != NXT_OK) {
return NXT_ERROR;
}