Welcome! Log In Create A New Profile

Advanced

[njs] Improved working with scope indexes of variables.

Dmitry Volyntsev
December 30, 2018 06:14AM
details: https://hg.nginx.org/njs/rev/5cf68fb9152e
branches:
changeset: 711:5cf68fb9152e
user: hongzhidao <hongzhidao@gmail.com>
date: Sat Dec 29 16:03:57 2018 +0800
description:
Improved working with scope indexes of variables.

diffstat:

njs/njs_parser.h | 7 +++----
njs/njs_variable.c | 35 +++++++++++++++++------------------
njs/njs_variable.h | 1 +
3 files changed, 21 insertions(+), 22 deletions(-)

diffs (115 lines):

diff -r 157bbb5d50eb -r 5cf68fb9152e njs/njs_parser.h
--- a/njs/njs_parser.h Sat Dec 29 15:16:59 2018 +0300
+++ b/njs/njs_parser.h Sat Dec 29 16:03:57 2018 +0800
@@ -238,10 +238,9 @@ struct njs_parser_scope_s {
nxt_lvlhsh_t variables;
nxt_lvlhsh_t references;

- /*
- * 0: local scope index;
- * 1: closure scope index.
- */
+#define NJS_SCOPE_INDEX_LOCAL 0
+#define NJS_SCOPE_INDEX_CLOSURE 1
+
nxt_array_t *values[2]; /* Array of njs_value_t. */
njs_index_t next_index[2];

diff -r 157bbb5d50eb -r 5cf68fb9152e njs/njs_variable.c
--- a/njs/njs_variable.c Sat Dec 29 15:16:59 2018 +0300
+++ b/njs/njs_variable.c Sat Dec 29 16:03:57 2018 +0800
@@ -9,7 +9,7 @@
#include <string.h>


-static njs_ret_t njs_variable_find(njs_vm_t *vm, njs_parser_scope_t *scope,
+static njs_ret_t njs_variable_find(njs_vm_t *vm, njs_parser_scope_t *node_scope,
njs_variable_reference_t *vr);
static njs_variable_t *njs_variable_alloc(njs_vm_t *vm, nxt_str_t *name,
njs_variable_type_t type);
@@ -196,15 +196,7 @@ njs_variables_scope_resolve(njs_vm_t *vm
continue;
}

- if (vr->scope->type == NJS_SCOPE_GLOBAL) {
- continue;
- }
-
- if (node->scope->nesting == vr->scope->nesting) {
- /*
- * A variable is referenced locally here, but may be
- * referenced non-locally in other places, skipping.
- */
+ if (vr->scope_index == NJS_SCOPE_INDEX_LOCAL) {
continue;
}
}
@@ -308,18 +300,16 @@ njs_variable_get(njs_vm_t *vm, njs_parse
goto not_found;
}

- scope_index = 0;
-
- if (vr->scope->type > NJS_SCOPE_GLOBAL) {
- scope_index = (node->scope->nesting != vr->scope->nesting);
- }
+ scope_index = vr->scope_index;

var = vr->variable;
index = var->index;

if (index != NJS_INDEX_NONE) {

- if (scope_index == 0 || njs_scope_type(index) != NJS_SCOPE_ARGUMENTS) {
+ if (scope_index == NJS_SCOPE_INDEX_LOCAL
+ || njs_scope_type(index) != NJS_SCOPE_ARGUMENTS)
+ {
node->index = index;

return var;
@@ -400,16 +390,17 @@ not_found:


static njs_ret_t
-njs_variable_find(njs_vm_t *vm, njs_parser_scope_t *scope,
+njs_variable_find(njs_vm_t *vm, njs_parser_scope_t *node_scope,
njs_variable_reference_t *vr)
{
nxt_lvlhsh_query_t lhq;
- njs_parser_scope_t *parent, *previous;
+ njs_parser_scope_t *scope, *parent, *previous;

lhq.key_hash = vr->hash;
lhq.key = vr->name;
lhq.proto = &njs_variables_hash_proto;

+ scope = node_scope;
previous = NULL;

for ( ;; ) {
@@ -431,6 +422,14 @@ njs_variable_find(njs_vm_t *vm, njs_pars

vr->scope = scope;

+ vr->scope_index = NJS_SCOPE_INDEX_LOCAL;
+
+ if (vr->scope->type > NJS_SCOPE_GLOBAL
+ && node_scope->nesting != vr->scope->nesting)
+ {
+ vr->scope_index = NJS_SCOPE_INDEX_CLOSURE;
+ }
+
return NXT_OK;
}

diff -r 157bbb5d50eb -r 5cf68fb9152e njs/njs_variable.h
--- a/njs/njs_variable.h Sat Dec 29 15:16:59 2018 +0300
+++ b/njs/njs_variable.h Sat Dec 29 16:03:57 2018 +0800
@@ -48,6 +48,7 @@ typedef struct {
nxt_str_t name;
njs_variable_t *variable;
njs_parser_scope_t *scope;
+ nxt_uint_t scope_index; /* NJS_SCOPE_INDEX_... */
} njs_variable_reference_t;


_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[njs] Improved working with scope indexes of variables.

Dmitry Volyntsev 99 December 30, 2018 06:14AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 62
Record Number of Users: 6 on February 13, 2018
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready