From b1f5840aefe0c4edac9dc3f238bdb757521eb67c Mon Sep 17 00:00:00 2001 From: Tomoyuki Sahara Date: Tue, 13 Nov 2012 16:50:41 +0900 Subject: fix the issue String#slice with Range may return broken String. --- src/range.c | 2 +- test/t/string.rb | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/range.c b/src/range.c index 6fe7964fe..085d5b1c0 100644 --- a/src/range.c +++ b/src/range.c @@ -286,7 +286,7 @@ mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, if (end > len) end = len; } if (end < 0) end += len; - if (!r->excl) end++; /* include end point */ + if (!r->excl && end < len) end++; /* include end point */ len = end - beg; if (len < 0) len = 0; diff --git a/test/t/string.rb b/test/t/string.rb index 26b7df584..1e921c668 100644 --- a/test/t/string.rb +++ b/test/t/string.rb @@ -61,6 +61,32 @@ assert('String#[]', '15.2.10.5.6') do a3 == 'bc' and b3 == nil end +assert('String#[] with Range') do + a1 = 'abc'[1..0] + b1 = 'abc'[1..1] + c1 = 'abc'[1..2] + d1 = 'abc'[1..3] + e1 = 'abc'[1..4] + f1 = 'abc'[0..-2] + g1 = 'abc'[-2..3] + h1 = 'abc'[3..4] + i1 = 'abc'[4..5] + a2 = 'abc'[1...0] + b2 = 'abc'[1...1] + c2 = 'abc'[1...2] + d2 = 'abc'[1...3] + e2 = 'abc'[1...4] + f2 = 'abc'[0...-2] + g2 = 'abc'[-2...3] + h2 = 'abc'[3...4] + i2 = 'abc'[4...5] + + a1 == '' and b1 == 'b' and c1 == 'bc' and d1 == 'bc' and e1 == 'bc' and + f1 == 'ab' and g1 == 'bc' and h1 == '' and i2 == nil and + a2 == '' and b2 == '' and c2 == 'b' and d2 == 'bc' and e2 == 'bc' and + f2 == 'a' and g2 == 'bc' and h2 == '' and i2 == nil +end + assert('String#capitalize', '15.2.10.5.7') do a = 'abc' a.capitalize -- cgit v1.2.3