From: Dmitry Volyntsev Date: Mon, 12 Feb 2018 11:57:24 +0000 (+0300) Subject: Fixed using of internal NJS headers in nginx modules. X-Git-Tag: 0.2.0~40 X-Git-Url: http://git.kaiwu.me/sitemap.xml?a=commitdiff_plain;h=325ec498ade702ebfa71e464b71f3b7d0ee0812f;p=njs.git Fixed using of internal NJS headers in nginx modules. 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. --- diff --git a/nginx/ngx_http_js_module.c b/nginx/ngx_http_js_module.c index 86c83313..b717334c 100644 --- a/nginx/ngx_http_js_module.c +++ b/nginx/ngx_http_js_module.c @@ -20,8 +20,6 @@ #include #include -#include -#include #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", diff --git a/nginx/ngx_stream_js_module.c b/nginx/ngx_stream_js_module.c index 6acd6e63..e8380b4a 100644 --- a/nginx/ngx_stream_js_module.c +++ b/nginx/ngx_stream_js_module.c @@ -20,8 +20,6 @@ #include #include -#include -#include #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", diff --git a/njs/njs.c b/njs/njs.c index ebdc5669..8d90747b 100644 --- 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) { diff --git a/njs/njs_array.c b/njs/njs_array.c index 25270ff3..8ba6897d 100644 --- a/njs/njs_array.c +++ b/njs/njs_array.c @@ -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; } diff --git a/njs/njs_date.c b/njs/njs_date.c index 64229af3..79d8f325 100644 --- a/njs/njs_date.c +++ b/njs/njs_date.c @@ -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; } diff --git a/njs/njs_math.c b/njs/njs_math.c index 0a283131..108ac029 100644 --- a/njs/njs_math.c +++ b/njs/njs_math.c @@ -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; } diff --git a/njs/njs_number.c b/njs/njs_number.c index 3b648b7d..d468dbd5 100644 --- a/njs/njs_number.c +++ b/njs/njs_number.c @@ -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; } diff --git a/njs/njs_regexp.c b/njs/njs_regexp.c index 21d21196..bf8a6e5e 100644 --- a/njs/njs_regexp.c +++ b/njs/njs_regexp.c @@ -487,7 +487,7 @@ njs_regexp_prototype_last_index(njs_vm_t *vm, njs_value_t *value) (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; } @@ -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]; diff --git a/njs/njs_string.c b/njs/njs_string.c index ced809c4..13299453 100644 --- a/njs/njs_string.c +++ b/njs/njs_string.c @@ -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]; diff --git a/njs/njs_string.h b/njs/njs_string.h index 4b282ff3..4ebfe422 100644 --- a/njs/njs_string.h +++ b/njs/njs_string.h @@ -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); diff --git a/njs/njs_vm.c b/njs/njs_vm.c index 194321ce..94a644a7 100644 --- a/njs/njs_vm.c +++ b/njs/njs_vm.c @@ -30,6 +30,7 @@ #include #include #include +#include /* 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) { diff --git a/njs/njs_vm.h b/njs/njs_vm.h index 5ac28728..c55b80cf 100644 --- a/njs/njs_vm.h +++ b/njs/njs_vm.h @@ -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); diff --git a/njs/njscript.c b/njs/njscript.c index ccafbaf7..3f059902 100644 --- a/njs/njscript.c +++ b/njs/njscript.c @@ -24,7 +24,6 @@ #include #include #include -#include 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); } diff --git a/njs/njscript.h b/njs/njscript.h index 160cf9f3..5fd2d6e1 100644 --- a/njs/njscript.h +++ b/njs/njscript.h @@ -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; diff --git a/njs/test/njs_benchmark.c b/njs/test/njs_benchmark.c index 89ef14be..550a7de6 100644 --- a/njs/test/njs_benchmark.c +++ b/njs/test/njs_benchmark.c @@ -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; } diff --git a/njs/test/njs_expect_test.exp b/njs/test/njs_expect_test.exp index 2361f4f6..727d451a 100644 --- a/njs/test/njs_expect_test.exp +++ b/njs/test/njs_expect_test.exp @@ -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>> "} diff --git a/njs/test/njs_interactive_test.c b/njs/test/njs_interactive_test.c index d6e93f2f..1b28671a 100644 --- a/njs/test/njs_interactive_test.c +++ b/njs/test/njs_interactive_test.c @@ -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; } diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index 2bd3a041..1742f0d3 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -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; }