aboutsummaryrefslogtreecommitdiff
path: root/src/njs_extern.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/njs_extern.c')
-rw-r--r--src/njs_extern.c77
1 files changed, 37 insertions, 40 deletions
diff --git a/src/njs_extern.c b/src/njs_extern.c
index 077d2a5f..bbac8c73 100644
--- a/src/njs_extern.c
+++ b/src/njs_extern.c
@@ -25,22 +25,22 @@ njs_external_add(njs_vm_t *vm, njs_arr_t *protos,
njs_function_t *function;
njs_object_prop_t *prop;
njs_exotic_slots_t *slot, *next;
- njs_flathsh_query_t lhq;
+ njs_flathsh_query_t fhq;
const njs_external_t *end;
slot = njs_arr_add(protos);
njs_memzero(slot, sizeof(njs_exotic_slots_t));
hash = &slot->external_shared_hash;
- njs_lvlhsh_init(hash);
+ njs_flathsh_init(hash);
if (n == 0) {
return NJS_OK;
}
- lhq.replace = 0;
- lhq.proto = &njs_object_hash_proto;
- lhq.pool = vm->mem_pool;
+ fhq.replace = 0;
+ fhq.proto = &njs_object_hash_proto;
+ fhq.pool = vm->mem_pool;
end = external + n;
@@ -58,17 +58,8 @@ njs_external_add(njs_vm_t *vm, njs_arr_t *protos,
continue;
}
- prop = njs_object_prop_alloc(vm, &njs_value_invalid, 1);
- if (njs_slow_path(prop == NULL)) {
- goto memory_error;
- }
-
- prop->writable = external->writable;
- prop->configurable = external->configurable;
- prop->enumerable = external->enumerable;
-
if (external->flags & NJS_EXTERN_SYMBOL) {
- lhq.key_hash = external->name.symbol;
+ fhq.key_hash = external->name.symbol;
} else {
ret = njs_atom_string_create(vm, &prop_name,
@@ -78,10 +69,23 @@ njs_external_add(njs_vm_t *vm, njs_arr_t *protos,
return NJS_ERROR;
}
- lhq.key_hash = prop_name.atom_id;
+ fhq.key_hash = prop_name.atom_id;
}
- lhq.value = prop;
+ ret = njs_flathsh_unique_insert(hash, &fhq);
+ if (njs_slow_path(ret != NJS_OK)) {
+ njs_internal_error(vm, "flathsh insert failed");
+ return NJS_ERROR;
+ }
+
+ prop = fhq.value;
+
+ prop->type = NJS_PROPERTY;
+ prop->enumerable = external->enumerable;
+ prop->configurable = external->configurable;
+ prop->writable = external->writable;
+ prop->u.value = njs_value_invalid;
+
switch (external->flags & NJS_EXTERN_TYPE_MASK) {
case NJS_EXTERN_METHOD:
@@ -138,7 +142,7 @@ njs_external_add(njs_vm_t *vm, njs_arr_t *protos,
prop->u.value.type = NJS_INVALID;
prop->u.value.data.truth = 1;
njs_prop_magic16(prop) = next - slot;
- njs_prop_magic32(prop) = lhq.key_hash;
+ njs_prop_magic32(prop) = fhq.key_hash;
njs_prop_handler(prop) = njs_external_prop_handler;
if (external->u.object.prop_handler) {
@@ -167,12 +171,6 @@ njs_external_add(njs_vm_t *vm, njs_arr_t *protos,
break;
}
- ret = njs_flathsh_unique_insert(hash, &lhq);
- if (njs_slow_path(ret != NJS_OK)) {
- njs_internal_error(vm, "lvlhsh insert failed");
- return NJS_ERROR;
- }
-
external++;
}
@@ -196,7 +194,7 @@ njs_external_prop_handler(njs_vm_t *vm, njs_object_prop_t *self,
njs_external_ptr_t external;
njs_object_value_t *ov;
njs_exotic_slots_t *slots;
- njs_flathsh_query_t lhq;
+ njs_flathsh_query_t fhq;
if (njs_slow_path(retval == NULL)) {
return NJS_DECLINED;
@@ -224,26 +222,25 @@ njs_external_prop_handler(njs_vm_t *vm, njs_object_prop_t *self,
njs_set_object_value(retval, ov);
}
- prop = njs_object_prop_alloc(vm, retval, 1);
- if (njs_slow_path(prop == NULL)) {
+ fhq.key_hash = atom_id;
+ fhq.replace = 1;
+ fhq.pool = vm->mem_pool;
+ fhq.proto = &njs_object_hash_proto;
+
+ ret = njs_flathsh_unique_insert(njs_object_hash(value), &fhq);
+ if (njs_slow_path(ret != NJS_OK)) {
+ njs_internal_error(vm, "flathsh insert/replace failed");
return NJS_ERROR;
}
- prop->writable = self->writable;
- prop->configurable = self->configurable;
- prop->enumerable = self->enumerable;
+ prop = fhq.value;
- lhq.value = prop;
- lhq.key_hash = atom_id;
- lhq.replace = 1;
- lhq.pool = vm->mem_pool;
- lhq.proto = &njs_object_hash_proto;
+ prop->type = NJS_PROPERTY;
+ prop->enumerable = self->enumerable;
+ prop->configurable = self->configurable;
+ prop->writable = self->writable;
- ret = njs_flathsh_unique_insert(njs_object_hash(value), &lhq);
- if (njs_slow_path(ret != NJS_OK)) {
- njs_internal_error(vm, "lvlhsh insert/replace failed");
- return NJS_ERROR;
- }
+ prop->u.value = *retval;
return NJS_OK;
}