From: Dmitry Volyntsev Date: Mon, 16 Apr 2018 16:28:07 +0000 (+0300) Subject: Added njs_vm_value(). X-Git-Tag: 0.3.1~45 X-Git-Url: http://git.kaiwu.me/postgresql/log/contrib/postgres_fdw/static/gitweb.js?a=commitdiff_plain;h=6c17b43034dec107ab05ca0188453b3f3efed613;p=njs.git Added njs_vm_value(). --- 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;