Skip to content

Commit f13e68e

Browse files
committed
[ruby/date] Do not repeat conversions to string
ruby/date@159e1ebb7f ruby/date@4f7b6c9b42
1 parent b22fd7c commit f13e68e

File tree

2 files changed

+26
-10
lines changed

2 files changed

+26
-10
lines changed

ext/date/date_core.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4464,18 +4464,19 @@ get_limit(VALUE opt)
44644464
#define rb_category_warn(category, fmt) rb_warn(fmt)
44654465
#endif
44664466

4467-
static void
4467+
static VALUE
44684468
check_limit(VALUE str, VALUE opt)
44694469
{
44704470
size_t slen, limit;
4471-
if (NIL_P(str)) return;
4471+
if (NIL_P(str)) return str;
44724472
StringValue(str);
44734473
slen = RSTRING_LEN(str);
44744474
limit = get_limit(opt);
44754475
if (slen > limit) {
44764476
rb_raise(rb_eArgError,
44774477
"string length (%"PRI_SIZE_PREFIX"u) exceeds the limit %"PRI_SIZE_PREFIX"u", slen, limit);
44784478
}
4479+
return str;
44794480
}
44804481

44814482
static VALUE
@@ -4484,8 +4485,7 @@ date_s__parse_internal(int argc, VALUE *argv, VALUE klass)
44844485
VALUE vstr, vcomp, hash, opt;
44854486

44864487
argc = rb_scan_args(argc, argv, "11:", &vstr, &vcomp, &opt);
4487-
check_limit(vstr, opt);
4488-
StringValue(vstr);
4488+
vstr = check_limit(vstr, opt);
44894489
if (!rb_enc_str_asciicompat_p(vstr))
44904490
rb_raise(rb_eArgError,
44914491
"string should have ASCII compatible encoding");
@@ -4620,7 +4620,7 @@ date_s__iso8601(int argc, VALUE *argv, VALUE klass)
46204620
VALUE str, opt;
46214621

46224622
rb_scan_args(argc, argv, "1:", &str, &opt);
4623-
check_limit(str, opt);
4623+
str = check_limit(str, opt);
46244624

46254625
return date__iso8601(str);
46264626
}
@@ -4690,7 +4690,7 @@ date_s__rfc3339(int argc, VALUE *argv, VALUE klass)
46904690
VALUE str, opt;
46914691

46924692
rb_scan_args(argc, argv, "1:", &str, &opt);
4693-
check_limit(str, opt);
4693+
str = check_limit(str, opt);
46944694

46954695
return date__rfc3339(str);
46964696
}
@@ -4759,7 +4759,7 @@ date_s__xmlschema(int argc, VALUE *argv, VALUE klass)
47594759
VALUE str, opt;
47604760

47614761
rb_scan_args(argc, argv, "1:", &str, &opt);
4762-
check_limit(str, opt);
4762+
str = check_limit(str, opt);
47634763

47644764
return date__xmlschema(str);
47654765
}
@@ -4828,7 +4828,7 @@ date_s__rfc2822(int argc, VALUE *argv, VALUE klass)
48284828
VALUE str, opt;
48294829

48304830
rb_scan_args(argc, argv, "1:", &str, &opt);
4831-
check_limit(str, opt);
4831+
str = check_limit(str, opt);
48324832

48334833
return date__rfc2822(str);
48344834
}
@@ -4896,7 +4896,7 @@ date_s__httpdate(int argc, VALUE *argv, VALUE klass)
48964896
VALUE str, opt;
48974897

48984898
rb_scan_args(argc, argv, "1:", &str, &opt);
4899-
check_limit(str, opt);
4899+
str = check_limit(str, opt);
49004900

49014901
return date__httpdate(str);
49024902
}
@@ -4965,7 +4965,7 @@ date_s__jisx0301(int argc, VALUE *argv, VALUE klass)
49654965
VALUE str, opt;
49664966

49674967
rb_scan_args(argc, argv, "1:", &str, &opt);
4968-
check_limit(str, opt);
4968+
str = check_limit(str, opt);
49694969

49704970
return date__jisx0301(str);
49714971
}

test/date/test_date_parse.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1304,4 +1304,20 @@ def test_length_limit
13041304

13051305
assert_raise(ArgumentError) { Date._parse("Jan " + "9" * 1000000) }
13061306
end
1307+
1308+
def test_string_argument
1309+
s = '2001-02-03T04:05:06Z'
1310+
obj = Class.new(Struct.new(:to_str, :count)) do
1311+
def to_str
1312+
self.count +=1
1313+
super
1314+
end
1315+
end.new(s, 0)
1316+
1317+
all_assertions_foreach(nil, :_parse, :_iso8601, :_rfc3339, :_xmlschema) do |m|
1318+
obj.count = 0
1319+
assert_not_equal({}, Date.__send__(m, obj))
1320+
assert_equal(1, obj.count)
1321+
end
1322+
end
13071323
end

0 commit comments

Comments
 (0)