]> git.kaiwu.me - njs.git/commitdiff
Fixed using of internal NJS headers in nginx modules.
authorDmitry Volyntsev <xeioex@nginx.com>
Mon, 12 Feb 2018 11:57:24 +0000 (14:57 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Mon, 12 Feb 2018 11:57:24 +0000 (14:57 +0300)
Public API is rectified to make it easier to work with the private
structure njs_value_t from the outside:
    1) njs_vm_retval() is split into njs_vm_retval() which now returns
    the njs_value_t * as a return value and njs_vm_value_to_ext_string()
    which stringifies an njs_value_t * passed as an argument.

    2) njs_value_*_set() methods are added.
    3) Similar public methods are grouped together.

18 files changed:
nginx/ngx_http_js_module.c
nginx/ngx_stream_js_module.c
njs/njs.c
njs/njs_array.c
njs/njs_date.c
njs/njs_math.c
njs/njs_number.c
njs/njs_regexp.c
njs/njs_string.c
njs/njs_string.h
njs/njs_vm.c
njs/njs_vm.h
njs/njscript.c
njs/njscript.h
njs/test/njs_benchmark.c
njs/test/njs_expect_test.exp
njs/test/njs_interactive_test.c
njs/test/njs_unit_test.c

index 86c8331310cad1b7a7880ea30e630128b7fd1152..b717334c4c01775280a535a4c33b563c43fb0b01 100644 (file)
@@ -20,8 +20,6 @@
 #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)
@@ -445,7 +443,7 @@ ngx_http_js_handler(ngx_http_request_t *r)
     }
 
     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);
@@ -496,7 +494,7 @@ ngx_http_js_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,
     }
 
     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);
@@ -505,7 +503,7 @@ ngx_http_js_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,
         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;
     }
 
@@ -1024,7 +1022,8 @@ ngx_http_js_ext_log(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     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;
     }
@@ -1334,7 +1333,7 @@ ngx_http_js_include(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
     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",
index 6acd6e63fa9bfd53d1480eaa76f27edf515e6597..e8380b4adc24c33a7ea5f64da22bb8ee4c1c7a5a 100644 (file)
@@ -20,8 +20,6 @@
 #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)
@@ -408,7 +406,7 @@ ngx_stream_js_phase_handler(ngx_stream_session_t *s, ngx_str_t *name)
     }
 
     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);
@@ -416,11 +414,11 @@ ngx_stream_js_phase_handler(ngx_stream_session_t *s, ngx_str_t *name)
         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;
     }
 
@@ -495,7 +493,7 @@ ngx_stream_js_body_filter(ngx_stream_session_t *s, ngx_chain_t *in,
         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);
@@ -503,8 +501,8 @@ ngx_stream_js_body_filter(ngx_stream_session_t *s, ngx_chain_t *in,
             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;
             }
 
@@ -593,7 +591,7 @@ ngx_stream_js_variable(ngx_stream_session_t *s, ngx_stream_variable_value_t *v,
     }
 
     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);
@@ -602,7 +600,7 @@ ngx_stream_js_variable(ngx_stream_session_t *s, ngx_stream_variable_value_t *v,
         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;
     }
 
@@ -746,7 +744,7 @@ ngx_stream_js_ext_get_eof(njs_vm_t *vm, njs_value_t *value, void *obj,
 
     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;
 }
@@ -762,7 +760,7 @@ ngx_stream_js_ext_get_from_upstream(njs_vm_t *vm, njs_value_t *value, void *obj,
     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;
 }
@@ -874,7 +872,9 @@ ngx_stream_js_ext_log(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     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;
     }
 
@@ -920,10 +920,7 @@ static njs_ret_t
 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;
 }
@@ -1044,7 +1041,7 @@ ngx_stream_js_include(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
     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",
index ebdc5669e0ab35cfb91d4be4d6dc92d8ef0c2958..8d90747babb58e68c19d663824f44d684561540c 100644 (file)
--- a/njs/njs.c
+++ b/njs/njs.c
@@ -445,7 +445,7 @@ njs_process_script(njs_vm_t *vm, njs_opts_t *opts, const nxt_str_t *script,
         }
     }
 
