Var: keeping raw variable string for debug.
This commit is contained in:
108
src/nxt_var.c
108
src/nxt_var.c
@@ -7,18 +7,24 @@
|
||||
|
||||
|
||||
struct nxt_var_s {
|
||||
size_t plain;
|
||||
size_t length;
|
||||
nxt_uint_t vars;
|
||||
u_char data[];
|
||||
|
||||
/*
|
||||
uint32_t indexes[vars];
|
||||
size_t positions[vars];
|
||||
u_char chars[plain];
|
||||
nxt_var_sub_t subs[vars];
|
||||
u_char raw[length];
|
||||
*/
|
||||
};
|
||||
|
||||
|
||||
typedef struct {
|
||||
uint32_t index;
|
||||
uint32_t length;
|
||||
uint32_t position;
|
||||
} nxt_var_sub_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
nxt_var_t *var;
|
||||
nxt_str_t *value;
|
||||
@@ -43,13 +49,10 @@ struct nxt_var_query_s {
|
||||
};
|
||||
|
||||
|
||||
#define nxt_var_indexes(var) ((uint32_t *) (var)->data)
|
||||
#define nxt_var_subs(var) ((nxt_var_sub_t *) (var)->data)
|
||||
|
||||
#define nxt_var_positions(var) \
|
||||
((size_t *) ((var)->data + (var)->vars * sizeof(uint32_t)))
|
||||
|
||||
#define nxt_var_plain_start(var) \
|
||||
((var)->data + (var)->vars * (sizeof(uint32_t) + sizeof(size_t)))
|
||||
#define nxt_var_raw_start(var) \
|
||||
((var)->data + (var)->vars * sizeof(nxt_var_sub_t))
|
||||
|
||||
|
||||
static nxt_int_t nxt_var_hash_test(nxt_lvlhsh_query_t *lhq, void *data);
|
||||
@@ -213,16 +216,15 @@ nxt_var_index_init(void)
|
||||
nxt_var_t *
|
||||
nxt_var_compile(nxt_str_t *str, nxt_mp_t *mp)
|
||||
{
|
||||
u_char *p, *end, *plain_pos;
|
||||
size_t plain, size, *positions;
|
||||
uint32_t *indexes;
|
||||
u_char *p, *end, *next, *src;
|
||||
size_t size;
|
||||
nxt_var_t *var;
|
||||
nxt_str_t part;
|
||||
nxt_uint_t n;
|
||||
nxt_bool_t is_var;
|
||||
nxt_var_sub_t *subs;
|
||||
nxt_var_decl_t *decl;
|
||||
|
||||
plain = 0;
|
||||
n = 0;
|
||||
|
||||
p = str->start;
|
||||
@@ -230,59 +232,50 @@ nxt_var_compile(nxt_str_t *str, nxt_mp_t *mp)
|
||||
|
||||
while (p < end) {
|
||||
p = nxt_var_next_part(p, end - p, &part, &is_var);
|
||||
|
||||
if (nxt_slow_path(p == NULL)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (is_var) {
|
||||
n++;
|
||||
|
||||
} else {
|
||||
plain += part.length;
|
||||
}
|
||||
}
|
||||
|
||||
size = sizeof(nxt_var_t)
|
||||
+ n * (sizeof(nxt_var_handler_t) + sizeof (size_t))
|
||||
+ plain;
|
||||
size = sizeof(nxt_var_t) + n * sizeof(nxt_var_sub_t) + str->length;
|
||||
|
||||
var = nxt_mp_get(mp, size);
|
||||
if (nxt_slow_path(var == NULL)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
var->plain = plain;
|
||||
var->length = str->length;
|
||||
var->vars = n;
|
||||
|
||||
indexes = nxt_var_indexes(var);
|
||||
positions = nxt_var_positions(var);
|
||||
plain_pos = nxt_var_plain_start(var);
|
||||
subs = nxt_var_subs(var);
|
||||
src = nxt_var_raw_start(var);
|
||||
|
||||
nxt_memcpy(src, str->start, str->length);
|
||||
|
||||
plain = 0;
|
||||
n = 0;
|
||||
|
||||
p = str->start;
|
||||
|
||||
while (p < end) {
|
||||
p = nxt_var_next_part(p, end - p, &part, &is_var);
|
||||
next = nxt_var_next_part(p, end - p, &part, &is_var);
|
||||
|
||||
if (is_var) {
|
||||
decl = nxt_var_hash_find(&part);
|
||||
|
||||
if (nxt_slow_path(decl == NULL)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
indexes[n] = decl->index;
|
||||
positions[n] = plain;
|
||||
subs[n].index = decl->index;
|
||||
subs[n].length = next - p;
|
||||
subs[n].position = p - str->start;
|
||||
|
||||
n++;
|
||||
|
||||
} else {
|
||||
plain_pos = nxt_cpymem(plain_pos, part.start, part.length);
|
||||
plain += part.length;
|
||||
}
|
||||
|
||||
p = next;
|
||||
}
|
||||
|
||||
return var;
|
||||
@@ -438,16 +431,17 @@ void
|
||||
nxt_var_query(nxt_task_t *task, nxt_var_query_t *query, nxt_var_t *var,
|
||||
nxt_str_t *str)
|
||||
{
|
||||
uint32_t *indexes;
|
||||
uint32_t index;
|
||||
nxt_mp_t *mp;
|
||||
nxt_str_t *value;
|
||||
nxt_int_t ret;
|
||||
nxt_uint_t i;
|
||||
nxt_var_sub_t *subs;
|
||||
nxt_var_value_t *val;
|
||||
|
||||
if (var->vars == 0) {
|
||||
str->length = var->plain;
|
||||
str->start = nxt_var_plain_start(var);
|
||||
str->length = var->length;
|
||||
str->start = nxt_var_raw_start(var);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -456,7 +450,7 @@ nxt_var_query(nxt_task_t *task, nxt_var_query_t *query, nxt_var_t *var,
|
||||
}
|
||||
|
||||
mp = query->values.mem_pool;
|
||||
indexes = nxt_var_indexes(var);
|
||||
subs = nxt_var_subs(var);
|
||||
value = query->spare;
|
||||
|
||||
for (i = 0; i < var->vars; i++) {
|
||||
@@ -468,7 +462,9 @@ nxt_var_query(nxt_task_t *task, nxt_var_query_t *query, nxt_var_t *var,
|
||||
}
|
||||
}
|
||||
|
||||
ret = nxt_var_cache_add(&query->cache, indexes[i], value, mp);
|
||||
index = subs[i].index;
|
||||
|
||||
ret = nxt_var_cache_add(&query->cache, index, value, mp);
|
||||
|
||||
if (ret != NXT_OK) {
|
||||
if (nxt_slow_path(ret == NXT_ERROR)) {
|
||||
@@ -478,7 +474,7 @@ nxt_var_query(nxt_task_t *task, nxt_var_query_t *query, nxt_var_t *var,
|
||||
continue; /* NXT_DECLINED */
|
||||
}
|
||||
|
||||
ret = nxt_var_index[indexes[i]](task, query, value, query->ctx);
|
||||
ret = nxt_var_index[index](task, query, value, query->ctx);
|
||||
|
||||
value = NULL;
|
||||
|
||||
@@ -539,11 +535,11 @@ static void
|
||||
nxt_var_query_finish(nxt_task_t *task, nxt_var_query_t *query)
|
||||
{
|
||||
u_char *p, *src;
|
||||
size_t length, plain, next, *positions;
|
||||
uint32_t *indexes;
|
||||
size_t length, last, next;
|
||||
nxt_str_t *str, **part;
|
||||
nxt_var_t *var;
|
||||
nxt_uint_t i, j;
|
||||
nxt_var_sub_t *subs;
|
||||
nxt_var_value_t *val;
|
||||
|
||||
if (query->failed) {
|
||||
@@ -555,11 +551,11 @@ nxt_var_query_finish(nxt_task_t *task, nxt_var_query_t *query)
|
||||
for (i = 0; i < query->values.nelts; i++) {
|
||||
var = val[i].var;
|
||||
|
||||
length = var->plain;
|
||||
indexes = nxt_var_indexes(var);
|
||||
subs = nxt_var_subs(var);
|
||||
length = var->length;
|
||||
|
||||
for (j = 0; j < var->vars; j++) {
|
||||
str = nxt_var_cache_find(&query->cache, indexes[j]);
|
||||
str = nxt_var_cache_find(&query->cache, subs[j].index);
|
||||
|
||||
nxt_assert(str != NULL);
|
||||
|
||||
@@ -572,7 +568,7 @@ nxt_var_query_finish(nxt_task_t *task, nxt_var_query_t *query)
|
||||
|
||||
*part = str;
|
||||
|
||||
length += str->length;
|
||||
length += str->length - subs[j].length;
|
||||
}
|
||||
|
||||
p = nxt_mp_nget(query->values.mem_pool, length);
|
||||
@@ -585,24 +581,24 @@ nxt_var_query_finish(nxt_task_t *task, nxt_var_query_t *query)
|
||||
val[i].value->start = p;
|
||||
|
||||
part = query->parts.elts;
|
||||
positions = nxt_var_positions(var);
|
||||
src = nxt_var_plain_start(var);
|
||||
src = nxt_var_raw_start(var);
|
||||
|
||||
plain = 0;
|
||||
last = 0;
|
||||
|
||||
for (j = 0; j < var->vars; j++) {
|
||||
next = positions[j];
|
||||
next = subs[j].position;
|
||||
|
||||
if (next != plain) {
|
||||
p = nxt_cpymem(p, &src[plain], next - plain);
|
||||
plain = next;
|
||||
if (next != last) {
|
||||
p = nxt_cpymem(p, &src[last], next - last);
|
||||
}
|
||||
|
||||
p = nxt_cpymem(p, part[j]->start, part[j]->length);
|
||||
|
||||
last = next + subs[j].length;
|
||||
}
|
||||
|
||||
if (plain != var->plain) {
|
||||
nxt_memcpy(p, &src[plain], var->plain - plain);
|
||||
if (last != var->length) {
|
||||
nxt_memcpy(p, &src[last], var->length - last);
|
||||
}
|
||||
|
||||
nxt_array_reset(&query->parts);
|
||||
|
||||
Reference in New Issue
Block a user