diff --git a/nginx/ngx_js.c b/nginx/ngx_js.c index f70288cf1..9a1903ed0 100644 --- a/nginx/ngx_js.c +++ b/nginx/ngx_js.c @@ -557,7 +557,7 @@ ngx_engine_njs_init(ngx_engine_t *engine, ngx_engine_opts_t *opts) vm_options.argv = ngx_argv; vm_options.argc = ngx_argc; - vm = njs_vm_create(&vm_options); + vm = njs_vm_create_parent(&vm_options, opts->conf->preload_vm); if (vm == NULL) { return NGX_ERROR; } diff --git a/src/njs.h b/src/njs.h index d0c992993..0fb3eace3 100644 --- a/src/njs.h +++ b/src/njs.h @@ -126,7 +126,6 @@ enum { NJS_SYMBOL_TO_PRIMITIVE, NJS_SYMBOL_TO_STRING_TAG, NJS_SYMBOL_UNSCOPABLES, - NJS_SYMBOL_KNOWN_MAX, }; diff --git a/src/njs_array.c b/src/njs_array.c index 60605fcf8..59269e8c7 100644 --- a/src/njs_array.c +++ b/src/njs_array.c @@ -613,7 +613,7 @@ static njs_object_prop_t njs_array_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_Array), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), NJS_DECLARE_PROP_NATIVE(njs_atom.vs_from, njs_array_from, 1, 0), @@ -1620,7 +1620,8 @@ njs_array_prototype_to_string(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_lvlhsh_query_t lhq; if (njs_is_object(njs_argument(args, 0))) { - njs_object_property_init(&lhq, &njs_atom.vs_join, NJS_JOIN_HASH); + lhq.proto = &njs_object_hash_proto; + lhq.key_hash = njs_atom.vs_join.atom_id; ret = njs_object_property(vm, njs_object(njs_argument(args, 0)), &lhq, &value); @@ -3189,12 +3190,12 @@ njs_array_prototype_iterator_obj(njs_vm_t *vm, njs_value_t *args, static njs_object_prop_t njs_array_prototype_properties[] = { - NJS_DECLARE_PROP_HANDLER(njs_atom.vs_length, njs_array_length, 0, 0, + NJS_DECLARE_PROP_HANDLER(njs_atom.vs_length, njs_array_length, 0, NJS_OBJECT_PROP_VALUE_W), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_NATIVE(njs_atom.vs_concat, njs_array_prototype_concat, 1, 0), @@ -3296,7 +3297,7 @@ static const njs_object_init_t njs_array_prototype_init = { njs_object_prop_t njs_array_instance_properties[] = { - NJS_DECLARE_PROP_HANDLER(njs_atom.vs_length, njs_array_length, 0, 0, + NJS_DECLARE_PROP_HANDLER(njs_atom.vs_length, njs_array_length, 0, NJS_OBJECT_PROP_VALUE_W), }; diff --git a/src/njs_array_buffer.c b/src/njs_array_buffer.c index 9cad3769e..5be0b339c 100644 --- a/src/njs_array_buffer.c +++ b/src/njs_array_buffer.c @@ -146,7 +146,7 @@ static njs_object_prop_t njs_array_buffer_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_ArrayBuffer), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), NJS_DECLARE_PROP_GETTER(njs_atom.vw_species, njs_array_buffer_get_this, @@ -265,8 +265,8 @@ njs_array_buffer_detach(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, static njs_object_prop_t njs_array_buffer_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_GETTER(njs_atom.vs_byteLength, njs_array_buffer_prototype_byte_length, 0), diff --git a/src/njs_async.c b/src/njs_async.c index 64d545417..d6ed48fb0 100644 --- a/src/njs_async.c +++ b/src/njs_async.c @@ -167,7 +167,8 @@ static njs_object_prop_t njs_async_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_AsyncFunction), - NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, 0, 0, 0), + NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, + 0, 0), }; @@ -183,8 +184,8 @@ static njs_object_prop_t njs_async_prototype_properties[] = NJS_OBJECT_PROP_VALUE_C), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), }; @@ -205,9 +206,9 @@ const njs_object_type_init_t njs_async_function_type_init = { static njs_object_prop_t njs_async_function_instance_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_length, njs_function_instance_length, 0, - 0, NJS_OBJECT_PROP_VALUE_C), + NJS_OBJECT_PROP_VALUE_C), - NJS_DECLARE_PROP_HANDLER(njs_atom.vs_name, njs_function_instance_name, 0, 0, + NJS_DECLARE_PROP_HANDLER(njs_atom.vs_name, njs_function_instance_name, 0, NJS_OBJECT_PROP_VALUE_C), }; diff --git a/src/njs_boolean.c b/src/njs_boolean.c index 616dddbbe..e98e980a9 100644 --- a/src/njs_boolean.c +++ b/src/njs_boolean.c @@ -47,7 +47,7 @@ static njs_object_prop_t njs_boolean_constructor_properties[] = NJS_OBJECT_PROP_VALUE_C), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), }; @@ -113,12 +113,12 @@ njs_boolean_prototype_to_string(njs_vm_t *vm, njs_value_t *args, static njs_object_prop_t njs_boolean_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs___proto__, - njs_primitive_prototype_get_proto, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_primitive_prototype_get_proto, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_NATIVE(njs_atom.vs_valueOf, njs_boolean_prototype_value_of, 0, 0), diff --git a/src/njs_buffer.c b/src/njs_buffer.c index af0d3a191..33794d54d 100644 --- a/src/njs_buffer.c +++ b/src/njs_buffer.c @@ -2473,11 +2473,11 @@ static njs_object_prop_t njs_buffer_prototype_properties[] = NJS_OBJECT_PROP_VALUE_C), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_length, njs_buffer_prototype_length, 0, - 0, 0), + 0), NJS_DECLARE_PROP_NATIVE(njs_atom.vs_readInt8, njs_buffer_prototype_read_int, 1, njs_buffer_magic(1, 1, 1)), @@ -2673,7 +2673,7 @@ static njs_object_prop_t njs_buffer_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_Buffer), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), NJS_DECLARE_PROP_NATIVE(njs_atom.vs_alloc, njs_buffer_alloc_safe, 0, 1), diff --git a/src/njs_builtin.c b/src/njs_builtin.c index 05f6dbfb7..d708e5b14 100644 --- a/src/njs_builtin.c +++ b/src/njs_builtin.c @@ -131,23 +131,29 @@ njs_builtin_objects_create(njs_vm_t *vm, njs_vm_t *vm_parent) njs_atom_hash_init(); if (vm_parent == NULL) { - /* njs_lvlhsh_init(&vm->atom_hash_shared); done by zalign. */ + /* njs_lvlhsh_init(&vm->atom_hash_shared_cell); done by zalign. */ - ret = njs_flathsh_alloc_copy(vm->mem_pool, &vm->atom_hash, + ret = njs_flathsh_alloc_copy(vm->mem_pool, &vm->atom_hash_cell, &njs_atom_hash); if (njs_slow_path(ret != NJS_OK)) { return NJS_ERROR; } + vm->atom_hash = &vm->atom_hash_cell; + vm->atom_hash_mem_pool = vm->mem_pool; - vm->atom_hash_atom_id = njs_atom_hash_atom_id; + + vm->atom_hash_atom_id_cell = njs_atom_hash_atom_id; + vm->atom_hash_atom_id = &vm->atom_hash_atom_id_cell; } else { - vm->atom_hash_shared = vm_parent->atom_hash_shared; + vm->atom_hash_shared_cell = vm_parent->atom_hash_shared_cell; + /* vm->atom_hash_cell not used here */ vm->atom_hash = vm_parent->atom_hash; + vm->atom_hash_mem_pool = vm_parent->mem_pool; - vm->atom_hash_atom_id = vm_parent->atom_hash_atom_id; + vm->atom_hash_atom_id = vm_parent->atom_hash_atom_id; } pattern = njs_regexp_pattern_create(vm, (u_char *) "(?:)", @@ -422,9 +428,15 @@ njs_builtin_traverse(njs_vm_t *vm, njs_traverse_t *traverse, void *data) return ret; } + ret = njs_atom_atomize_key(vm, &prop->name); + if (ret != NJS_OK) { + return ret; + } + lhq.value = prop; - njs_string_get(&prop->name, &lhq.key); - lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length); + + lhq.key_hash = prop->name.atom_id; + lhq.replace = 1; lhq.pool = vm->mem_pool; lhq.proto = &njs_object_hash_proto; @@ -763,10 +775,10 @@ njs_global_this_prop_handler(njs_vm_t *vm, njs_object_prop_t *prop, lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length); lhq.proto = &njs_lexer_hash_proto; - ret = njs_lvlhsh_find(&vm->atom_hash, &lhq); + ret = njs_lvlhsh_find(vm->atom_hash, &lhq); if (njs_slow_path(ret != NJS_OK || lhq.value == NULL)) { - ret = njs_lvlhsh_find(&vm->atom_hash_shared, &lhq); + ret = njs_lvlhsh_find(&vm->atom_hash_shared_cell, &lhq); if (njs_slow_path(ret != NJS_OK || lhq.value == NULL)) { return NJS_DECLINED; } @@ -842,9 +854,17 @@ njs_global_this_object(njs_vm_t *vm, njs_object_prop_t *self, njs_value_assign(njs_prop_value(prop), retval); prop->enumerable = self->enumerable; + if (!prop->name.atom_id) { + ret = njs_atom_atomize_key(vm, &prop->name); + if (ret != NJS_OK) { + return ret; + } + } + lhq.value = prop; - njs_string_get(&self->name, &lhq.key); - lhq.key_hash = njs_prop_magic32(self); + + lhq.key_hash = prop->name.atom_id; + lhq.replace = 1; lhq.pool = vm->mem_pool; lhq.proto = &njs_object_hash_proto; @@ -892,9 +912,17 @@ njs_top_level_object(njs_vm_t *vm, njs_object_prop_t *self, njs_value_assign(njs_prop_value(prop), retval); prop->enumerable = self->enumerable; + if (!prop->name.atom_id) { + ret = njs_atom_atomize_key(vm, &prop->name); + if (ret != NJS_OK) { + return ret; + } + } + lhq.value = prop; - njs_string_get(&self->name, &lhq.key); - lhq.key_hash = njs_prop_magic32(self); + + lhq.key_hash = prop->name.atom_id; + lhq.replace = 1; lhq.pool = vm->mem_pool; lhq.proto = &njs_object_hash_proto; @@ -939,9 +967,17 @@ njs_top_level_constructor(njs_vm_t *vm, njs_object_prop_t *self, njs_value_assign(njs_prop_value(prop), retval); prop->enumerable = 0; + if (!prop->name.atom_id) { + ret = njs_atom_atomize_key(vm, &prop->name); + if (ret != NJS_OK) { + return ret; + } + } + lhq.value = prop; - njs_string_get(&self->name, &lhq.key); - lhq.key_hash = njs_prop_magic32(self); + + lhq.key_hash = prop->name.atom_id; + lhq.replace = 1; lhq.pool = vm->mem_pool; lhq.proto = &njs_object_hash_proto; @@ -964,10 +1000,10 @@ static njs_object_prop_t njs_global_this_object_properties[] = /* Global aliases. */ NJS_DECLARE_PROP_HANDLER(njs_atom.vs_global, njs_global_this_object, 0, - NJS_GLOBAL_HASH, NJS_OBJECT_PROP_VALUE_ECW), + NJS_OBJECT_PROP_VALUE_ECW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_globalThis, njs_global_this_object, 0, - NJS_GLOBAL_THIS_HASH, NJS_OBJECT_PROP_VALUE_CW), + NJS_OBJECT_PROP_VALUE_CW), /* Global constants. */ @@ -1015,170 +1051,146 @@ static njs_object_prop_t njs_global_this_object_properties[] = /* Global objects. */ NJS_DECLARE_PROP_HANDLER(njs_atom.vs_njs, njs_top_level_object, - NJS_OBJECT_NJS, NJS_NJS_HASH, - NJS_OBJECT_PROP_VALUE_ECW), + NJS_OBJECT_NJS, NJS_OBJECT_PROP_VALUE_ECW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_process, njs_top_level_object, - NJS_OBJECT_PROCESS, NJS_PROCESS_HASH, - NJS_OBJECT_PROP_VALUE_ECW), + NJS_OBJECT_PROCESS, NJS_OBJECT_PROP_VALUE_ECW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_Math, njs_top_level_object, - NJS_OBJECT_MATH, NJS_MATH_HASH, - NJS_OBJECT_PROP_VALUE_CW), + NJS_OBJECT_MATH, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_JSON, njs_top_level_object, - NJS_OBJECT_JSON, NJS_JSON_HASH, - NJS_OBJECT_PROP_VALUE_CW), + NJS_OBJECT_JSON, NJS_OBJECT_PROP_VALUE_CW), #ifdef NJS_TEST262 NJS_DECLARE_PROP_HANDLER(njs_atom.vs__262, njs_top_level_object, - NJS_OBJECT_262, NJS_262_HASH, - NJS_OBJECT_PROP_VALUE_ECW), + NJS_OBJECT_262, NJS_OBJECT_PROP_VALUE_ECW), #endif /* Global constructors. */ NJS_DECLARE_PROP_HANDLER(njs_atom.vs_Object, njs_top_level_constructor, - NJS_OBJ_TYPE_OBJECT, NJS_OBJECT_HASH, - NJS_OBJECT_PROP_VALUE_CW), + NJS_OBJ_TYPE_OBJECT, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_Array, njs_top_level_constructor, - NJS_OBJ_TYPE_ARRAY, NJS_ARRAY_HASH, - NJS_OBJECT_PROP_VALUE_CW), + NJS_OBJ_TYPE_ARRAY, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_ArrayBuffer, njs_top_level_constructor, - NJS_OBJ_TYPE_ARRAY_BUFFER, NJS_ARRAY_BUFFER_HASH, + NJS_OBJ_TYPE_ARRAY_BUFFER, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_DataView, njs_top_level_constructor, - NJS_OBJ_TYPE_DATA_VIEW, NJS_DATA_VIEW_HASH, + NJS_OBJ_TYPE_DATA_VIEW, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_TextDecoder, njs_top_level_constructor, - NJS_OBJ_TYPE_TEXT_DECODER, NJS_TEXT_DECODER_HASH, + NJS_OBJ_TYPE_TEXT_DECODER, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_TextEncoder, njs_top_level_constructor, - NJS_OBJ_TYPE_TEXT_ENCODER, NJS_TEXT_ENCODER_HASH, + NJS_OBJ_TYPE_TEXT_ENCODER, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_Buffer, njs_top_level_constructor, - NJS_OBJ_TYPE_BUFFER, NJS_BUFFER_HASH, - NJS_OBJECT_PROP_VALUE_CW), + NJS_OBJ_TYPE_BUFFER, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_Uint8Array, njs_top_level_constructor, - NJS_OBJ_TYPE_UINT8_ARRAY, NJS_UINT8ARRAY_HASH, + NJS_OBJ_TYPE_UINT8_ARRAY, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_Uint16Array, njs_top_level_constructor, - NJS_OBJ_TYPE_UINT16_ARRAY, NJS_UINT16ARRAY_HASH, + NJS_OBJ_TYPE_UINT16_ARRAY, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_Uint32Array, njs_top_level_constructor, - NJS_OBJ_TYPE_UINT32_ARRAY, NJS_UINT32ARRAY_HASH, + NJS_OBJ_TYPE_UINT32_ARRAY, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_Int8Array, njs_top_level_constructor, - NJS_OBJ_TYPE_INT8_ARRAY, NJS_INT8ARRAY_HASH, + NJS_OBJ_TYPE_INT8_ARRAY, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_Int16Array, njs_top_level_constructor, - NJS_OBJ_TYPE_INT16_ARRAY, NJS_INT16ARRAY_HASH, + NJS_OBJ_TYPE_INT16_ARRAY, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_Int32Array, njs_top_level_constructor, - NJS_OBJ_TYPE_INT32_ARRAY, NJS_INT32ARRAY_HASH, + NJS_OBJ_TYPE_INT32_ARRAY, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_Float32Array, njs_top_level_constructor, - NJS_OBJ_TYPE_FLOAT32_ARRAY, NJS_FLOAT32ARRAY_HASH, + NJS_OBJ_TYPE_FLOAT32_ARRAY, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_Float64Array, njs_top_level_constructor, - NJS_OBJ_TYPE_FLOAT64_ARRAY, NJS_FLOAT64ARRAY_HASH, + NJS_OBJ_TYPE_FLOAT64_ARRAY, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_Uint8ClampedArray, njs_top_level_constructor, NJS_OBJ_TYPE_UINT8_CLAMPED_ARRAY, - NJS_UINT8CLAMPEDARRAY_HASH, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_Boolean, njs_top_level_constructor, - NJS_OBJ_TYPE_BOOLEAN, NJS_BOOLEAN_HASH, - NJS_OBJECT_PROP_VALUE_CW), + NJS_OBJ_TYPE_BOOLEAN, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_Number, njs_top_level_constructor, - NJS_OBJ_TYPE_NUMBER, NJS_NUMBER_HASH, - NJS_OBJECT_PROP_VALUE_CW), + NJS_OBJ_TYPE_NUMBER, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_Symbol, njs_top_level_constructor, - NJS_OBJ_TYPE_SYMBOL, NJS_SYMBOL_HASH, - NJS_OBJECT_PROP_VALUE_CW), + NJS_OBJ_TYPE_SYMBOL, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_String, njs_top_level_constructor, - NJS_OBJ_TYPE_STRING, NJS_STRING_HASH, - NJS_OBJECT_PROP_VALUE_CW), + NJS_OBJ_TYPE_STRING, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_Function, njs_top_level_constructor, - NJS_OBJ_TYPE_FUNCTION, NJS_FUNCTION_HASH, - NJS_OBJECT_PROP_VALUE_CW), + NJS_OBJ_TYPE_FUNCTION, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_RegExp, njs_top_level_constructor, - NJS_OBJ_TYPE_REGEXP, NJS_REGEXP_HASH, - NJS_OBJECT_PROP_VALUE_CW), + NJS_OBJ_TYPE_REGEXP, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_Date, njs_top_level_constructor, - NJS_OBJ_TYPE_DATE, NJS_DATE_HASH, - NJS_OBJECT_PROP_VALUE_CW), + NJS_OBJ_TYPE_DATE, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_Promise, njs_top_level_constructor, - NJS_OBJ_TYPE_PROMISE, NJS_PROMISE_HASH, - NJS_OBJECT_PROP_VALUE_CW), + NJS_OBJ_TYPE_PROMISE, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_Error, njs_top_level_constructor, - NJS_OBJ_TYPE_ERROR, NJS_ERROR_HASH, - NJS_OBJECT_PROP_VALUE_CW), + NJS_OBJ_TYPE_ERROR, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_EvalError, njs_top_level_constructor, - NJS_OBJ_TYPE_EVAL_ERROR, NJS_EVAL_ERROR_HASH, - NJS_OBJECT_PROP_VALUE_CW), + NJS_OBJ_TYPE_EVAL_ERROR, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_InternalError, njs_top_level_constructor, NJS_OBJ_TYPE_INTERNAL_ERROR, - NJS_INTERNAL_ERROR_HASH, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_RangeError, njs_top_level_constructor, - NJS_OBJ_TYPE_RANGE_ERROR, NJS_RANGE_ERROR_HASH, + NJS_OBJ_TYPE_RANGE_ERROR, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_ReferenceError, njs_top_level_constructor, - NJS_OBJ_TYPE_REF_ERROR, NJS_REF_ERROR_HASH, - NJS_OBJECT_PROP_VALUE_CW), + NJS_OBJ_TYPE_REF_ERROR, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_SyntaxError, njs_top_level_constructor, - NJS_OBJ_TYPE_SYNTAX_ERROR, NJS_SYNTAX_ERROR_HASH, + NJS_OBJ_TYPE_SYNTAX_ERROR, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_TypeError, njs_top_level_constructor, - NJS_OBJ_TYPE_TYPE_ERROR, NJS_TYPE_ERROR_HASH, - NJS_OBJECT_PROP_VALUE_CW), + NJS_OBJ_TYPE_TYPE_ERROR, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_URIError, njs_top_level_constructor, - NJS_OBJ_TYPE_URI_ERROR, NJS_URI_ERROR_HASH, - NJS_OBJECT_PROP_VALUE_CW), + NJS_OBJ_TYPE_URI_ERROR, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_MemoryError, njs_top_level_constructor, - NJS_OBJ_TYPE_MEMORY_ERROR, NJS_MEMORY_ERROR_HASH, + NJS_OBJ_TYPE_MEMORY_ERROR, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_AggregateError, njs_top_level_constructor, NJS_OBJ_TYPE_AGGREGATE_ERROR, - NJS_AGGREGATE_ERROR_HASH, NJS_OBJECT_PROP_VALUE_CW), }; @@ -1208,7 +1220,7 @@ static njs_object_prop_t njs_njs_object_properties[] = NJS_DECLARE_PROP_NATIVE(njs_atom.vs_on, njs_ext_on, 0, 0), - NJS_DECLARE_PROP_HANDLER(njs_atom.vs_memoryStats, njs_ext_memory_stats, 0, 0, + NJS_DECLARE_PROP_HANDLER(njs_atom.vs_memoryStats, njs_ext_memory_stats, 0, NJS_OBJECT_PROP_VALUE_EC), }; @@ -1250,15 +1262,20 @@ njs_process_object_argv(njs_vm_t *vm, njs_object_prop_t *pr, njs_set_array(njs_prop_value(prop), argv); + ret = njs_atom_atomize_key(vm, &prop->name); + if (ret != NJS_OK) { + return ret; + } + lhq.value = prop; - lhq.key_hash = NJS_ARGV_HASH; - lhq.key = njs_str_value("argv"); + + lhq.key_hash = prop->name.atom_id; + lhq.replace = 1; lhq.pool = vm->mem_pool; lhq.proto = &njs_object_hash_proto; ret = njs_lvlhsh_insert(njs_object_hash(process), &lhq); - if (njs_fast_path(ret == NJS_OK)) { njs_value_assign(retval, njs_prop_value(prop)); return NJS_OK; @@ -1328,9 +1345,14 @@ njs_env_hash_init(njs_vm_t *vm, njs_lvlhsh_t *hash, char **environment) return NJS_ERROR; } + ret = njs_atom_atomize_key(vm, &prop->name); + if (ret != NJS_OK) { + return ret; + } + lhq.value = prop; - njs_string_get(&prop->name, &lhq.key); - lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length); + + lhq.key_hash = prop->name.atom_id; ret = njs_lvlhsh_insert(hash, &lhq); if (njs_slow_path(ret != NJS_OK)) { @@ -1375,15 +1397,20 @@ njs_process_object_env(njs_vm_t *vm, njs_object_prop_t *pr, njs_set_object(njs_prop_value(prop), env); + ret = njs_atom_atomize_key(vm, &prop->name); + if (ret != NJS_OK) { + return ret; + } + + lhq.value = prop; + + lhq.key_hash = prop->name.atom_id; + lhq.replace = 1; lhq.pool = vm->mem_pool; lhq.proto = &njs_object_hash_proto; - lhq.value = prop; - lhq.key = njs_str_value("env"); - lhq.key_hash = NJS_ENV_HASH; ret = njs_lvlhsh_insert(njs_object_hash(process), &lhq); - if (njs_fast_path(ret == NJS_OK)) { njs_value_assign(retval, njs_prop_value(prop)); return NJS_OK; @@ -1420,13 +1447,13 @@ static njs_object_prop_t njs_process_object_properties[] = NJS_DECLARE_PROP_VALUE(njs_atom.vw_toStringTag, njs_atom.vs_process, NJS_OBJECT_PROP_VALUE_C), - NJS_DECLARE_PROP_HANDLER(njs_atom.vs_argv, njs_process_object_argv, 0, 0, 0), + NJS_DECLARE_PROP_HANDLER(njs_atom.vs_argv, njs_process_object_argv, 0, 0), - NJS_DECLARE_PROP_HANDLER(njs_atom.vs_env, njs_process_object_env, 0, 0, 0), + NJS_DECLARE_PROP_HANDLER(njs_atom.vs_env, njs_process_object_env, 0, 0), - NJS_DECLARE_PROP_HANDLER(njs_atom.vs_pid, njs_process_object_pid, 0, 0, 0), + NJS_DECLARE_PROP_HANDLER(njs_atom.vs_pid, njs_process_object_pid, 0, 0), - NJS_DECLARE_PROP_HANDLER(njs_atom.vs_ppid, njs_process_object_ppid, 0, 0, 0), + NJS_DECLARE_PROP_HANDLER(njs_atom.vs_ppid, njs_process_object_ppid, 0, 0), }; diff --git a/src/njs_date.c b/src/njs_date.c index 7970ee470..e859fcdd6 100644 --- a/src/njs_date.c +++ b/src/njs_date.c @@ -1131,7 +1131,7 @@ static njs_object_prop_t njs_date_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_Date), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), NJS_DECLARE_PROP_NATIVE(njs_atom.vs_UTC, njs_date_utc, 7, 0), @@ -1446,8 +1446,8 @@ njs_date_prototype_to_json(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_lvlhsh_query_t lhq; if (njs_is_object(njs_argument(args, 0))) { - njs_object_property_init(&lhq, &njs_atom.vs_toISOString, - NJS_TO_ISO_STRING_HASH); + lhq.proto = &njs_object_hash_proto; + lhq.key_hash = njs_atom.vs_toISOString.atom_id; ret = njs_object_property(vm, njs_object(njs_argument(args, 0)), &lhq, &value); @@ -1471,12 +1471,12 @@ njs_date_prototype_to_json(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, static njs_object_prop_t njs_date_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs___proto__, - njs_primitive_prototype_get_proto, 0, 0, + njs_primitive_prototype_get_proto, 0, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_NATIVE(njs_atom.vs_valueOf, njs_date_prototype_value_of, 0, 0), diff --git a/src/njs_encoding.c b/src/njs_encoding.c index 05ee4c190..0147e224d 100644 --- a/src/njs_encoding.c +++ b/src/njs_encoding.c @@ -233,8 +233,8 @@ njs_text_encoder_encode_into(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, static njs_object_prop_t njs_text_encoder_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_VALUE(njs_atom.vs_encoding, njs_atom.vs_utf_8, 0), @@ -258,7 +258,7 @@ static njs_object_prop_t njs_text_encoder_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_TextEncoder), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), }; @@ -564,16 +564,16 @@ njs_text_decoder_decode(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, static njs_object_prop_t njs_text_decoder_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_encoding, njs_text_decoder_encoding, 0, - 0, 0), + 0), - NJS_DECLARE_PROP_HANDLER(njs_atom.vs_fatal, njs_text_decoder_fatal, 0, 0, 0), + NJS_DECLARE_PROP_HANDLER(njs_atom.vs_fatal, njs_text_decoder_fatal, 0, 0), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_ignoreBOM, njs_text_decoder_ignore_bom, - 0, 0, 0), + 0, 0), NJS_DECLARE_PROP_NATIVE(njs_atom.vs_decode, njs_text_decoder_decode, 0, 0), }; @@ -592,7 +592,7 @@ static njs_object_prop_t njs_text_decoder_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_TextDecoder), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), }; diff --git a/src/njs_error.c b/src/njs_error.c index 6f2c37abe..908be3bf4 100644 --- a/src/njs_error.c +++ b/src/njs_error.c @@ -213,8 +213,7 @@ njs_error_alloc(njs_vm_t *vm, njs_object_t *proto, const njs_value_t *name, lhq.proto = &njs_object_hash_proto; if (name != NULL) { - lhq.key = njs_str_value("name"); - lhq.key_hash = NJS_NAME_HASH; + lhq.key_hash = njs_atom.vs_name.atom_id; prop = njs_object_prop_alloc(vm, &njs_atom.vs_name, name, 1); if (njs_slow_path(prop == NULL)) { @@ -223,6 +222,8 @@ njs_error_alloc(njs_vm_t *vm, njs_object_t *proto, const njs_value_t *name, lhq.value = prop; + lhq.key_hash = njs_atom.vs_name.atom_id; + ret = njs_lvlhsh_insert(&error->hash, &lhq); if (njs_slow_path(ret != NJS_OK)) { njs_internal_error(vm, "lvlhsh insert failed"); @@ -231,8 +232,7 @@ njs_error_alloc(njs_vm_t *vm, njs_object_t *proto, const njs_value_t *name, } if (message!= NULL) { - lhq.key = njs_str_value("message"); - lhq.key_hash = NJS_MESSAGE_HASH; + lhq.key_hash = njs_atom.vs_message.atom_id; prop = njs_object_prop_alloc(vm, &njs_atom.vs_message, message, 1); if (njs_slow_path(prop == NULL)) { @@ -243,6 +243,8 @@ njs_error_alloc(njs_vm_t *vm, njs_object_t *proto, const njs_value_t *name, lhq.value = prop; + lhq.key_hash = njs_atom.vs_message.atom_id; + ret = njs_lvlhsh_insert(&error->hash, &lhq); if (njs_slow_path(ret != NJS_OK)) { njs_internal_error(vm, "lvlhsh insert failed"); @@ -251,8 +253,6 @@ njs_error_alloc(njs_vm_t *vm, njs_object_t *proto, const njs_value_t *name, } if (errors != NULL) { - lhq.key = njs_str_value("errors"); - lhq.key_hash = NJS_ERRORS_HASH; prop = njs_object_prop_alloc(vm, &njs_atom.vs_errors, errors, 1); if (njs_slow_path(prop == NULL)) { @@ -263,6 +263,8 @@ njs_error_alloc(njs_vm_t *vm, njs_object_t *proto, const njs_value_t *name, lhq.value = prop; + lhq.key_hash = njs_atom.vs_errors.atom_id; + ret = njs_lvlhsh_insert(&error->hash, &lhq); if (njs_slow_path(ret != NJS_OK)) { njs_internal_error(vm, "lvlhsh insert failed"); @@ -341,7 +343,7 @@ static njs_object_prop_t njs_error_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_Error), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), }; @@ -358,7 +360,7 @@ static njs_object_prop_t njs_eval_error_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_EvalError), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), }; @@ -375,7 +377,7 @@ static njs_object_prop_t njs_internal_error_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_InternalError), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), }; @@ -392,7 +394,7 @@ static njs_object_prop_t njs_range_error_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_RangeError), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), }; @@ -409,7 +411,7 @@ static njs_object_prop_t njs_reference_error_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_ReferenceError), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), }; @@ -425,7 +427,8 @@ static njs_object_prop_t njs_syntax_error_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_SyntaxError), - NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, 0, 0, 0), + NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, + 0, 0), }; @@ -442,7 +445,7 @@ static njs_object_prop_t njs_type_error_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_TypeError), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), }; @@ -459,7 +462,7 @@ static njs_object_prop_t njs_uri_error_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_URIError), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), }; @@ -475,7 +478,8 @@ static njs_object_prop_t njs_aggregate_error_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_AggregateError), - NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, 0, 0, 0), + NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, + 0, 0), }; @@ -562,8 +566,8 @@ static njs_object_prop_t njs_memory_error_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_MemoryError), - NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_memory_error_prototype_create, - 0, 0, 0), + NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, + njs_memory_error_prototype_create, 0, 0), }; @@ -794,8 +798,8 @@ njs_error_to_string(njs_vm_t *vm, njs_value_t *retval, const njs_value_t *error) static njs_object_prop_t njs_error_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_VALUE(njs_atom.vs_name, njs_atom.vs_Error, NJS_OBJECT_PROP_VALUE_CW), @@ -810,7 +814,7 @@ static njs_object_prop_t njs_error_prototype_properties[] = 0, 0), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_stack, njs_error_prototype_stack, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + 0, NJS_OBJECT_PROP_VALUE_CW), }; @@ -832,8 +836,8 @@ const njs_object_type_init_t njs_error_type_init = { static njs_object_prop_t njs_eval_error_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_VALUE(njs_atom.vs_name, njs_atom.vs_EvalError, NJS_OBJECT_PROP_VALUE_CW), @@ -913,8 +917,8 @@ const njs_object_type_init_t njs_memory_error_type_init = { static njs_object_prop_t njs_range_error_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_VALUE(njs_atom.vs_name, njs_atom.vs_RangeError, NJS_OBJECT_PROP_VALUE_CW), @@ -942,8 +946,8 @@ const njs_object_type_init_t njs_range_error_type_init = { static njs_object_prop_t njs_reference_error_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_VALUE(njs_atom.vs_name, njs_atom.vs_ReferenceError, NJS_OBJECT_PROP_VALUE_CW), @@ -971,8 +975,8 @@ const njs_object_type_init_t njs_reference_error_type_init = { static njs_object_prop_t njs_syntax_error_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_VALUE(njs_atom.vs_name, njs_atom.vs_SyntaxError, NJS_OBJECT_PROP_VALUE_CW), @@ -999,8 +1003,8 @@ const njs_object_type_init_t njs_syntax_error_type_init = { static njs_object_prop_t njs_type_error_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_VALUE(njs_atom.vs_name, njs_atom.vs_TypeError, NJS_OBJECT_PROP_VALUE_CW), @@ -1027,8 +1031,8 @@ const njs_object_type_init_t njs_type_error_type_init = { static njs_object_prop_t njs_uri_error_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_VALUE(njs_atom.vs_name, njs_atom.vs_URIError, NJS_OBJECT_PROP_VALUE_CW), @@ -1055,8 +1059,8 @@ const njs_object_type_init_t njs_uri_error_type_init = { static njs_object_prop_t njs_aggregate_error_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_VALUE(njs_atom.vs_name, njs_atom.vs_AggregateError, NJS_OBJECT_PROP_VALUE_CW), diff --git a/src/njs_extern.c b/src/njs_extern.c index 1c3b980a6..d9360717a 100644 --- a/src/njs_extern.c +++ b/src/njs_extern.c @@ -66,50 +66,7 @@ njs_external_add(njs_vm_t *vm, njs_arr_t *protos, prop->enumerable = external->enumerable; if (external->flags & NJS_EXTERN_SYMBOL) { - switch (external->name.symbol) { - case NJS_SYMBOL_ASYNC_ITERATOR: - prop->name = njs_atom.vw_asyncIterator; - break; - case NJS_SYMBOL_HAS_INSTANCE: - prop->name = njs_atom.vw_hasInstance; - break; - case NJS_SYMBOL_IS_CONCAT_SPREADABLE: - prop->name = njs_atom.vw_isConcatSpreadable; - break; - case NJS_SYMBOL_ITERATOR: - prop->name = njs_atom.vw_iterator; - break; - case NJS_SYMBOL_MATCH: - prop->name = njs_atom.vw_match; - break; - case NJS_SYMBOL_MATCH_ALL: - prop->name = njs_atom.vw_matchAll; - break; - case NJS_SYMBOL_REPLACE: - prop->name = njs_atom.vw_replace; - break; - case NJS_SYMBOL_SEARCH: - prop->name = njs_atom.vw_search; - break; - case NJS_SYMBOL_SPECIES: - prop->name = njs_atom.vw_species; - break; - case NJS_SYMBOL_SPLIT: - prop->name = njs_atom.vw_split; - break; - case NJS_SYMBOL_TO_PRIMITIVE: - prop->name = njs_atom.vw_toPrimitive; - break; - case NJS_SYMBOL_TO_STRING_TAG: - prop->name = njs_atom.vw_toStringTag; - break; - case NJS_SYMBOL_UNSCOPABLES: - prop->name = njs_atom.vw_unscopables; - break; - default: - return NJS_ERROR; - }; - + njs_set_symbol(&prop->name, external->name.symbol, NULL); lhq.key_hash = external->name.symbol; } else { @@ -120,8 +77,12 @@ njs_external_add(njs_vm_t *vm, njs_arr_t *protos, return NJS_ERROR; } - lhq.key = external->name.string; - lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length); + ret = njs_atom_atomize_key(vm, &prop->name); + if (ret != NJS_OK) { + return ret; + } + + lhq.key_hash = prop->name.atom_id; } lhq.value = prop; @@ -276,8 +237,9 @@ njs_external_prop_handler(njs_vm_t *vm, njs_object_prop_t *self, prop->enumerable = self->enumerable; lhq.value = prop; - njs_string_get(&self->name, &lhq.key); - lhq.key_hash = njs_prop_magic32(self); + + lhq.key_hash = prop->name.atom_id; + lhq.replace = 1; lhq.pool = vm->mem_pool; lhq.proto = &njs_object_hash_proto; diff --git a/src/njs_flathsh.h b/src/njs_flathsh.h index a69792314..8766350ae 100644 --- a/src/njs_flathsh.h +++ b/src/njs_flathsh.h @@ -105,8 +105,6 @@ NJS_EXPORT njs_int_t njs_flathsh_delete(njs_flathsh_t *fh, typedef struct { - const njs_flathsh_proto_t *proto; - uint32_t key_hash; uint32_t cp; } njs_flathsh_each_t; @@ -114,7 +112,6 @@ typedef struct { #define njs_flathsh_each_init(lhe, _proto) \ do { \ njs_memzero(lhe, sizeof(njs_flathsh_each_t)); \ - (lhe)->proto = _proto; \ } while (0) diff --git a/src/njs_function.c b/src/njs_function.c index 8c6db3b8d..5680078f3 100644 --- a/src/njs_function.c +++ b/src/njs_function.c @@ -174,12 +174,13 @@ njs_function_name_set(njs_vm_t *vm, njs_function_t *function, prop->configurable = 1; - lhq.key_hash = NJS_NAME_HASH; - lhq.key = njs_str_value("name"); - lhq.replace = 0; lhq.value = prop; - lhq.proto = &njs_object_hash_proto; + + lhq.key_hash = prop->name.atom_id; + + lhq.replace = 0; lhq.pool = vm->mem_pool; + lhq.proto = &njs_object_hash_proto; ret = njs_lvlhsh_insert(&function->object.hash, &lhq); if (njs_slow_path(ret != NJS_OK)) { @@ -261,9 +262,10 @@ njs_function_arguments_object_init(njs_vm_t *vm, njs_native_frame_t *frame) njs_set_object(&value, arguments); njs_set_number(&length, frame->nargs); - ret = njs_object_prop_define(vm, &value, njs_value_arg(&njs_atom.vs_length), - &length, NJS_OBJECT_PROP_VALUE_CW, - NJS_LENGTH_HASH); + ret = njs_object_prop_define(vm, &value, + njs_value_arg(&njs_atom.vs_length), &length, + NJS_OBJECT_PROP_VALUE_CW, + njs_atom.vs_length.atom_id); if (njs_slow_path(ret != NJS_OK)) { return NJS_ERROR; } @@ -918,8 +920,9 @@ njs_function_property_prototype_set(njs_vm_t *vm, njs_lvlhsh_t *hash, prop->writable = 1; lhq.value = prop; - lhq.key_hash = NJS_PROTOTYPE_HASH; - lhq.key = njs_str_value("prototype"); + + lhq.key_hash = prop->name.atom_id; + lhq.replace = 1; lhq.pool = vm->mem_pool; lhq.proto = &njs_object_hash_proto; @@ -1158,7 +1161,8 @@ static njs_object_prop_t njs_function_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_Function), - NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, 0, 0, 0), + NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, + 0, 0), }; @@ -1431,8 +1435,8 @@ static njs_object_prop_t njs_function_prototype_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_NATIVE(njs_atom.vs_call, njs_function_prototype_call, 1, 0), @@ -1470,13 +1474,13 @@ static const njs_object_init_t njs_function_prototype_init = { njs_object_prop_t njs_function_instance_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_length, njs_function_instance_length, - 0, 0, NJS_OBJECT_PROP_VALUE_C), + 0, NJS_OBJECT_PROP_VALUE_C), - NJS_DECLARE_PROP_HANDLER(njs_atom.vs_name, njs_function_instance_name, 0, 0, + NJS_DECLARE_PROP_HANDLER(njs_atom.vs_name, njs_function_instance_name, 0, NJS_OBJECT_PROP_VALUE_C), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, - njs_function_prototype_create, 0, 0, + njs_function_prototype_create, 0, NJS_OBJECT_PROP_VALUE_W), }; @@ -1490,9 +1494,9 @@ const njs_object_init_t njs_function_instance_init = { njs_object_prop_t njs_arrow_instance_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_length, njs_function_instance_length, - 0, 0, NJS_OBJECT_PROP_VALUE_C), + 0, NJS_OBJECT_PROP_VALUE_C), - NJS_DECLARE_PROP_HANDLER(njs_atom.vs_name, njs_function_instance_name, 0, 0, + NJS_DECLARE_PROP_HANDLER(njs_atom.vs_name, njs_function_instance_name, 0, NJS_OBJECT_PROP_VALUE_C), }; diff --git a/src/njs_generator.c b/src/njs_generator.c index 3f9ea14b1..d9d76fd7a 100644 --- a/src/njs_generator.c +++ b/src/njs_generator.c @@ -5369,6 +5369,7 @@ static njs_int_t njs_generate_global_reference(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node, njs_bool_t exception) { + njs_int_t ret; njs_index_t index; njs_value_t property; njs_vmcode_prop_get_t *prop_get; @@ -5391,6 +5392,11 @@ njs_generate_global_reference(njs_vm_t *vm, njs_generator_t *generator, property = *((njs_value_t *)node->u.reference.unique_id); + ret = njs_atom_atomize_key(vm, &property); + if (njs_slow_path(ret != NJS_OK)) { + return NJS_ERROR; + } + prop_get->property = njs_scope_global_index(vm, &property, generator->runtime); if (njs_slow_path(prop_get->property == NJS_INDEX_ERROR)) { diff --git a/src/njs_json.c b/src/njs_json.c index ba6c6ab3c..f69ee046d 100644 --- a/src/njs_json.c +++ b/src/njs_json.c @@ -400,9 +400,15 @@ njs_json_parse_object(njs_json_parse_ctx_t *ctx, njs_value_t *value, goto memory_error; } - njs_string_get(&prop_name, &lhq.key); - lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length); + ret = njs_atom_atomize_key(ctx->vm, &prop->name); + if (ret != NJS_OK) { + return NULL; + } + lhq.value = prop; + + lhq.key_hash = prop->name.atom_id; + lhq.replace = 1; lhq.pool = ctx->pool; lhq.proto = &njs_object_hash_proto; @@ -1237,7 +1243,8 @@ njs_object_to_json_function(njs_vm_t *vm, njs_value_t *value) njs_lvlhsh_query_t lhq; if (njs_is_object(value)) { - njs_object_property_init(&lhq, &njs_atom.vs_toJSON, NJS_TO_JSON_HASH); + lhq.proto = &njs_object_hash_proto; + lhq.key_hash = njs_atom.vs_toJSON.atom_id; ret = njs_object_property(vm, njs_object(value), &lhq, &retval); @@ -1606,12 +1613,6 @@ njs_json_wrap_value(njs_vm_t *vm, njs_value_t *wrapper, wrapper->type = NJS_OBJECT; wrapper->data.truth = 1; - lhq.replace = 0; - lhq.proto = &njs_object_hash_proto; - lhq.pool = vm->mem_pool; - lhq.key = njs_str_value(""); - lhq.key_hash = NJS_DJB_HASH_INIT; - prop = njs_object_prop_alloc(vm, &njs_atom.vs_, value, 1); if (njs_slow_path(prop == NULL)) { return NULL; @@ -1619,6 +1620,12 @@ njs_json_wrap_value(njs_vm_t *vm, njs_value_t *wrapper, lhq.value = prop; + lhq.key_hash = njs_atom.vs_.atom_id; + + lhq.replace = 0; + lhq.pool = vm->mem_pool; + lhq.proto = &njs_object_hash_proto; + ret = njs_lvlhsh_insert(njs_object_hash(wrapper), &lhq); if (njs_slow_path(ret != NJS_OK)) { return NULL; diff --git a/src/njs_lexer.c b/src/njs_lexer.c index 99ce05be6..9183a30e1 100644 --- a/src/njs_lexer.c +++ b/src/njs_lexer.c @@ -741,12 +741,12 @@ njs_lexer_keyword_find(njs_vm_t *vm, u_char *key, size_t size, size_t length, lhq.key_hash = hash; lhq.proto = &njs_lexer_hash_proto; - ret = njs_lvlhsh_find(&vm->atom_hash, &lhq); + ret = njs_lvlhsh_find(vm->atom_hash, &lhq); if (ret == NJS_OK) { return lhq.value; } - ret = njs_lvlhsh_find(&vm->atom_hash_shared, &lhq); + ret = njs_lvlhsh_find(&vm->atom_hash_shared_cell, &lhq); if (ret == NJS_OK) { return lhq.value; } @@ -761,8 +761,8 @@ njs_lexer_keyword_find(njs_vm_t *vm, u_char *key, size_t size, size_t length, return NULL; } - entry->string.atom_id = vm->atom_hash_atom_id++; - if (entry->string.atom_id == 0) { + entry->string.atom_id = (*vm->atom_hash_atom_id)++; + if (entry->string.atom_id >= 0x80000000) { return NULL; } entry->string.token_type = 0; @@ -770,7 +770,7 @@ njs_lexer_keyword_find(njs_vm_t *vm, u_char *key, size_t size, size_t length, lhq.value = entry; lhq.pool = vm->atom_hash_mem_pool; - ret = njs_lvlhsh_insert(&vm->atom_hash, &lhq); + ret = njs_lvlhsh_insert(vm->atom_hash, &lhq); if (njs_slow_path(ret != NJS_OK)) { return NULL; } @@ -838,6 +838,7 @@ njs_lexer_word(njs_lexer_t *lexer, njs_lexer_token_t *token) token->type = entry->string.token_id; token->keyword_type = entry->string.token_type; } + token->atom_id = entry->atom_id; token->unique_id = (uintptr_t) entry; diff --git a/src/njs_lexer.h b/src/njs_lexer.h index dd52c404d..1e0563ec6 100644 --- a/src/njs_lexer.h +++ b/src/njs_lexer.h @@ -243,6 +243,7 @@ typedef struct { njs_token_type_t type:16; njs_keyword_type_t keyword_type; uint32_t line; + uint32_t atom_id; uintptr_t unique_id; njs_str_t text; double number; diff --git a/src/njs_lexer_tables.h b/src/njs_lexer_tables.h deleted file mode 100644 index e65032529..000000000 --- a/src/njs_lexer_tables.h +++ /dev/null @@ -1,445 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - * - * Do not edit, generated by: utils/lexer_keyword.py. - */ - - -#ifndef _NJS_LEXER_TABLES_H_INCLUDED_ -#define _NJS_LEXER_TABLES_H_INCLUDED_ - - -static const njs_keyword_t njs_lexer_kws[54] = -{ - { - .entry = { njs_str("arguments") }, - .type = NJS_TOKEN_ARGUMENTS, - .reserved = 0 - }, - - { - .entry = { njs_str("async") }, - .type = NJS_TOKEN_ASYNC, - .reserved = 0 - }, - - { - .entry = { njs_str("await") }, - .type = NJS_TOKEN_AWAIT, - .reserved = 1 - }, - - { - .entry = { njs_str("break") }, - .type = NJS_TOKEN_BREAK, - .reserved = 1 - }, - - { - .entry = { njs_str("case") }, - .type = NJS_TOKEN_CASE, - .reserved = 1 - }, - - { - .entry = { njs_str("catch") }, - .type = NJS_TOKEN_CATCH, - .reserved = 1 - }, - - { - .entry = { njs_str("class") }, - .type = NJS_TOKEN_CLASS, - .reserved = 1 - }, - - { - .entry = { njs_str("const") }, - .type = NJS_TOKEN_CONST, - .reserved = 1 - }, - - { - .entry = { njs_str("continue") }, - .type = NJS_TOKEN_CONTINUE, - .reserved = 1 - }, - - { - .entry = { njs_str("debugger") }, - .type = NJS_TOKEN_DEBUGGER, - .reserved = 1 - }, - - { - .entry = { njs_str("default") }, - .type = NJS_TOKEN_DEFAULT, - .reserved = 1 - }, - - { - .entry = { njs_str("delete") }, - .type = NJS_TOKEN_DELETE, - .reserved = 1 - }, - - { - .entry = { njs_str("do") }, - .type = NJS_TOKEN_DO, - .reserved = 1 - }, - - { - .entry = { njs_str("else") }, - .type = NJS_TOKEN_ELSE, - .reserved = 1 - }, - - { - .entry = { njs_str("enum") }, - .type = NJS_TOKEN_ENUM, - .reserved = 1 - }, - - { - .entry = { njs_str("eval") }, - .type = NJS_TOKEN_EVAL, - .reserved = 0 - }, - - { - .entry = { njs_str("export") }, - .type = NJS_TOKEN_EXPORT, - .reserved = 1 - }, - - { - .entry = { njs_str("extends") }, - .type = NJS_TOKEN_EXTENDS, - .reserved = 1 - }, - - { - .entry = { njs_str("false") }, - .type = NJS_TOKEN_FALSE, - .reserved = 1 - }, - - { - .entry = { njs_str("finally") }, - .type = NJS_TOKEN_FINALLY, - .reserved = 1 - }, - - { - .entry = { njs_str("for") }, - .type = NJS_TOKEN_FOR, - .reserved = 1 - }, - - { - .entry = { njs_str("from") }, - .type = NJS_TOKEN_FROM, - .reserved = 0 - }, - - { - .entry = { njs_str("function") }, - .type = NJS_TOKEN_FUNCTION, - .reserved = 1 - }, - - { - .entry = { njs_str("if") }, - .type = NJS_TOKEN_IF, - .reserved = 1 - }, - - { - .entry = { njs_str("implements") }, - .type = NJS_TOKEN_IMPLEMENTS, - .reserved = 1 - }, - - { - .entry = { njs_str("import") }, - .type = NJS_TOKEN_IMPORT, - .reserved = 1 - }, - - { - .entry = { njs_str("in") }, - .type = NJS_TOKEN_IN, - .reserved = 1 - }, - - { - .entry = { njs_str("instanceof") }, - .type = NJS_TOKEN_INSTANCEOF, - .reserved = 1 - }, - - { - .entry = { njs_str("interface") }, - .type = NJS_TOKEN_INTERFACE, - .reserved = 1 - }, - - { - .entry = { njs_str("let") }, - .type = NJS_TOKEN_LET, - .reserved = 1 - }, - - { - .entry = { njs_str("meta") }, - .type = NJS_TOKEN_META, - .reserved = 0 - }, - - { - .entry = { njs_str("new") }, - .type = NJS_TOKEN_NEW, - .reserved = 1 - }, - - { - .entry = { njs_str("null") }, - .type = NJS_TOKEN_NULL, - .reserved = 1 - }, - - { - .entry = { njs_str("of") }, - .type = NJS_TOKEN_OF, - .reserved = 0 - }, - - { - .entry = { njs_str("package") }, - .type = NJS_TOKEN_PACKAGE, - .reserved = 1 - }, - - { - .entry = { njs_str("private") }, - .type = NJS_TOKEN_PRIVATE, - .reserved = 1 - }, - - { - .entry = { njs_str("protected") }, - .type = NJS_TOKEN_PROTECTED, - .reserved = 1 - }, - - { - .entry = { njs_str("public") }, - .type = NJS_TOKEN_PUBLIC, - .reserved = 1 - }, - - { - .entry = { njs_str("return") }, - .type = NJS_TOKEN_RETURN, - .reserved = 1 - }, - - { - .entry = { njs_str("static") }, - .type = NJS_TOKEN_STATIC, - .reserved = 1 - }, - - { - .entry = { njs_str("super") }, - .type = NJS_TOKEN_SUPER, - .reserved = 1 - }, - - { - .entry = { njs_str("switch") }, - .type = NJS_TOKEN_SWITCH, - .reserved = 1 - }, - - { - .entry = { njs_str("target") }, - .type = NJS_TOKEN_TARGET, - .reserved = 0 - }, - - { - .entry = { njs_str("this") }, - .type = NJS_TOKEN_THIS, - .reserved = 1 - }, - - { - .entry = { njs_str("throw") }, - .type = NJS_TOKEN_THROW, - .reserved = 1 - }, - - { - .entry = { njs_str("true") }, - .type = NJS_TOKEN_TRUE, - .reserved = 1 - }, - - { - .entry = { njs_str("try") }, - .type = NJS_TOKEN_TRY, - .reserved = 1 - }, - - { - .entry = { njs_str("typeof") }, - .type = NJS_TOKEN_TYPEOF, - .reserved = 1 - }, - - { - .entry = { njs_str("undefined") }, - .type = NJS_TOKEN_UNDEFINED, - .reserved = 0 - }, - - { - .entry = { njs_str("var") }, - .type = NJS_TOKEN_VAR, - .reserved = 1 - }, - - { - .entry = { njs_str("void") }, - .type = NJS_TOKEN_VOID, - .reserved = 1 - }, - - { - .entry = { njs_str("while") }, - .type = NJS_TOKEN_WHILE, - .reserved = 1 - }, - - { - .entry = { njs_str("with") }, - .type = NJS_TOKEN_WITH, - .reserved = 1 - }, - - { - .entry = { njs_str("yield") }, - .type = NJS_TOKEN_YIELD, - .reserved = 1 - }, -}; - - -static const njs_lexer_keyword_entry_t njs_lexer_keyword_entries[99] = -{ - { NULL, NULL, 98, 0 }, - { "continue", &njs_lexer_kws[8], 8, 0 }, - { "finally", &njs_lexer_kws[19], 7, 0 }, - { "return", &njs_lexer_kws[38], 6, 0 }, - { "static", &njs_lexer_kws[39], 6, 0 }, - { "async", &njs_lexer_kws[1], 5, 0 }, - { "break", &njs_lexer_kws[3], 5, 0 }, - { "interface", &njs_lexer_kws[28], 9, 0 }, - { "case", &njs_lexer_kws[4], 4, 0 }, - { "import", &njs_lexer_kws[25], 6, 0 }, - { "protected", &njs_lexer_kws[36], 9, 0 }, - { "switch", &njs_lexer_kws[41], 6, 0 }, - { "catch", &njs_lexer_kws[5], 5, 1 }, - { "delete", &njs_lexer_kws[11], 6, 0 }, - { "else", &njs_lexer_kws[13], 4, 0 }, - { "private", &njs_lexer_kws[35], 7, 0 }, - { "extends", &njs_lexer_kws[17], 7, 0 }, - { "this", &njs_lexer_kws[43], 4, 0 }, - { "false", &njs_lexer_kws[18], 5, 0 }, - { "await", &njs_lexer_kws[2], 5, 0 }, - { NULL, NULL, 0, 0 }, - { "public", &njs_lexer_kws[37], 6, 0 }, - { NULL, NULL, 0, 0 }, - { "class", &njs_lexer_kws[6], 5, 0 }, - { "const", &njs_lexer_kws[7], 5, 4 }, - { NULL, NULL, 0, 0 }, - { "try", &njs_lexer_kws[46], 3, 0 }, - { "null", &njs_lexer_kws[32], 4, 0 }, - { NULL, NULL, 0, 0 }, - { "do", &njs_lexer_kws[12], 2, 0 }, - { "var", &njs_lexer_kws[49], 3, 0 }, - { "if", &njs_lexer_kws[23], 2, 7 }, - { "implements", &njs_lexer_kws[24], 10, 0 }, - { "with", &njs_lexer_kws[52], 4, 0 }, - { NULL, NULL, 0, 0 }, - { "eval", &njs_lexer_kws[15], 4, 9 }, - { NULL, NULL, 0, 0 }, - { "target", &njs_lexer_kws[42], 6, 0 }, - { "enum", &njs_lexer_kws[14], 4, 10 }, - { "instanceof", &njs_lexer_kws[27], 10, 0 }, - { NULL, NULL, 0, 0 }, - { "debugger", &njs_lexer_kws[9], 8, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { "default", &njs_lexer_kws[10], 7, 0 }, - { "void", &njs_lexer_kws[50], 4, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { "undefined", &njs_lexer_kws[48], 9, 0 }, - { "from", &njs_lexer_kws[21], 4, 0 }, - { "package", &njs_lexer_kws[34], 7, 15 }, - { NULL, NULL, 0, 0 }, - { "yield", &njs_lexer_kws[53], 5, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { "of", &njs_lexer_kws[33], 2, 0 }, - { NULL, NULL, 0, 0 }, - { "function", &njs_lexer_kws[22], 8, 0 }, - { NULL, NULL, 0, 0 }, - { "true", &njs_lexer_kws[45], 4, 16 }, - { "new", &njs_lexer_kws[31], 3, 0 }, - { "export", &njs_lexer_kws[16], 6, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { "for", &njs_lexer_kws[20], 3, 0 }, - { "while", &njs_lexer_kws[51], 5, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { "typeof", &njs_lexer_kws[47], 6, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { "super", &njs_lexer_kws[40], 5, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { "let", &njs_lexer_kws[29], 3, 19 }, - { "in", &njs_lexer_kws[26], 2, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { "throw", &njs_lexer_kws[44], 5, 0 }, - { "arguments", &njs_lexer_kws[0], 9, 0 }, - { "meta", &njs_lexer_kws[30], 4, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, - { NULL, NULL, 0, 0 }, -}; - - -#endif /* _NJS_LEXER_TABLES_H_INCLUDED_ */ diff --git a/src/njs_main.h b/src/njs_main.h index 8715f4ac3..3509148d8 100644 --- a/src/njs_main.h +++ b/src/njs_main.h @@ -59,7 +59,6 @@ #include #include #include -#include #include #include #include diff --git a/src/njs_number.c b/src/njs_number.c index 11371431f..68080dcfc 100644 --- a/src/njs_number.c +++ b/src/njs_number.c @@ -434,7 +434,7 @@ static njs_object_prop_t njs_number_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_Number), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), NJS_DECLARE_PROP_VALUE(njs_atom.vs_EPSILON, njs_value(NJS_NUMBER, 1, DBL_EPSILON), 0), @@ -881,11 +881,11 @@ njs_number_to_string_radix(njs_vm_t *vm, njs_value_t *string, static njs_object_prop_t njs_number_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs___proto__, - njs_primitive_prototype_get_proto, 0, 0, + njs_primitive_prototype_get_proto, 0, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, 0, 0, + njs_object_prototype_create_constructor, 0, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_NATIVE(njs_atom.vs_valueOf, njs_number_prototype_value_of, diff --git a/src/njs_number.h b/src/njs_number.h index 2ff1844eb..e76017c11 100644 --- a/src/njs_number.h +++ b/src/njs_number.h @@ -183,6 +183,10 @@ njs_uint32_to_string(njs_vm_t *vm, njs_value_t *value, uint32_t u32) value->string.data->length = size; value->string.data->size = size; + if (!(u32 & 0x80000000)) { + value->atom_id = u32 | 0x80000000; + } + return NJS_OK; } diff --git a/src/njs_object.c b/src/njs_object.c index d1dab2c28..2324ac2c2 100644 --- a/src/njs_object.c +++ b/src/njs_object.c @@ -146,12 +146,11 @@ njs_object_hash_create(njs_vm_t *vm, njs_lvlhsh_t *hash, prop->name = *prop->pname; if (prop->type != NJS_ACCESSOR) { - prop->u.value = *prop->u.pvalue; + prop->u.value = *prop->u.pvalue; } } - njs_object_property_key_set(&lhq, &prop->name, 0); - + lhq.key_hash = prop->name.atom_id; lhq.value = (void *) prop; @@ -182,27 +181,9 @@ const njs_lvlhsh_proto_t njs_object_hash_proto static njs_int_t njs_object_hash_test(njs_lvlhsh_query_t *lhq, void *data) { - u_char *start; - njs_value_t *name; - njs_object_prop_t *prop; - - prop = data; - name = &prop->name; - - if (njs_slow_path(njs_is_symbol(name))) { - return ((njs_symbol_key(name) == lhq->key_hash) - && lhq->key.start == NULL) ? NJS_OK : NJS_DECLINED; - } - - /* string. */ - - if (lhq->key.length != name->string.data->size) { - return NJS_DECLINED; - } - - start = name->string.data->start; - - if (memcmp(start, lhq->key.start, lhq->key.length) == 0) { + if (njs_fast_path(lhq->key_hash == + ((njs_object_prop_t *)data)->name.atom_id)) + { return NJS_OK; } @@ -957,7 +938,7 @@ njs_get_own_ordered_keys(njs_vm_t *vm, const njs_object_t *object, continue; } - njs_object_property_key_set(&lhq, &prop->name, lhe.key_hash); + lhq.key_hash = prop->name.atom_id; ext_prop = njs_object_exist_in_proto(parent, object, &lhq); if (ext_prop != NULL) { @@ -1030,7 +1011,7 @@ njs_get_own_ordered_keys(njs_vm_t *vm, const njs_object_t *object, continue; } - njs_object_property_key_set(&lhq, &prop->name, lhe.key_hash); + lhq.key_hash = prop->name.atom_id; ext_prop = njs_object_exist_in_proto(parent, object, &lhq); if (ext_prop != NULL) { @@ -1052,7 +1033,6 @@ njs_get_own_ordered_keys(njs_vm_t *vm, const njs_object_t *object, /* prop is: in_hash && !in_shared_hash */ /* select names of not deleted props */ - njs_process_prop(vm, prop, flags, items_string, items_symbol); @@ -1060,7 +1040,6 @@ njs_get_own_ordered_keys(njs_vm_t *vm, const njs_object_t *object, /* prop is: in_hash && in_shared_hash */ /* select names of not deleted and created again */ - if (prop->enum_in_object_hash) { njs_process_prop(vm, prop, flags, items_string, items_symbol); @@ -1352,8 +1331,15 @@ njs_object_define_property(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, value = njs_argument(args, 1); name = njs_lvalue_arg(&lvalue, args, nargs, 2); + if (!name->atom_id) { + ret = njs_atom_atomize_key(vm, name); + if (ret != NJS_OK) { + return NJS_ERROR; + } + } + ret = njs_object_prop_define(vm, value, name, desc, - NJS_OBJECT_PROP_DESCRIPTOR, 0); + NJS_OBJECT_PROP_DESCRIPTOR, name->atom_id); if (njs_slow_path(ret != NJS_OK)) { return NJS_ERROR; } @@ -1415,8 +1401,16 @@ njs_object_define_properties(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, goto done; } + if (!(&keys->start[i])->atom_id) { + ret = njs_atom_atomize_key(vm, &keys->start[i]); + if (ret != NJS_OK) { + goto done; + } + } + ret = njs_object_prop_define(vm, value, &keys->start[i], &desc, - NJS_OBJECT_PROP_DESCRIPTOR, 0); + NJS_OBJECT_PROP_DESCRIPTOR, + (&keys->start[i])->atom_id); if (njs_slow_path(ret != NJS_OK)) { goto done; } @@ -1494,6 +1488,15 @@ njs_object_get_own_property_descriptors(njs_vm_t *vm, njs_value_t *args, for (i = 0; i < length; i++) { key = &names->start[i]; + if (!key->atom_id) { + + ret = njs_atom_atomize_key(vm, key); + if (ret != NJS_OK) { + ret = NJS_ERROR; + goto done; + } + } + ret = njs_object_prop_descriptor(vm, &descriptor, value, key); if (njs_slow_path(ret != NJS_OK)) { ret = NJS_ERROR; @@ -1506,7 +1509,8 @@ njs_object_get_own_property_descriptors(njs_vm_t *vm, njs_value_t *args, goto done; } - njs_object_property_key_set(&lhq, key, 0); + lhq.key_hash = key->atom_id; + lhq.value = pr; ret = njs_lvlhsh_insert(&descriptors->hash, &lhq); @@ -1975,11 +1979,19 @@ njs_property_prototype_create(njs_vm_t *vm, njs_lvlhsh_t *hash, return NULL; } - njs_set_type_object(njs_prop_value(prop), prototype, prototype->type); + if (!prop->name.atom_id) { + ret = njs_atom_atomize_key(vm, &prop->name); + if (ret != NJS_OK) { + return NULL; + } + } lhq.value = prop; - lhq.key_hash = NJS_PROTOTYPE_HASH; - lhq.key = njs_str_value("prototype"); + + njs_set_type_object(njs_prop_value(prop), prototype, prototype->type); + + lhq.key_hash = prop->name.atom_id; + lhq.replace = 1; lhq.pool = vm->mem_pool; lhq.proto = &njs_object_hash_proto; @@ -2003,7 +2015,7 @@ static njs_object_prop_t njs_object_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_Object), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), NJS_DECLARE_PROP_NATIVE(njs_atom.vs_create, njs_object_create, 2, 0), @@ -2235,14 +2247,14 @@ njs_property_constructor_set(njs_vm_t *vm, njs_lvlhsh_t *hash, prop->enumerable = 0; lhq.value = prop; - lhq.key_hash = NJS_CONSTRUCTOR_HASH; - lhq.key = njs_str_value("constructor"); + + lhq.key_hash = prop->name.atom_id; + lhq.replace = 1; lhq.pool = vm->mem_pool; lhq.proto = &njs_object_hash_proto; ret = njs_lvlhsh_insert(hash, &lhq); - if (njs_fast_path(ret == NJS_OK)) { return njs_prop_value(prop); } @@ -2512,11 +2524,11 @@ njs_object_prototype_is_prototype_of(njs_vm_t *vm, njs_value_t *args, static njs_object_prop_t njs_object_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs___proto__, njs_object_prototype_proto, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + 0, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_NATIVE(njs_atom.vs_valueOf, njs_object_prototype_value_of, 0, 0), diff --git a/src/njs_object.h b/src/njs_object.h index efdd08e1a..5de63a194 100644 --- a/src/njs_object.h +++ b/src/njs_object.h @@ -137,42 +137,6 @@ njs_is_generic_descriptor(njs_object_prop_t *prop) } -njs_inline void -njs_object_property_key_set(njs_lvlhsh_query_t *lhq, const njs_value_t *key, - uint32_t hash) -{ - if (njs_is_symbol(key)) { - - lhq->key.length = 0; - lhq->key.start = NULL; - lhq->key_hash = njs_symbol_key(key); - - } else { - - /* string. */ - - njs_string_get(key, &lhq->key); - - if (hash == 0) { - lhq->key_hash = njs_djb_hash(lhq->key.start, lhq->key.length); - - } else { - lhq->key_hash = hash; - } - } -} - - -njs_inline void -njs_object_property_init(njs_lvlhsh_query_t *lhq, const njs_value_t *key, - uint32_t hash) -{ - lhq->proto = &njs_object_hash_proto; - - njs_object_property_key_set(lhq, key, hash); -} - - njs_inline njs_int_t njs_primitive_value_to_key(njs_vm_t *vm, njs_value_t *dst, const njs_value_t *src) diff --git a/src/njs_object_hash.h b/src/njs_object_hash.h deleted file mode 100644 index 163c814ca..000000000 --- a/src/njs_object_hash.h +++ /dev/null @@ -1,842 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) NGINX, Inc. - */ - -#ifndef _NJS_OBJECT_HASH_H_INCLUDED_ -#define _NJS_OBJECT_HASH_H_INCLUDED_ - - -#define NJS___PROTO___HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - '_'), '_'), 'p'), 'r'), 'o'), 't'), 'o'), '_'), '_') - - -#define NJS_ARRAY_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'A'), 'r'), 'r'), 'a'), 'y') - - -#define NJS_ARGV_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'a'), 'r'), 'g'), 'v') - - -#define NJS_BOOLEAN_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'B'), 'o'), 'o'), 'l'), 'e'), 'a'), 'n') - - -#define NJS_CONFIGURABLE_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'c'), 'o'), 'n'), 'f'), 'i'), 'g'), 'u'), 'r'), 'a'), 'b'), 'l'), 'e') - - -#define NJS_CONSTRUCTOR_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'c'), 'o'), 'n'), 's'), 't'), 'r'), 'u'), 'c'), 't'), 'o'), 'r') - - -#define NJS_DATE_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'D'), 'a'), 't'), 'e') - - -#define NJS_PROMISE_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'P'), 'r'), 'o'), 'm'), 'i'), 's'), 'e') - - -#define NJS_ENUMERABLE_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'e'), 'n'), 'u'), 'm'), 'e'), 'r'), 'a'), 'b'), 'l'), 'e') - - -#define NJS_ERRNO_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'e'), 'r'), 'r'), 'n'), 'o') - - -#define NJS_ERROR_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'E'), 'r'), 'r'), 'o'), 'r') - - -#define NJS_ENCODING_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'e'), 'n'), 'c'), 'o'), 'd'), 'i'), 'n'), 'g') - - -#define NJS_ENV_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'e'), 'n'), 'v') - - -#define NJS_EVAL_ERROR_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'E'), 'v'), 'a'), 'l'), 'E'), 'r'), 'r'), 'o'), 'r') - - -#define NJS_FLAG_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'f'), 'l'), 'a'), 'g') - - -#define NJS_GET_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'g'), 'e'), 't') - - -#define NJS_GLOBAL_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'g'), 'l'), 'o'), 'b'), 'a'), 'l') - - -#define NJS_GLOBAL_THIS_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'g'), 'l'), 'o'), 'b'), 'a'), 'l'), 'T'), 'h'), 'i'), 's') - - -#define NJS_FUNCTION_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'F'), 'u'), 'n'), 'c'), 't'), 'i'), 'o'), 'n') - - -#define NJS_INDEX_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'i'), 'n'), 'd'), 'e'), 'x') - - -#define NJS_INPUT_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'i'), 'n'), 'p'), 'u'), 't') - - -#define NJS_INTERNAL_ERROR_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'I'), 'n'), 't'), 'e'), 'r'), 'n'), 'a'), 'l'), \ - 'E'), 'r'), 'r'), 'o'), 'r') - - -#define NJS_GROUPS_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'g'), 'r'), 'o'), 'u'), 'p'), 's') - - -#define NJS_JOIN_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'j'), 'o'), 'i'), 'n') - - -#define NJS_JSON_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'J'), 'S'), 'O'), 'N') - - -#define NJS_LENGTH_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'l'), 'e'), 'n'), 'g'), 't'), 'h') - - -#define NJS_NAME_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'n'), 'a'), 'm'), 'e') - - -#define NJS_NJS_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'n'), 'j'), 's') - - -#define NJS_262_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - '$'), '2'), '6'), '2') - - -#define NJS_NUMBER_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'N'), 'u'), 'm'), 'b'), 'e'), 'r') - - -#define NJS_MATH_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'M'), 'a'), 't'), 'h') - - -#define NJS_MEMORY_ERROR_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'M'), 'e'), 'm'), 'o'), 'r'), 'y'), \ - 'E'), 'r'), 'r'), 'o'), 'r') - - -#define NJS_AGGREGATE_ERROR_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'A'), 'g'), 'g'), 'r'), 'e'), 'g'), 'a'), 't'), 'e'), \ - 'E'), 'r'), 'r'), 'o'), 'r') - - -#define NJS_MESSAGE_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'm'), 'e'), 's'), 's'), 'a'), 'g'), 'e') - - -#define NJS_ERRORS_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'e'), 'r'), 'r'), 'o'), 'r'), 's') - - -#define NJS_MODE_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'm'), 'o'), 'd'), 'e') - - -#define NJS_OBJECT_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'O'), 'b'), 'j'), 'e'), 'c'), 't') - - -#define NJS_PATH_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'p'), 'a'), 't'), 'h') - - -#define NJS_PROCESS_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'p'), 'r'), 'o'), 'c'), 'e'), 's'), 's') - - -#define NJS_PROTOTYPE_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'p'), 'r'), 'o'), 't'), 'o'), 't'), 'y'), 'p'), 'e') - - -#define NJS_RANGE_ERROR_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'R'), 'a'), 'n'), 'g'), 'e'), 'E'), 'r'), 'r'), 'o'), 'r') - - -#define NJS_REF_ERROR_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'R'), 'e'), 'f'), 'e'), 'r'), 'e'), 'n'), 'c'), 'e'), \ - 'E'), 'r'), 'r'), 'o'), 'r') - - -#define NJS_REGEXP_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'R'), 'e'), 'g'), 'E'), 'x'), 'p') - - -#define NJS_SET_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 's'), 'e'), 't') - - -#define NJS_STACK_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 's'), 't'), 'a'), 'c'), 'k') - - -#define NJS_STRING_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'S'), 't'), 'r'), 'i'), 'n'), 'g') - - -#define NJS_SYMBOL_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'S'), 'y'), 'm'), 'b'), 'o'), 'l') - - -#define NJS_SYNTAX_ERROR_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'S'), 'y'), 'n'), 't'), 'a'), 'x'), \ - 'E'), 'r'), 'r'), 'o'), 'r') - - -#define NJS_SYSCALL_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 's'), 'y'), 's'), 'c'), 'a'), 'l'), 'l') - - -#define NJS_TO_JSON_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 't'), 'o'), 'J'), 'S'), 'O'), 'N') - - -#define NJS_TO_STRING_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 't'), 'o'), 'S'), 't'), 'r'), 'i'), 'n'), 'g') - - -#define NJS_TO_ISO_STRING_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 't'), 'o'), 'I'), 'S'), 'O'), 'S'), 't'), 'r'), 'i'), 'n'), 'g') - - -#define NJS_TYPE_ERROR_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'T'), 'y'), 'p'), 'e'), 'E'), 'r'), 'r'), 'o'), 'r') - - -#define NJS_VALUE_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'v'), 'a'), 'l'), 'u'), 'e') - - -#define NJS_VALUE_OF_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'v'), 'a'), 'l'), 'u'), 'e'), 'O'), 'f') - - -#define NJS_WRITABABLE_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'w'), 'r'), 'i'), 't'), 'a'), 'b'), 'l'), 'e') - - -#define NJS_URI_ERROR_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'U'), 'R'), 'I'), 'E'), 'r'), 'r'), 'o'), 'r') - - -#define NJS_ARRAY_BUFFER_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'A'), 'r'), 'r'), 'a'), 'y'), 'B'), 'u'), 'f'), 'f'), 'e'), 'r') - - -#define NJS_DATA_VIEW_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'D'), 'a'), 't'), 'a'), 'V'), 'i'), 'e'), 'w') - - -#define NJS_UINT8ARRAY_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'U'), 'i'), 'n'), 't'), '8'), 'A'), 'r'), 'r'), 'a'), 'y') - - -#define NJS_UINT16ARRAY_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'U'), 'i'), 'n'), 't'), '1'), '6'), 'A'), 'r'), 'r'), 'a'), 'y') - - -#define NJS_UINT32ARRAY_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'U'), 'i'), 'n'), 't'), '3'), '2'), 'A'), 'r'), 'r'), 'a'), 'y') - - -#define NJS_INT8ARRAY_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'I'), 'n'), 't'), '8'), 'A'), 'r'), 'r'), 'a'), 'y') - - -#define NJS_INT16ARRAY_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'I'), 'n'), 't'), '1'), '6'), 'A'), 'r'), 'r'), 'a'), 'y') - - -#define NJS_INT32ARRAY_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'I'), 'n'), 't'), '3'), '2'), 'A'), 'r'), 'r'), 'a'), 'y') - - -#define NJS_FLOAT32ARRAY_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'F'), 'l'), 'o'), 'a'), 't'), '3'), '2'), 'A'), 'r'), 'r'), 'a'), 'y') - - -#define NJS_FLOAT64ARRAY_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'F'), 'l'), 'o'), 'a'), 't'), '6'), '4'), 'A'), 'r'), 'r'), 'a'), 'y') - - -#define NJS_UINT8CLAMPEDARRAY_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'U'), 'i'), 'n'), 't'), '8'), 'C'), 'l'), 'a'), 'm'), 'p'), 'e'), \ - 'd'), 'A'), 'r'), 'r'), 'a'), 'y') - - -#define NJS_TEXT_DECODER_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'T'), 'e'), 'x'), 't'), 'D'), 'e'), 'c'), 'o'), 'd'), 'e'), 'r') - - -#define NJS_TEXT_ENCODER_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'T'), 'e'), 'x'), 't'), 'E'), 'n'), 'c'), 'o'), 'd'), 'e'), 'r') - - -#define NJS_BUFFER_HASH \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add( \ - njs_djb_hash_add(NJS_DJB_HASH_INIT, \ - 'B'), 'u'), 'f'), 'f'), 'e'), 'r') - - -#endif /* _NJS_OBJECT_HASH_H_INCLUDED_ */ diff --git a/src/njs_object_prop.c b/src/njs_object_prop.c index c389a6d83..8729276a8 100644 --- a/src/njs_object_prop.c +++ b/src/njs_object_prop.c @@ -163,12 +163,20 @@ njs_object_property_add(njs_vm_t *vm, njs_value_t *object, njs_value_t *key, return NULL; } - lhq.proto = &njs_object_hash_proto; - njs_string_get(&key_value, &lhq.key); - lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length); + if (!prop->name.atom_id) { + ret = njs_atom_atomize_key(vm, &prop->name); + if (ret != NJS_OK) { + return NULL; + } + } + lhq.value = prop; + + lhq.key_hash = prop->name.atom_id; + lhq.replace = replace; lhq.pool = vm->mem_pool; + lhq.proto = &njs_object_hash_proto; ret = njs_lvlhsh_insert(njs_object_hash(object), &lhq); if (njs_slow_path(ret != NJS_OK)) { @@ -194,8 +202,6 @@ njs_object_prop_define(njs_vm_t *vm, njs_value_t *object, njs_object_prop_t *prop, *prev; njs_property_query_t pq; - static const njs_str_t length_key = njs_str("length"); - if (njs_slow_path(!njs_is_index_or_key(name))) { ret = njs_value_to_key(vm, name, name); if (njs_slow_path(ret != NJS_OK)) { @@ -332,6 +338,13 @@ njs_object_prop_define(njs_vm_t *vm, njs_value_t *object, } else { + if (!prop->name.atom_id) { + ret = njs_atom_atomize_key(vm, &prop->name); + if (ret != NJS_OK) { + return NJS_ERROR; + } + } + if ((flags & NJS_OBJECT_PROP_CREATE)) { ret = njs_primitive_value_to_key(vm, &pq.key, name); if (njs_slow_path(ret != NJS_OK)) { @@ -340,20 +353,16 @@ njs_object_prop_define(njs_vm_t *vm, njs_value_t *object, if (njs_is_symbol(name)) { pq.lhq.key_hash = njs_symbol_key(name); - pq.lhq.key.start = NULL; } else { - njs_string_get(&pq.key, &pq.lhq.key); - pq.lhq.key_hash = (hash == 0) - ? njs_djb_hash(pq.lhq.key.start, - pq.lhq.key.length) - : hash; + pq.lhq.key_hash = prop->name.atom_id; } pq.lhq.proto = &njs_object_hash_proto; } pq.lhq.value = prop; + pq.lhq.replace = 0; pq.lhq.pool = vm->mem_pool; @@ -523,8 +532,7 @@ njs_object_prop_define(njs_vm_t *vm, njs_value_t *object, done: if (njs_slow_path(njs_is_fast_array(object) - && pq.lhq.key_hash == NJS_LENGTH_HASH) - && njs_strstr_eq(&pq.lhq.key, &length_key) + && pq.lhq.key_hash == njs_atom.vs_length.atom_id) && prop->writable == NJS_ATTRIBUTE_FALSE) { array = njs_array(object); @@ -578,8 +586,7 @@ njs_object_prop_define(njs_vm_t *vm, njs_value_t *object, } else { if (njs_slow_path(njs_is_array(object) - && pq.lhq.key_hash == NJS_LENGTH_HASH) - && njs_strstr_eq(&pq.lhq.key, &length_key)) + && pq.lhq.key_hash == njs_atom.vs_length.atom_id)) { if (prev->configurable != NJS_ATTRIBUTE_TRUE && prev->writable != NJS_ATTRIBUTE_TRUE @@ -748,7 +755,9 @@ njs_descriptor_prop(njs_vm_t *vm, const njs_value_t *name, setter = NJS_PROP_PTR_UNSET; desc_object = njs_object(desc); - njs_object_property_init(&lhq, &njs_atom.vs_get, NJS_GET_HASH); + lhq.proto = &njs_object_hash_proto; + + lhq.key_hash = njs_atom.vs_get.atom_id; ret = njs_object_property(vm, desc_object, &lhq, &value); if (njs_slow_path(ret == NJS_ERROR)) { @@ -765,8 +774,7 @@ njs_descriptor_prop(njs_vm_t *vm, const njs_value_t *name, getter = njs_is_function(&value) ? njs_function(&value) : NULL; } - lhq.key = njs_str_value("set"); - lhq.key_hash = NJS_SET_HASH; + lhq.key_hash = njs_atom.vs_set.atom_id; ret = njs_object_property(vm, desc_object, &lhq, &value); if (njs_slow_path(ret == NJS_ERROR)) { @@ -783,8 +791,7 @@ njs_descriptor_prop(njs_vm_t *vm, const njs_value_t *name, setter = njs_is_function(&value) ? njs_function(&value) : NULL; } - lhq.key = njs_str_value("value"); - lhq.key_hash = NJS_VALUE_HASH; + lhq.key_hash = njs_atom.vs_value.atom_id; ret = njs_object_property(vm, desc_object, &lhq, &value); if (njs_slow_path(ret == NJS_ERROR)) { @@ -796,8 +803,7 @@ njs_descriptor_prop(njs_vm_t *vm, const njs_value_t *name, njs_value_assign(njs_prop_value(prop), &value); } - lhq.key = njs_str_value("writable"); - lhq.key_hash = NJS_WRITABABLE_HASH; + lhq.key_hash = njs_atom.vs_writable.atom_id; ret = njs_object_property(vm, desc_object, &lhq, &value); if (njs_slow_path(ret == NJS_ERROR)) { @@ -815,8 +821,7 @@ njs_descriptor_prop(njs_vm_t *vm, const njs_value_t *name, return NULL; } - lhq.key = njs_str_value("enumerable"); - lhq.key_hash = NJS_ENUMERABLE_HASH; + lhq.key_hash = njs_atom.vs_enumerable.atom_id; ret = njs_object_property(vm, desc_object, &lhq, &value); if (njs_slow_path(ret == NJS_ERROR)) { @@ -827,8 +832,7 @@ njs_descriptor_prop(njs_vm_t *vm, const njs_value_t *name, prop->enumerable = njs_is_true(&value); } - lhq.key = njs_str_value("configurable"); - lhq.key_hash = NJS_CONFIGURABLE_HASH; + lhq.key_hash = njs_atom.vs_configurable.atom_id; ret = njs_object_property(vm, desc_object, &lhq, &value); if (njs_slow_path(ret == NJS_ERROR)) { @@ -919,8 +923,7 @@ njs_object_prop_descriptor(njs_vm_t *vm, njs_value_t *dest, if (njs_is_data_descriptor(prop)) { - lhq.key = njs_str_value("value"); - lhq.key_hash = NJS_VALUE_HASH; + lhq.key_hash = njs_atom.vs_value.atom_id; pr = njs_object_prop_alloc(vm, &njs_atom.vs_value, njs_prop_value(prop), 1); @@ -936,8 +939,7 @@ njs_object_prop_descriptor(njs_vm_t *vm, njs_value_t *dest, return NJS_ERROR; } - lhq.key = njs_str_value("writable"); - lhq.key_hash = NJS_WRITABABLE_HASH; + lhq.key_hash = njs_atom.vs_writable.atom_id; setval = (prop->writable == 1) ? &njs_value_true : &njs_value_false; @@ -956,8 +958,7 @@ njs_object_prop_descriptor(njs_vm_t *vm, njs_value_t *dest, } else { - lhq.key = njs_str_value("get"); - lhq.key_hash = NJS_GET_HASH; + lhq.key_hash = njs_atom.vs_get.atom_id; pr = njs_object_prop_alloc(vm, &njs_atom.vs_get, &njs_value_undefined, 1); @@ -977,8 +978,7 @@ njs_object_prop_descriptor(njs_vm_t *vm, njs_value_t *dest, return NJS_ERROR; } - lhq.key = njs_str_value("set"); - lhq.key_hash = NJS_SET_HASH; + lhq.key_hash = njs_atom.vs_set.atom_id; pr = njs_object_prop_alloc(vm, &njs_atom.vs_set, &njs_value_undefined, 1); @@ -999,8 +999,7 @@ njs_object_prop_descriptor(njs_vm_t *vm, njs_value_t *dest, } } - lhq.key = njs_str_value("enumerable"); - lhq.key_hash = NJS_ENUMERABLE_HASH; + lhq.key_hash = njs_atom.vs_enumerable.atom_id; setval = (prop->enumerable == 1) ? &njs_value_true : &njs_value_false; @@ -1017,8 +1016,7 @@ njs_object_prop_descriptor(njs_vm_t *vm, njs_value_t *dest, return NJS_ERROR; } - lhq.key = njs_str_value("configurable"); - lhq.key_hash = NJS_CONFIGURABLE_HASH; + lhq.key_hash = njs_atom.vs_configurable.atom_id; setval = (prop->configurable == 1) ? &njs_value_true : &njs_value_false; @@ -1096,12 +1094,20 @@ njs_object_prop_init(njs_vm_t *vm, const njs_object_init_t* init, prop->type = NJS_PROPERTY; njs_set_object(njs_prop_value(prop), object); - lhq.proto = &njs_object_hash_proto; - njs_string_get(&prop->name, &lhq.key); - lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length); + if (!prop->name.atom_id) { + ret = njs_atom_atomize_key(vm, &prop->name); + if (ret != NJS_OK) { + return ret; + } + } + lhq.value = prop; + + lhq.key_hash = prop->name.atom_id; + lhq.replace = 1; lhq.pool = vm->mem_pool; + lhq.proto = &njs_object_hash_proto; ret = njs_lvlhsh_insert(njs_object_hash(value), &lhq); if (njs_fast_path(ret == NJS_OK)) { diff --git a/src/njs_object_prop_declare.h b/src/njs_object_prop_declare.h index 099b42dbe..a2fced879 100644 --- a/src/njs_object_prop_declare.h +++ b/src/njs_object_prop_declare.h @@ -24,11 +24,11 @@ NJS_OBJECT_PROP_VALUE_CW) -#define NJS_DECLARE_PROP_HANDLER(_name, _native, _m16, _m32, _fl) \ +#define NJS_DECLARE_PROP_HANDLER(_name, _native, _m16, _fl) \ { \ .type = NJS_PROPERTY_HANDLER | NJS_PROPERTY_NOT_INIT, \ .pname = &_name, \ - .u.pvalue = &njs_prop_handler2(_native, _m16, _m32), \ + .u.pvalue = &njs_prop_handler2(_native, _m16), \ .enumerable = !!(_fl & NJS_OBJECT_PROP_ENUMERABLE), \ .configurable = !!(_fl & NJS_OBJECT_PROP_CONFIGURABLE), \ .writable = !!(_fl & NJS_OBJECT_PROP_WRITABLE), \ diff --git a/src/njs_parser.c b/src/njs_parser.c index 77c7f2c0e..9655db618 100644 --- a/src/njs_parser.c +++ b/src/njs_parser.c @@ -570,7 +570,7 @@ njs_parser(njs_vm_t *vm, njs_parser_t *parser) parser->ret = NJS_OK; } - parser->undefined_id = (uintptr_t) &njs_atom.vs_undefined; //??? do we need this field? + parser->undefined_id = (uintptr_t) &njs_atom.vs_undefined; njs_queue_init(&parser->stack); @@ -1188,6 +1188,8 @@ njs_parser_primary_expression_test(njs_parser_t *parser, return NJS_ERROR; } + node->u.value.atom_id = token->atom_id; + node->token_line = token->line; parser->node = node; @@ -6677,7 +6679,7 @@ njs_parser_labelled_statement_after(njs_parser_t *parser, njs_lexer_token_t *token, njs_queue_link_t *current) { njs_int_t ret; - njs_str_t str; //?? remove it + njs_str_t str; uintptr_t unique_id; njs_parser_node_t *node; const njs_value_t *entry; @@ -8683,6 +8685,7 @@ njs_parser_string_create(njs_vm_t *vm, njs_lexer_token_t *token, njs_value_t *value) { size_t length; + njs_int_t ret; njs_str_t dst; length = njs_decode_utf8_length(&token->text, &dst.length); @@ -8698,6 +8701,11 @@ njs_parser_string_create(njs_vm_t *vm, njs_lexer_token_t *token, dst.length); } + ret = njs_atom_atomize_key(vm, value); + if (njs_slow_path(ret != NJS_OK)) { + return NJS_TOKEN_ERROR; + } + return NJS_OK; } @@ -8942,6 +8950,11 @@ njs_parser_escape_string_create(njs_parser_t *parser, njs_lexer_token_t *token, njs_string_utf8_offset_map_init(start, size); } + ret = njs_atom_atomize_key(parser->vm, value); + if (njs_slow_path(ret != NJS_OK)) { + return NJS_TOKEN_ERROR; + } + return NJS_TOKEN_STRING; } diff --git a/src/njs_promise.c b/src/njs_promise.c index 87cb9efc0..293b57060 100644 --- a/src/njs_promise.c +++ b/src/njs_promise.c @@ -1748,7 +1748,7 @@ static njs_object_prop_t njs_promise_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_Promise), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), NJS_DECLARE_PROP_NATIVE(njs_atom.vs_resolve, njs_promise_object_resolve, 1, 0), @@ -1779,8 +1779,8 @@ static const njs_object_init_t njs_promise_constructor_init = { static njs_object_prop_t njs_promise_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_VALUE(njs_atom.vw_toStringTag, njs_atom.vs_Promise, NJS_OBJECT_PROP_VALUE_C), diff --git a/src/njs_regexp.c b/src/njs_regexp.c index 3d35d9a9c..be87bb43b 100644 --- a/src/njs_regexp.c +++ b/src/njs_regexp.c @@ -1060,8 +1060,8 @@ 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_INDEX_HASH; - lhq.key = njs_str_value("index"); + lhq.key_hash = njs_atom.vs_index.atom_id; + lhq.replace = 0; lhq.value = prop; lhq.pool = vm->mem_pool; @@ -1077,8 +1077,8 @@ njs_regexp_exec_result(njs_vm_t *vm, njs_value_t *r, njs_utf8_t utf8, goto fail; } - lhq.key_hash = NJS_INPUT_HASH; - lhq.key = njs_str_value("input"); + lhq.key_hash = njs_atom.vs_input.atom_id; + lhq.value = prop; ret = njs_lvlhsh_insert(&array->object.hash, &lhq); @@ -1092,8 +1092,8 @@ njs_regexp_exec_result(njs_vm_t *vm, njs_value_t *r, njs_utf8_t utf8, goto fail; } - lhq.key_hash = NJS_GROUPS_HASH; - lhq.key = njs_str_value("groups"); + lhq.key_hash = njs_atom.vs_groups.atom_id; + lhq.value = prop; ret = njs_lvlhsh_insert(&array->object.hash, &lhq); @@ -1126,8 +1126,12 @@ njs_regexp_exec_result(njs_vm_t *vm, njs_value_t *r, njs_utf8_t utf8, goto fail; } - lhq.key_hash = group->hash; - lhq.key = group->name; + ret = njs_atom_atomize_key(vm, &prop->name); + if (njs_slow_path(ret != NJS_OK)) { + goto fail; + } + lhq.key_hash = prop->name.atom_id; + lhq.value = prop; ret = njs_lvlhsh_insert(&groups->hash, &lhq); @@ -1858,7 +1862,7 @@ static njs_object_prop_t njs_regexp_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_RegExp), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), }; @@ -1871,8 +1875,8 @@ static const njs_object_init_t njs_regexp_constructor_init = { static njs_object_prop_t njs_regexp_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_GETTER(njs_atom.vs_flags, njs_regexp_prototype_flags, 0), @@ -1908,8 +1912,8 @@ static njs_object_prop_t njs_regexp_prototype_properties[] = njs_object_prop_t njs_regexp_instance_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_lastIndex, - njs_regexp_prototype_last_index, - 0, 0, NJS_OBJECT_PROP_VALUE_W), + njs_regexp_prototype_last_index, 0, + NJS_OBJECT_PROP_VALUE_W), }; diff --git a/src/njs_string.c b/src/njs_string.c index 4d8116cbc..a1c622d84 100644 --- a/src/njs_string.c +++ b/src/njs_string.c @@ -162,6 +162,8 @@ njs_string_alloc(njs_vm_t *vm, njs_value_t *value, uint64_t size, value->type = NJS_STRING; value->truth = size != 0; + value->atom_id = 0; + if (size != length && length > NJS_STRING_MAP_STRIDE) { map_offset = njs_string_map_offset(size); total = map_offset + njs_string_map_size(length); @@ -479,7 +481,7 @@ static njs_object_prop_t njs_string_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_String), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), NJS_DECLARE_PROP_NATIVE(njs_atom.vs_fromCharCode, njs_string_from_char_code, 1, 0), @@ -3377,14 +3379,14 @@ njs_string_to_index(const njs_value_t *value) static njs_object_prop_t njs_string_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs___proto__, - njs_primitive_prototype_get_proto, 0, 0, + njs_primitive_prototype_get_proto, 0, NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_LENGTH(0), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_NATIVE(njs_atom.vs_valueOf, njs_string_prototype_value_of, 0, 0), @@ -3478,7 +3480,7 @@ static const njs_object_init_t njs_string_prototype_init = { static njs_object_prop_t njs_string_instance_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_length, njs_string_instance_length, 0, - 0, 0), + 0), }; diff --git a/src/njs_symbol.c b/src/njs_symbol.c index 308e34367..b6e8ddf7d 100644 --- a/src/njs_symbol.c +++ b/src/njs_symbol.c @@ -71,9 +71,8 @@ njs_symbol_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, } } - key = ++vm->symbol_generator; - - if (njs_slow_path(key >= UINT32_MAX)) { + key = (*vm->atom_hash_atom_id)++; + if (njs_slow_path(key >= 0x80000000)) { njs_internal_error(vm, "Symbol generator overflow"); return NJS_ERROR; } @@ -126,9 +125,8 @@ njs_symbol_for(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, rb_node = njs_rbtree_node_successor(&vm->global_symbols, rb_node); } - key = ++vm->symbol_generator; - - if (njs_slow_path(key >= UINT32_MAX)) { + key = (*vm->atom_hash_atom_id)++; + if (njs_slow_path(key >= 0x80000000)) { njs_internal_error(vm, "Symbol generator overflow"); return NJS_ERROR; } @@ -182,7 +180,7 @@ static njs_object_prop_t njs_symbol_constructor_properties[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_Symbol), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), NJS_DECLARE_PROP_NATIVE(njs_atom.vs_for, njs_symbol_for, 1, 0), @@ -289,12 +287,12 @@ static njs_object_prop_t njs_symbol_prototype_properties[] = NJS_OBJECT_PROP_VALUE_C), NJS_DECLARE_PROP_HANDLER(njs_atom.vs___proto__, - njs_primitive_prototype_get_proto, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_primitive_prototype_get_proto, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_NATIVE(njs_atom.vs_valueOf, njs_symbol_prototype_value_of, 0, 0), diff --git a/src/njs_typed_array.c b/src/njs_typed_array.c index 10fb7ee6c..ca5499439 100644 --- a/src/njs_typed_array.c +++ b/src/njs_typed_array.c @@ -2168,7 +2168,7 @@ static njs_object_prop_t njs_typed_array_constructor_props[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_TypedArray), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), NJS_DECLARE_PROP_GETTER(njs_atom.vw_species, njs_typed_array_get_this, 0), @@ -2190,8 +2190,8 @@ static njs_object_prop_t njs_typed_array_prototype_properties[] = njs_typed_array_get_string_tag, 0), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_GETTER(njs_atom.vs_buffer, njs_typed_array_prototype_buffer, 0), @@ -2401,7 +2401,7 @@ static njs_object_prop_t njs_data_view_constructor_props[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_DataView), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), }; @@ -2646,8 +2646,8 @@ static njs_object_prop_t njs_data_view_prototype_properties[] = NJS_OBJECT_PROP_VALUE_C), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_GETTER(njs_atom.vs_buffer, njs_typed_array_prototype_buffer, 0), @@ -2729,7 +2729,7 @@ static njs_object_prop_t njs_typed_array_u8_constructor_props[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_Uint8Array), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), NJS_DECLARE_PROP_VALUE(njs_atom.vs_BYTES_PER_ELEMENT, njs_value(NJS_NUMBER, 1, 1), 0), @@ -2745,8 +2745,8 @@ static const njs_object_init_t njs_typed_array_u8_constructor_init = { static njs_object_prop_t njs_typed_array_u8_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_VALUE(njs_atom.vs_BYTES_PER_ELEMENT, njs_value(NJS_NUMBER, 1, 1), 0), @@ -2776,7 +2776,7 @@ static njs_object_prop_t njs_typed_array_u8c_constructor_props[] = NJS_DECLARE_PROP_LENGTH(3), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), NJS_DECLARE_PROP_VALUE(njs_atom.vs_BYTES_PER_ELEMENT, njs_value(NJS_NUMBER, 1, 1), 0), @@ -2792,8 +2792,8 @@ static const njs_object_init_t njs_typed_array_u8c_constructor_init = { static njs_object_prop_t njs_typed_array_u8c_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_VALUE(njs_atom.vs_BYTES_PER_ELEMENT, njs_value(NJS_NUMBER, 1, 1), 0), @@ -2822,7 +2822,7 @@ static njs_object_prop_t njs_typed_array_i8_constructor_props[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_Int8Array), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), NJS_DECLARE_PROP_VALUE(njs_atom.vs_BYTES_PER_ELEMENT, njs_value(NJS_NUMBER, 1, 1), 0), @@ -2838,8 +2838,8 @@ static const njs_object_init_t njs_typed_array_i8_constructor_init = { static njs_object_prop_t njs_typed_array_i8_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_VALUE(njs_atom.vs_BYTES_PER_ELEMENT, njs_value(NJS_NUMBER, 1, 1), 0), @@ -2868,7 +2868,7 @@ static njs_object_prop_t njs_typed_array_u16_constructor_props[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_Uint16Array), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), NJS_DECLARE_PROP_VALUE(njs_atom.vs_BYTES_PER_ELEMENT, njs_value(NJS_NUMBER, 1, 2), 0), @@ -2884,8 +2884,8 @@ static const njs_object_init_t njs_typed_array_u16_constructor_init = { static njs_object_prop_t njs_typed_array_u16_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_VALUE(njs_atom.vs_BYTES_PER_ELEMENT, njs_value(NJS_NUMBER, 1, 2), 0), @@ -2913,7 +2913,8 @@ static njs_object_prop_t njs_typed_array_i16_constructor_props[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_Int16Array), - NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, 0, 0, 0), + NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, + 0, 0), NJS_DECLARE_PROP_VALUE(njs_atom.vs_BYTES_PER_ELEMENT, njs_value(NJS_NUMBER, 1, 2), 0), @@ -2929,8 +2930,8 @@ static const njs_object_init_t njs_typed_array_i16_constructor_init = { static njs_object_prop_t njs_typed_array_i16_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_VALUE(njs_atom.vs_BYTES_PER_ELEMENT, njs_value(NJS_NUMBER, 1, 2), 0), @@ -2959,7 +2960,7 @@ static njs_object_prop_t njs_typed_array_u32_constructor_props[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_Uint32Array), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), NJS_DECLARE_PROP_VALUE(njs_atom.vs_BYTES_PER_ELEMENT, njs_value(NJS_NUMBER, 1, 4), 0), }; @@ -2974,8 +2975,8 @@ static const njs_object_init_t njs_typed_array_u32_constructor_init = { static njs_object_prop_t njs_typed_array_u32_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_VALUE(njs_atom.vs_BYTES_PER_ELEMENT, njs_value(NJS_NUMBER, 1, 4), 0), @@ -3004,7 +3005,7 @@ static njs_object_prop_t njs_typed_array_i32_constructor_props[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_Int32Array), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), NJS_DECLARE_PROP_VALUE(njs_atom.vs_BYTES_PER_ELEMENT, njs_value(NJS_NUMBER, 1, 4), 0), @@ -3020,8 +3021,8 @@ static const njs_object_init_t njs_typed_array_i32_constructor_init = { static njs_object_prop_t njs_typed_array_i32_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_VALUE(njs_atom.vs_BYTES_PER_ELEMENT, njs_value(NJS_NUMBER, 1, 4), 0), }; @@ -3049,7 +3050,7 @@ static njs_object_prop_t njs_typed_array_f32_constructor_props[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_Float32Array), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, njs_object_prototype_create, - 0, 0, 0), + 0, 0), NJS_DECLARE_PROP_VALUE(njs_atom.vs_BYTES_PER_ELEMENT, njs_value(NJS_NUMBER, 1, 4), 0), @@ -3065,8 +3066,8 @@ static const njs_object_init_t njs_typed_array_f32_constructor_init = { static njs_object_prop_t njs_typed_array_f32_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_VALUE(njs_atom.vs_BYTES_PER_ELEMENT, njs_value(NJS_NUMBER, 1, 4), 0), @@ -3095,7 +3096,7 @@ static njs_object_prop_t njs_typed_array_f64_constructor_props[] = NJS_DECLARE_PROP_NAME(njs_atom.vs_Float64Array), NJS_DECLARE_PROP_HANDLER(njs_atom.vs_prototype, - njs_object_prototype_create, 0, 0, 0), + njs_object_prototype_create, 0, 0), NJS_DECLARE_PROP_VALUE(njs_atom.vs_BYTES_PER_ELEMENT, njs_value(NJS_NUMBER, 1, 8), 0), @@ -3111,8 +3112,8 @@ static const njs_object_init_t njs_typed_array_f64_constructor_init = { static njs_object_prop_t njs_typed_array_f64_prototype_properties[] = { NJS_DECLARE_PROP_HANDLER(njs_atom.vs_constructor, - njs_object_prototype_create_constructor, - 0, 0, NJS_OBJECT_PROP_VALUE_CW), + njs_object_prototype_create_constructor, 0, + NJS_OBJECT_PROP_VALUE_CW), NJS_DECLARE_PROP_VALUE(njs_atom.vs_BYTES_PER_ELEMENT, njs_value(NJS_NUMBER, 1, 8), 0), diff --git a/src/njs_value.c b/src/njs_value.c index 253cd1ca8..430452b77 100644 --- a/src/njs_value.c +++ b/src/njs_value.c @@ -9,8 +9,7 @@ static njs_int_t njs_object_property_query(njs_vm_t *vm, - njs_property_query_t *pq, njs_object_t *object, - const njs_value_t *key); + njs_property_query_t *pq, njs_object_t *object, njs_value_t *key); static njs_int_t njs_array_property_query(njs_vm_t *vm, njs_property_query_t *pq, njs_array_t *array, uint32_t index); static njs_int_t njs_typed_array_property_query(njs_vm_t *vm, @@ -43,17 +42,11 @@ njs_value_to_primitive(njs_vm_t *vm, njs_value_t *dst, njs_value_t *value, njs_value_t method, retval; njs_lvlhsh_query_t lhq; - static const uint32_t hashes[] = { - NJS_VALUE_OF_HASH, - NJS_TO_STRING_HASH, + static const njs_value_t *hashes[] = { + &njs_atom.vs_valueOf, + &njs_atom.vs_toString, }; - static const njs_str_t names[] = { - njs_str("valueOf"), - njs_str("toString"), - }; - - if (njs_is_primitive(value)) { *dst = *value; return NJS_OK; @@ -68,8 +61,7 @@ njs_value_to_primitive(njs_vm_t *vm, njs_value_t *dst, njs_value_t *value, if (njs_is_object(value) && tries < 2) { hint ^= tries++; - lhq.key_hash = hashes[hint]; - lhq.key = names[hint]; + lhq.key_hash = hashes[hint]->atom_id; ret = njs_object_property(vm, njs_object(value), &lhq, &method); @@ -632,21 +624,23 @@ njs_property_query(njs_vm_t *vm, njs_property_query_t *pq, njs_value_t *value, return NJS_ERROR; } + ret = njs_primitive_value_to_key(vm, &pq->key, key); if (njs_fast_path(ret == NJS_OK)) { - if (njs_is_symbol(key)) { pq->lhq.key_hash = njs_symbol_key(key); - pq->lhq.key.start = NULL; } else { njs_string_get(&pq->key, &pq->lhq.key); - if (pq->lhq.key_hash == 0) { - pq->lhq.key_hash = njs_djb_hash(pq->lhq.key.start, - pq->lhq.key.length); + if (key->atom_id == 0) { + ret = njs_atom_atomize_key(vm, key); + if (ret != NJS_OK) { + return ret; + } } + pq->lhq.key_hash = key->atom_id; } ret = njs_object_property_query(vm, pq, obj, key); @@ -662,7 +656,7 @@ njs_property_query(njs_vm_t *vm, njs_property_query_t *pq, njs_value_t *value, static njs_int_t njs_object_property_query(njs_vm_t *vm, njs_property_query_t *pq, - njs_object_t *object, const njs_value_t *key) + njs_object_t *object, njs_value_t *key) { double num; njs_int_t ret; @@ -729,6 +723,14 @@ njs_object_property_query(njs_vm_t *vm, njs_property_query_t *pq, break; } + if (key->atom_id == 0) { + ret = njs_atom_atomize_key(vm, key); + if (ret != NJS_OK) { + return ret; + } + } + pq->lhq.key_hash = key->atom_id; + ret = njs_lvlhsh_find(&proto->hash, &pq->lhq); if (ret == NJS_OK) { @@ -744,7 +746,6 @@ njs_object_property_query(njs_vm_t *vm, njs_property_query_t *pq, } else { ret = njs_lvlhsh_find(&proto->shared_hash, &pq->lhq); - if (ret == NJS_OK) { return njs_prop_private_copy(vm, pq, proto); } @@ -826,7 +827,15 @@ njs_array_property_query(njs_vm_t *vm, njs_property_query_t *pq, } } - ret = njs_lvlhsh_find(&array->object.hash, &pq->lhq); + if (pq->key.atom_id == 0) { + ret = njs_atom_atomize_key(vm, &pq->key); + if (ret != NJS_OK) { + return ret; + } + } + pq->lhq.key_hash = pq->key.atom_id; + + ret = njs_flathsh_find(&array->object.hash, &pq->lhq); if (ret == NJS_OK) { prop = pq->lhq.value; @@ -1177,6 +1186,7 @@ njs_value_property_set(njs_vm_t *vm, njs_value_t *value, njs_value_t *key, njs_assert(njs_is_index_or_key(key)); if (njs_fast_path(njs_is_number(key))) { + num = njs_number(key); if (njs_slow_path(!njs_number_is_integer_index(num))) { @@ -1264,7 +1274,7 @@ njs_value_property_set(njs_vm_t *vm, njs_value_t *value, njs_value_t *key, switch (prop->type) { case NJS_PROPERTY: if (njs_is_array(value)) { - if (njs_slow_path(pq.lhq.key_hash == NJS_LENGTH_HASH)) { + if (njs_slow_path(pq.lhq.key_hash == njs_atom.vs_length.atom_id)) { if (njs_strstr_eq(&pq.lhq.key, &length_key)) { return njs_array_length_set(vm, value, prop, setval); } @@ -1349,6 +1359,7 @@ njs_value_property_set(njs_vm_t *vm, njs_value_t *value, njs_value_t *key, if (njs_slow_path(pq.own && njs_is_typed_array(value) && njs_is_string(key))) { + /* Integer-Indexed Exotic Objects [[DefineOwnProperty]]. */ if (!isnan(njs_string_to_index(key))) { return NJS_OK; @@ -1372,8 +1383,18 @@ njs_value_property_set(njs_vm_t *vm, njs_value_t *value, njs_value_t *key, return NJS_ERROR; } + if (!prop->name.atom_id) { + ret = njs_atom_atomize_key(vm, &prop->name); + if (ret != NJS_OK) { + return NJS_ERROR; + } + } + pq.lhq.replace = 0; pq.lhq.value = prop; + + pq.lhq.key_hash = prop->name.atom_id; + pq.lhq.pool = vm->mem_pool; ret = njs_lvlhsh_insert(njs_object_hash(value), &pq.lhq); diff --git a/src/njs_value.h b/src/njs_value.h index 6dbbaf6ca..560b20064 100644 --- a/src/njs_value.h +++ b/src/njs_value.h @@ -400,6 +400,7 @@ typedef struct { .string = { \ .type = NJS_STRING, \ .truth = njs_length(s) ? 1 : 0, \ + .atom_id = 0, \ .token_type = _token_type, \ .token_id = _token_id, \ .data = &(njs_string_t) { \ @@ -457,12 +458,12 @@ typedef struct { _njs_function(_function, _args_count, 1, _magic) -#define njs_prop_handler2(_handler, _magic16, _magic32) (njs_value_t) { \ +#define njs_prop_handler2(_handler, _magic16) (njs_value_t) { \ .data = { \ .type = NJS_INVALID, \ .truth = 1, \ .magic16 = _magic16, \ - .magic32 = _magic32, \ + .magic32 = 2, \ .u = { .prop_handler = _handler } \ } \ } @@ -785,6 +786,7 @@ njs_set_number(njs_value_t *value, double num) value->data.u.number = num; value->type = NJS_NUMBER; value->data.truth = njs_is_number_true(num); + value->atom_id = 0; } @@ -794,6 +796,7 @@ njs_set_int32(njs_value_t *value, int32_t num) value->data.u.number = num; value->type = NJS_NUMBER; value->data.truth = (num != 0); + value->atom_id = 0; } @@ -803,6 +806,7 @@ njs_set_uint32(njs_value_t *value, uint32_t num) value->data.u.number = num; value->type = NJS_NUMBER; value->data.truth = (num != 0); + value->atom_id = 0; } diff --git a/src/njs_vm.c b/src/njs_vm.c index a38f817ac..fd77bb4fd 100644 --- a/src/njs_vm.c +++ b/src/njs_vm.c @@ -138,8 +138,6 @@ njs_vm_create_parent(njs_vm_opt_t *options, njs_vm_t *vm_parent) } } - vm->symbol_generator = NJS_ATOM_SYMBOL_KNOWN_MAX; - if (njs_scope_undefined_index(vm, 0) == NJS_INDEX_ERROR) { return NULL; } @@ -415,11 +413,13 @@ njs_vm_clone(njs_vm_t *vm, njs_external_ptr_t external) nvm->trace.data = nvm; nvm->external = external; - nvm->atom_hash_shared = vm->atom_hash; + nvm->atom_hash_shared_cell = *vm->atom_hash; + + njs_lvlhsh_init(&nvm->atom_hash_cell); + nvm->atom_hash = &nvm->atom_hash_cell; - njs_lvlhsh_init(&nvm->atom_hash); - nvm->atom_hash_mem_pool = nvm->mem_pool; - /* nvm->atom_hash_atom_id = vm->atom_hash_atom_id; already there. */ + nvm->atom_hash_atom_id_cell = *vm->atom_hash_atom_id; + nvm->atom_hash_atom_id = &nvm->atom_hash_atom_id_cell; ret = njs_vm_runtime_init(nvm); if (njs_slow_path(ret != NJS_OK)) { @@ -892,9 +892,15 @@ njs_vm_bind2(njs_vm_t *vm, const njs_str_t *var_name, njs_object_prop_t *prop, return NJS_ERROR; } + ret = njs_atom_atomize_key(vm, &prop->name); + if (ret != NJS_OK) { + return ret; + } + lhq.value = prop; - lhq.key = *var_name; - lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length); + + lhq.key_hash = prop->name.atom_id; + lhq.replace = 1; lhq.pool = vm->mem_pool; lhq.proto = &njs_object_hash_proto; @@ -1071,7 +1077,7 @@ njs_vm_value_string(njs_vm_t *vm, njs_str_t *dst, njs_value_t *src) && njs_number(src) == 0 && signbit(njs_number(src)))) { - njs_string_get(&njs_atom.vs__0, dst); + njs_string_get(&njs_atom.vs__0, dst); /* minus zero */ return NJS_OK; } @@ -1230,20 +1236,26 @@ njs_vm_object_alloc(njs_vm_t *vm, njs_value_t *retval, ...) goto done; } - lhq.replace = 0; - lhq.pool = vm->mem_pool; - lhq.proto = &njs_object_hash_proto; - - njs_string_get(name, &lhq.key); - lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length); - prop = njs_object_prop_alloc(vm, name, value, 1); if (njs_slow_path(prop == NULL)) { goto done; } + if (!prop->name.atom_id) { + ret = njs_atom_atomize_key(vm, &prop->name); + if (ret != NJS_OK) { + goto done; + } + } + lhq.value = prop; + lhq.key_hash = prop->name.atom_id; + + lhq.replace = 0; + lhq.pool = vm->mem_pool; + lhq.proto = &njs_object_hash_proto; + ret = njs_lvlhsh_insert(&object->hash, &lhq); if (njs_slow_path(ret != NJS_OK)) { njs_internal_error(vm, NULL); diff --git a/src/njs_vm.h b/src/njs_vm.h index 065d50db3..054be9fb1 100644 --- a/src/njs_vm.h +++ b/src/njs_vm.h @@ -128,10 +128,12 @@ struct njs_vm_s { njs_native_frame_t *top_frame; njs_frame_t *active_frame; - njs_lvlhsh_t atom_hash_shared; - njs_lvlhsh_t atom_hash; + njs_lvlhsh_t atom_hash_shared_cell; + njs_lvlhsh_t atom_hash_cell; + njs_lvlhsh_t *atom_hash; njs_mp_t *atom_hash_mem_pool; - uint32_t atom_hash_atom_id; + uint32_t atom_hash_atom_id_cell; + uint32_t *atom_hash_atom_id; njs_lvlhsh_t values_hash; @@ -182,7 +184,6 @@ struct njs_vm_s { njs_random_t random; njs_rbtree_t global_symbols; - uint64_t symbol_generator; njs_module_loader_t module_loader; void *module_loader_opaque; diff --git a/src/njs_vmcode.c b/src/njs_vmcode.c index 8b0645a44..719aa7cb0 100644 --- a/src/njs_vmcode.c +++ b/src/njs_vmcode.c @@ -258,6 +258,15 @@ NEXT_LBL; get = (njs_vmcode_prop_get_t *) pc; njs_vmcode_operand(vm, get->value, retval); + if (value2->type == NJS_STRING) { + if (!value2->atom_id) { + ret = njs_atom_atomize_key(vm, value2); + if (ret != NJS_OK) { + goto error; + } + } + } + if (njs_slow_path(!njs_is_index_or_key(value2))) { if (njs_slow_path(njs_is_null_or_undefined(value1))) { (void) njs_throw_cannot_property(vm, value1, value2, "get"); @@ -1239,6 +1248,15 @@ NEXT_LBL; njs_vmcode_operand(vm, vmcode->operand2, value1); njs_vmcode_operand(vm, vmcode->operand1, retval); + if (value2->type == NJS_STRING) { + if (!value2->atom_id) { + ret = njs_atom_atomize_key(vm, value2); + if (ret != NJS_OK) { + goto error; + } + } + } + if (njs_slow_path(!njs_is_index_or_key(value2))) { if (njs_slow_path(njs_is_null_or_undefined(value1))) { (void) njs_throw_cannot_property(vm, value1, value2, "set"); @@ -2035,22 +2053,40 @@ njs_vmcode_property_init(njs_vm_t *vm, njs_value_t *value, njs_value_t *key, break; case NJS_OBJECT: + if (key->type == NJS_STRING) { + if (!key->atom_id) { + ret = njs_atom_atomize_key(vm, key); + if (ret != NJS_OK) { + return ret; + } + } + } + ret = njs_value_to_key(vm, &name, key); if (njs_slow_path(ret != NJS_OK)) { return NJS_ERROR; } - njs_object_property_key_set(&lhq, &name, 0); - lhq.proto = &njs_object_hash_proto; - lhq.pool = vm->mem_pool; - prop = njs_object_prop_alloc(vm, &name, init, 1); if (njs_slow_path(prop == NULL)) { return NJS_ERROR; } + if (!prop->name.atom_id) { + ret = njs_atom_atomize_key(vm, &prop->name); + if (ret != NJS_OK) { + return ret; + } + } + lhq.value = prop; + + lhq.key_hash = prop->name.atom_id; + lhq.replace = 1; + lhq.pool = vm->mem_pool; + lhq.proto = &njs_object_hash_proto; + ret = njs_lvlhsh_insert(njs_object_hash(value), &lhq); if (njs_slow_path(ret != NJS_OK)) { @@ -2082,8 +2118,8 @@ njs_vmcode_proto_init(njs_vm_t *vm, njs_value_t *value, njs_value_t *unused, njs_object_prop_t *prop; njs_lvlhsh_query_t lhq; - lhq.key = njs_str_value("__proto__"); - lhq.key_hash = NJS___PROTO___HASH; + lhq.key_hash = njs_atom.vs___proto__.atom_id; + lhq.proto = &njs_object_hash_proto; lhq.pool = vm->mem_pool; @@ -2356,7 +2392,21 @@ njs_values_equal(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) if (val1->type == val2->type) { if (njs_is_string(val1)) { - return njs_string_eq(val1, val2); + + if (val1->atom_id == 0) { + ret = njs_atom_atomize_key(vm, val1); + if (njs_slow_path(ret != NJS_OK)) { + return -1; + } + } + + if (val2->atom_id == 0) { + ret = njs_atom_atomize_key(vm, val2); + if (njs_slow_path(ret != NJS_OK)) { + return -1; + } + } + return val1->atom_id == val2->atom_id; } if (njs_is_symbol(val1)) {