From: Igor Sysoev Date: Fri, 30 Oct 2015 13:22:37 +0000 (+0300) Subject: njs_vmcode_addition() does not use njs_string_prototype_concat(). X-Git-Tag: 0.1.0~126 X-Git-Url: http://git.kaiwu.me/postgresql/log/contrib/postgres_fdw/static/gitweb.js?a=commitdiff_plain;h=bb9dbf91b57957e9db430b048a2ab7fb38720717;p=njs.git njs_vmcode_addition() does not use njs_string_prototype_concat(). --- diff --git a/njs/njs_string.c b/njs/njs_string.c index 4d4512fd..6376f461 100644 --- a/njs/njs_string.c +++ b/njs/njs_string.c @@ -543,7 +543,8 @@ njs_string_prototype_concat(njs_vm_t *vm, njs_param_t *param) size = string.size; length = string.length; - mask = (length != 0) ? -1 : 0; + + mask = (string.length == 0 && string.size != 0) ? 0 : -1; args = param->args; diff --git a/njs/njs_vm.c b/njs/njs_vm.c index b09e3b9b..0fb21639 100644 --- a/njs/njs_vm.c +++ b/njs/njs_vm.c @@ -1369,9 +1369,10 @@ njs_vmcode_unary_negation(njs_vm_t *vm, njs_value_t *value, njs_value_t *invld) njs_ret_t njs_vmcode_addition(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) { - double num; - njs_ret_t ret; - njs_param_t param; + double num; + u_char *start; + size_t size, length; + njs_string_prop_t string1, string2; if (nxt_fast_path(njs_is_numeric(val1) && njs_is_numeric(val2))) { @@ -1382,18 +1383,35 @@ njs_vmcode_addition(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) } if (nxt_fast_path(njs_is_string(val1) && njs_is_string(val2))) { - param.object = val1; - param.args = val2; - param.retval = 0; - param.nargs = 1; - ret = njs_string_prototype_concat(vm, ¶m); + (void) njs_string_prop(&string1, val1); + (void) njs_string_prop(&string2, val2); + + if ((string1.length != 0 || string1.size == 0) + && (string2.length != 0 || string2.size == 0)) + { + length = string1.length + string2.length; - if (nxt_fast_path(ret >= 0)) { - return sizeof(njs_vmcode_3addr_t); + } else { + length = 0; } - return ret; + size = string1.size + string2.size; + + start = njs_string_alloc(vm, &vm->retval, size, length); + + if (nxt_slow_path(start == NULL)) { + return NXT_ERROR; + } + + (void) memcpy(start, string1.start, string1.size); + (void) memcpy(start + string1.size, string2.start, string2.size); + + if (length >= NJS_STRING_MAP_OFFSET && size != length) { + njs_string_offset_map_init(start, size); + } + + return sizeof(njs_vmcode_3addr_t); } return NJS_TRAP_STRINGS;