array.
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;
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);
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;
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);
}
+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)
{
} 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_ */
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;
vm->parser = NULL;
+ *export = njs_vm_export_functions(vm);
+ if (nxt_slow_path(*export == NULL)) {
+ return NJS_ERROR;
+ }
+
return NJS_OK;
}
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,
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;
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) {
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;
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;
}