-    if (njs_vm_retval(vm, out) != NXT_OK) {
+    if (njs_vm_retval_to_ext_string(vm, out) != NXT_OK) {
         return NXT_ERROR;
     }
 
@@ -617,7 +617,7 @@ njs_ext_console_log(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     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)
     {
 
index 25270ff3ff99a9fd9cb6cfc17f19b81963a5b872..8ba6897da671f66d552dbdb7c1059c701cd721ee 100644 (file)
@@ -383,7 +383,7 @@ const njs_object_init_t  njs_array_constructor_init = {
 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);
 
@@ -499,7 +499,7 @@ njs_array_prototype_push(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
             }
         }
 
-        njs_number_set(&vm->retval, array->length);
+        njs_value_number_set(&vm->retval, array->length);
     }
 
     return NXT_OK;
@@ -565,7 +565,7 @@ njs_array_prototype_unshift(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
             } while (n > 1);
         }
 
-        njs_number_set(&vm->retval, array->length);
+        njs_value_number_set(&vm->retval, array->length);
     }
 
     return NXT_OK;
@@ -1074,7 +1074,7 @@ njs_array_prototype_index_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 done:
 
-    njs_number_set(&vm->retval, index);
+    njs_value_number_set(&vm->retval, index);
 
     return NXT_OK;
 }
@@ -1133,7 +1133,7 @@ njs_array_prototype_last_index_of(njs_vm_t *vm, njs_value_t *args,
 
 done:
 
-    njs_number_set(&vm->retval, index);
+    njs_value_number_set(&vm->retval, index);
 
     return NXT_OK;
 }
@@ -1574,7 +1574,7 @@ njs_array_prototype_find_index_continuation(njs_vm_t *vm, njs_value_t *args,
         index = -1;
     }
 
-    njs_number_set(&vm->retval, index);
+    njs_value_number_set(&vm->retval, index);
 
     return NXT_OK;
 }
@@ -1602,7 +1602,7 @@ njs_array_prototype_find_apply(njs_vm_t *vm, njs_array_iter_t *iter,
 
     arguments[1] = *value;
 
-    njs_number_set(&arguments[2], n);
+    njs_value_number_set(&arguments[2], n);
 
     arguments[3] = args[0];
 
@@ -1751,7 +1751,7 @@ njs_array_prototype_reduce_continuation(njs_vm_t *vm, njs_value_t *args,
 
     arguments[2] = array->start[n];
 
-    njs_number_set(&arguments[3], n);
+    njs_value_number_set(&arguments[3], n);
 
     arguments[4] = args[0];
 
@@ -1815,7 +1815,7 @@ njs_array_iterator_apply(njs_vm_t *vm, njs_array_iter_t *iter,
     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];
 
@@ -1888,7 +1888,7 @@ njs_array_prototype_reduce_right_continuation(njs_vm_t *vm, njs_value_t *args,
 
     arguments[2] = array->start[n];
 
-    njs_number_set(&arguments[3], n);
+    njs_value_number_set(&arguments[3], n);
 
     arguments[4] = args[0];
 
@@ -1934,7 +1934,7 @@ njs_array_string_sort(njs_vm_t *vm, njs_value_t *args,
 
     ret = njs_string_cmp(&args[1], &args[2]);
 
-    njs_number_set(&vm->retval, ret);
+    njs_value_number_set(&vm->retval, ret);
 
     return NXT_OK;
 }
index 64229af3f4c80f1374d4b5c71b2d6198956b01ed..79d8f32515201b099dad94e3741ead85256385f7 100644 (file)
@@ -219,7 +219,7 @@ njs_date_utc(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 done:
 
-    njs_number_set(&vm->retval, time);
+    njs_value_number_set(&vm->retval, time);
 
     return NXT_OK;
 }
@@ -278,7 +278,7 @@ static njs_ret_t
 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;
 }
@@ -297,7 +297,7 @@ njs_date_parse(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         time = NAN;
     }
 
-    njs_number_set(&vm->retval, time);
+    njs_value_number_set(&vm->retval, time);
 
     return NXT_OK;
 }
@@ -942,7 +942,7 @@ static njs_ret_t
 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;
 }
@@ -1086,7 +1086,7 @@ njs_date_prototype_get_full_year(njs_vm_t *vm, njs_value_t *args,
         value = tm.tm_year + 1900;
     }
 
-    njs_number_set(&vm->retval, value);
+    njs_value_number_set(&vm->retval, value);
 
     return NXT_OK;
 }
@@ -1109,7 +1109,7 @@ njs_date_prototype_get_utc_full_year(njs_vm_t *vm, njs_value_t *args,
         value = tm.tm_year + 1900;
     }
 
