[njs] Now njs_vm_compile() returns all global functions via the ...

Igor Sysoev igor at sysoev.ru
Mon Oct 10 14:20:24 UTC 2016


details:   http://hg.nginx.org/njs/rev/03d12ab0961e
branches:  
changeset: 190:03d12ab0961e
user:      Igor Sysoev <igor at sysoev.ru>
date:      Mon Oct 10 16:33:56 2016 +0300
description:
Now njs_vm_compile() returns all global functions via the export
array.

diffstat:

 nginx/ngx_http_js_module.c   |   4 +-
 nginx/ngx_stream_js_module.c |   4 +-
 njs/njs_variable.c           |  59 ++++++++++++++++++++++++++++++++++++++++++++
 njs/njs_variable.h           |   7 +++++
 njs/njscript.c               |   7 ++++-
 njs/njscript.h               |   2 +-
 njs/test/njs_unit_test.c     |   8 ++--
 7 files changed, 81 insertions(+), 10 deletions(-)

diffs (207 lines):

diff -r 769173883f87 -r 03d12ab0961e nginx/ngx_http_js_module.c
--- a/nginx/ngx_http_js_module.c	Mon Oct 10 13:08:40 2016 +0300
+++ b/nginx/ngx_http_js_module.c	Mon Oct 10 16:33:56 2016 +0300
@@ -1225,7 +1225,7 @@ ngx_http_js_include(ngx_conf_t *cf, ngx_
     ngx_fd_t               fd;
     ngx_str_t             *value, file;
     nxt_int_t              rc;
-    nxt_str_t              text, ext;
+    nxt_str_t              text, ext, *export;
     nxt_lvlhsh_t           externals;
     ngx_file_info_t        fi;
     njs_vm_shared_t       *shared;
@@ -1321,7 +1321,7 @@ ngx_http_js_include(ngx_conf_t *cf, ngx_
         return NGX_CONF_ERROR;
     }
 
-    rc = njs_vm_compile(jlcf->vm, &start, end, NULL);
+    rc = njs_vm_compile(jlcf->vm, &start, end, NULL, &export);
 
     if (rc != NJS_OK) {
         njs_vm_exception(jlcf->vm, &text);
diff -r 769173883f87 -r 03d12ab0961e nginx/ngx_stream_js_module.c
--- a/nginx/ngx_stream_js_module.c	Mon Oct 10 13:08:40 2016 +0300
+++ b/nginx/ngx_stream_js_module.c	Mon Oct 10 16:33:56 2016 +0300
@@ -933,7 +933,7 @@ ngx_stream_js_include(ngx_conf_t *cf, ng
     ngx_fd_t               fd;
     ngx_str_t             *value, file;
     nxt_int_t              rc;
-    nxt_str_t              text, ext;
+    nxt_str_t              text, ext, *export;
     nxt_lvlhsh_t           externals;
     ngx_file_info_t        fi;
     njs_vm_shared_t       *shared;
@@ -1029,7 +1029,7 @@ ngx_stream_js_include(ngx_conf_t *cf, ng
         return NGX_CONF_ERROR;
     }
 
-    rc = njs_vm_compile(jscf->vm, &start, end, NULL);
+    rc = njs_vm_compile(jscf->vm, &start, end, NULL, &export);
 
     if (rc != NJS_OK) {
         njs_vm_exception(jscf->vm, &text);
diff -r 769173883f87 -r 03d12ab0961e njs/njs_variable.c
--- a/njs/njs_variable.c	Mon Oct 10 13:08:40 2016 +0300
+++ b/njs/njs_variable.c	Mon Oct 10 16:33:56 2016 +0300
@@ -153,6 +153,65 @@ njs_parser_variable(njs_vm_t *vm, njs_pa
 }
 
 
+nxt_str_t *
+njs_vm_export_functions(njs_vm_t *vm)
+{
+    size_t             n;
+    nxt_str_t          *ex, *export;
+    njs_value_t        *value;
+    njs_variable_t     *var;
+    nxt_lvlhsh_each_t  lhe;
+
+    n = 1;
+
+    memset(&lhe, 0, sizeof(nxt_lvlhsh_each_t));
+    lhe.proto = &njs_variables_hash_proto;
+
+    for ( ;; ) {
+        var = nxt_lvlhsh_each(&vm->variables_hash, &lhe);
+        if (var == NULL) {
+            break;
+        }
+
+        value = njs_global_variable_value(vm, var);
+
+        if (njs_is_function(value) && !value->data.u.function->native) {
+            n++;
+        }
+    }
+
+    export = nxt_mem_cache_alloc(vm->mem_cache_pool, n * sizeof(nxt_str_t));
+    if (nxt_slow_path(export == NULL)) {
+        return NULL;
+    }
+
+    memset(&lhe, 0, sizeof(nxt_lvlhsh_each_t));
+    lhe.proto = &njs_variables_hash_proto;
+
+    ex = export;
+
+    for ( ;; ) {
+        var = nxt_lvlhsh_each(&vm->variables_hash, &lhe);
+        if (var == NULL) {
+            break;
+        }
+
+        value = njs_global_variable_value(vm, var);
+
+        if (njs_is_function(value) && !value->data.u.function->native) {
+            ex->length = var->name_len;
+            ex->start = var->name_start;
+            ex++;
+        }
+    }
+
+    ex->length = 0;
+    ex->start = NULL;
+
+    return export;
+}
+
+
 njs_function_t *
 njs_vm_function(njs_vm_t *vm, nxt_str_t *name)
 {
diff -r 769173883f87 -r 03d12ab0961e njs/njs_variable.h
--- a/njs/njs_variable.h	Mon Oct 10 13:08:40 2016 +0300
+++ b/njs/njs_variable.h	Mon Oct 10 16:33:56 2016 +0300
@@ -26,10 +26,17 @@ typedef struct {
 } njs_variable_t;
 
 
+#define njs_global_variable_value(vm, var)                                    \
+    (njs_value_t *) ((u_char *) vm->global_scope                              \
+                      + njs_offset((var)->index) - NJS_INDEX_GLOBAL_OFFSET)
+
+
+
 njs_variable_t *njs_parser_name_alloc(njs_vm_t *vm, njs_parser_t *parser);
 njs_variable_t *njs_parser_variable(njs_vm_t *vm, njs_parser_t *parser,
     nxt_uint_t *level);
 njs_value_t *njs_variable_value(njs_parser_t *parser, njs_index_t index);
+nxt_str_t *njs_vm_export_functions(njs_vm_t *vm);
 
 
 #endif /* _NJS_VARIABLE_H_INCLUDED_ */
diff -r 769173883f87 -r 03d12ab0961e njs/njscript.c
--- a/njs/njscript.c	Mon Oct 10 13:08:40 2016 +0300
+++ b/njs/njscript.c	Mon Oct 10 16:33:56 2016 +0300
@@ -175,7 +175,7 @@ njs_vm_destroy(njs_vm_t *vm)
 
 nxt_int_t
 njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end,
-    njs_function_t **function)
+    njs_function_t **function, nxt_str_t **export)
 {
     nxt_int_t          ret;
     njs_lexer_t        *lexer;
@@ -251,6 +251,11 @@ njs_vm_compile(njs_vm_t *vm, u_char **st
 
     vm->parser = NULL;
 
+    *export = njs_vm_export_functions(vm);
+    if (nxt_slow_path(*export == NULL)) {
+        return NJS_ERROR;
+    }
+
     return NJS_OK;
 }
 
diff -r 769173883f87 -r 03d12ab0961e njs/njscript.h
--- a/njs/njscript.h	Mon Oct 10 13:08:40 2016 +0300
+++ b/njs/njscript.h	Mon Oct 10 16:33:56 2016 +0300
@@ -84,7 +84,7 @@ NXT_EXPORT njs_vm_t *njs_vm_create(nxt_m
 NXT_EXPORT void njs_vm_destroy(njs_vm_t *vm);
 
 NXT_EXPORT nxt_int_t njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end,
-    njs_function_t **function);
+    njs_function_t **function, nxt_str_t **export);
 NXT_EXPORT njs_vm_t *njs_vm_clone(njs_vm_t *vm, nxt_mem_cache_pool_t *mcp,
     void **external);
 NXT_EXPORT nxt_int_t njs_vm_call(njs_vm_t *vm, njs_function_t *function,
diff -r 769173883f87 -r 03d12ab0961e njs/test/njs_unit_test.c
--- a/njs/test/njs_unit_test.c	Mon Oct 10 13:08:40 2016 +0300
+++ b/njs/test/njs_unit_test.c	Mon Oct 10 16:33:56 2016 +0300
@@ -5484,7 +5484,7 @@ njs_unit_test(nxt_bool_t disassemble)
     u_char                *start;
     njs_vm_t              *vm, *nvm;
     nxt_int_t             ret;
-    nxt_str_t             s, r_name;
+    nxt_str_t             s, r_name, *export;
     nxt_uint_t            i;
     nxt_bool_t            success;
     nxt_lvlhsh_t          externals;
@@ -5532,7 +5532,7 @@ njs_unit_test(nxt_bool_t disassemble)
         start = njs_test[i].script.start;
 
         ret = njs_vm_compile(vm, &start, start + njs_test[i].script.length,
-                             &function);
+                             &function, &export);
 
         if (ret == NXT_OK) {
             if (disassemble) {
@@ -5611,7 +5611,7 @@ njs_unit_test_benchmark(nxt_str_t *scrip
     njs_vm_t              *vm, *nvm;
     uint64_t              us;
     nxt_int_t             ret;
-    nxt_str_t             s;
+    nxt_str_t             s, *export;
     nxt_uint_t            i;
     nxt_bool_t            success;
     nxt_lvlhsh_t          externals;
@@ -5645,7 +5645,7 @@ njs_unit_test_benchmark(nxt_str_t *scrip
 
     start = script->start;
 
-    ret = njs_vm_compile(vm, &start, start + script->length, NULL);
+    ret = njs_vm_compile(vm, &start, start + script->length, NULL, &export);
     if (ret != NXT_OK) {
         return NXT_ERROR;
     }



More information about the nginx-devel mailing list