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;
}
Esempio n. 2
0
_Bool
__go_type_equal_empty_interface (const void *vv1, const void *vv2,
				 uintptr_t key_size __attribute__ ((unused)))
{
  const struct __go_empty_interface *v1;
  const struct __go_empty_interface *v2;
  const struct __go_type_descriptor* v1_descriptor;
  const struct __go_type_descriptor* v2_descriptor;

  v1 = (const struct __go_empty_interface *) vv1;
  v2 = (const struct __go_empty_interface *) vv2;
  v1_descriptor = v1->__type_descriptor;
  v2_descriptor = v2->__type_descriptor;
  if (v1_descriptor == NULL || v2_descriptor == NULL)
    return v1_descriptor == v2_descriptor;
  if (!__go_type_descriptors_equal (v1_descriptor, v2_descriptor))
    return 0;
  if (v1_descriptor->__equalfn == NULL)
    runtime_panicstring ("comparing uncomparable types");
  if (__go_is_pointer_type (v1_descriptor))
    return v1->__object == v2->__object;
  else
    return __go_call_equalfn (v1_descriptor->__equalfn, v1->__object,
			      v2->__object, v1_descriptor->__size);
}
Esempio n. 3
0
_Bool
__go_type_equal_empty_interface (const void *vv1, const void *vv2,
				 size_t key_size __attribute__ ((unused)))
{
  const struct __go_empty_interface *v1;
  const struct __go_empty_interface *v2;
  const struct __go_type_descriptor* v1_descriptor;
  const struct __go_type_descriptor* v2_descriptor;

  v1 = (const struct __go_empty_interface *) vv1;
  v2 = (const struct __go_empty_interface *) vv2;
  v1_descriptor = v1->__type_descriptor;
  v2_descriptor = v2->__type_descriptor;
  if (((uintptr_t) v1_descriptor & reflectFlags) != 0
      || ((uintptr_t) v2_descriptor & reflectFlags) != 0)
    runtime_panicstring ("invalid interface value");
  if (v1_descriptor == NULL || v2_descriptor == NULL)
    return v1_descriptor == v2_descriptor;
  if (!__go_type_descriptors_equal (v1_descriptor, v2_descriptor))
    return 0;
  if (__go_is_pointer_type (v1_descriptor))
    return v1->__object == v2->__object;
  else
    return v1_descriptor->__equalfn (v1->__object, v2->__object,
				     v1_descriptor->__size);
}
int
__go_empty_interface_compare (struct __go_empty_interface left,
			      struct __go_empty_interface right)
{
  const struct __go_type_descriptor *left_descriptor;

  left_descriptor = left.__type_descriptor;

  if (((uintptr_t) left_descriptor & reflectFlags) != 0
      || ((uintptr_t) right.__type_descriptor & reflectFlags) != 0)
    __go_panic_msg ("invalid interface value");

  if (left_descriptor == NULL && right.__type_descriptor == NULL)
    return 0;
  if (left_descriptor == NULL || right.__type_descriptor == NULL)
    return 1;
  if (!__go_type_descriptors_equal (left_descriptor,
				    right.__type_descriptor))
    return 1;
  if (__go_is_pointer_type (left_descriptor))
    return left.__object == right.__object ? 0 : 1;
  if (!left_descriptor->__equalfn (left.__object, right.__object,
				   left_descriptor->__size))
    return 1;
  return 0;
}
struct __go_empty_interface
Unreflect (struct __go_empty_interface type, void *object)
{
  struct __go_empty_interface ret;

  /* FIXME: We should check __type_descriptor to verify that this is
     really a type descriptor.  */
  ret.__type_descriptor = type.__object;
  if (__go_is_pointer_type (ret.__type_descriptor))
    ret.__object = *(void **) object;
  else
    ret.__object = object;
  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);
    }
}
Esempio n. 7
0
uintptr_t
__go_type_hash_interface (const void *vval,
			  uintptr_t key_size __attribute__ ((unused)))
{
  const struct __go_interface *val;
  const struct __go_type_descriptor *descriptor;
  uintptr_t size;

  val = (const struct __go_interface *) vval;
  if (val->__methods == NULL)
    return 0;
  descriptor = (const struct __go_type_descriptor *) val->__methods[0];
  size = descriptor->__size;
  if (__go_is_pointer_type (descriptor))
    return descriptor->__hashfn (&val->__object, size);
  else
    return descriptor->__hashfn (val->__object, size);
}
Esempio n. 8
0
size_t
__go_type_hash_empty_interface (const void *vval,
				size_t key_size __attribute__ ((unused)))
{
  const struct __go_empty_interface *val;
  const struct __go_type_descriptor *descriptor;
  size_t size;

  val = (const struct __go_empty_interface *) vval;
  descriptor = val->__type_descriptor;
  if (descriptor == NULL)
    return 0;
  size = descriptor->__size;
  if (__go_is_pointer_type (descriptor))
    return descriptor->__hashfn (&val->__object, size);
  else
    return descriptor->__hashfn (val->__object, size);
}
Esempio n. 9
0
uintptr_t
__go_type_hash_empty_interface (const void *vval, uintptr_t seed,
				uintptr_t key_size __attribute__ ((unused)))
{
  const struct __go_empty_interface *val;
  const struct __go_type_descriptor *descriptor;
  uintptr_t size;

  val = (const struct __go_empty_interface *) vval;
  descriptor = val->__type_descriptor;
  if (descriptor == NULL)
    return 0;
  if (descriptor->__hashfn == NULL)
    runtime_panicstring ("hash of unhashable type");
  size = descriptor->__size;
  if (__go_is_pointer_type (descriptor))
    return __go_call_hashfn (descriptor->__hashfn, &val->__object, seed, size);
  else
    return __go_call_hashfn (descriptor->__hashfn, val->__object, seed, size);
}
Esempio n. 10
0
int
__go_interface_compare (struct __go_interface left,
			struct __go_interface right)
{
  const struct __go_type_descriptor *left_descriptor;