-    njs_number_set(&vm->retval, value);
+    njs_value_number_set(&vm->retval, value);
 
     return NXT_OK;
 }
@@ -1132,7 +1132,7 @@ njs_date_prototype_get_month(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         value = tm.tm_mon;
     }
 
-    njs_number_set(&vm->retval, value);
+    njs_value_number_set(&vm->retval, value);
 
     return NXT_OK;
 }
@@ -1156,7 +1156,7 @@ njs_date_prototype_get_utc_month(njs_vm_t *vm, njs_value_t *args,
         value = tm.tm_mon;
     }
 
-    njs_number_set(&vm->retval, value);
+    njs_value_number_set(&vm->retval, value);
 
     return NXT_OK;
 }
@@ -1179,7 +1179,7 @@ njs_date_prototype_get_date(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         value = tm.tm_mday;
     }
 
-    njs_number_set(&vm->retval, value);
+    njs_value_number_set(&vm->retval, value);
 
     return NXT_OK;
 }
@@ -1202,7 +1202,7 @@ njs_date_prototype_get_utc_date(njs_vm_t *vm, njs_value_t *args,
         value = tm.tm_mday;
     }
 
-    njs_number_set(&vm->retval, value);
+    njs_value_number_set(&vm->retval, value);
 
     return NXT_OK;
 }
@@ -1225,7 +1225,7 @@ njs_date_prototype_get_day(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         value = tm.tm_wday;
     }
 
-    njs_number_set(&vm->retval, value);
+    njs_value_number_set(&vm->retval, value);
 
     return NXT_OK;
 }
@@ -1248,7 +1248,7 @@ njs_date_prototype_get_utc_day(njs_vm_t *vm, njs_value_t *args,
         value = tm.tm_wday;
     }
 
-    njs_number_set(&vm->retval, value);
+    njs_value_number_set(&vm->retval, value);
 
     return NXT_OK;
 }
@@ -1272,7 +1272,7 @@ njs_date_prototype_get_hours(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         value = tm.tm_hour;
     }
 
-    njs_number_set(&vm->retval, value);
+    njs_value_number_set(&vm->retval, value);
 
     return NXT_OK;
 }
@@ -1295,7 +1295,7 @@ njs_date_prototype_get_utc_hours(njs_vm_t *vm, njs_value_t *args,
         value = tm.tm_hour;
     }
 
-    njs_number_set(&vm->retval, value);
+    njs_value_number_set(&vm->retval, value);
 
     return NXT_OK;
 }
@@ -1319,7 +1319,7 @@ njs_date_prototype_get_minutes(njs_vm_t *vm, njs_value_t *args,
         value = tm.tm_min;
     }
 
-    njs_number_set(&vm->retval, value);
+    njs_value_number_set(&vm->retval, value);
 
     return NXT_OK;
 }
@@ -1342,7 +1342,7 @@ njs_date_prototype_get_utc_minutes(njs_vm_t *vm, njs_value_t *args,
         value = tm.tm_min;
     }
 
-    njs_number_set(&vm->retval, value);
+    njs_value_number_set(&vm->retval, value);
 
     return NXT_OK;
 }
@@ -1360,7 +1360,7 @@ njs_date_prototype_get_seconds(njs_vm_t *vm, njs_value_t *args,
         value = (int64_t) (value / 1000) % 60;
     }
 
-    njs_number_set(&vm->retval, value);
+    njs_value_number_set(&vm->retval, value);
 
     return NXT_OK;
 }
@@ -1378,7 +1378,7 @@ njs_date_prototype_get_milliseconds(njs_vm_t *vm, njs_value_t *args,
         value = (int64_t) value % 1000;
     }
 
-    njs_number_set(&vm->retval, value);
+    njs_value_number_set(&vm->retval, value);
 
     return NXT_OK;
 }
@@ -1401,7 +1401,7 @@ njs_date_prototype_get_timezone_offset(njs_vm_t *vm, njs_value_t *args,
         value = - nxt_timezone(&tm) / 60;
     }
 
-    njs_number_set(&vm->retval, value);
+    njs_value_number_set(&vm->retval, value);
 
     return NXT_OK;
 }
@@ -1426,7 +1426,7 @@ njs_date_prototype_set_time(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     args[0].data.u.date->time = time;
-    njs_number_set(&vm->retval, time);
+    njs_value_number_set(&vm->retval, time);
 
     return NXT_OK;
 }
@@ -1451,7 +1451,7 @@ njs_date_prototype_set_milliseconds(njs_vm_t *vm, njs_value_t *args,
     }
 
     args[0].data.u.date->time = time;
-    njs_number_set(&vm->retval, time);
+    njs_value_number_set(&vm->retval, time);
 
     return NXT_OK;
 }
@@ -1480,7 +1480,7 @@ njs_date_prototype_set_seconds(njs_vm_t *vm, njs_value_t *args,
     }
 
     args[0].data.u.date->time = time;
-    njs_number_set(&vm->retval, time);
+    njs_value_number_set(&vm->retval, time);
 
     return NXT_OK;
 }
@@ -1519,7 +1519,7 @@ njs_date_prototype_set_minutes(njs_vm_t *vm, njs_value_t *args,
     }
 
     args[0].data.u.date->time = time;
-    njs_number_set(&vm->retval, time);
+    njs_value_number_set(&vm->retval, time);
 
     return NXT_OK;
 }
@@ -1554,7 +1554,7 @@ njs_date_prototype_set_utc_minutes(njs_vm_t *vm, njs_value_t *args,
     }
 
     args[0].data.u.date->time = time;
-    njs_number_set(&vm->retval, time);
+    njs_value_number_set(&vm->retval, time);
 
     return NXT_OK;
 }
@@ -1597,7 +1597,7 @@ njs_date_prototype_set_hours(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     args[0].data.u.date->time = time;
-    njs_number_set(&vm->retval, time);
+    njs_value_number_set(&vm->retval, time);
 
     return NXT_OK;
 }
@@ -1633,7 +1633,7 @@ njs_date_prototype_set_utc_hours(njs_vm_t *vm, njs_value_t *args,
     }
 
     args[0].data.u.date->time = time;
-    njs_number_set(&vm->retval, time);
+    njs_value_number_set(&vm->retval, time);
 
     return NXT_OK;
 }
@@ -1665,7 +1665,7 @@ njs_date_prototype_set_date(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     args[0].data.u.date->time = time;
-    njs_number_set(&vm->retval, time);
+    njs_value_number_set(&vm->retval, time);
 
     return NXT_OK;
 }
@@ -1697,7 +1697,7 @@ njs_date_prototype_set_utc_date(njs_vm_t *vm, njs_value_t *args,
     }
 
     args[0].data.u.date->time = time;
-    njs_number_set(&vm->retval, time);
+    njs_value_number_set(&vm->retval, time);
 
     return NXT_OK;
 }
@@ -1733,7 +1733,7 @@ njs_date_prototype_set_month(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     args[0].data.u.date->time = time;
-    njs_number_set(&vm->retval, time);
+    njs_value_number_set(&vm->retval, time);
 
     return NXT_OK;
 }
@@ -1769,7 +1769,7 @@ njs_date_prototype_set_utc_month(njs_vm_t *vm, njs_value_t *args,
     }
 
     args[0].data.u.date->time = time;
-    njs_number_set(&vm->retval, time);
+    njs_value_number_set(&vm->retval, time);
 
     return NXT_OK;
 }
@@ -1809,7 +1809,7 @@ njs_date_prototype_set_full_year(njs_vm_t *vm, njs_value_t *args,
     }
 
     args[0].data.u.date->time = time;
-    njs_number_set(&vm->retval, time);
+    njs_value_number_set(&vm->retval, time);
 
     return NXT_OK;
 }
@@ -1849,7 +1849,7 @@ njs_date_prototype_set_utc_full_year(njs_vm_t *vm, njs_value_t *args,
     }
 
     args[0].data.u.date->time = time;
-    njs_number_set(&vm->retval, time);
+    njs_value_number_set(&vm->retval, time);
 
     return NXT_OK;
 }
