summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2008-11-19 09:35:36 -0800
committerRuss Cox <rsc@golang.org>2008-11-19 09:35:36 -0800
commitb8690c78f0683ae39241db2604fc0ba9f0b81f1a (patch)
tree73d24975f897e0451eb3132142d3a3540764d545
parent875bca340078d218fb2cb12a3e9f2f476c05ca94 (diff)
downloadgolang-b8690c78f0683ae39241db2604fc0ba9f0b81f1a.tar.gz
change array slice error to include bounds
$ 6.out slice[5:12] of [10] array throw: array slice SIGSEGV: segmentation violation R=r DELTA=15 (13 added, 0 deleted, 2 changed) OCL=19540 CL=19580
-rw-r--r--src/runtime/array.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/runtime/array.c b/src/runtime/array.c
index 548886e6c..a67deb00c 100644
--- a/src/runtime/array.c
+++ b/src/runtime/array.c
@@ -38,6 +38,19 @@ sys·newarray(uint32 nel, uint32 cap, uint32 width, Array* ret)
}
}
+static void
+throwslice(uint32 lb, uint32 hb, uint32 n)
+{
+ prints("slice[");
+ sys·printint(lb);
+ prints(":");
+ sys·printint(hb);
+ prints("] of [");
+ sys·printint(n);
+ prints("] array\n");
+ throw("array slice");
+}
+
// arraysliced(old *[]any, lb uint32, hb uint32, width uint32) (ary *[]any);
void
sys·arraysliced(Array* old, uint32 lb, uint32 hb, uint32 width, Array* ret)
@@ -62,7 +75,7 @@ sys·arraysliced(Array* old, uint32 lb, uint32 hb, uint32 width, Array* ret)
sys·printint(old->cap);
prints("\n");
}
- throw("sys·arraysliced: new size exceeds old size");
+ throwslice(lb, hb, old->cap);
}
// new array is inside old array
@@ -109,7 +122,7 @@ sys·arrayslices(byte* old, uint32 nel, uint32 lb, uint32 hb, uint32 width, Arra
sys·printint(width);
prints("\n");
}
- throw("sys·arrayslices: new size exceeds cap");
+ throwslice(lb, hb, nel);
}
// new array is inside old array