summaryrefslogtreecommitdiff
path: root/src/pkg/runtime/iface.goc
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2014-06-02 21:06:30 -0400
committerRuss Cox <rsc@golang.org>2014-06-02 21:06:30 -0400
commit67dfc8bde67368108766b94b2cdcab143299d40c (patch)
tree1cf4326e1e77688cda63e1cacb04ab89b4c7e009 /src/pkg/runtime/iface.goc
parent64e102c9d6e598e6cdfaf1b429c2157e82ebe1ff (diff)
downloadgo-67dfc8bde67368108766b94b2cdcab143299d40c.tar.gz
runtime: fix 1-byte return during x.(T) for 0-byte T
The 1-byte write was silently clearing a byte on the stack. If there was another function call with more arguments in the same stack frame, no harm done. Otherwise, if the variable at that location was already zero, no harm done. Otherwise, problems. Fixes issue 8139. LGTM=dsymonds R=golang-codereviews, dsymonds CC=golang-codereviews, iant, r https://codereview.appspot.com/100940043
Diffstat (limited to 'src/pkg/runtime/iface.goc')
-rw-r--r--src/pkg/runtime/iface.goc23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/pkg/runtime/iface.goc b/src/pkg/runtime/iface.goc
index 96bb8b8aa..c0a17e303 100644
--- a/src/pkg/runtime/iface.goc
+++ b/src/pkg/runtime/iface.goc
@@ -209,9 +209,19 @@ func convT2E(t *Type, elem *byte) (ret Eface) {
static void assertI2Tret(Type *t, Iface i, byte *ret);
+/*
+ * NOTE: Cannot use 'func' here, because we have to declare
+ * a return value, the only types we have are at least 1 byte large,
+ * goc2c will zero the return value, and the actual return value
+ * might have size 0 bytes, in which case the zeroing of the
+ * 1 or more bytes would be wrong.
+ * Using C lets us control (avoid) the initial zeroing.
+ */
#pragma textflag NOSPLIT
-func assertI2T(t *Type, i Iface) (ret byte, ...) {
- assertI2Tret(t, i, &ret);
+void
+runtime·assertI2T(Type *t, Iface i, GoOutput retbase)
+{
+ assertI2Tret(t, i, (byte*)&retbase);
}
static void
@@ -260,9 +270,14 @@ func assertI2TOK(t *Type, i Iface) (ok bool) {
static void assertE2Tret(Type *t, Eface e, byte *ret);
+/*
+ * NOTE: Cannot use 'func' here. See assertI2T above.
+ */
#pragma textflag NOSPLIT
-func assertE2T(t *Type, e Eface) (ret byte, ...) {
- assertE2Tret(t, e, &ret);
+void
+runtime·assertE2T(Type *t, Eface e, GoOutput retbase)
+{
+ assertE2Tret(t, e, (byte*)&retbase);
}
static void