From 9bcdc66d5a7010b51185b04a2d885fe3879a0cd1 Mon Sep 17 00:00:00 2001 From: Alexander Borisov Date: Mon, 28 Oct 2019 16:10:17 +0300 Subject: [PATCH] Added njs_lvalue_arg() macro. --- src/njs.h | 5 +++- src/njs_json.c | 15 ++++-------- src/njs_object.c | 15 ++++-------- src/njs_regexp.c | 30 ++++++++---------------- src/njs_string.c | 59 ++++++++++++++++-------------------------------- 5 files changed, 43 insertions(+), 81 deletions(-) diff --git a/src/njs.h b/src/njs.h index 90be1e57..b5e1f784 100644 --- a/src/njs.h +++ b/src/njs.h @@ -51,10 +51,13 @@ extern const njs_value_t njs_value_undefined; : (njs_value_t *) &njs_value_undefined) #define njs_value_assign(dst, src) \ - *((njs_opaque_value_t *) dst) = *((njs_opaque_value_t *) src); + *((njs_opaque_value_t *) dst) = *((njs_opaque_value_t *) src) #define njs_value_arg(val) ((njs_value_t *) val) +#define njs_lvalue_arg(lvalue, args, nargs, n) \ + ((n < nargs) ? njs_argument(args, n) \ + : (njs_value_assign(lvalue, &njs_value_undefined), lvalue)) #define njs_vm_error(vm, fmt, ...) \ njs_vm_value_error_set(vm, njs_vm_retval(vm), fmt, ##__VA_ARGS__) diff --git a/src/njs_json.c b/src/njs_json.c index 7867ffc6..d56987cb 100644 --- a/src/njs_json.c +++ b/src/njs_json.c @@ -147,7 +147,7 @@ njs_json_parse(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { njs_int_t ret; - njs_value_t *text, *value, *wrapper; + njs_value_t *text, *value, *wrapper, lvalue; const u_char *p, *end; njs_json_parse_t *parse, json_parse; const njs_value_t *reviver; @@ -162,17 +162,12 @@ njs_json_parse(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, return NJS_ERROR; } - text = njs_arg(args, nargs, 1); + text = njs_lvalue_arg(&lvalue, args, nargs, 1); if (njs_slow_path(!njs_is_string(text))) { - if (njs_is_undefined(text)) { - text = njs_value_arg(&njs_string_undefined); - - } else { - ret = njs_value_to_string(vm, text, text); - if (njs_slow_path(ret != NJS_OK)) { - return ret; - } + ret = njs_value_to_string(vm, text, text); + if (njs_slow_path(ret != NJS_OK)) { + return ret; } } diff --git a/src/njs_object.c b/src/njs_object.c index fb9d747a..f6599be8 100644 --- a/src/njs_object.c +++ b/src/njs_object.c @@ -1089,7 +1089,7 @@ njs_object_define_property(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { njs_int_t ret; - njs_value_t *value, *name, *desc; + njs_value_t *value, *name, *desc, lvalue; if (!njs_is_object(njs_arg(args, nargs, 1))) { njs_type_error(vm, "cannot convert %s argument to object", @@ -1111,17 +1111,12 @@ njs_object_define_property(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, return NJS_ERROR; } - name = njs_arg(args, nargs, 2); + name = njs_lvalue_arg(&lvalue, args, nargs, 2); if (njs_slow_path(!njs_is_string(name))) { - if (njs_is_undefined(name)) { - name = njs_value_arg(&njs_string_undefined); - - } else { - ret = njs_value_to_string(vm, name, name); - if (njs_slow_path(ret != NJS_OK)) { - return ret; - } + ret = njs_value_to_string(vm, name, name); + if (njs_slow_path(ret != NJS_OK)) { + return ret; } } diff --git a/src/njs_regexp.c b/src/njs_regexp.c index 6f7ce2a2..a52f8e63 100644 --- a/src/njs_regexp.c +++ b/src/njs_regexp.c @@ -845,7 +845,7 @@ njs_regexp_prototype_test(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_int_t ret; njs_uint_t n; njs_regex_t *regex; - njs_value_t *value; + njs_value_t *value, lvalue; const njs_value_t *retval; njs_string_prop_t string; njs_regexp_pattern_t *pattern; @@ -858,17 +858,12 @@ njs_regexp_prototype_test(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, retval = &njs_value_false; - value = njs_arg(args, nargs, 1); + value = njs_lvalue_arg(&lvalue, args, nargs, 1); if (!njs_is_string(value)) { - if (njs_is_undefined(value)) { - value = njs_value_arg(&njs_string_undefined); - - } else { - ret = njs_value_to_string(vm, value, value); - if (njs_slow_path(ret != NJS_OK)) { - return ret; - } + ret = njs_value_to_string(vm, value, value); + if (njs_slow_path(ret != NJS_OK)) { + return ret; } } @@ -921,7 +916,7 @@ njs_regexp_prototype_exec(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, { njs_int_t ret; njs_utf8_t utf8; - njs_value_t *value; + njs_value_t *value, lvalue; njs_regexp_t *regexp; njs_string_prop_t string; njs_regexp_utf8_t type; @@ -933,17 +928,12 @@ njs_regexp_prototype_exec(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, return NJS_ERROR; } - value = njs_arg(args, nargs, 1); + value = njs_lvalue_arg(&lvalue, args, nargs, 1); if (!njs_is_string(value)) { - if (njs_is_undefined(value)) { - value = njs_value_arg(&njs_string_undefined); - - } else { - ret = njs_value_to_string(vm, value, value); - if (njs_slow_path(ret != NJS_OK)) { - return ret; - } + ret = njs_value_to_string(vm, value, value); + if (njs_slow_path(ret != NJS_OK)) { + return ret; } } diff --git a/src/njs_string.c b/src/njs_string.c index 1144cd27..e12d0134 100644 --- a/src/njs_string.c +++ b/src/njs_string.c @@ -2065,9 +2065,8 @@ njs_string_prototype_last_index_of(njs_vm_t *vm, njs_value_t *args, double pos; ssize_t index, start, length, search_length; njs_int_t ret; - njs_value_t *value; + njs_value_t *value, *search_string, lvalue; const u_char *p, *end; - const njs_value_t *search_string; njs_string_prop_t string, search; ret = njs_string_object_validate(vm, njs_arg(args, nargs, 0)); @@ -2079,18 +2078,12 @@ njs_string_prototype_last_index_of(njs_vm_t *vm, njs_value_t *args, length = njs_string_prop(&string, njs_argument(args, 0)); - search_string = njs_arg(args, nargs, 1); + search_string = njs_lvalue_arg(&lvalue, args, nargs, 1); if (njs_slow_path(!njs_is_string(search_string))) { - if (njs_is_undefined(search_string)) { - search_string = &njs_string_undefined; - - } else { - ret = njs_value_to_string(vm, njs_value_arg(search_string), - njs_value_arg(search_string)); - if (njs_slow_path(ret != NJS_OK)) { - return ret; - } + ret = njs_value_to_string(vm, search_string, search_string); + if (njs_slow_path(ret != NJS_OK)) { + return ret; } } @@ -2301,7 +2294,7 @@ njs_string_starts_or_ends_with(njs_vm_t *vm, njs_value_t *args, { int64_t index, length, search_length; njs_int_t ret; - njs_value_t *value; + njs_value_t *value, lvalue; const u_char *p, *end; const njs_value_t *retval; njs_string_prop_t string, search; @@ -2313,17 +2306,12 @@ njs_string_starts_or_ends_with(njs_vm_t *vm, njs_value_t *args, return ret; } - value = njs_arg(args, nargs, 1); + value = njs_lvalue_arg(&lvalue, args, nargs, 1); if (njs_slow_path(!njs_is_string(value))) { - if (njs_is_undefined(value)) { - value = njs_value_arg(&njs_string_undefined); - - } else { - ret = njs_value_to_string(vm, value, value); - if (njs_slow_path(ret != NJS_OK)) { - return ret; - } + ret = njs_value_to_string(vm, value, value); + if (njs_slow_path(ret != NJS_OK)) { + return ret; } } @@ -3478,6 +3466,7 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_int_t ret; njs_uint_t ncaptures; njs_value_t *this, *search, *replace; + njs_value_t search_lvalue, replace_lvalue; njs_regex_t *regex; njs_string_prop_t string; njs_string_replace_t *r, string_replace; @@ -3493,8 +3482,8 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, goto original; } - search = njs_arg(args, nargs, 1); - replace = njs_arg(args, nargs, 2); + search = njs_lvalue_arg(&search_lvalue, args, nargs, 1); + replace = njs_lvalue_arg(&replace_lvalue, args, nargs, 2); (void) njs_string_prop(&string, this); @@ -3530,14 +3519,9 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, ncaptures = 1; if (!njs_is_string(search)) { - if (njs_is_undefined(search)) { - search = njs_value_arg(&njs_string_undefined); - - } else { - ret = njs_value_to_string(vm, search, search); - if (njs_slow_path(ret != NJS_OK)) { - return ret; - } + ret = njs_value_to_string(vm, search, search); + if (njs_slow_path(ret != NJS_OK)) { + return ret; } } } @@ -3559,14 +3543,9 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, } else { if (njs_slow_path(!njs_is_string(replace))) { - if (njs_is_undefined(replace)) { - replace = njs_value_arg(&njs_string_undefined); - - } else { - ret = njs_value_to_string(vm, replace, replace); - if (njs_slow_path(ret != NJS_OK)) { - return ret; - } + ret = njs_value_to_string(vm, replace, replace); + if (njs_slow_path(ret != NJS_OK)) { + return ret; } } -- 2.47.3