  if (left.__methods == NULL && right.__methods == NULL)
    return 0;
  if (left.__methods == NULL || right.__methods == NULL)
    return 1;
  left_descriptor = left.__methods[0];
  if (!__go_type_descriptors_equal (left_descriptor, right.__methods[0]))
    return 1;
  if (__go_is_pointer_type (left_descriptor))
    return left.__object == right.__object ? 0 : 1;
  if (!left_descriptor->__equalfn (left.__object, right.__object,
				   left_descriptor->__size))
    return 1;
  return 0;
}
Esempio n. 11
0
File: chan.c Progetto: mm120/gcc
_Bool
reflect_chansend(ChanType *t, Hchan *c, uintptr val, _Bool nb)
{
	bool selected;
	bool *sp;
	byte *vp;

	if(nb) {
		selected = false;
		sp = (bool*)&selected;
	} else {
		selected = true;
		sp = nil;
	}
	if(__go_is_pointer_type(t->__element_type))
		vp = (byte*)&val;
	else
		vp = (byte*)val;
	runtime_chansend(t, c, vp, sp, runtime_getcallerpc(&t));
	return selected;
}
Esempio n. 12
0
_Bool
__go_type_equal_interface (const void *vv1, const void *vv2,
			   uintptr_t key_size __attribute__ ((unused)))
{
  const struct __go_interface *v1;
  const struct __go_interface *v2;
  const struct __go_type_descriptor* v1_descriptor;
  const struct __go_type_descriptor* v2_descriptor;

  v1 = (const struct __go_interface *) vv1;
  v2 = (const struct __go_interface *) vv2;
  if (v1->__methods == NULL || v2->__methods == NULL)
    return v1->__methods == v2->__methods;
  v1_descriptor = (const struct __go_type_descriptor *) v1->__methods[0];
  v2_descriptor = (const struct __go_type_descriptor *) v2->__methods[0];
  if (!__go_type_descriptors_equal (v1_descriptor, v2_descriptor))
    return 0;
  if (__go_is_pointer_type (v1_descriptor))
    return v1->__object == v2->__object;
  else
    return v1_descriptor->__equalfn (v1->__object, v2->__object,
				     v1_descriptor->__size);
}
struct mapiterkey_ret
mapiterkey (unsigned char *ita)
{
  struct __go_hash_iter *it = (struct __go_hash_iter *) ita;
  struct mapiterkey_ret ret;

  if (it->entry == NULL)
    {
      ret.key = 0;
      ret.ok = 0;
    }
  else
    {
      const struct __go_type_descriptor *key_descriptor;
      void *key;
      void *pk;

      key_descriptor = it->map->__descriptor->__map_descriptor->__key_type;
      if (__go_is_pointer_type (key_descriptor))
	{
	  key = NULL;
	  pk = &key;
	}
      else
	{
	  key = __go_alloc (key_descriptor->__size);
	  pk = key;
	}

      __go_mapiter1 (it, pk);

      ret.key = (uintptr_t) key;
      ret.ok = 1;
    }

  return ret;
}