diff options
Diffstat (limited to 'src/njs_extern.c')
-rw-r--r-- | src/njs_extern.c | 77 |
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; } |