Var: Introduced nxt_var_get()

This commit is for subsequent commits that will support njs variable
accessing. In this commit, nxt_var_get() is introduced to extend
the variable handling capabilities. Concurrently, nxt_var_ref_get()
has been refactored to use in both configuration and request phases.
This commit is contained in:
Zhidao HONG
2024-01-31 14:32:08 +08:00
parent 63507c499e
commit 465540157f
2 changed files with 39 additions and 13 deletions

View File

@@ -50,7 +50,8 @@ struct nxt_var_query_s {
static nxt_int_t nxt_var_hash_test(nxt_lvlhsh_query_t *lhq, void *data); static nxt_int_t nxt_var_hash_test(nxt_lvlhsh_query_t *lhq, void *data);
static nxt_var_decl_t *nxt_var_hash_find(nxt_str_t *name); static nxt_var_decl_t *nxt_var_hash_find(nxt_str_t *name);
static nxt_var_ref_t *nxt_var_ref_get(nxt_tstr_state_t *state, nxt_str_t *name); static nxt_var_ref_t *nxt_var_ref_get(nxt_tstr_state_t *state, nxt_str_t *name,
nxt_mp_t *mp);
static nxt_int_t nxt_var_cache_test(nxt_lvlhsh_query_t *lhq, void *data); static nxt_int_t nxt_var_cache_test(nxt_lvlhsh_query_t *lhq, void *data);
static nxt_str_t *nxt_var_cache_value(nxt_task_t *task, nxt_tstr_state_t *state, static nxt_str_t *nxt_var_cache_value(nxt_task_t *task, nxt_tstr_state_t *state,
@@ -109,7 +110,7 @@ nxt_var_hash_find(nxt_str_t *name)
static nxt_var_ref_t * static nxt_var_ref_t *
nxt_var_ref_get(nxt_tstr_state_t *state, nxt_str_t *name) nxt_var_ref_get(nxt_tstr_state_t *state, nxt_str_t *name, nxt_mp_t *mp)
{ {
nxt_int_t ret; nxt_int_t ret;
nxt_uint_t i; nxt_uint_t i;
@@ -125,12 +126,22 @@ nxt_var_ref_get(nxt_tstr_state_t *state, nxt_str_t *name)
} }
} }
ref = nxt_array_add(state->var_refs); if (mp != NULL) {
if (nxt_slow_path(ref == NULL)) { ref = nxt_mp_alloc(mp, sizeof(nxt_var_ref_t));
return NULL; if (nxt_slow_path(ref == NULL)) {
} return NULL;
}
ref->index = state->var_refs->nelts - 1; } else {
ref = nxt_array_add(state->var_refs);
if (nxt_slow_path(ref == NULL)) {
return NULL;
}
ref->index = state->var_refs->nelts - 1;
mp = state->pool;
}
decl = nxt_var_hash_find(name); decl = nxt_var_hash_find(name);
@@ -141,14 +152,14 @@ nxt_var_ref_get(nxt_tstr_state_t *state, nxt_str_t *name)
goto done; goto done;
} }
ret = nxt_http_unknown_var_ref(state->pool, ref, name); ret = nxt_http_unknown_var_ref(mp, ref, name);
if (nxt_slow_path(ret != NXT_OK)) { if (nxt_slow_path(ret != NXT_OK)) {
return NULL; return NULL;
} }
done: done:
ref->name = nxt_str_dup(state->pool, NULL, name); ref->name = nxt_str_dup(mp, NULL, name);
if (nxt_slow_path(ref->name == NULL)) { if (nxt_slow_path(ref->name == NULL)) {
return NULL; return NULL;
} }
@@ -355,7 +366,7 @@ nxt_var_compile(nxt_tstr_state_t *state, nxt_str_t *str)
next = nxt_var_next_part(p, end, &part); next = nxt_var_next_part(p, end, &part);
if (part.start != NULL) { if (part.start != NULL) {
ref = nxt_var_ref_get(state, &part); ref = nxt_var_ref_get(state, &part, NULL);
if (nxt_slow_path(ref == NULL)) { if (nxt_slow_path(ref == NULL)) {
return NULL; return NULL;
} }
@@ -395,7 +406,7 @@ nxt_var_test(nxt_tstr_state_t *state, nxt_str_t *str, u_char *error)
} }
if (part.start != NULL) { if (part.start != NULL) {
ref = nxt_var_ref_get(state, &part); ref = nxt_var_ref_get(state, &part, NULL);
if (ref == NULL) { if (ref == NULL) {
nxt_sprintf(error, error + NXT_MAX_ERROR_STR, nxt_sprintf(error, error + NXT_MAX_ERROR_STR,
@@ -560,3 +571,18 @@ nxt_var_interpreter(nxt_task_t *task, nxt_tstr_state_t *state,
return NXT_OK; return NXT_OK;
} }
nxt_str_t *
nxt_var_get(nxt_task_t *task, nxt_tstr_state_t *state, nxt_var_cache_t *cache,
nxt_str_t *name, void *ctx)
{
nxt_var_ref_t *ref;
ref = nxt_var_ref_get(state, name, cache->pool);
if (nxt_slow_path(ref == NULL)) {
return NULL;
}
return nxt_var_cache_value(task, state, cache, ref, ctx);
}

View File

@@ -59,8 +59,8 @@ nxt_int_t nxt_var_test(nxt_tstr_state_t *state, nxt_str_t *str, u_char *error);
nxt_int_t nxt_var_interpreter(nxt_task_t *task, nxt_tstr_state_t *state, nxt_int_t nxt_var_interpreter(nxt_task_t *task, nxt_tstr_state_t *state,
nxt_var_cache_t *cache, nxt_var_t *var, nxt_str_t *str, void *ctx, nxt_var_cache_t *cache, nxt_var_t *var, nxt_str_t *str, void *ctx,
nxt_bool_t logging); nxt_bool_t logging);
nxt_str_t *nxt_var_get(nxt_task_t *task, nxt_var_cache_t *cache, nxt_str_t *nxt_var_get(nxt_task_t *task, nxt_tstr_state_t *state,
nxt_str_t *name, void *ctx); nxt_var_cache_t *cache, nxt_str_t *name, void *ctx);
nxt_int_t nxt_http_unknown_var_ref(nxt_mp_t *mp, nxt_var_ref_t *ref, nxt_int_t nxt_http_unknown_var_ref(nxt_mp_t *mp, nxt_var_ref_t *ref,
nxt_str_t *name); nxt_str_t *name);