index 0a2831316721f8084214c509e3e82204ba2247f9..108ac029dca8019530013ef59402d812cb4c53f8 100644 (file)
@@ -34,7 +34,7 @@ njs_object_math_abs(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -62,7 +62,7 @@ njs_object_math_acos(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -81,7 +81,7 @@ njs_object_math_acosh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -109,7 +109,7 @@ njs_object_math_asin(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -128,7 +128,7 @@ njs_object_math_asinh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -147,7 +147,7 @@ njs_object_math_atan(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -169,7 +169,7 @@ njs_object_math_atan2(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -188,7 +188,7 @@ njs_object_math_atanh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -207,7 +207,7 @@ njs_object_math_cbrt(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -226,7 +226,7 @@ njs_object_math_ceil(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -247,7 +247,7 @@ njs_object_math_clz32(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = 32;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -266,7 +266,7 @@ njs_object_math_cos(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -285,7 +285,7 @@ njs_object_math_cosh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -304,7 +304,7 @@ njs_object_math_exp(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -323,7 +323,7 @@ njs_object_math_expm1(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -342,7 +342,7 @@ njs_object_math_floor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -361,7 +361,7 @@ njs_object_math_fround(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -392,7 +392,7 @@ njs_object_math_hypot(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         }
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -415,7 +415,7 @@ njs_object_math_imul(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = 0;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -434,7 +434,7 @@ njs_object_math_log(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -453,7 +453,7 @@ njs_object_math_log10(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -472,7 +472,7 @@ njs_object_math_log1p(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -500,7 +500,7 @@ njs_object_math_log2(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -531,7 +531,7 @@ njs_object_math_max(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = -INFINITY;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -562,7 +562,7 @@ njs_object_math_min(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = INFINITY;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -595,7 +595,7 @@ njs_object_math_pow(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -609,7 +609,7 @@ njs_object_math_random(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     num = nxt_random(&vm->random) / 4294967296.0;
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -628,7 +628,7 @@ njs_object_math_round(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -651,7 +651,7 @@ njs_object_math_sign(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -670,7 +670,7 @@ njs_object_math_sin(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -689,7 +689,7 @@ njs_object_math_sinh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -708,7 +708,7 @@ njs_object_math_sqrt(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -727,7 +727,7 @@ njs_object_math_tan(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -746,7 +746,7 @@ njs_object_math_tanh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -765,7 +765,7 @@ njs_object_math_trunc(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = NAN;
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
index 3b648b7d0ceaa7e369ce94bfefb3cfc68b0fab4a..d468dbd5086a3fcfbdca2d1328030b928790e16f 100644 (file)
@@ -848,7 +848,7 @@ njs_number_parse_int(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 done:
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -866,7 +866,7 @@ njs_number_parse_float(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         num = njs_string_to_number(&args[1], 1);
     }
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
index 21d21196139a797f76e60553178085598e5d1a09..bf8a6e5ee22081084b9678b738b1334886a57a0c 100644 (file)
@@ -487,7 +487,7 @@ njs_regexp_prototype_last_index(njs_vm_t *vm, njs_value_t *value)
     (void) njs_string_prop(&string, &regexp->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;
 }
@@ -752,7 +752,7 @@ njs_regexp_exec_result(njs_vm_t *vm, njs_regexp_t *regexp, njs_utf8_t utf8,
 
     /* 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];
index ced809c4caf6879f2db50dcfa2c38316f4d6c561..1329945314a6d3947b5c8032dfaa6fa3533fe75f 100644 (file)
@@ -461,7 +461,7 @@ njs_string_prototype_length(njs_vm_t *vm, njs_value_t *value)
         length = (length == 0) ? size : length;
     }
 
-    njs_number_set(&vm->retval, length);
+    njs_value_number_set(&vm->retval, length);
 
     njs_release(vm, value);
 
@@ -1117,7 +1117,7 @@ njs_string_prototype_char_code_at(njs_vm_t *vm, njs_value_t *args,
 
 done:
 
-    njs_number_set(&vm->retval, num);
+    njs_value_number_set(&vm->retval, num);
 
     return NXT_OK;
 }
@@ -1240,7 +1240,7 @@ njs_string_prototype_index_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 done:
 
-    njs_number_set(&vm->retval, index);
+    njs_value_number_set(&vm->retval, index);
 
     return NXT_OK;
 }
@@ -1329,7 +1329,7 @@ njs_string_prototype_last_index_of(njs_vm_t *vm, njs_value_t *args,
 
 done:
 
-    njs_number_set(&vm->retval, index);
+    njs_value_number_set(&vm->retval, index);
 
     return NXT_OK;
 }
@@ -1931,7 +1931,7 @@ njs_string_prototype_search(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 done:
 
-    njs_number_set(&vm->retval, index);
+    njs_value_number_set(&vm->retval, index);
 
     return NXT_OK;
 }
@@ -2501,7 +2501,7 @@ njs_string_replace_regexp_function(njs_vm_t *vm, njs_value_t *args,
     }
 
     /* 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);
@@ -2630,7 +2630,7 @@ njs_string_replace_search_function(njs_vm_t *vm, njs_value_t *args,
     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];
index 4b282ff399f5991c09fbb857b7751ecb17c3b29f..4ebfe422f5681d0d306584a3cced5598d5591338 100644 (file)
@@ -122,8 +122,6 @@ njs_string_length(njs_utf8_t utf8, u_char *start, size_t size)
 
 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);
index 194321cecb978d7344056cf33e89a5e953e76d68..94a644a7531f180dd124ff3e7c73b0310796946a 100644 (file)
@@ -30,6 +30,7 @@
 #include <njs_parser.h>
 #include <njs_regexp.h>
 #include <string.h>
+#include <stdio.h>
 
 
 /* The values must be greater than NXT_OK. */
@@ -738,7 +739,7 @@ njs_vmcode_property_set(njs_vm_t *vm, njs_value_t *object,
         }
 
         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;
             }
@@ -1286,7 +1287,7 @@ njs_vmcode_property_next(njs_vm_t *vm, njs_value_t *object, njs_value_t *value)
                 n = next->index++;
 
                 if (njs_is_valid(&array->start[n])) {
-                    njs_number_set(retval, n);
+                    njs_value_number_set(retval, n);
 
                     return code->offset;
                 }
@@ -1408,7 +1409,7 @@ njs_vmcode_increment(njs_vm_t *vm, njs_value_t *reference, njs_value_t *value)
 
         njs_release(vm, reference);
 
-        njs_number_set(reference, num);
+        njs_value_number_set(reference, num);
         vm->retval = *reference;
 
         return sizeof(njs_vmcode_3addr_t);
@@ -1428,7 +1429,7 @@ njs_vmcode_decrement(njs_vm_t *vm, njs_value_t *reference, njs_value_t *value)
 
         njs_release(vm, reference);
 
-        njs_number_set(reference, num);
+        njs_value_number_set(reference, num);
         vm->retval = *reference;
 
         return sizeof(njs_vmcode_3addr_t);
@@ -1449,8 +1450,8 @@ njs_vmcode_post_increment(njs_vm_t *vm, njs_value_t *reference,
 
         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);
     }
@@ -1470,8 +1471,8 @@ njs_vmcode_post_decrement(njs_vm_t *vm, njs_value_t *reference,
 
         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);
     }
@@ -1556,7 +1557,7 @@ njs_ret_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);
     }
 
@@ -1568,7 +1569,7 @@ njs_ret_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);
     }
 
@@ -1587,7 +1588,7 @@ njs_vmcode_addition(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2)
     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);
     }
@@ -1632,7 +1633,7 @@ njs_vmcode_substraction(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2)
     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);
     }
@@ -1649,7 +1650,7 @@ njs_vmcode_multiplication(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2)
     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);
     }
@@ -1683,7 +1684,7 @@ njs_vmcode_exponentiation(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2)
             num = NAN;
         }
 
-        njs_number_set(&vm->retval, num);
+        njs_value_number_set(&vm->retval, num);
 
         return sizeof(njs_vmcode_3addr_t);
     }
@@ -1700,7 +1701,7 @@ njs_vmcode_division(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2)
     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);
     }
@@ -1717,7 +1718,7 @@ njs_vmcode_remainder(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2)
     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);
     }
@@ -1736,7 +1737,7 @@ njs_vmcode_left_shift(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2)
 
         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);
     }
@@ -1755,7 +1756,7 @@ njs_vmcode_right_shift(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2)
 
         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);
     }
@@ -1775,7 +1776,7 @@ njs_vmcode_unsigned_right_shift(njs_vm_t *vm, njs_value_t *val1,
 
         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);
     }
@@ -1841,7 +1842,7 @@ njs_vmcode_bitwise_not(njs_vm_t *vm, njs_value_t *value, njs_value_t *invld)
 
     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);
     }
@@ -1859,7 +1860,7 @@ njs_vmcode_bitwise_and(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2)
 
         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);
     }
@@ -1877,7 +1878,7 @@ njs_vmcode_bitwise_xor(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2)
 
         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);
     }
