[njs] Improved next index allocation.
Dmitry Volyntsev
xeioex at nginx.com
Tue Jan 29 12:00:27 UTC 2019
details: https://hg.nginx.org/njs/rev/b4b1280ae790
branches:
changeset: 739:b4b1280ae790
user: hongzhidao <hongzhidao at gmail.com>
date: Sun Jan 27 05:21:32 2019 +0800
description:
Improved next index allocation.
diffstat:
njs/njs_generator.c | 33 +----------------
njs/njs_variable.c | 97 ++++++++++++++++++++++++++++++----------------------
njs/njs_variable.h | 2 +
3 files changed, 60 insertions(+), 72 deletions(-)
diffs (187 lines):
diff -r e98be67a10e2 -r b4b1280ae790 njs/njs_generator.c
--- a/njs/njs_generator.c Mon Jan 28 21:18:43 2019 +0300
+++ b/njs/njs_generator.c Sun Jan 27 05:21:32 2019 +0800
@@ -3053,8 +3053,7 @@ njs_generate_temp_index_get(njs_vm_t *vm
njs_parser_node_t *node)
{
nxt_array_t *cache;
- njs_value_t *value;
- njs_index_t index, *last;
+ njs_index_t *last;
njs_parser_scope_t *scope;
cache = generator->index_cache;
@@ -3073,34 +3072,8 @@ njs_generate_temp_index_get(njs_vm_t *vm
scope = scope->parent;
}
- if (vm->options.accumulative && scope->type == NJS_SCOPE_GLOBAL) {
- /*
- * When non-clonable VM runs in accumulative mode
- * all global variables are allocated in absolute scope
- * to simplify global scope handling.
- */
- value = nxt_mp_align(vm->mem_pool, sizeof(njs_value_t),
- sizeof(njs_value_t));
- if (nxt_slow_path(value == NULL)) {
- return NJS_INDEX_ERROR;
- }
-
- index = (njs_index_t) value;
-
- } else {
- value = nxt_array_add(scope->values[0], &njs_array_mem_proto,
- vm->mem_pool);
- if (nxt_slow_path(value == NULL)) {
- return NJS_INDEX_ERROR;
- }
-
- index = scope->next_index[0];
- scope->next_index[0] += sizeof(njs_value_t);
- }
-
- *value = njs_value_invalid;
-
- return index;
+ return njs_scope_next_index(vm, scope, NJS_SCOPE_INDEX_LOCAL,
+ &njs_value_invalid);
}
diff -r e98be67a10e2 -r b4b1280ae790 njs/njs_variable.c
--- a/njs/njs_variable.c Mon Jan 28 21:18:43 2019 +0300
+++ b/njs/njs_variable.c Sun Jan 27 05:21:32 2019 +0800
@@ -286,10 +286,9 @@ njs_variable_resolve(njs_vm_t *vm, njs_p
{
nxt_int_t ret;
nxt_uint_t scope_index;
- nxt_array_t *values;
njs_index_t index;
- njs_value_t *value;
njs_variable_t *var;
+ const njs_value_t *default_value;
njs_variable_reference_t *vr;
vr = &node->u.reference;
@@ -331,48 +330,12 @@ njs_variable_resolve(njs_vm_t *vm, njs_p
goto not_found;
}
- if (vm->options.accumulative && vr->scope->type == NJS_SCOPE_GLOBAL) {
- /*
- * When non-clonable VM runs in accumulative mode all
- * global variables should be allocated in absolute scope
- * to share them among consecutive VM invocations.
- */
- value = nxt_mp_align(vm->mem_pool, sizeof(njs_value_t),
- sizeof(njs_value_t));
- if (nxt_slow_path(value == NULL)) {
- njs_memory_error(vm);
- return NULL;
- }
-
- index = (njs_index_t) value;
-
- } else {
- values = vr->scope->values[scope_index];
+ default_value = njs_is_object(&var->value) ? &var->value : &njs_value_void;
- if (values == NULL) {
- values = nxt_array_create(4, sizeof(njs_value_t),
- &njs_array_mem_proto, vm->mem_pool);
- if (nxt_slow_path(values == NULL)) {
- return NULL;
- }
-
- vr->scope->values[scope_index] = values;
- }
+ index = njs_scope_next_index(vm, vr->scope, scope_index, default_value);
- value = nxt_array_add(values, &njs_array_mem_proto, vm->mem_pool);
- if (nxt_slow_path(value == NULL)) {
- return NULL;
- }
-
- index = vr->scope->next_index[scope_index];
- vr->scope->next_index[scope_index] += sizeof(njs_value_t);
- }
-
- if (njs_is_object(&var->value)) {
- *value = var->value;
-
- } else {
- *value = njs_value_void;
+ if (nxt_slow_path(index == NJS_INDEX_ERROR)) {
+ return NULL;
}
var->index = index;
@@ -448,6 +411,56 @@ njs_variable_reference_resolve(njs_vm_t
}
+njs_index_t
+njs_scope_next_index(njs_vm_t *vm, njs_parser_scope_t *scope,
+ nxt_uint_t scope_index, const njs_value_t *default_value)
+{
+ njs_index_t index;
+ njs_value_t *value;
+ nxt_array_t *values;
+
+ if (vm->options.accumulative && scope->type == NJS_SCOPE_GLOBAL) {
+ /*
+ * When non-clonable VM runs in accumulative mode all
+ * global variables should be allocated in absolute scope
+ * to share them among consecutive VM invocations.
+ */
+ value = nxt_mp_align(vm->mem_pool, sizeof(njs_value_t),
+ sizeof(njs_value_t));
+ if (nxt_slow_path(value == NULL)) {
+ return NJS_INDEX_ERROR;
+ }
+
+ index = (njs_index_t) value;
+
+ } else {
+ values = scope->values[scope_index];
+
+ if (values == NULL) {
+ values = nxt_array_create(4, sizeof(njs_value_t),
+ &njs_array_mem_proto, vm->mem_pool);
+ if (nxt_slow_path(values == NULL)) {
+ return NJS_INDEX_ERROR;
+ }
+
+ scope->values[scope_index] = values;
+ }
+
+ value = nxt_array_add(values, &njs_array_mem_proto, vm->mem_pool);
+ if (nxt_slow_path(value == NULL)) {
+ return NJS_INDEX_ERROR;
+ }
+
+ index = scope->next_index[scope_index];
+ scope->next_index[scope_index] += sizeof(njs_value_t);
+ }
+
+ *value = *default_value;
+
+ return index;
+}
+
+
static njs_variable_t *
njs_variable_alloc(njs_vm_t *vm, nxt_str_t *name, njs_variable_type_t type)
{
diff -r e98be67a10e2 -r b4b1280ae790 njs/njs_variable.h
--- a/njs/njs_variable.h Mon Jan 28 21:18:43 2019 +0300
+++ b/njs/njs_variable.h Sun Jan 27 05:21:32 2019 +0800
@@ -59,6 +59,8 @@ njs_ret_t njs_variable_reference(njs_vm_
njs_reference_type_t type);
njs_ret_t njs_variables_scope_reference(njs_vm_t *vm,
njs_parser_scope_t *scope);
+njs_index_t njs_scope_next_index(njs_vm_t *vm, njs_parser_scope_t *scope,
+ nxt_uint_t scope_index, const njs_value_t *default_value);
njs_ret_t njs_name_copy(njs_vm_t *vm, nxt_str_t *dst, nxt_str_t *src);
extern const nxt_lvlhsh_proto_t njs_variables_hash_proto;
More information about the nginx-devel
mailing list