From 6c17b43034dec107ab05ca0188453b3f3efed613 Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Mon, 16 Apr 2018 19:28:07 +0300 Subject: [PATCH] Added njs_vm_value(). --- njs/njs.h | 3 ++- njs/njs_variable.c | 27 +++++++++++++++++++-------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/njs/njs.h b/njs/njs.h index 3d7d4ec3..334fcc87 100644 --- a/njs/njs.h +++ b/njs/njs.h @@ -229,7 +229,8 @@ NXT_EXPORT njs_external_ptr_t njs_vm_external(njs_vm_t *vm, NXT_EXPORT void njs_disassembler(njs_vm_t *vm); NXT_EXPORT nxt_array_t *njs_vm_completions(njs_vm_t *vm, nxt_str_t *expression); -NXT_EXPORT njs_function_t *njs_vm_function(njs_vm_t *vm, nxt_str_t *name); +NXT_EXPORT const njs_value_t *njs_vm_value(njs_vm_t *vm, const nxt_str_t *name); +NXT_EXPORT njs_function_t *njs_vm_function(njs_vm_t *vm, const nxt_str_t *name); NXT_EXPORT njs_value_t *njs_vm_retval(njs_vm_t *vm); NXT_EXPORT void njs_vm_retval_set(njs_vm_t *vm, const njs_value_t *value); diff --git a/njs/njs_variable.c b/njs/njs_variable.c index b692b6f1..f4596baa 100644 --- a/njs/njs_variable.c +++ b/njs/njs_variable.c @@ -598,24 +598,35 @@ njs_name_copy(njs_vm_t *vm, nxt_str_t *dst, nxt_str_t *src) } -njs_function_t * -njs_vm_function(njs_vm_t *vm, nxt_str_t *name) +const njs_value_t * +njs_vm_value(njs_vm_t *vm, const nxt_str_t *name) { - njs_value_t *value; - njs_variable_t *var; nxt_lvlhsh_query_t lhq; lhq.key_hash = nxt_djb_hash(name->start, name->length); lhq.key = *name; lhq.proto = &njs_variables_hash_proto; - if (nxt_slow_path(nxt_lvlhsh_find(&vm->variables_hash, &lhq) != NXT_OK)) { - return NULL; + if (nxt_lvlhsh_find(&vm->variables_hash, &lhq) == NXT_OK) { + return njs_vmcode_operand(vm, ((njs_variable_t *) lhq.value)->index); + } + + lhq.proto = &njs_extern_value_hash_proto; + + if (nxt_lvlhsh_find(&vm->externals_hash, &lhq) == NXT_OK) { + return &((njs_extern_value_t *) lhq.value)->value; } - var = lhq.value; + return &njs_value_undefined; +} + + +njs_function_t * +njs_vm_function(njs_vm_t *vm, const nxt_str_t *name) +{ + const njs_value_t *value; - value = njs_global_variable_value(vm, var); + value = njs_vm_value(vm, name); if (njs_is_function(value)) { return value->data.u.function; -- 2.47.3