]> git.kaiwu.me - njs.git/commitdiff
Improved API for value creation from the outside of VM.
authorDmitry Volyntsev <xeioex@nginx.com>
Thu, 21 Feb 2019 13:35:52 +0000 (16:35 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Thu, 21 Feb 2019 13:35:52 +0000 (16:35 +0300)
nginx/ngx_http_js_module.c
nginx/ngx_stream_js_module.c
njs/njs.h
njs/njs_string.c
njs/njs_string.h
njs/njs_vm.c
njs/test/njs_unit_test.c

index b85b1d434109089c2027bcd4fbdc0e5d8b84ddd1..6eed74ca8ec523dd1075211fce8a5ea6f2dafa12 100644 (file)
@@ -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;
     }
index cebee745e56240e3f1095063239795ecdbfca9de..57d754cf9dfe71efd77caf44b2b283bd9503840c 100644 (file)
@@ -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);
 }
 
 
index 924cb5f5af9fc4829a68b165f502cc5fee0ad6b5..73bf1379eaddb9cdd4815cb9b431925ba1512c33 100644 (file)
--- 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);
index c7f34396c29ba325f002de91c5275893b051974c..ed8d36b1f87f165c7995496381124b004050cb07 100644 (file)
@@ -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;
     }
 
index c6d33db55cbfa500107bf888d195111e220d51ad..6273673f16f11521ce9825b2977385404c646680 100644 (file)
@@ -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,
index a3de3dc4e6a9f2adcd3ae00110b684975736ec16..7250c2b04da5d815ccd8f98d88a5b318f5bde0ff 100644 (file)
@@ -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;
index 67d2009fa701bb630161b6bdd2152f38b7ff88af..f2fe56a53b47182a4a68e649b14be33a9e9bbced 100644 (file)
@@ -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;