diff options
Diffstat (limited to 'src/njs_regexp.c')
-rw-r--r-- | src/njs_regexp.c | 108 |
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(®exp->object.hash); + njs_flathsh_init(®exp->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, ®exp->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); } |