aboutsummaryrefslogtreecommitdiff
path: root/src/njs_regexp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/njs_regexp.c')
-rw-r--r--src/njs_regexp.c108
1 files changed, 50 insertions, 58 deletions
diff --git a/src/njs_regexp.c b/src/njs_regexp.c
index ed560b18..7d09d5c8 100644
--- a/src/njs_regexp.c
+++ b/src/njs_regexp.c
@@ -501,7 +501,7 @@ njs_regexp_alloc(njs_vm_t *vm, njs_regexp_pattern_t *pattern)
regexp = njs_mp_alloc(vm->mem_pool, sizeof(njs_regexp_t));
if (njs_fast_path(regexp != NULL)) {
- njs_lvlhsh_init(&regexp->object.hash);
+ njs_flathsh_init(&regexp->object.hash);
regexp->object.shared_hash = vm->shared->regexp_instance_hash;
regexp->object.__proto__ = njs_vm_proto(vm, NJS_OBJ_TYPE_REGEXP);
regexp->object.slots = NULL;
@@ -1007,7 +1007,7 @@ njs_regexp_exec_result(njs_vm_t *vm, njs_value_t *r, njs_utf8_t utf8,
njs_regexp_t *regexp;
njs_object_prop_t *prop;
njs_regexp_group_t *group;
- njs_flathsh_query_t lhq;
+ njs_flathsh_query_t fhq;
njs_regexp_pattern_t *pattern;
regexp = njs_regexp(r);
@@ -1038,11 +1038,24 @@ njs_regexp_exec_result(njs_vm_t *vm, njs_value_t *r, njs_utf8_t utf8,
}
/* FIXME: implement fast CreateDataPropertyOrThrow(). */
- prop = njs_object_prop_alloc(vm, &njs_value_undefined, 1);
- if (njs_slow_path(prop == NULL)) {
- goto fail;
+
+ fhq.key_hash = NJS_ATOM_STRING_index;
+ fhq.replace = 0;
+ fhq.pool = vm->mem_pool;
+ fhq.proto = &njs_object_hash_proto;
+
+ ret = njs_flathsh_unique_insert(&array->object.hash, &fhq);
+ if (njs_slow_path(ret != NJS_OK)) {
+ goto insert_fail;
}
+ prop = fhq.value;
+
+ prop->type = NJS_PROPERTY;
+ prop->enumerable = 1;
+ prop->configurable = 1;
+ prop->writable = 1;
+
c = njs_regex_capture(match_data, 0);
if (utf8 == NJS_STRING_UTF8) {
@@ -1054,42 +1067,35 @@ njs_regexp_exec_result(njs_vm_t *vm, njs_value_t *r, njs_utf8_t utf8,
njs_set_number(&prop->u.value, index);
- lhq.key_hash = NJS_ATOM_STRING_index;
- lhq.replace = 0;
- lhq.value = prop;
- lhq.pool = vm->mem_pool;
- lhq.proto = &njs_object_hash_proto;
+ fhq.key_hash = NJS_ATOM_STRING_input;
- ret = njs_flathsh_unique_insert(&array->object.hash, &lhq);
+ ret = njs_flathsh_unique_insert(&array->object.hash, &fhq);
if (njs_slow_path(ret != NJS_OK)) {
goto insert_fail;
}
- prop = njs_object_prop_alloc(vm, &regexp->string, 1);
- if (njs_slow_path(prop == NULL)) {
- goto fail;
- }
+ prop = fhq.value;
+
+ prop->type = NJS_PROPERTY;
+ prop->enumerable = 1;
+ prop->configurable = 1;
+ prop->writable = 1;
+ prop->u.value = regexp->string;
- lhq.key_hash = NJS_ATOM_STRING_input;
- lhq.value = prop;
+ fhq.key_hash = NJS_ATOM_STRING_groups;
- ret = njs_flathsh_unique_insert(&array->object.hash, &lhq);
+ ret = njs_flathsh_unique_insert(&array->object.hash, &fhq);
if (njs_slow_path(ret != NJS_OK)) {
goto insert_fail;
}
- prop = njs_object_prop_alloc(vm, &njs_value_undefined, 1);
- if (njs_slow_path(prop == NULL)) {
- goto fail;
- }
+ prop = fhq.value;
- lhq.key_hash = NJS_ATOM_STRING_groups;
- lhq.value = prop;
-
- ret = njs_flathsh_unique_insert(&array->object.hash, &lhq);
- if (njs_slow_path(ret != NJS_OK)) {
- goto insert_fail;
- }
+ prop->type = NJS_PROPERTY;
+ prop->enumerable = 1;
+ prop->configurable = 1;
+ prop->writable = 1;
+ prop->u.value = njs_value_undefined;
if (pattern->ngroups != 0) {
groups = njs_object_alloc(vm);
@@ -1110,19 +1116,21 @@ njs_regexp_exec_result(njs_vm_t *vm, njs_value_t *r, njs_utf8_t utf8,
goto fail;
}
- prop = njs_object_prop_alloc(vm, &array->start[group->capture], 1);
- if (njs_slow_path(prop == NULL)) {
- goto fail;
- }
-
- lhq.key_hash = name.atom_id;
- lhq.value = prop;
+ fhq.key_hash = name.atom_id;
- ret = njs_flathsh_unique_insert(&groups->hash, &lhq);
+ ret = njs_flathsh_unique_insert(&groups->hash, &fhq);
if (njs_slow_path(ret != NJS_OK)) {
goto insert_fail;
}
+ prop = fhq.value;
+
+ prop->type = NJS_PROPERTY;
+ prop->enumerable = 1;
+ prop->configurable = 1;
+ prop->writable = 1;
+ prop->u.value = array->start[group->capture];
+
i++;
} while (i < pattern->ngroups);
@@ -1133,7 +1141,7 @@ njs_regexp_exec_result(njs_vm_t *vm, njs_value_t *r, njs_utf8_t utf8,
insert_fail:
- njs_internal_error(vm, "lvlhsh insert failed");
+ njs_internal_error(vm, "flathsh insert failed");
fail:
@@ -1149,30 +1157,14 @@ static void
njs_regexp_exec_result_free(njs_vm_t *vm, njs_array_t *result)
{
njs_flathsh_t *hash;
- njs_object_prop_t *prop;
- njs_flathsh_elt_t *elt;
- njs_flathsh_each_t lhe;
- njs_flathsh_query_t lhq;
-
- njs_flathsh_each_init(&lhe, &njs_object_hash_proto);
+ njs_flathsh_query_t fhq;
hash = &result->object.hash;
- for ( ;; ) {
- elt = njs_flathsh_each(hash, &lhe);
- if (elt == NULL) {
- break;
- }
-
- prop = elt->value;
-
- njs_mp_free(vm->mem_pool, prop);
- }
-
- lhq.pool = vm->mem_pool;
- lhq.proto = &njs_object_hash_proto;
+ fhq.pool = vm->mem_pool;
+ fhq.proto = &njs_object_hash_proto;
- njs_flathsh_destroy(hash, &lhq);
+ njs_flathsh_destroy(hash, &fhq);
njs_array_destroy(vm, result);
}