@@ -1895,7 +1896,7 @@ njs_vmcode_bitwise_or(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2)
 
         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);
     }
@@ -3189,7 +3190,7 @@ njs_vmcode_number_primitive(njs_vm_t *vm, njs_value_t *invld, njs_value_t *narg)
                 num = njs_string_to_number(value, 0);
             }
 
-            njs_number_set(value, num);
+            njs_value_number_set(value, num);
         }
 
         ret = sizeof(njs_vmcode_1addr_t);
@@ -3242,7 +3243,7 @@ njs_vmcode_number_argument(njs_vm_t *vm, njs_value_t *invld1,
                 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;
@@ -3415,12 +3416,20 @@ njs_vmcode_restart(njs_vm_t *vm, njs_value_t *invld1, njs_value_t *invld2)
 
 
 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)) {
 
@@ -3464,12 +3473,68 @@ njs_value_to_ext_string(njs_vm_t *vm, nxt_str_t *dst, const njs_value_t *src)
             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;
 
@@ -3535,7 +3600,21 @@ njs_vmcode_value_to_string(njs_vm_t *vm, njs_value_t *invld1,
 
 
 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;
@@ -3543,18 +3622,17 @@ njs_number_set(njs_value_t *value, double num)
 }
 
 
-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;
 }
 
 
