From: Russ Cox Date: Wed, 19 Nov 2008 17:35:36 +0000 (-0800) Subject: change array slice error to include bounds X-Git-Tag: weekly.2009-11-06~2674 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=9b8a6dc7da6e0ef2a3afe9094fcda4f645442702;p=gostls13.git 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 --- diff --git a/src/runtime/array.c b/src/runtime/array.c index 548886e6cf..a67deb00cd 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