1 /* go-reflect-chan.c -- channel reflection support for Go.
3 Copyright 2009 The Go Authors. All rights reserved.
4 Use of this source code is governed by a BSD-style
5 license that can be found in the LICENSE file. */
14 /* This file implements support for reflection on channels. These
15 functions are called from reflect/value.go. */
17 extern unsigned char *makechan (const struct __go_type_descriptor
*, uint32_t)
18 asm ("libgo_reflect.reflect.makechan");
21 makechan (const struct __go_type_descriptor
*typ
, uint32_t size
)
23 return (unsigned char *) __go_new_channel (typ
->__size
, size
);
26 extern void chansend (unsigned char *, unsigned char *, _Bool
*)
27 asm ("libgo_reflect.reflect.chansend");
30 chansend (unsigned char *ch
, unsigned char *val
, _Bool
*pres
)
32 struct __go_channel
*channel
= (struct __go_channel
*) ch
;
34 if (channel
->element_size
<= sizeof (uint64_t))
38 char b
[sizeof (uint64_t)];
42 __builtin_memset (u
.b
, 0, sizeof (uint64_t));
43 #ifndef WORDS_BIGENDIAN
44 __builtin_memcpy (u
.b
, val
, channel
->element_size
);
46 __builtin_memcpy (u
.b
+ sizeof (uint64_t) - channel
->element_size
, val
,
47 channel
->element_size
);
50 __go_send_small (channel
, u
.v
, 0);
52 *pres
= __go_send_nonblocking_small (channel
, u
.v
);
57 __go_send_big (channel
, val
, 0);
59 *pres
= __go_send_nonblocking_big (channel
, val
);
63 extern void chanrecv (unsigned char *, unsigned char *, _Bool
*)
64 asm ("libgo_reflect.reflect.chanrecv");
67 chanrecv (unsigned char *ch
, unsigned char *val
, _Bool
*pres
)
69 struct __go_channel
*channel
= (struct __go_channel
*) ch
;
71 if (channel
->element_size
<= sizeof (uint64_t))
75 char b
[sizeof (uint64_t)];
80 u
.v
= __go_receive_small (channel
, 0);
83 struct __go_receive_nonblocking_small s
;
85 s
= __go_receive_nonblocking_small (channel
);
92 #ifndef WORDS_BIGENDIAN
93 __builtin_memcpy (val
, u
.b
, channel
->element_size
);
95 __builtin_memcpy (val
, u
.b
+ sizeof (uint64_t) - channel
->element_size
,
96 channel
->element_size
);
102 __go_receive_big (channel
, val
, 0);
104 *pres
= __go_receive_nonblocking_big (channel
, val
);
108 extern _Bool
chanclosed (unsigned char *)
109 asm ("libgo_reflect.reflect.chanclosed");
112 chanclosed (unsigned char *ch
)
114 struct __go_channel
*channel
= (struct __go_channel
*) ch
;
116 return __go_builtin_closed (channel
);
119 extern void chanclose (unsigned char *)
120 asm ("libgo_reflect.reflect.chanclose");
123 chanclose (unsigned char *ch
)
125 struct __go_channel
*channel
= (struct __go_channel
*) ch
;
127 __go_builtin_close (channel
);
130 extern int32_t chanlen (unsigned char *) asm ("libgo_reflect.reflect.chanlen");
133 chanlen (unsigned char *ch
)
135 struct __go_channel
*channel
= (struct __go_channel
*) ch
;
137 return (int32_t) __go_chan_len (channel
);
140 extern int32_t chancap (unsigned char *) asm ("libgo_reflect.reflect.chancap");
143 chancap (unsigned char *ch
)
145 struct __go_channel
*channel
= (struct __go_channel
*) ch
;
147 return (int32_t) __go_chan_cap (channel
);