@@ -3595,7 +3673,7 @@ njs_value_string_copy(njs_vm_t *vm, nxt_str_t *retval, njs_value_t *value,
         return NXT_ERROR;
     }
 
-    return njs_value_to_ext_string(vm, retval, value);
+    return njs_vm_value_to_ext_string(vm, retval, value, 0);
 }
 
 
@@ -3663,6 +3741,17 @@ njs_vm_add_backtrace_entry(njs_vm_t *vm, njs_frame_t *frame)
 }
 
 
+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)
 {
index 5ac2872826c571371516314cdd2c1c4855ea1f9f..c55b80cfdf353446acabeeff3e90ec8d7bc7f542 100644 (file)
@@ -1158,15 +1158,12 @@ const char *njs_arg_type_string(uint8_t arg);
 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);
index ccafbaf7d45eea61c227dbdc67445769afeed69f..3f059902c2c78c4b2f9c885badf68c009b934d79 100644 (file)
@@ -24,7 +24,6 @@
 #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);
@@ -496,7 +495,7 @@ njs_vm_run(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);
         }
 
@@ -517,95 +516,20 @@ njs_vm_run(njs_vm_t *vm)
 }
 
 
-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);
 }
index 160cf9f3c88695e0e3fefa38cddb8018f2ca419c..5fd2d6e148c432efbfbdc857f61607eed0a2dcbf 100644 (file)
@@ -2,6 +2,8 @@
 /*
  * Copyright (C) Igor Sysoev
  * Copyright (C) NGINX, Inc.
+ *
+ * njsScript public header.
  */
 
 #ifndef _NJSCRIPT_H_INCLUDED_
@@ -108,23 +110,31 @@ NXT_EXPORT nxt_int_t njs_vm_call(njs_vm_t *vm, njs_function_t *function,
     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;
index 89ef14be058dc5acdd421f52405b50bede2983d0..550a7de672355c1c46b0ca080cdedb150a5a27cb 100644 (file)
@@ -113,7 +113,7 @@ njs_unit_test_benchmark(nxt_str_t *script, nxt_str_t *result, const char *msg,
 
         (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;
         }
 
index 2361f4f6f550fccc3a5d4e79abe836627af00d75..727d451ad8a720afce65f835384c375ae478ffce 100644 (file)
@@ -171,7 +171,7 @@ njs_test {
      "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>> "}
index d6e93f2ff1e17e2bcfb4a7503757be91a03e64d3..1b28671a3413978f85e4e2301156ebc867c84d43 100644 (file)
@@ -183,7 +183,7 @@ static njs_interactive_test_t  njs_test[] =
                  "    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),
@@ -250,7 +250,7 @@ njs_interactive_test(void)
             }
         }
 
-        if (njs_vm_retval(vm, &s) != NXT_OK) {
+        if (njs_vm_retval_to_ext_string(vm, &s) != NXT_OK) {
             return NXT_ERROR;
         }
 
index 2bd3a0414820d288b0e943a4b66e0f8195620c90..1742f0d3d2d51a6cc790496ed9053a8a7d205add 100644 (file)
@@ -9095,7 +9095,8 @@ njs_unit_test_method_external(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
         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;
         }
@@ -9306,12 +9307,12 @@ njs_unit_test(nxt_bool_t disassemble)
 
             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;
             }