From cbf8c2d93e96db008d890f5473c6be16ffa4eb0d Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Tue, 2 Nov 2021 12:38:02 +0000 Subject: [PATCH] Unified creation of objects with custom value slots. --- src/njs_crypto.c | 31 ++------------------------- src/njs_encoding.c | 52 +++++++++++----------------------------------- src/njs_extern.c | 19 ++--------------- src/njs_iterator.c | 22 +++++--------------- 4 files changed, 21 insertions(+), 103 deletions(-) diff --git a/src/njs_crypto.c b/src/njs_crypto.c index 273eff1d..0b65f0ed 100644 --- a/src/njs_crypto.c +++ b/src/njs_crypto.c @@ -129,33 +129,6 @@ static njs_crypto_enc_t njs_encodings[] = { }; -static njs_object_value_t * -njs_crypto_object_value_alloc(njs_vm_t *vm, njs_object_type_t type) -{ - njs_object_value_t *ov; - - ov = njs_mp_alloc(vm->mem_pool, sizeof(njs_object_value_t)); - - if (njs_fast_path(ov != NULL)) { - njs_lvlhsh_init(&ov->object.hash); - njs_lvlhsh_init(&ov->object.shared_hash); - ov->object.type = NJS_OBJECT_VALUE; - ov->object.shared = 0; - ov->object.extensible = 1; - ov->object.error_data = 0; - ov->object.fast_array = 0; - - ov->object.__proto__ = &vm->prototypes[type].object; - ov->object.slots = NULL; - return ov; - } - - njs_memory_error(vm); - - return NULL; -} - - static njs_int_t njs_crypto_create_hash(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) @@ -169,7 +142,7 @@ njs_crypto_create_hash(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, return NJS_ERROR; } - hash = njs_crypto_object_value_alloc(vm, NJS_OBJ_TYPE_CRYPTO_HASH); + hash = njs_object_value_alloc(vm, NJS_OBJ_TYPE_CRYPTO_HASH, 0, NULL); if (njs_slow_path(hash == NULL)) { return NJS_ERROR; } @@ -510,7 +483,7 @@ njs_crypto_create_hmac(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, alg->init(&ctx->u); alg->update(&ctx->u, key_buf, 64); - hmac = njs_crypto_object_value_alloc(vm, NJS_OBJ_TYPE_CRYPTO_HMAC); + hmac = njs_object_value_alloc(vm, NJS_OBJ_TYPE_CRYPTO_HMAC, 0, NULL); if (njs_slow_path(hmac == NULL)) { return NJS_ERROR; } diff --git a/src/njs_encoding.c b/src/njs_encoding.c index 14500491..2379bf16 100644 --- a/src/njs_encoding.c +++ b/src/njs_encoding.c @@ -48,34 +48,20 @@ static njs_int_t njs_text_encoder_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { - njs_object_t *proto; - njs_object_value_t *ov; + njs_object_value_t *encoder; if (!vm->top_frame->ctor) { njs_type_error(vm, "Constructor of TextEncoder requires 'new'"); return NJS_ERROR; } - ov = njs_mp_alloc(vm->mem_pool, sizeof(njs_object_value_t)); - if (njs_slow_path(ov == NULL)) { - njs_memory_error(vm); + encoder = njs_object_value_alloc(vm, NJS_OBJ_TYPE_TEXT_ENCODER, 0, NULL); + if (njs_slow_path(encoder == NULL)) { return NJS_ERROR; } - proto = &vm->prototypes[NJS_OBJ_TYPE_TEXT_ENCODER].object; - - njs_lvlhsh_init(&ov->object.hash); - njs_lvlhsh_init(&ov->object.shared_hash); - ov->object.type = NJS_OBJECT_VALUE; - ov->object.shared = 0; - ov->object.extensible = 1; - ov->object.error_data = 0; - ov->object.fast_array = 0; - ov->object.__proto__ = proto; - ov->object.slots = NULL; - - njs_set_data(&ov->value, NULL, NJS_DATA_TAG_TEXT_ENCODER); - njs_set_object_value(&vm->retval, ov); + njs_set_data(&encoder->value, NULL, NJS_DATA_TAG_TEXT_ENCODER); + njs_set_object_value(&vm->retval, encoder); return NJS_OK; } @@ -330,8 +316,7 @@ njs_text_decoder_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { njs_int_t ret; - njs_object_t *proto; - njs_object_value_t *ov; + njs_object_value_t *decoder; njs_encoding_decode_t *data; if (!vm->top_frame->ctor) { @@ -339,26 +324,13 @@ njs_text_decoder_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, return NJS_ERROR; } - ov = njs_mp_alloc(vm->mem_pool, sizeof(njs_object_value_t) - + sizeof(njs_encoding_decode_t)); - if (njs_slow_path(ov == NULL)) { - njs_memory_error(vm); + decoder = njs_object_value_alloc(vm, NJS_OBJ_TYPE_TEXT_DECODER, + sizeof(njs_encoding_decode_t), NULL); + if (njs_slow_path(decoder == NULL)) { return NJS_ERROR; } - proto = &vm->prototypes[NJS_OBJ_TYPE_TEXT_DECODER].object; - - njs_lvlhsh_init(&ov->object.hash); - njs_lvlhsh_init(&ov->object.shared_hash); - ov->object.type = NJS_OBJECT_VALUE; - ov->object.shared = 0; - ov->object.extensible = 1; - ov->object.error_data = 0; - ov->object.fast_array = 0; - ov->object.__proto__ = proto; - ov->object.slots = NULL; - - data = (njs_encoding_decode_t *) ((uint8_t *) ov + data = (njs_encoding_decode_t *) ((uint8_t *) decoder + sizeof(njs_object_value_t)); ret = njs_text_decoder_arg_encoding(vm, args, nargs, data); @@ -373,8 +345,8 @@ njs_text_decoder_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_utf8_decode_init(&data->ctx); - njs_set_data(&ov->value, data, NJS_DATA_TAG_TEXT_DECODER); - njs_set_object_value(&vm->retval, ov); + njs_set_data(&decoder->value, data, NJS_DATA_TAG_TEXT_DECODER); + njs_set_object_value(&vm->retval, decoder); return NJS_OK; } diff --git a/src/njs_extern.c b/src/njs_extern.c index 8536996e..8e487373 100644 --- a/src/njs_extern.c +++ b/src/njs_extern.c @@ -179,22 +179,14 @@ njs_external_prop_handler(njs_vm_t *vm, njs_object_prop_t *self, *retval = *setval; } else { - ov = njs_mp_alloc(vm->mem_pool, sizeof(njs_object_value_t)); + ov = njs_object_value_alloc(vm, NJS_OBJ_TYPE_OBJECT, 0, NULL); if (njs_slow_path(ov == NULL)) { - njs_memory_error(vm); return NJS_ERROR; } slots = njs_object(value)->slots + self->value.data.magic16; - njs_lvlhsh_init(&ov->object.hash); ov->object.shared_hash = slots->external_shared_hash; - ov->object.type = NJS_OBJECT; - ov->object.shared = 0; - ov->object.extensible = 1; - ov->object.error_data = 0; - ov->object.fast_array = 0; - ov->object.__proto__ = &vm->prototypes[NJS_OBJ_TYPE_OBJECT].object; ov->object.slots = slots; external = njs_vm_external(vm, NJS_PROTO_ID_ANY, value); @@ -308,23 +300,16 @@ njs_vm_external_create(njs_vm_t *vm, njs_value_t *value, njs_int_t proto_id, proto = ((uintptr_t *) vm->protos->start)[proto_id]; - ov = njs_mp_alloc(vm->mem_pool, sizeof(njs_object_value_t)); + ov = njs_object_value_alloc(vm, NJS_OBJ_TYPE_OBJECT, 0, NULL); if (njs_slow_path(ov == NULL)) { - njs_memory_error(vm); return NJS_ERROR; } protos = (njs_arr_t *) proto; slots = protos->start; - njs_lvlhsh_init(&ov->object.hash); ov->object.shared_hash = slots->external_shared_hash; - ov->object.type = NJS_OBJECT; ov->object.shared = shared; - ov->object.extensible = 1; - ov->object.error_data = 0; - ov->object.fast_array = 0; - ov->object.__proto__ = &vm->prototypes[NJS_OBJ_TYPE_OBJECT].object; ov->object.slots = slots; njs_set_object_value(value, ov); diff --git a/src/njs_iterator.c b/src/njs_iterator.c index ca2dd973..90c3046f 100644 --- a/src/njs_iterator.c +++ b/src/njs_iterator.c @@ -34,27 +34,15 @@ njs_int_t njs_array_iterator_create(njs_vm_t *vm, const njs_value_t *target, njs_value_t *retval, njs_object_enum_t kind) { - njs_object_value_t *ov; + njs_object_value_t *iterator; njs_array_iterator_t *it; - ov = njs_mp_alloc(vm->mem_pool, sizeof(njs_object_value_t)); - if (njs_slow_path(ov == NULL)) { + iterator = njs_object_value_alloc(vm, NJS_OBJ_TYPE_ARRAY_ITERATOR, 0, NULL); + if (njs_slow_path(iterator == NULL)) { njs_memory_error(vm); return NJS_ERROR; } - njs_lvlhsh_init(&ov->object.hash); - njs_lvlhsh_init(&ov->object.shared_hash); - ov->object.type = NJS_OBJECT_VALUE; - ov->object.shared = 0; - ov->object.extensible = 1; - ov->object.error_data = 0; - ov->object.fast_array = 0; - - ov->object.__proto__ = - &vm->prototypes[NJS_OBJ_TYPE_ARRAY_ITERATOR].object; - ov->object.slots = NULL; - it = njs_mp_alloc(vm->mem_pool, sizeof(njs_array_iterator_t)); if (njs_slow_path(it == NULL)) { njs_memory_error(vm); @@ -66,8 +54,8 @@ njs_array_iterator_create(njs_vm_t *vm, const njs_value_t *target, it->next = 0; it->kind = kind; - njs_set_data(&ov->value, it, NJS_DATA_TAG_ARRAY_ITERATOR); - njs_set_object_value(retval, ov); + njs_set_data(&iterator->value, it, NJS_DATA_TAG_ARRAY_ITERATOR); + njs_set_object_value(retval, iterator); return NJS_OK; } -- 2.47.3