uintptr_t
makemap (const struct __go_map_type *t)
{
  struct __go_map_descriptor *md;
  unsigned int o;
  const struct __go_type_descriptor *kt;
  const struct __go_type_descriptor *vt;
  struct __go_map* map;
  void *ret;

  /* FIXME: Reference count.  */
  md = (struct __go_map_descriptor *) __go_alloc (sizeof (*md));
  md->__map_descriptor = t;
  o = sizeof (void *);
  kt = t->__key_type;
  o = (o + kt->__field_align - 1) & ~ (kt->__field_align - 1);
  md->__key_offset = o;
  o += kt->__size;
  vt = t->__val_type;
  o = (o + vt->__field_align - 1) & ~ (vt->__field_align - 1);
  md->__val_offset = o;
  o += vt->__size;
  o = (o + sizeof (void *) - 1) & ~ (sizeof (void *) - 1);
  o = (o + kt->__field_align - 1) & ~ (kt->__field_align - 1);
  o = (o + vt->__field_align - 1) & ~ (vt->__field_align - 1);
  md->__entry_size = o;

  map = __go_new_map (md, 0);

  ret = __go_alloc (sizeof (void *));
  __builtin_memcpy (ret, &map, sizeof (void *));
  return (uintptr_t) ret;
}
Пример #2
0
struct __go_map *
__go_new_map_big (const struct __go_map_descriptor *descriptor,
		  uint64_t entries)
{
  uintptr_t sentries;

  sentries = (uintptr_t) entries;
  if ((uint64_t) sentries != entries)
    runtime_panicstring ("map size out of range");
  return __go_new_map (descriptor, sentries);
}
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;
}