Пример #1
0
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;
}
Пример #2
0
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]++;
}
Пример #3
0
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;
}
Пример #4
0
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;
      }
}