From: Igor Sysoev Date: Mon, 10 Oct 2016 13:33:56 +0000 (+0300) Subject: Now njs_vm_compile() returns all global functions via the export X-Git-Tag: 0.1.3~1 X-Git-Url: http://git.kaiwu.me/postgresql/log/contrib/postgres_fdw/static/gitweb.js?a=commitdiff_plain;h=aeea083d3c6622257cfb71675b3c9ebeeb35a452;p=njs.git Now njs_vm_compile() returns all global functions via the export array. --- diff --git a/nginx/ngx_http_js_module.c b/nginx/ngx_http_js_module.c index 429b3c42..994f8623 100644 --- a/nginx/ngx_http_js_module.c +++ b/nginx/ngx_http_js_module.c @@ -1225,7 +1225,7 @@ ngx_http_js_include(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) 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_command_t *cmd, void *conf) 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 --git a/nginx/ngx_stream_js_module.c b/nginx/ngx_stream_js_module.c index 754ead2a..bead4276 100644 --- a/nginx/ngx_stream_js_module.c +++ b/nginx/ngx_stream_js_module.c @@ -933,7 +933,7 @@ ngx_stream_js_include(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) 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, ngx_command_t *cmd, void *conf) 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 --git a/njs/njs_variable.c b/njs/njs_variable.c index d7efff8a..cd17468b 100644 --- a/njs/njs_variable.c +++ b/njs/njs_variable.c @@ -153,6 +153,65 @@ njs_parser_variable(njs_vm_t *vm, njs_parser_t *parser, nxt_uint_t *level) } +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 --git a/njs/njs_variable.h b/njs/njs_variable.h index 0d02d139..342b6301 100644 --- a/njs/njs_variable.h +++ b/njs/njs_variable.h @@ -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 --git a/njs/njscript.c b/njs/njscript.c index 0213ce8f..a85c3ccf 100644 --- a/njs/njscript.c +++ b/njs/njscript.c @@ -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 **start, u_char *end, vm->parser = NULL; + *export = njs_vm_export_functions(vm); + if (nxt_slow_path(*export == NULL)) { + return NJS_ERROR; + } + return NJS_OK; } diff --git a/njs/njscript.h b/njs/njscript.h index ed1c4bf3..f1726c5f 100644 --- a/njs/njscript.h +++ b/njs/njscript.h @@ -84,7 +84,7 @@ NXT_EXPORT njs_vm_t *njs_vm_create(nxt_mem_cache_pool_t *mcp, 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 --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index ab5c9c0d..d7114de8 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -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 *script, nxt_str_t *result, const char *msg, 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 *script, nxt_str_t *result, const char *msg, 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; }