From 3f401245debe30dd81fc51ce2984c061d8fc7076 Mon Sep 17 00:00:00 2001 From: Igor Sysoev Date: Thu, 11 Feb 2016 11:36:14 +0300 Subject: [PATCH] Array.join() optimization. --- njs/njs_array.c | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/njs/njs_array.c b/njs/njs_array.c index ef53cd57..29434b1f 100644 --- a/njs/njs_array.c +++ b/njs/njs_array.c @@ -601,33 +601,24 @@ njs_array_prototype_join_continuation(njs_vm_t *vm, njs_param_t *param) njs_array_join_t *join; njs_string_prop_t separator, string; - if (param->nargs != 0) { - value = ¶m->args[0]; - - } else { - value = (njs_value_t *) &njs_string_comma; - } - - (void) njs_string_prop(&separator, value); - - array = param->this->data.u.array; - - size = separator.size * (array->length - 1); - length = separator.length * (array->length - 1); - n = 0; - - max = 0; - values = NULL; - join = (njs_array_join_t *) vm->frame->continuation; if (join != NULL) { values = join->values; max = join->max; + + } else { + values = NULL; + max = 0; } + size = 0; + length = 0; + n = 0; mask = -1; + array = param->this->data.u.array; + for (i = 0; i < array->length; i++) { value = &array->start[i]; @@ -654,6 +645,18 @@ njs_array_prototype_join_continuation(njs_vm_t *vm, njs_param_t *param) } } + if (param->nargs != 0) { + value = ¶m->args[0]; + + } else { + value = (njs_value_t *) &njs_string_comma; + } + + (void) njs_string_prop(&separator, value); + + size += separator.size * (array->length - 1); + length += separator.length * (array->length - 1); + length &= mask; p = njs_string_alloc(vm, &vm->retval, size, length); -- 2.47.3