diff options
Diffstat (limited to 'libgo/runtime/go-construct-map.c')
-rw-r--r-- | libgo/runtime/go-construct-map.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/libgo/runtime/go-construct-map.c b/libgo/runtime/go-construct-map.c index 4bd79d2005..9a48d5733e 100644 --- a/libgo/runtime/go-construct-map.c +++ b/libgo/runtime/go-construct-map.c @@ -9,25 +9,33 @@ #include <stdlib.h> #include "runtime.h" -#include "map.h" +#include "go-type.h" -struct __go_map * -__go_construct_map (const struct __go_map_descriptor *descriptor, +extern void *makemap (const struct __go_map_type *, int64_t hint, + void *, void *) + __asm__ (GOSYM_PREFIX "runtime.makemap"); + +extern void *mapassign (const struct __go_map_type *, void *hmap, + const void *key) + __asm__ (GOSYM_PREFIX "runtime.mapassign"); + +void * +__go_construct_map (const struct __go_map_type *type, uintptr_t count, uintptr_t entry_size, - uintptr_t val_offset, uintptr_t val_size, - const void *ventries) + uintptr_t val_offset, const void *ventries) { - struct __go_map *ret; + void *ret; const unsigned char *entries; uintptr_t i; + void *p; - ret = __go_new_map (descriptor, count); + ret = makemap(type, (int64_t) count, NULL, NULL); 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); + p = mapassign (type, ret, entries); + typedmemmove (type->__val_type, p, entries + val_offset); entries += entry_size; } |