Index: ext/date/date_core.c =================================================================== --- ext/date/date_core.c (revision 53395) +++ ext/date/date_core.c (working copy) @@ -3398,15 +3398,31 @@ fr2 = INT2FIX(0); sg = DEFAULT_SG; + switch (argc) { case 4: - val2sg(vsg, sg); + val2sg(vsg, sg); case 3: - num2int_with_frac(d, positive_inf); + if (!(TYPE(vd) == T_FLOAT || + TYPE(vd) == T_FIXNUM || + TYPE(vd) == T_BIGNUM)) { + rb_raise(rb_eArgError, "invalid day"); + } + num2int_with_frac(d, positive_inf); case 2: - m = NUM2INT(vm); + if (!(TYPE(vm) == T_FLOAT || + TYPE(vm) == T_FIXNUM || + TYPE(vm) == T_BIGNUM)) { + rb_raise(rb_eArgError, "invalid month"); + } + m = NUM2INT(vm); case 1: - y = vy; + if (!(TYPE(vy) == T_FLOAT || + TYPE(vy) == T_FIXNUM || + TYPE(vy) == T_BIGNUM)) { + rb_raise(rb_eArgError, "invalid year"); + } + y = vy; } if (guess_style(y, sg) < 0) {