static struct kstr *kpool_insert(struct ymd_mach *vm, const char *z, int count) { struct kpool *kt = &vm->kpool; struct kstr *kz = kstr_new(vm, 1, z, count); struct gc_node **list; if (kt->used >= (1 << kt->shift)) kpool_resize(vm, kt->shift + 1); list = kt->slot + kstr_hash(kz) % (1 << kt->shift); kz->next = *list; *list = gcx(kz); kt->used++; return kz; }
struct variable *vm_mem(struct ymd_mach *vm, void *o, const char *field) { struct variable k, *v = NULL; switch (gcx(o)->type) { case T_HMAP: setv_kstr(&k, kstr_fetch(vm, field, -1)); v = hmap_get(o, &k); break; case T_SKLS: setv_kstr(&k, kstr_fetch(vm, field, -1)); v = skls_get(vm, o, &k); break; default: assert(!"No reached."); break; } return v; }