aboutsummaryrefslogtreecommitdiff
path: root/src/njs_builtin.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/njs_builtin.c')
-rw-r--r--src/njs_builtin.c253
1 files changed, 125 insertions, 128 deletions
diff --git a/src/njs_builtin.c b/src/njs_builtin.c
index 230b4c1c..1b486ba9 100644
--- a/src/njs_builtin.c
+++ b/src/njs_builtin.c
@@ -158,7 +158,7 @@ njs_builtin_objects_create(njs_vm_t *vm)
vm->shared = shared;
- njs_lvlhsh_init(&shared->values_hash);
+ njs_flathsh_init(&shared->values_hash);
vm->atom_id_generator = njs_atom_hash_init(vm);
if (njs_slow_path(vm->atom_id_generator == 0xffffffff)) {
@@ -300,13 +300,13 @@ njs_builtin_objects_create(njs_vm_t *vm)
vm->global_object.shared = 0;
string_object = &shared->string_object;
- njs_lvlhsh_init(&string_object->hash);
+ njs_flathsh_init(&string_object->hash);
string_object->shared_hash = shared->string_instance_hash;
string_object->type = NJS_OBJECT_VALUE;
string_object->shared = 1;
string_object->extensible = 0;
- njs_lvlhsh_init(&shared->modules_hash);
+ njs_flathsh_init(&shared->modules_hash);
return NJS_OK;
}
@@ -323,7 +323,7 @@ njs_builtin_traverse(njs_vm_t *vm, njs_traverse_t *traverse, void *data)
njs_value_t key, *value, prop_name;
njs_function_t *func, *target;
njs_object_prop_t *prop;
- njs_flathsh_query_t lhq;
+ njs_flathsh_query_t fhq;
njs_builtin_traverse_t *ctx;
njs_traverse_t *path[NJS_TRAVERSE_MAX_DEPTH];
u_char buf[256];
@@ -433,28 +433,30 @@ njs_builtin_traverse(njs_vm_t *vm, njs_traverse_t *traverse, void *data)
/* NJS_BUILTIN_TRAVERSE_KEYS. */
- prop = njs_object_prop_alloc(vm, &njs_value_null, 0);
- if (njs_slow_path(prop == NULL)) {
- return NJS_ERROR;
- }
-
ret = njs_atom_string_create(vm, &prop_name, buf, p - buf);
if (njs_slow_path(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;
+ fhq.key_hash = prop_name.atom_id;
+ fhq.replace = 1;
+ fhq.pool = vm->mem_pool;
+ fhq.proto = &njs_object_hash_proto;
- ret = njs_flathsh_unique_insert(&ctx->keys, &lhq);
+ ret = njs_flathsh_unique_insert(&ctx->keys, &fhq);
if (njs_slow_path(ret != NJS_OK)) {
- njs_internal_error(vm, "lvlhsh insert/replace failed");
+ njs_internal_error(vm, "flathsh insert/replace failed");
return NJS_ERROR;
}
+ prop = fhq.value;
+
+ prop->type = NJS_PROPERTY;
+ prop->enumerable = 0;
+ prop->configurable = 0;
+ prop->writable = 0;
+ prop->u.value = njs_value_null;
+
return NJS_OK;
}
@@ -477,7 +479,8 @@ njs_builtin_match_native_function(njs_vm_t *vm, njs_function_t *function,
njs_uint_t i, n;
njs_value_t value, tag;
njs_object_t object;
- njs_lvlhsh_each_t lhe;
+ njs_object_prop_t *prop;
+ njs_flathsh_each_t lhe;
njs_exotic_slots_t *slots;
njs_function_name_t *fn;
njs_function_native_t native;
@@ -535,15 +538,16 @@ njs_builtin_match_native_function(njs_vm_t *vm, njs_function_t *function,
/* Modules. */
- njs_lvlhsh_each_init(&lhe, &njs_modules_hash_proto);
+ njs_flathsh_each_init(&lhe, &njs_modules_hash_proto);
for ( ;; ) {
- module = njs_lvlhsh_each(&vm->modules_hash, &lhe);
-
- if (module == NULL) {
+ prop = (njs_object_prop_t *) njs_flathsh_each(&vm->modules_hash, &lhe);
+ if (prop == NULL) {
break;
}
+ module = prop->u.mod;
+
if (njs_is_object(&module->value)
&& !njs_object(&module->value)->shared)
{
@@ -759,7 +763,6 @@ njs_global_this_prop_handler(njs_vm_t *vm, njs_object_prop_t *prop,
{
njs_value_t *value;
njs_variable_t *var;
- njs_function_t *function;
njs_rbtree_node_t *rb_node;
njs_variable_node_t *node, var_node;
@@ -788,15 +791,6 @@ njs_global_this_prop_handler(njs_vm_t *vm, njs_object_prop_t *prop,
value = njs_scope_valid_value(vm, var->index);
- if (var->type == NJS_VARIABLE_FUNCTION && njs_is_undefined(value)) {
- njs_value_assign(value, &var->value);
-
- function = njs_function_value_copy(vm, value);
- if (njs_slow_path(function == NULL)) {
- return NJS_ERROR;
- }
- }
-
if (setval != NULL) {
njs_value_assign(value, setval);
}
@@ -813,7 +807,7 @@ njs_global_this_object(njs_vm_t *vm, njs_object_prop_t *self, uint32_t atom_id,
{
njs_int_t ret;
njs_object_prop_t *prop;
- njs_flathsh_query_t lhq;
+ njs_flathsh_query_t fhq;
if (retval == NULL) {
return NJS_DECLINED;
@@ -825,26 +819,25 @@ njs_global_this_object(njs_vm_t *vm, njs_object_prop_t *self, uint32_t atom_id,
njs_value_assign(retval, setval);
}
- prop = njs_object_prop_alloc(vm, retval, 1);
- if (njs_slow_path(prop == NULL)) {
- return NJS_ERROR;
- }
-
- njs_value_assign(njs_prop_value(prop), retval);
- prop->enumerable = self->enumerable;
-
- lhq.value = prop;
- lhq.key_hash = atom_id;
- lhq.replace = 1;
- lhq.pool = vm->mem_pool;
- lhq.proto = &njs_object_hash_proto;
+ fhq.key_hash = atom_id;
+ fhq.replace = 1;
+ fhq.pool = vm->mem_pool;
+ fhq.proto = &njs_object_hash_proto;
- ret = njs_flathsh_unique_insert(njs_object_hash(global), &lhq);
+ ret = njs_flathsh_unique_insert(njs_object_hash(global), &fhq);
if (njs_slow_path(ret != NJS_OK)) {
- njs_internal_error(vm, "lvlhsh insert/replace failed");
+ njs_internal_error(vm, "flathsh insert/replace failed");
return NJS_ERROR;
}
+ prop = fhq.value;
+
+ prop->type = NJS_PROPERTY;
+ prop->enumerable = self->enumerable;
+ prop->configurable = 1;
+ prop->writable = 1;
+ prop->u.value = *retval;
+
return NJS_OK;
}
@@ -856,7 +849,7 @@ njs_top_level_object(njs_vm_t *vm, njs_object_prop_t *self, uint32_t atom_id,
njs_int_t ret;
njs_object_t *object;
njs_object_prop_t *prop;
- njs_flathsh_query_t lhq;
+ njs_flathsh_query_t fhq;
if (njs_slow_path(setval != NULL)) {
njs_value_assign(retval, setval);
@@ -876,26 +869,25 @@ njs_top_level_object(njs_vm_t *vm, njs_object_prop_t *self, uint32_t atom_id,
object->__proto__ = njs_vm_proto(vm, NJS_OBJ_TYPE_OBJECT);
}
- prop = njs_object_prop_alloc(vm, retval, 1);
- if (njs_slow_path(prop == NULL)) {
- return NJS_ERROR;
- }
-
- njs_value_assign(njs_prop_value(prop), retval);
- prop->enumerable = self->enumerable;
+ fhq.key_hash = atom_id;
+ fhq.replace = 1;
+ fhq.pool = vm->mem_pool;
+ fhq.proto = &njs_object_hash_proto;
- lhq.value = prop;
- lhq.key_hash = atom_id;
- lhq.replace = 1;
- lhq.pool = vm->mem_pool;
- lhq.proto = &njs_object_hash_proto;
-
- ret = njs_flathsh_unique_insert(njs_object_hash(global), &lhq);
+ ret = njs_flathsh_unique_insert(njs_object_hash(global), &fhq);
if (njs_slow_path(ret != NJS_OK)) {
- njs_internal_error(vm, "lvlhsh insert/replace failed");
+ njs_internal_error(vm, "flathsh insert/replace failed");
return NJS_ERROR;
}
+ prop = fhq.value;
+
+ prop->type = NJS_PROPERTY;
+ prop->enumerable = self->enumerable;
+ prop->configurable = 1;
+ prop->writable = 1;
+ prop->u.value = *retval;
+
return NJS_OK;
}
@@ -908,7 +900,7 @@ njs_top_level_constructor(njs_vm_t *vm, njs_object_prop_t *self,
njs_int_t ret;
njs_function_t *ctor;
njs_object_prop_t *prop;
- njs_flathsh_query_t lhq;
+ njs_flathsh_query_t fhq;
if (njs_slow_path(setval != NULL)) {
njs_value_assign(retval, setval);
@@ -925,26 +917,25 @@ njs_top_level_constructor(njs_vm_t *vm, njs_object_prop_t *self,
return NJS_OK;
}
- prop = njs_object_prop_alloc(vm, retval, 1);
- if (njs_slow_path(prop == NULL)) {
- return NJS_ERROR;
- }
-
- njs_value_assign(njs_prop_value(prop), retval);
- prop->enumerable = 0;
-
- lhq.value = prop;
- lhq.key_hash = atom_id;
- lhq.replace = 1;
- lhq.pool = vm->mem_pool;
- lhq.proto = &njs_object_hash_proto;
+ fhq.key_hash = atom_id;
+ fhq.replace = 1;
+ fhq.pool = vm->mem_pool;
+ fhq.proto = &njs_object_hash_proto;
- ret = njs_flathsh_unique_insert(njs_object_hash(global), &lhq);
+ ret = njs_flathsh_unique_insert(njs_object_hash(global), &fhq);
if (njs_slow_path(ret != NJS_OK)) {
- njs_internal_error(vm, "lvlhsh insert/replace failed");
+ njs_internal_error(vm, "flathsh insert/replace failed");
return NJS_ERROR;
}
+ prop = fhq.value;
+
+ prop->type = NJS_PROPERTY;
+ prop->enumerable = 0;
+ prop->configurable = 1;
+ prop->writable = 1;
+ prop->u.value = *retval;
+
return NJS_OK;
}
@@ -1198,7 +1189,7 @@ njs_process_object_argv(njs_vm_t *vm, njs_object_prop_t *pr, uint32_t unused,
njs_uint_t i;
njs_array_t *argv;
njs_object_prop_t *prop;
- njs_flathsh_query_t lhq;
+ njs_flathsh_query_t fhq;
argv = njs_array_alloc(vm, 1, vm->options.argc, 0);
if (njs_slow_path(argv == NULL)) {
@@ -1215,28 +1206,29 @@ njs_process_object_argv(njs_vm_t *vm, njs_object_prop_t *pr, uint32_t unused,
}
}
- prop = njs_object_prop_alloc(vm, &njs_value_undefined, 1);
- if (njs_slow_path(prop == NULL)) {
+ fhq.key_hash = NJS_ATOM_STRING_argv;
+ fhq.replace = 1;
+ fhq.pool = vm->mem_pool;
+ fhq.proto = &njs_object_hash_proto;
+
+ ret = njs_flathsh_unique_insert(njs_object_hash(process), &fhq);
+ if (njs_slow_path(ret != NJS_OK)) {
+ njs_internal_error(vm, "flathsh insert failed");
return NJS_ERROR;
}
- njs_set_array(njs_prop_value(prop), argv);
+ prop = fhq.value;
- lhq.value = prop;
- lhq.key_hash = NJS_ATOM_STRING_argv;
- lhq.replace = 1;
- lhq.pool = vm->mem_pool;
- lhq.proto = &njs_object_hash_proto;
+ prop->type = NJS_PROPERTY;
+ prop->enumerable = 1;
+ prop->configurable = 1;
+ prop->writable = 1;
- ret = njs_flathsh_unique_insert(njs_object_hash(process), &lhq);
- if (njs_fast_path(ret == NJS_OK)) {
- njs_value_assign(retval, njs_prop_value(prop));
- return NJS_OK;
- }
+ njs_set_array(njs_prop_value(prop), argv);
- njs_internal_error(vm, "lvlhsh insert failed");
+ njs_value_assign(retval, njs_prop_value(prop));
+ return NJS_OK;
- return NJS_ERROR;
}
@@ -1252,19 +1244,15 @@ njs_env_hash_init(njs_vm_t *vm, njs_flathsh_t *hash, char **environment)
const u_char *val, *entry, *s, *end;
njs_object_prop_t *prop;
njs_string_prop_t string;
- njs_flathsh_query_t lhq;
+ njs_flathsh_query_t fhq;
- lhq.replace = 0;
- lhq.pool = vm->mem_pool;
- lhq.proto = &njs_object_hash_proto;
+ fhq.replace = 0;
+ fhq.pool = vm->mem_pool;
+ fhq.proto = &njs_object_hash_proto;
ep = environment;
while (*ep != NULL) {
- prop = njs_object_prop_alloc(vm, &njs_value_undefined, 1);
- if (njs_slow_path(prop == NULL)) {
- return NJS_ERROR;
- }
entry = (u_char *) *ep++;
@@ -1293,23 +1281,17 @@ njs_env_hash_init(njs_vm_t *vm, njs_flathsh_t *hash, char **environment)
val++;
- ret = njs_string_create(vm, njs_prop_value(prop), val, njs_strlen(val));
- if (njs_slow_path(ret != NJS_OK)) {
- return NJS_ERROR;
- }
-
ret = njs_atom_atomize_key(vm, &prop_name);
if (ret != NJS_OK) {
return ret;
}
- lhq.value = prop;
- lhq.key_hash = prop_name.atom_id;
+ fhq.key_hash = prop_name.atom_id;
- ret = njs_flathsh_unique_insert(hash, &lhq);
+ ret = njs_flathsh_unique_insert(hash, &fhq);
if (njs_slow_path(ret != NJS_OK)) {
if (ret == NJS_ERROR) {
- njs_internal_error(vm, "lvlhsh insert failed");
+ njs_internal_error(vm, "flathsh insert failed");
return NJS_ERROR;
}
@@ -1319,6 +1301,19 @@ njs_env_hash_init(njs_vm_t *vm, njs_flathsh_t *hash, char **environment)
* Always using the first element among the duplicates
* and ignoring the rest.
*/
+ continue;
+ }
+
+ prop = fhq.value;
+
+ prop->type = NJS_PROPERTY;
+ prop->enumerable = 1;
+ prop->configurable = 1;
+ prop->writable = 1;
+
+ ret = njs_string_create(vm, njs_prop_value(prop), val, njs_strlen(val));
+ if (njs_slow_path(ret != NJS_OK)) {
+ return NJS_ERROR;
}
}
@@ -1333,7 +1328,7 @@ njs_process_object_env(njs_vm_t *vm, njs_object_prop_t *pr, uint32_t unused,
njs_int_t ret;
njs_object_t *env;
njs_object_prop_t *prop;
- njs_flathsh_query_t lhq;
+ njs_flathsh_query_t fhq;
env = njs_object_alloc(vm);
if (njs_slow_path(env == NULL)) {
@@ -1342,28 +1337,30 @@ njs_process_object_env(njs_vm_t *vm, njs_object_prop_t *pr, uint32_t unused,
env->shared_hash = vm->shared->env_hash;
- prop = njs_object_prop_alloc(vm, &njs_value_undefined, 1);
- if (njs_slow_path(prop == NULL)) {
+ fhq.replace = 1;
+ fhq.pool = vm->mem_pool;
+ fhq.proto = &njs_object_hash_proto;
+ fhq.key_hash = NJS_ATOM_STRING_env;
+
+ ret = njs_flathsh_unique_insert(njs_object_hash(process), &fhq);
+ if (njs_slow_path(ret != NJS_OK)) {
+ njs_internal_error(vm, "flathsh insert failed");
+
return NJS_ERROR;
}
- njs_set_object(njs_prop_value(prop), env);
+ prop = fhq.value;
- lhq.replace = 1;
- lhq.pool = vm->mem_pool;
- lhq.proto = &njs_object_hash_proto;
- lhq.value = prop;
- lhq.key_hash = NJS_ATOM_STRING_env;
+ prop->type = NJS_PROPERTY;
+ prop->enumerable = 1;
+ prop->configurable = 1;
+ prop->writable = 1;
- ret = njs_flathsh_unique_insert(njs_object_hash(process), &lhq);
- if (njs_fast_path(ret == NJS_OK)) {
- njs_value_assign(retval, njs_prop_value(prop));
- return NJS_OK;
- }
+ njs_set_object(njs_prop_value(prop), env);
- njs_internal_error(vm, "lvlhsh insert failed");
+ njs_value_assign(retval, njs_prop_value(prop));
- return NJS_ERROR;
+ return NJS_OK;
}