struct mapaccess_ret mapaccess (struct __go_map_type *mt, uintptr_t m, uintptr_t key_i) { struct __go_map *map = (struct __go_map *) m; void *key; const struct __go_type_descriptor *key_descriptor; void *p; const struct __go_type_descriptor *val_descriptor; struct mapaccess_ret ret; void *val; void *pv; __go_assert (mt->__common.__code == GO_MAP); key_descriptor = mt->__key_type; if (__go_is_pointer_type (key_descriptor)) key = &key_i; else key = (void *) key_i; if (map == NULL) p = NULL; else p = __go_map_index (map, key, 0); val_descriptor = mt->__val_type; if (__go_is_pointer_type (val_descriptor)) { val = NULL; pv = &val; } else { val = __go_alloc (val_descriptor->__size); pv = val; } if (p == NULL) ret.pres = 0; else { __builtin_memcpy (pv, p, val_descriptor->__size); ret.pres = 1; } ret.val = (uintptr_t) val; return ret; }
struct __go_map * __go_construct_map (const struct __go_map_descriptor *descriptor, size_t count, size_t entry_size, size_t val_offset, size_t val_size, const void *ventries) { struct __go_map *ret; const unsigned char *entries; size_t i; ret = __go_new_map (descriptor, count); entries = (const unsigned char *) ventries; for (i = 0; i < count; ++i) { void *val = __go_map_index (ret, entries, 1); __builtin_memcpy (val, entries + val_offset, val_size); entries += entry_size; } return ret; }
void mapassign (struct __go_map_type *mt, uintptr_t m, uintptr_t key_i, uintptr_t val_i, _Bool pres) { struct __go_map *map = (struct __go_map *) m; const struct __go_type_descriptor *key_descriptor; void *key; __go_assert (mt->__common.__code == GO_MAP); if (map == NULL) __go_panic_msg ("assignment to entry in nil map"); key_descriptor = mt->__key_type; if (__go_is_pointer_type (key_descriptor)) key = &key_i; else key = (void *) key_i; if (!pres) __go_map_delete (map, key); else { void *p; const struct __go_type_descriptor *val_descriptor; void *pv; p = __go_map_index (map, key, 1); val_descriptor = mt->__val_type; if (__go_is_pointer_type (val_descriptor)) pv = &val_i; else pv = (void *) val_i; __builtin_memcpy (p, pv, val_descriptor->__size); } }