unsigned int js_vm_intern_with_len(JSVirtualMachine * vm, const char *name, unsigned int len) { JSHashBucket *b; unsigned int pos = js_count_hash(name, len) % JS_HASH_TABLE_SIZE; for (b = vm->globals_hash[pos]; b; b = b->next) if (strcmp(b->name, name) == 0) return b->u.ui; b = js_malloc(vm, sizeof(*b)); b->name = js_strdup(vm, name); b->next = vm->globals_hash[pos]; vm->globals_hash[pos] = b; /* Alloc space from the globals array. */ if (vm->num_globals >= vm->globals_alloc) { // CHANGE alloc times to 16 vm->globals = js_realloc(vm, vm->globals, (vm->globals_alloc + 16) * sizeof(JSNode)); vm->globals_alloc += 16; } /* Initialize symbol's name spaces. */ vm->globals[vm->num_globals].type = JS_UNDEFINED; b->u.ui = vm->num_globals++; return b->u.ui; }
static void hash_insert (JSVirtualMachine *vm, JSObject *obj, const char *name, unsigned int name_len, int pos) { unsigned int hash; JSObjectPropHashBucket *b; hash = js_count_hash (name, name_len) % HASH_SIZE; for (b = obj->hash[hash]; b; b = b->next) if (b->len == name_len && memcmp (b->data, name, name_len) == 0) { /* Ok, we already have a bucket */ b->value = pos; return; } /* Create a new bucket. */ b = js_vm_alloc (vm, sizeof (*b)); b->len = name_len; b->data = js_vm_alloc (vm, b->len); memcpy (b->data, name, b->len); b->value = pos; b->next = obj->hash[hash]; obj->hash[hash] = b; obj->hash_lengths[hash]++; }
static int hash_lookup (JSObject *obj, char *name, unsigned int name_len) { unsigned int hash; JSObjectPropHashBucket *b; hash = js_count_hash (name, name_len) % HASH_SIZE; for (b = obj->hash[hash]; b; b = b->next) if (b->len == name_len && memcmp (b->data, name, name_len) == 0) return b->value; return -1; }
static void hash_delete (JSVirtualMachine *vm, JSObject *obj, const char *name, unsigned int name_len) { unsigned int hash; JSObjectPropHashBucket *b, *prev; hash = js_count_hash (name, name_len) % HASH_SIZE; for (prev = NULL, b = obj->hash[hash]; b; prev = b, b = b->next) if (b->len == name_len && memcmp (b->data, name, name_len) == 0) { /* Ok, found it. */ if (prev) prev->next = b->next; else obj->hash[hash] = b->next; obj->hash_lengths[hash]--; break; } }