From: Dmitry Volyntsev Date: Thu, 21 Feb 2019 13:35:52 +0000 (+0300) Subject: Improved API for value creation from the outside of VM. X-Git-Tag: 0.2.8~9 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=286d1c9b5bf200da4f7aca8c74822fe4000eca04;p=njs.git Improved API for value creation from the outside of VM. --- diff --git a/nginx/ngx_http_js_module.c b/nginx/ngx_http_js_module.c index b85b1d43..6eed74ca 100644 --- a/nginx/ngx_http_js_module.c +++ b/nginx/ngx_http_js_module.c @@ -805,7 +805,7 @@ ngx_http_js_ext_get_string(njs_vm_t *vm, njs_value_t *value, void *obj, field = (ngx_str_t *) (p + data); - return njs_string_create(vm, value, field->data, field->len, 0); + return njs_vm_value_string_set(vm, value, field->data, field->len); } @@ -864,7 +864,7 @@ ngx_http_js_ext_next_header(njs_vm_t *vm, njs_value_t *value, void *obj, continue; } - return njs_string_create(vm, value, h->key.data, h->key.len, 0); + return njs_vm_value_string_set(vm, value, h->key.data, h->key.len); } return NJS_DONE; @@ -920,10 +920,10 @@ ngx_http_js_ext_get_header_out(njs_vm_t *vm, njs_value_t *value, void *obj, h = ngx_http_js_get_header(&r->headers_out.headers.part, v->start, v->length); if (h == NULL) { - return njs_string_create(vm, value, NULL, 0, 0); + return njs_vm_value_string_set(vm, value, NULL, 0); } - return njs_string_create(vm, value, h->value.data, h->value.len, 0); + return njs_vm_value_string_set(vm, value, h->value.data, h->value.len); } @@ -1122,7 +1122,8 @@ ngx_http_js_ext_send(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, next = 0; for ( ;; ) { - ret = njs_value_string_copy(vm, &s, njs_argument(args, n), &next); + ret = njs_vm_value_string_copy(vm, &s, njs_argument(args, n), + &next); if (ret == NJS_DECLINED) { break; @@ -1387,7 +1388,7 @@ ngx_http_js_ext_get_http_version(njs_vm_t *vm, njs_value_t *value, void *obj, break; } - return njs_string_create(vm, value, v.data, v.len, 0); + return njs_vm_value_string_set(vm, value, v.data, v.len); } @@ -1401,7 +1402,8 @@ ngx_http_js_ext_get_remote_address(njs_vm_t *vm, njs_value_t *value, void *obj, r = (ngx_http_request_t *) obj; c = r->connection; - return njs_string_create(vm, value, c->addr_text.data, c->addr_text.len, 0); + return njs_vm_value_string_set(vm, value, c->addr_text.data, + c->addr_text.len); } @@ -1472,7 +1474,7 @@ ngx_http_js_ext_get_request_body(njs_vm_t *vm, njs_value_t *value, void *obj, done: - ret = njs_string_create(vm, request_body, body, len, 0); + ret = njs_vm_value_string_set(vm, request_body, body, len); if (ret != NXT_OK) { return NJS_ERROR; @@ -1498,10 +1500,10 @@ ngx_http_js_ext_get_header_in(njs_vm_t *vm, njs_value_t *value, void *obj, h = ngx_http_js_get_header(&r->headers_in.headers.part, v->start, v->length); if (h == NULL) { - return njs_string_create(vm, value, NULL, 0, 0); + return njs_vm_value_string_set(vm, value, NULL, 0); } - return njs_string_create(vm, value, h->value.data, h->value.len, 0); + return njs_vm_value_string_set(vm, value, h->value.data, h->value.len); } @@ -1524,10 +1526,10 @@ ngx_http_js_ext_get_arg(njs_vm_t *vm, njs_value_t *value, void *obj, v = (nxt_str_t *) data; if (ngx_http_arg(r, v->start, v->length, &arg) == NGX_OK) { - return njs_string_create(vm, value, arg.data, arg.len, 0); + return njs_vm_value_string_set(vm, value, arg.data, arg.len); } - return njs_string_create(vm, value, NULL, 0, 0); + return njs_vm_value_string_set(vm, value, NULL, 0); } @@ -1590,7 +1592,7 @@ ngx_http_js_ext_next_arg(njs_vm_t *vm, njs_value_t *value, void *obj, entry->len = 0; } - return njs_string_create(vm, value, start, len, 0); + return njs_vm_value_string_set(vm, value, start, len); } @@ -1614,10 +1616,10 @@ ngx_http_js_ext_get_variable(njs_vm_t *vm, njs_value_t *value, void *obj, vv = ngx_http_get_variable(r, &name, key); if (vv == NULL || vv->not_found) { - return njs_string_create(vm, value, NULL, 0, 0); + return njs_vm_value_string_set(vm, value, NULL, 0); } - return njs_string_create(vm, value, vv->data, vv->len, 0); + return njs_vm_value_string_set(vm, value, vv->data, vv->len); } @@ -1980,7 +1982,7 @@ ngx_http_js_ext_get_reply_body(njs_vm_t *vm, njs_value_t *value, void *obj, len = b ? b->last - b->pos : 0; - p = njs_string_alloc(vm, value, len, 0); + p = njs_vm_value_string_alloc(vm, value, len); if (p == NULL) { return NJS_ERROR; } diff --git a/nginx/ngx_stream_js_module.c b/nginx/ngx_stream_js_module.c index cebee745..57d754cf 100644 --- a/nginx/ngx_stream_js_module.c +++ b/nginx/ngx_stream_js_module.c @@ -794,7 +794,7 @@ ngx_stream_js_buffer_arg(ngx_stream_session_t *s, njs_value_t *buffer) len = b ? b->last - b->pos : 0; - p = njs_string_alloc(ctx->vm, buffer, len, 0); + p = njs_vm_value_string_alloc(ctx->vm, buffer, len); if (p == NULL) { return NJS_ERROR; } @@ -821,8 +821,8 @@ ngx_stream_js_flags_arg(ngx_stream_session_t *s, njs_value_t *flags) ctx = ngx_stream_get_module_ctx(s, ngx_stream_js_module); - njs_string_create(ctx->vm, njs_value_arg(&last_key), last_str.start, - last_str.length, 0); + njs_vm_value_string_set(ctx->vm, njs_value_arg(&last_key), last_str.start, + last_str.length); c = s->connection; @@ -884,7 +884,8 @@ ngx_stream_js_ext_get_remote_address(njs_vm_t *vm, njs_value_t *value, s = (ngx_stream_session_t *) obj; c = s->connection; - return njs_string_create(vm, value, c->addr_text.data, c->addr_text.len, 0); + return njs_vm_value_string_set(vm, value, c->addr_text.data, + c->addr_text.len); } @@ -1200,10 +1201,10 @@ ngx_stream_js_ext_get_variable(njs_vm_t *vm, njs_value_t *value, void *obj, vv = ngx_stream_get_variable(s, &name, key); if (vv == NULL || vv->not_found) { - return njs_string_create(vm, value, NULL, 0, 0); + return njs_vm_value_string_set(vm, value, NULL, 0); } - return njs_string_create(vm, value, vv->data, vv->len, 0); + return njs_vm_value_string_set(vm, value, vv->data, vv->len); } diff --git a/njs/njs.h b/njs/njs.h index 924cb5f5..73bf1379 100644 --- a/njs/njs.h +++ b/njs/njs.h @@ -57,7 +57,7 @@ extern const njs_value_t njs_value_void; #define njs_vm_error(vm, fmt, ...) \ - njs_value_error_set(vm, njs_vm_retval(vm), fmt, ##__VA_ARGS__) + njs_vm_value_error_set(vm, njs_vm_retval(vm), fmt, ##__VA_ARGS__) typedef njs_ret_t (*njs_extern_get_t)(njs_vm_t *vm, njs_value_t *value, @@ -231,14 +231,16 @@ 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 void njs_vm_retval_set(njs_vm_t *vm, const njs_value_t *value); -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, - const u_char *start, uint32_t size, uint32_t length); - -NXT_EXPORT nxt_int_t njs_value_string_copy(njs_vm_t *vm, nxt_str_t *retval, +/* + * Sets a byte string value. + * start data is not copied and should not be freed. + */ +NXT_EXPORT njs_ret_t njs_vm_value_string_set(njs_vm_t *vm, njs_value_t *value, + const u_char *start, uint32_t size); +NXT_EXPORT u_char *njs_vm_value_string_alloc(njs_vm_t *vm, njs_value_t *value, + uint32_t size); +NXT_EXPORT nxt_int_t njs_vm_value_string_copy(njs_vm_t *vm, nxt_str_t *retval, const njs_value_t *value, uintptr_t *next); - NXT_EXPORT njs_ret_t njs_vm_value_to_ext_string(njs_vm_t *vm, nxt_str_t *dst, const njs_value_t *src, nxt_uint_t handle_exception); NXT_EXPORT njs_ret_t njs_vm_retval_to_ext_string(njs_vm_t *vm, nxt_str_t *dst); @@ -248,14 +250,14 @@ NXT_EXPORT njs_ret_t njs_vm_value_dump(njs_vm_t *vm, nxt_str_t *dst, NXT_EXPORT njs_ret_t njs_vm_retval_dump(njs_vm_t *vm, nxt_str_t *dst, nxt_uint_t indent); +NXT_EXPORT void njs_vm_value_error_set(njs_vm_t *vm, njs_value_t *value, + const char *fmt, ...); NXT_EXPORT void njs_vm_memory_error(njs_vm_t *vm); 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_set(njs_value_t *value, void *data); -NXT_EXPORT void njs_value_error_set(njs_vm_t *vm, njs_value_t *value, - const char *fmt, ...); NXT_EXPORT uint8_t njs_value_bool(const njs_value_t *value); NXT_EXPORT double njs_value_number(const njs_value_t *value); diff --git a/njs/njs_string.c b/njs/njs_string.c index c7f34396..ed8d36b1 100644 --- a/njs/njs_string.c +++ b/njs/njs_string.c @@ -111,8 +111,8 @@ static njs_ret_t njs_string_decode(njs_vm_t *vm, njs_value_t *value, njs_ret_t -njs_string_create(njs_vm_t *vm, njs_value_t *value, const u_char *start, - uint32_t size, uint32_t length) +njs_string_set(njs_vm_t *vm, njs_value_t *value, const u_char *start, + uint32_t size) { u_char *dst; const u_char *src; @@ -123,7 +123,7 @@ njs_string_create(njs_vm_t *vm, njs_value_t *value, const u_char *start, if (size <= NJS_STRING_SHORT) { value->short_string.size = size; - value->short_string.length = length; + value->short_string.length = 0; dst = value->short_string.start; src = start; @@ -155,7 +155,7 @@ njs_string_create(njs_vm_t *vm, njs_value_t *value, const u_char *start, value->long_string.data = string; string->start = (u_char *) start; - string->length = length; + string->length = 0; string->retain = 1; } diff --git a/njs/njs_string.h b/njs/njs_string.h index c6d33db5..6273673f 100644 --- a/njs/njs_string.h +++ b/njs/njs_string.h @@ -121,6 +121,10 @@ njs_string_length(njs_utf8_t utf8, const u_char *start, size_t size) } +njs_ret_t njs_string_set(njs_vm_t *vm, njs_value_t *value, const u_char *start, + uint32_t size); +u_char *njs_string_alloc(njs_vm_t *vm, njs_value_t *value, uint32_t size, + uint32_t length); njs_ret_t njs_string_new(njs_vm_t *vm, njs_value_t *value, const u_char *start, uint32_t size, uint32_t length); njs_ret_t njs_string_hex(njs_vm_t *vm, njs_value_t *value, diff --git a/njs/njs_vm.c b/njs/njs_vm.c index a3de3dc4..7250c2b0 100644 --- a/njs/njs_vm.c +++ b/njs/njs_vm.c @@ -3326,8 +3326,23 @@ njs_value_data_set(njs_value_t *value, void *data) } +nxt_noinline njs_ret_t +njs_vm_value_string_set(njs_vm_t *vm, njs_value_t *value, const u_char *start, + uint32_t size) +{ + return njs_string_set(vm, value, start, size); +} + + +nxt_noinline u_char * +njs_vm_value_string_alloc(njs_vm_t *vm, njs_value_t *value, uint32_t size) +{ + return njs_string_alloc(vm, value, size, 0); +} + + void -njs_value_error_set(njs_vm_t *vm, njs_value_t *value, const char *fmt, ...) +njs_vm_value_error_set(njs_vm_t *vm, njs_value_t *value, const char *fmt, ...) { va_list args; u_char buf[NXT_MAX_ERROR_STR], *p; @@ -3431,8 +3446,8 @@ njs_value_is_function(const njs_value_t *value) nxt_int_t -njs_value_string_copy(njs_vm_t *vm, nxt_str_t *retval, const njs_value_t *value, - uintptr_t *next) +njs_vm_value_string_copy(njs_vm_t *vm, nxt_str_t *retval, + const njs_value_t *value, uintptr_t *next) { uintptr_t n; njs_array_t *array; diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index 67d2009f..f2fe56a5 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -11324,7 +11324,7 @@ njs_unit_test_r_get_uri_external(njs_vm_t *vm, njs_value_t *value, void *obj, field = (nxt_str_t *) (p + data); - return njs_string_create(vm, value, field->start, field->length, 0); + return njs_vm_value_string_set(vm, value, field->start, field->length); } @@ -11355,7 +11355,7 @@ njs_unit_test_r_get_a_external(njs_vm_t *vm, njs_value_t *value, void *obj, p = nxt_sprintf(buf, buf + nxt_length(buf), "%uD", r->a); - return njs_string_create(vm, value, buf, p - buf, 0); + return njs_vm_value_string_set(vm, value, buf, p - buf); } @@ -11373,7 +11373,7 @@ static njs_ret_t njs_unit_test_host_external(njs_vm_t *vm, njs_value_t *value, void *obj, uintptr_t data) { - return njs_string_create(vm, value, (u_char *) "АБВГДЕЁЖЗИЙ", 22, 0); + return njs_vm_value_string_set(vm, value, (u_char *) "АБВГДЕЁЖЗИЙ", 22); } @@ -11427,8 +11427,8 @@ njs_unit_test_r_set_vars(njs_vm_t *vm, void *obj, uintptr_t data, return NXT_ERROR; } - njs_string_create(vm, &name, key->start, key->length, 0); - njs_string_create(vm, &val, value->start, value->length, 0); + njs_vm_value_string_set(vm, &name, key->start, key->length); + njs_vm_value_string_set(vm, &val, value->start, value->length); prop = lvlhsh_unit_test_alloc(vm->mem_pool, &name, &val); if (prop == NULL) { @@ -11492,7 +11492,7 @@ njs_unit_test_header_external(njs_vm_t *vm, njs_value_t *value, void *obj, size = 7 + h->length; - p = njs_string_alloc(vm, value, size, 0); + p = njs_vm_value_string_alloc(vm, value, size); if (p == NULL) { return NJS_ERROR; } @@ -11531,7 +11531,7 @@ njs_unit_test_header_next_external(njs_vm_t *vm, njs_value_t *value, void *obj, return NXT_DONE; } - return njs_string_create(vm, value, s, 2, 0); + return njs_vm_value_string_set(vm, value, s, 2); } @@ -11550,8 +11550,8 @@ njs_unit_test_method_external(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, ret = njs_vm_value_to_ext_string(vm, &s, njs_arg(args, nargs, 1), 0); if (ret == NXT_OK && s.length == 3 && memcmp(s.start, "YES", 3) == 0) { - return njs_string_create(vm, njs_vm_retval(vm), r->uri.start, - r->uri.length, 0); + return njs_vm_value_string_set(vm, njs_vm_retval(vm), r->uri.start, + r->uri.length); } vm->retval = njs_value_void;