diff options
Diffstat (limited to 'src/njs_vm.c')
-rw-r--r-- | src/njs_vm.c | 99 |
1 files changed, 50 insertions, 49 deletions
diff --git a/src/njs_vm.c b/src/njs_vm.c index 008f9d04..19c50e48 100644 --- a/src/njs_vm.c +++ b/src/njs_vm.c @@ -54,7 +54,7 @@ njs_vm_create(njs_vm_opt_t *options) return NULL; } - njs_lvlhsh_init(&vm->values_hash); + njs_flathsh_init(&vm->values_hash); vm->options = *options; @@ -310,7 +310,6 @@ njs_vm_compile_module(njs_vm_t *vm, njs_str_t *name, u_char **start, u_char *end) { njs_int_t ret; - njs_arr_t *arr; njs_mod_t *module; njs_parser_t parser; njs_vm_code_t *code; @@ -366,10 +365,6 @@ njs_vm_compile_module(njs_vm_t *vm, njs_str_t *name, u_char **start, lambda->start = generator.code_start; lambda->nlocal = scope->items; - arr = scope->declarations; - lambda->declarations = (arr != NULL) ? arr->start : NULL; - lambda->ndeclarations = (arr != NULL) ? arr->items : 0; - module->function.u.lambda = lambda; return module; @@ -419,7 +414,7 @@ njs_vm_clone(njs_vm_t *vm, njs_external_ptr_t external) nvm->shared_atom_count = vm->atom_id_generator; - njs_lvlhsh_init(&nvm->atom_hash); + njs_flathsh_init(&nvm->atom_hash); nvm->atom_hash_current = &nvm->atom_hash; ret = njs_vm_runtime_init(nvm); @@ -497,9 +492,9 @@ njs_vm_runtime_init(njs_vm_t *vm) return NJS_ERROR; } - njs_lvlhsh_init(&vm->values_hash); + njs_flathsh_init(&vm->values_hash); - njs_lvlhsh_init(&vm->modules_hash); + njs_flathsh_init(&vm->modules_hash); njs_rbtree_init(&vm->global_symbols, njs_symbol_rbtree_cmp); @@ -908,7 +903,8 @@ njs_vm_bind2(njs_vm_t *vm, const njs_str_t *var_name, njs_object_prop_t *prop, njs_value_t prop_name; njs_object_t *global; njs_flathsh_t *hash; - njs_flathsh_query_t lhq; + njs_object_prop_t *obj_prop; + njs_flathsh_query_t fhq; ret = njs_atom_string_create(vm, &prop_name, var_name->start, var_name->length); @@ -916,21 +912,28 @@ njs_vm_bind2(njs_vm_t *vm, const njs_str_t *var_name, njs_object_prop_t *prop, return NJS_ERROR; } - 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; global = &vm->global_object; hash = shared ? &global->shared_hash : &global->hash; - ret = njs_flathsh_unique_insert(hash, &lhq); + ret = njs_flathsh_unique_insert(hash, &fhq); if (njs_slow_path(ret != NJS_OK)) { - njs_internal_error(vm, "lvlhsh insert failed"); + njs_internal_error(vm, "flathsh insert failed"); return ret; } + obj_prop = fhq.value; + + obj_prop->type = prop->type; + obj_prop->enumerable = prop->enumerable; + obj_prop->configurable = prop->configurable; + obj_prop->writable = prop->writable; + obj_prop->u.value = prop->u.value; + return NJS_OK; } @@ -939,14 +942,13 @@ njs_int_t njs_vm_bind(njs_vm_t *vm, const njs_str_t *var_name, const njs_value_t *value, njs_bool_t shared) { - njs_object_prop_t *prop; + njs_object_prop_t prop; - prop = njs_object_prop_alloc(vm, value, 1); - if (njs_slow_path(prop == NULL)) { - return NJS_ERROR; - } + njs_object_prop_init(&prop, NJS_PROPERTY, + NJS_OBJECT_PROP_VALUE_ECW); + *njs_prop_value(&prop) = *value; - return njs_vm_bind2(vm, var_name, prop, shared); + return njs_vm_bind2(vm, var_name, &prop, shared); } @@ -955,21 +957,18 @@ njs_vm_bind_handler(njs_vm_t *vm, const njs_str_t *var_name, njs_prop_handler_t handler, uint16_t magic16, uint32_t magic32, njs_bool_t shared) { - njs_object_prop_t *prop; + njs_object_prop_t prop; - prop = njs_object_prop_alloc(vm, &njs_value_invalid, 1); - if (njs_slow_path(prop == NULL)) { - return NJS_ERROR; - } + njs_object_prop_init(&prop, NJS_PROPERTY_HANDLER, + NJS_OBJECT_PROP_VALUE_ECW); - prop->type = NJS_PROPERTY_HANDLER; - prop->u.value.type = NJS_INVALID; - prop->u.value.data.truth = 1; - njs_prop_magic16(prop) = magic16; - njs_prop_magic32(prop) = magic32; - njs_prop_handler(prop) = handler; + prop.u.value.type = NJS_INVALID; + prop.u.value.data.truth = 1; + njs_prop_magic16(&prop) = magic16; + njs_prop_magic32(&prop) = magic32; + njs_prop_handler(&prop) = handler; - return njs_vm_bind2(vm, var_name, prop, shared); + return njs_vm_bind2(vm, var_name, &prop, shared); } @@ -1219,7 +1218,7 @@ njs_vm_object_alloc(njs_vm_t *vm, njs_value_t *retval, ...) njs_value_t *name, *value; njs_object_t *object; njs_object_prop_t *prop; - njs_flathsh_query_t lhq; + njs_flathsh_query_t fhq; object = njs_object_alloc(vm); if (njs_slow_path(object == NULL)) { @@ -1247,11 +1246,6 @@ njs_vm_object_alloc(njs_vm_t *vm, njs_value_t *retval, ...) goto done; } - prop = njs_object_prop_alloc(vm, value, 1); - if (njs_slow_path(prop == NULL)) { - goto done; - } - if (name->atom_id == NJS_ATOM_STRING_unknown) { ret = njs_atom_atomize_key(vm, name); if (ret != NJS_OK) { @@ -1259,17 +1253,24 @@ njs_vm_object_alloc(njs_vm_t *vm, njs_value_t *retval, ...) } } - lhq.value = prop; - lhq.key_hash = name->atom_id; - lhq.replace = 0; - lhq.pool = vm->mem_pool; - lhq.proto = &njs_object_hash_proto; + fhq.key_hash = name->atom_id; + fhq.replace = 0; + fhq.pool = vm->mem_pool; + fhq.proto = &njs_object_hash_proto; - ret = njs_flathsh_unique_insert(&object->hash, &lhq); + ret = njs_flathsh_unique_insert(&object->hash, &fhq); if (njs_slow_path(ret != NJS_OK)) { njs_internal_error(vm, NULL); goto done; } + + prop = fhq.value; + + prop->type = NJS_PROPERTY; + prop->enumerable = 1; + prop->configurable = 1; + prop->writable = 1; + prop->u.value = *value; } ret = NJS_OK; @@ -1636,14 +1637,14 @@ njs_vm_string_compare(njs_vm_t *vm, const njs_value_t *v1, void * -njs_lvlhsh_alloc(void *data, size_t size) +njs_flathsh_proto_alloc(void *data, size_t size) { return njs_mp_align(data, NJS_MAX_ALIGNMENT, size); } void -njs_lvlhsh_free(void *data, void *p, size_t size) +njs_flathsh_proto_free(void *data, void *p, size_t size) { njs_mp_free(data, p); } |