date 3.0.1 → 3.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9f891e1846f83381a22586299aaa6831910cd9ba63e4a02d6c82db073a4794ba
4
- data.tar.gz: 13bfb909f575de2dc192b95eab90c1808e175327d446ea52d6f137bb3fca99e5
3
+ metadata.gz: 33ef20bebc298ad26d350db0e6511f2dbc084402c0d118e5f70f5f77230df222
4
+ data.tar.gz: d6ad174792f8032aab382cb21c10cc0cdbcc77e6f32c4105ff51736251eea43f
5
5
  SHA512:
6
- metadata.gz: 59414c762a7440353fcb0aa66a6b0320b23d15ff2b5557fe950a68655c432af4c5e934e6ac9c78c982db2d0afa90618e554a8dc3f810949bd501f952cd39005b
7
- data.tar.gz: 0f7700b96cb1ad9521aac3eb1b283bdcef38fd6fc6f98e042b011f69751f251e288f0a753148ad61e93d9e8b48bbb629ae9d8d94fcb5aff64366d56209476602
6
+ metadata.gz: 9e7b5ac465831a3fc501d72d1ef576a8b3d4791553047a0516c1e6dc7190eb418acb65521afda41a0ff6fe5ca3f09011e04ba27f3b30b2d511bffb177704306c
7
+ data.tar.gz: 8c020832fac18b494a6d2ec7de441fd8d3cc90ffa44cc33196ef2fa0ad1e1ee1ff8af63c183250c39d10ccde9a478246303500d53c61483319d0f62c502d8c4b
data/ext/date/date_core.c CHANGED
@@ -53,6 +53,8 @@ static double positive_inf, negative_inf;
53
53
  #define f_add3(x,y,z) f_add(f_add(x, y), z)
54
54
  #define f_sub3(x,y,z) f_sub(f_sub(x, y), z)
55
55
 
56
+ #define f_frozen_ary(...) rb_obj_freeze(rb_ary_new3(__VA_ARGS__))
57
+
56
58
  static VALUE date_initialize(int argc, VALUE *argv, VALUE self);
57
59
  static VALUE datetime_initialize(int argc, VALUE *argv, VALUE self);
58
60
 
@@ -2971,11 +2973,15 @@ d_lite_memsize(const void *ptr)
2971
2973
  return complex_dat_p(dat) ? sizeof(struct ComplexDateData) : sizeof(struct SimpleDateData);
2972
2974
  }
2973
2975
 
2976
+ #ifndef HAVE_RB_EXT_RACTOR_SAFE
2977
+ # define RUBY_TYPED_FROZEN_SHAREABLE 0
2978
+ #endif
2979
+
2974
2980
  static const rb_data_type_t d_lite_type = {
2975
2981
  "Date",
2976
2982
  {d_lite_gc_mark, RUBY_TYPED_DEFAULT_FREE, d_lite_memsize,},
2977
2983
  0, 0,
2978
- RUBY_TYPED_FREE_IMMEDIATELY|RUBY_TYPED_WB_PROTECTED,
2984
+ RUBY_TYPED_FREE_IMMEDIATELY|RUBY_TYPED_WB_PROTECTED|RUBY_TYPED_FROZEN_SHAREABLE,
2979
2985
  };
2980
2986
 
2981
2987
  inline static VALUE
@@ -3767,89 +3773,89 @@ rt_complete_frags(VALUE klass, VALUE hash)
3767
3773
  VALUE k, a, d;
3768
3774
 
3769
3775
  if (NIL_P(tab)) {
3770
- tab = rb_ary_new3(11,
3771
- rb_ary_new3(2,
3776
+ tab = f_frozen_ary(11,
3777
+ f_frozen_ary(2,
3772
3778
  sym("time"),
3773
- rb_ary_new3(3,
3779
+ f_frozen_ary(3,
3774
3780
  sym("hour"),
3775
3781
  sym("min"),
3776
3782
  sym("sec"))),
3777
- rb_ary_new3(2,
3783
+ f_frozen_ary(2,
3778
3784
  Qnil,
3779
- rb_ary_new3(1,
3785
+ f_frozen_ary(1,
3780
3786
  sym("jd"))),
3781
- rb_ary_new3(2,
3787
+ f_frozen_ary(2,
3782
3788
  sym("ordinal"),
3783
- rb_ary_new3(5,
3789
+ f_frozen_ary(5,
3784
3790
  sym("year"),
3785
3791
  sym("yday"),
3786
3792
  sym("hour"),
3787
3793
  sym("min"),
3788
3794
  sym("sec"))),
3789
- rb_ary_new3(2,
3795
+ f_frozen_ary(2,
3790
3796
  sym("civil"),
3791
- rb_ary_new3(6,
3797
+ f_frozen_ary(6,
3792
3798
  sym("year"),
3793
3799
  sym("mon"),
3794
3800
  sym("mday"),
3795
3801
  sym("hour"),
3796
3802
  sym("min"),
3797
3803
  sym("sec"))),
3798
- rb_ary_new3(2,
3804
+ f_frozen_ary(2,
3799
3805
  sym("commercial"),
3800
- rb_ary_new3(6,
3806
+ f_frozen_ary(6,
3801
3807
  sym("cwyear"),
3802
3808
  sym("cweek"),
3803
3809
  sym("cwday"),
3804
3810
  sym("hour"),
3805
3811
  sym("min"),
3806
3812
  sym("sec"))),
3807
- rb_ary_new3(2,
3813
+ f_frozen_ary(2,
3808
3814
  sym("wday"),
3809
- rb_ary_new3(4,
3815
+ f_frozen_ary(4,
3810
3816
  sym("wday"),
3811
3817
  sym("hour"),
3812
3818
  sym("min"),
3813
3819
  sym("sec"))),
3814
- rb_ary_new3(2,
3820
+ f_frozen_ary(2,
3815
3821
  sym("wnum0"),
3816
- rb_ary_new3(6,
3822
+ f_frozen_ary(6,
3817
3823
  sym("year"),
3818
3824
  sym("wnum0"),
3819
3825
  sym("wday"),
3820
3826
  sym("hour"),
3821
3827
  sym("min"),
3822
3828
  sym("sec"))),
3823
- rb_ary_new3(2,
3829
+ f_frozen_ary(2,
3824
3830
  sym("wnum1"),
3825
- rb_ary_new3(6,
3831
+ f_frozen_ary(6,
3826
3832
  sym("year"),
3827
3833
  sym("wnum1"),
3828
3834
  sym("wday"),
3829
3835
  sym("hour"),
3830
3836
  sym("min"),
3831
3837
  sym("sec"))),
3832
- rb_ary_new3(2,
3838
+ f_frozen_ary(2,
3833
3839
  Qnil,
3834
- rb_ary_new3(6,
3840
+ f_frozen_ary(6,
3835
3841
  sym("cwyear"),
3836
3842
  sym("cweek"),
3837
3843
  sym("wday"),
3838
3844
  sym("hour"),
3839
3845
  sym("min"),
3840
3846
  sym("sec"))),
3841
- rb_ary_new3(2,
3847
+ f_frozen_ary(2,
3842
3848
  Qnil,
3843
- rb_ary_new3(6,
3849
+ f_frozen_ary(6,
3844
3850
  sym("year"),
3845
3851
  sym("wnum0"),
3846
3852
  sym("cwday"),
3847
3853
  sym("hour"),
3848
3854
  sym("min"),
3849
3855
  sym("sec"))),
3850
- rb_ary_new3(2,
3856
+ f_frozen_ary(2,
3851
3857
  Qnil,
3852
- rb_ary_new3(6,
3858
+ f_frozen_ary(6,
3853
3859
  sym("year"),
3854
3860
  sym("wnum1"),
3855
3861
  sym("cwday"),
@@ -4322,12 +4328,37 @@ date_s_strptime(int argc, VALUE *argv, VALUE klass)
4322
4328
 
4323
4329
  VALUE date__parse(VALUE str, VALUE comp);
4324
4330
 
4331
+ static size_t
4332
+ get_limit(VALUE opt)
4333
+ {
4334
+ if (!NIL_P(opt)) {
4335
+ VALUE limit = rb_hash_aref(opt, ID2SYM(rb_intern("limit")));
4336
+ if (NIL_P(limit)) return SIZE_MAX;
4337
+ return NUM2SIZET(limit);
4338
+ }
4339
+ return 128;
4340
+ }
4341
+
4342
+ static void
4343
+ check_limit(VALUE str, VALUE opt)
4344
+ {
4345
+ StringValue(str);
4346
+ size_t slen = RSTRING_LEN(str);
4347
+ size_t limit = get_limit(opt);
4348
+ if (slen > limit) {
4349
+ rb_raise(rb_eArgError,
4350
+ "string length (%"PRI_SIZE_PREFIX"u) exceeds the limit %"PRI_SIZE_PREFIX"u", slen, limit);
4351
+ }
4352
+ }
4353
+
4325
4354
  static VALUE
4326
4355
  date_s__parse_internal(int argc, VALUE *argv, VALUE klass)
4327
4356
  {
4328
- VALUE vstr, vcomp, hash;
4357
+ VALUE vstr, vcomp, hash, opt;
4329
4358
 
4330
- rb_scan_args(argc, argv, "11", &vstr, &vcomp);
4359
+ rb_scan_args(argc, argv, "11:", &vstr, &vcomp, &opt);
4360
+ if (!NIL_P(opt)) argc--;
4361
+ check_limit(vstr, opt);
4331
4362
  StringValue(vstr);
4332
4363
  if (!rb_enc_str_asciicompat_p(vstr))
4333
4364
  rb_raise(rb_eArgError,
@@ -4342,17 +4373,25 @@ date_s__parse_internal(int argc, VALUE *argv, VALUE klass)
4342
4373
 
4343
4374
  /*
4344
4375
  * call-seq:
4345
- * Date._parse(string[, comp=true]) -> hash
4376
+ * Date._parse(string[, comp=true], limit: 128) -> hash
4346
4377
  *
4347
4378
  * Parses the given representation of date and time, and returns a
4348
- * hash of parsed elements. This method does not function as a
4349
- * validator.
4379
+ * hash of parsed elements.
4380
+ *
4381
+ * This method **does not** function as a validator. If the input
4382
+ * string does not match valid formats strictly, you may get a cryptic
4383
+ * result. Should consider to use `Date._strptime` or
4384
+ * `DateTime._strptime` instead of this method as possible.
4350
4385
  *
4351
4386
  * If the optional second argument is true and the detected year is in
4352
4387
  * the range "00" to "99", considers the year a 2-digit form and makes
4353
4388
  * it full.
4354
4389
  *
4355
4390
  * Date._parse('2001-02-03') #=> {:year=>2001, :mon=>2, :mday=>3}
4391
+ *
4392
+ * Raise an ArgumentError when the string length is longer than _limit_.
4393
+ * You can stop this check by passing `limit: nil`, but note that
4394
+ * it may take a long time to parse.
4356
4395
  */
4357
4396
  static VALUE
4358
4397
  date_s__parse(int argc, VALUE *argv, VALUE klass)
@@ -4362,10 +4401,15 @@ date_s__parse(int argc, VALUE *argv, VALUE klass)
4362
4401
 
4363
4402
  /*
4364
4403
  * call-seq:
4365
- * Date.parse(string='-4712-01-01'[, comp=true[, start=Date::ITALY]]) -> date
4404
+ * Date.parse(string='-4712-01-01'[, comp=true[, start=Date::ITALY]], limit: 128) -> date
4366
4405
  *
4367
4406
  * Parses the given representation of date and time, and creates a
4368
- * date object. This method does not function as a validator.
4407
+ * date object.
4408
+ *
4409
+ * This method **does not** function as a validator. If the input
4410
+ * string does not match valid formats strictly, you may get a cryptic
4411
+ * result. Should consider to use `Date.strptime` instead of this
4412
+ * method as possible.
4369
4413
  *
4370
4414
  * If the optional second argument is true and the detected year is in
4371
4415
  * the range "00" to "99", considers the year a 2-digit form and makes
@@ -4374,13 +4418,18 @@ date_s__parse(int argc, VALUE *argv, VALUE klass)
4374
4418
  * Date.parse('2001-02-03') #=> #<Date: 2001-02-03 ...>
4375
4419
  * Date.parse('20010203') #=> #<Date: 2001-02-03 ...>
4376
4420
  * Date.parse('3rd Feb 2001') #=> #<Date: 2001-02-03 ...>
4421
+ *
4422
+ * Raise an ArgumentError when the string length is longer than _limit_.
4423
+ * You can stop this check by passing `limit: nil`, but note that
4424
+ * it may take a long time to parse.
4377
4425
  */
4378
4426
  static VALUE
4379
4427
  date_s_parse(int argc, VALUE *argv, VALUE klass)
4380
4428
  {
4381
- VALUE str, comp, sg;
4429
+ VALUE str, comp, sg, opt;
4382
4430
 
4383
- rb_scan_args(argc, argv, "03", &str, &comp, &sg);
4431
+ rb_scan_args(argc, argv, "03:", &str, &comp, &sg, &opt);
4432
+ if (!NIL_P(opt)) argc--;
4384
4433
 
4385
4434
  switch (argc) {
4386
4435
  case 0:
@@ -4392,11 +4441,12 @@ date_s_parse(int argc, VALUE *argv, VALUE klass)
4392
4441
  }
4393
4442
 
4394
4443
  {
4395
- VALUE argv2[2], hash;
4396
-
4397
- argv2[0] = str;
4398
- argv2[1] = comp;
4399
- hash = date_s__parse(2, argv2, klass);
4444
+ int argc2 = 2;
4445
+ VALUE argv2[3];
4446
+ argv2[0] = str;
4447
+ argv2[1] = comp;
4448
+ if (!NIL_P(opt)) argv2[argc2++] = opt;
4449
+ VALUE hash = date_s__parse(argc2, argv2, klass);
4400
4450
  return d_new_by_frags(klass, hash, sg);
4401
4451
  }
4402
4452
  }
@@ -4410,19 +4460,28 @@ VALUE date__jisx0301(VALUE);
4410
4460
 
4411
4461
  /*
4412
4462
  * call-seq:
4413
- * Date._iso8601(string) -> hash
4463
+ * Date._iso8601(string, limit: 128) -> hash
4414
4464
  *
4415
4465
  * Returns a hash of parsed elements.
4466
+ *
4467
+ * Raise an ArgumentError when the string length is longer than _limit_.
4468
+ * You can stop this check by passing `limit: nil`, but note that
4469
+ * it may take a long time to parse.
4416
4470
  */
4417
4471
  static VALUE
4418
- date_s__iso8601(VALUE klass, VALUE str)
4472
+ date_s__iso8601(int argc, VALUE *argv, VALUE klass)
4419
4473
  {
4474
+ VALUE str, opt;
4475
+
4476
+ rb_scan_args(argc, argv, "1:", &str, &opt);
4477
+ check_limit(str, opt);
4478
+
4420
4479
  return date__iso8601(str);
4421
4480
  }
4422
4481
 
4423
4482
  /*
4424
4483
  * call-seq:
4425
- * Date.iso8601(string='-4712-01-01'[, start=Date::ITALY]) -> date
4484
+ * Date.iso8601(string='-4712-01-01'[, start=Date::ITALY], limit: 128) -> date
4426
4485
  *
4427
4486
  * Creates a new Date object by parsing from a string according to
4428
4487
  * some typical ISO 8601 formats.
@@ -4430,13 +4489,18 @@ date_s__iso8601(VALUE klass, VALUE str)
4430
4489
  * Date.iso8601('2001-02-03') #=> #<Date: 2001-02-03 ...>
4431
4490
  * Date.iso8601('20010203') #=> #<Date: 2001-02-03 ...>
4432
4491
  * Date.iso8601('2001-W05-6') #=> #<Date: 2001-02-03 ...>
4492
+ *
4493
+ * Raise an ArgumentError when the string length is longer than _limit_.
4494
+ * You can stop this check by passing `limit: nil`, but note that
4495
+ * it may take a long time to parse.
4433
4496
  */
4434
4497
  static VALUE
4435
4498
  date_s_iso8601(int argc, VALUE *argv, VALUE klass)
4436
4499
  {
4437
- VALUE str, sg;
4500
+ VALUE str, sg, opt;
4438
4501
 
4439
- rb_scan_args(argc, argv, "02", &str, &sg);
4502
+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
4503
+ if (!NIL_P(opt)) argc--;
4440
4504
 
4441
4505
  switch (argc) {
4442
4506
  case 0:
@@ -4446,38 +4510,56 @@ date_s_iso8601(int argc, VALUE *argv, VALUE klass)
4446
4510
  }
4447
4511
 
4448
4512
  {
4449
- VALUE hash = date_s__iso8601(klass, str);
4513
+ int argc2 = 1;
4514
+ VALUE argv2[2];
4515
+ argv2[0] = str;
4516
+ if (!NIL_P(opt)) argv2[argc2++] = opt;
4517
+ VALUE hash = date_s__iso8601(argc2, argv2, klass);
4450
4518
  return d_new_by_frags(klass, hash, sg);
4451
4519
  }
4452
4520
  }
4453
4521
 
4454
4522
  /*
4455
4523
  * call-seq:
4456
- * Date._rfc3339(string) -> hash
4524
+ * Date._rfc3339(string, limit: 128) -> hash
4457
4525
  *
4458
4526
  * Returns a hash of parsed elements.
4527
+ *
4528
+ * Raise an ArgumentError when the string length is longer than _limit_.
4529
+ * You can stop this check by passing `limit: nil`, but note that
4530
+ * it may take a long time to parse.
4459
4531
  */
4460
4532
  static VALUE
4461
- date_s__rfc3339(VALUE klass, VALUE str)
4533
+ date_s__rfc3339(int argc, VALUE *argv, VALUE klass)
4462
4534
  {
4535
+ VALUE str, opt;
4536
+
4537
+ rb_scan_args(argc, argv, "1:", &str, &opt);
4538
+ check_limit(str, opt);
4539
+
4463
4540
  return date__rfc3339(str);
4464
4541
  }
4465
4542
 
4466
4543
  /*
4467
4544
  * call-seq:
4468
- * Date.rfc3339(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY]) -> date
4545
+ * Date.rfc3339(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> date
4469
4546
  *
4470
4547
  * Creates a new Date object by parsing from a string according to
4471
4548
  * some typical RFC 3339 formats.
4472
4549
  *
4473
4550
  * Date.rfc3339('2001-02-03T04:05:06+07:00') #=> #<Date: 2001-02-03 ...>
4551
+ *
4552
+ * Raise an ArgumentError when the string length is longer than _limit_.
4553
+ * You can stop this check by passing `limit: nil`, but note that
4554
+ * it may take a long time to parse.
4474
4555
  */
4475
4556
  static VALUE
4476
4557
  date_s_rfc3339(int argc, VALUE *argv, VALUE klass)
4477
4558
  {
4478
- VALUE str, sg;
4559
+ VALUE str, sg, opt;
4479
4560
 
4480
- rb_scan_args(argc, argv, "02", &str, &sg);
4561
+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
4562
+ if (!NIL_P(opt)) argc--;
4481
4563
 
4482
4564
  switch (argc) {
4483
4565
  case 0:
@@ -4487,38 +4569,56 @@ date_s_rfc3339(int argc, VALUE *argv, VALUE klass)
4487
4569
  }
4488
4570
 
4489
4571
  {
4490
- VALUE hash = date_s__rfc3339(klass, str);
4572
+ int argc2 = 1;
4573
+ VALUE argv2[2];
4574
+ argv2[0] = str;
4575
+ if (!NIL_P(opt)) argv2[argc2++] = opt;
4576
+ VALUE hash = date_s__rfc3339(argc2, argv2, klass);
4491
4577
  return d_new_by_frags(klass, hash, sg);
4492
4578
  }
4493
4579
  }
4494
4580
 
4495
4581
  /*
4496
4582
  * call-seq:
4497
- * Date._xmlschema(string) -> hash
4583
+ * Date._xmlschema(string, limit: 128) -> hash
4498
4584
  *
4499
4585
  * Returns a hash of parsed elements.
4586
+ *
4587
+ * Raise an ArgumentError when the string length is longer than _limit_.
4588
+ * You can stop this check by passing `limit: nil`, but note that
4589
+ * it may take a long time to parse.
4500
4590
  */
4501
4591
  static VALUE
4502
- date_s__xmlschema(VALUE klass, VALUE str)
4592
+ date_s__xmlschema(int argc, VALUE *argv, VALUE klass)
4503
4593
  {
4594
+ VALUE str, opt;
4595
+
4596
+ rb_scan_args(argc, argv, "1:", &str, &opt);
4597
+ check_limit(str, opt);
4598
+
4504
4599
  return date__xmlschema(str);
4505
4600
  }
4506
4601
 
4507
4602
  /*
4508
4603
  * call-seq:
4509
- * Date.xmlschema(string='-4712-01-01'[, start=Date::ITALY]) -> date
4604
+ * Date.xmlschema(string='-4712-01-01'[, start=Date::ITALY], limit: 128) -> date
4510
4605
  *
4511
4606
  * Creates a new Date object by parsing from a string according to
4512
4607
  * some typical XML Schema formats.
4513
4608
  *
4514
4609
  * Date.xmlschema('2001-02-03') #=> #<Date: 2001-02-03 ...>
4610
+ *
4611
+ * Raise an ArgumentError when the string length is longer than _limit_.
4612
+ * You can stop this check by passing `limit: nil`, but note that
4613
+ * it may take a long time to parse.
4515
4614
  */
4516
4615
  static VALUE
4517
4616
  date_s_xmlschema(int argc, VALUE *argv, VALUE klass)
4518
4617
  {
4519
- VALUE str, sg;
4618
+ VALUE str, sg, opt;
4520
4619
 
4521
- rb_scan_args(argc, argv, "02", &str, &sg);
4620
+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
4621
+ if (!NIL_P(opt)) argc--;
4522
4622
 
4523
4623
  switch (argc) {
4524
4624
  case 0:
@@ -4528,41 +4628,58 @@ date_s_xmlschema(int argc, VALUE *argv, VALUE klass)
4528
4628
  }
4529
4629
 
4530
4630
  {
4531
- VALUE hash = date_s__xmlschema(klass, str);
4631
+ int argc2 = 1;
4632
+ VALUE argv2[2];
4633
+ argv2[0] = str;
4634
+ if (!NIL_P(opt)) argv2[argc2++] = opt;
4635
+ VALUE hash = date_s__xmlschema(argc2, argv2, klass);
4532
4636
  return d_new_by_frags(klass, hash, sg);
4533
4637
  }
4534
4638
  }
4535
4639
 
4536
4640
  /*
4537
4641
  * call-seq:
4538
- * Date._rfc2822(string) -> hash
4539
- * Date._rfc822(string) -> hash
4642
+ * Date._rfc2822(string, limit: 128) -> hash
4643
+ * Date._rfc822(string, limit: 128) -> hash
4540
4644
  *
4541
4645
  * Returns a hash of parsed elements.
4646
+ *
4647
+ * Raise an ArgumentError when the string length is longer than _limit_.
4648
+ * You can stop this check by passing `limit: nil`, but note that
4649
+ * it may take a long time to parse.
4542
4650
  */
4543
4651
  static VALUE
4544
- date_s__rfc2822(VALUE klass, VALUE str)
4652
+ date_s__rfc2822(int argc, VALUE *argv, VALUE klass)
4545
4653
  {
4654
+ VALUE str, opt;
4655
+
4656
+ rb_scan_args(argc, argv, "1:", &str, &opt);
4657
+ check_limit(str, opt);
4658
+
4546
4659
  return date__rfc2822(str);
4547
4660
  }
4548
4661
 
4549
4662
  /*
4550
4663
  * call-seq:
4551
- * Date.rfc2822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY]) -> date
4552
- * Date.rfc822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY]) -> date
4664
+ * Date.rfc2822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY], limit: 128) -> date
4665
+ * Date.rfc822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY], limit: 128) -> date
4553
4666
  *
4554
4667
  * Creates a new Date object by parsing from a string according to
4555
4668
  * some typical RFC 2822 formats.
4556
4669
  *
4557
4670
  * Date.rfc2822('Sat, 3 Feb 2001 00:00:00 +0000')
4558
4671
  * #=> #<Date: 2001-02-03 ...>
4672
+ *
4673
+ * Raise an ArgumentError when the string length is longer than _limit_.
4674
+ * You can stop this check by passing `limit: nil`, but note that
4675
+ * it may take a long time to parse.
4559
4676
  */
4560
4677
  static VALUE
4561
4678
  date_s_rfc2822(int argc, VALUE *argv, VALUE klass)
4562
4679
  {
4563
- VALUE str, sg;
4680
+ VALUE str, sg, opt;
4564
4681
 
4565
- rb_scan_args(argc, argv, "02", &str, &sg);
4682
+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
4566
4683
 
4567
4684
  switch (argc) {
4568
4685
  case 0:
@@ -4572,39 +4689,56 @@ date_s_rfc2822(int argc, VALUE *argv, VALUE klass)
4572
4689
  }
4573
4690
 
4574
4691
  {
4575
- VALUE hash = date_s__rfc2822(klass, str);
4692
+ int argc2 = 1;
4693
+ VALUE argv2[2];
4694
+ argv2[0] = str;
4695
+ if (!NIL_P(opt)) argv2[argc2++] = opt;
4696
+ VALUE hash = date_s__rfc2822(argc2, argv2, klass);
4576
4697
  return d_new_by_frags(klass, hash, sg);
4577
4698
  }
4578
4699
  }
4579
4700
 
4580
4701
  /*
4581
4702
  * call-seq:
4582
- * Date._httpdate(string) -> hash
4703
+ * Date._httpdate(string, limit: 128) -> hash
4583
4704
  *
4584
4705
  * Returns a hash of parsed elements.
4706
+ *
4707
+ * Raise an ArgumentError when the string length is longer than _limit_.
4708
+ * You can stop this check by passing `limit: nil`, but note that
4709
+ * it may take a long time to parse.
4585
4710
  */
4586
4711
  static VALUE
4587
- date_s__httpdate(VALUE klass, VALUE str)
4712
+ date_s__httpdate(int argc, VALUE *argv, VALUE klass)
4588
4713
  {
4714
+ VALUE str, opt;
4715
+
4716
+ rb_scan_args(argc, argv, "1:", &str, &opt);
4717
+ check_limit(str, opt);
4718
+
4589
4719
  return date__httpdate(str);
4590
4720
  }
4591
4721
 
4592
4722
  /*
4593
4723
  * call-seq:
4594
- * Date.httpdate(string='Mon, 01 Jan -4712 00:00:00 GMT'[, start=Date::ITALY]) -> date
4724
+ * Date.httpdate(string='Mon, 01 Jan -4712 00:00:00 GMT'[, start=Date::ITALY], limit: 128) -> date
4595
4725
  *
4596
4726
  * Creates a new Date object by parsing from a string according to
4597
4727
  * some RFC 2616 format.
4598
4728
  *
4599
4729
  * Date.httpdate('Sat, 03 Feb 2001 00:00:00 GMT')
4600
4730
  * #=> #<Date: 2001-02-03 ...>
4731
+ *
4732
+ * Raise an ArgumentError when the string length is longer than _limit_.
4733
+ * You can stop this check by passing `limit: nil`, but note that
4734
+ * it may take a long time to parse.
4601
4735
  */
4602
4736
  static VALUE
4603
4737
  date_s_httpdate(int argc, VALUE *argv, VALUE klass)
4604
4738
  {
4605
- VALUE str, sg;
4739
+ VALUE str, sg, opt;
4606
4740
 
4607
- rb_scan_args(argc, argv, "02", &str, &sg);
4741
+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
4608
4742
 
4609
4743
  switch (argc) {
4610
4744
  case 0:
@@ -4614,26 +4748,39 @@ date_s_httpdate(int argc, VALUE *argv, VALUE klass)
4614
4748
  }
4615
4749
 
4616
4750
  {
4617
- VALUE hash = date_s__httpdate(klass, str);
4751
+ int argc2 = 1;
4752
+ VALUE argv2[2];
4753
+ argv2[0] = str;
4754
+ if (!NIL_P(opt)) argv2[argc2++] = opt;
4755
+ VALUE hash = date_s__httpdate(argc2, argv2, klass);
4618
4756
  return d_new_by_frags(klass, hash, sg);
4619
4757
  }
4620
4758
  }
4621
4759
 
4622
4760
  /*
4623
4761
  * call-seq:
4624
- * Date._jisx0301(string) -> hash
4762
+ * Date._jisx0301(string, limit: 128) -> hash
4625
4763
  *
4626
4764
  * Returns a hash of parsed elements.
4765
+ *
4766
+ * Raise an ArgumentError when the string length is longer than _limit_.
4767
+ * You can stop this check by passing `limit: nil`, but note that
4768
+ * it may take a long time to parse.
4627
4769
  */
4628
4770
  static VALUE
4629
- date_s__jisx0301(VALUE klass, VALUE str)
4771
+ date_s__jisx0301(int argc, VALUE *argv, VALUE klass)
4630
4772
  {
4773
+ VALUE str, opt;
4774
+
4775
+ rb_scan_args(argc, argv, "1:", &str, &opt);
4776
+ check_limit(str, opt);
4777
+
4631
4778
  return date__jisx0301(str);
4632
4779
  }
4633
4780
 
4634
4781
  /*
4635
4782
  * call-seq:
4636
- * Date.jisx0301(string='-4712-01-01'[, start=Date::ITALY]) -> date
4783
+ * Date.jisx0301(string='-4712-01-01'[, start=Date::ITALY], limit: 128) -> date
4637
4784
  *
4638
4785
  * Creates a new Date object by parsing from a string according to
4639
4786
  * some typical JIS X 0301 formats.
@@ -4643,13 +4790,18 @@ date_s__jisx0301(VALUE klass, VALUE str)
4643
4790
  * For no-era year, legacy format, Heisei is assumed.
4644
4791
  *
4645
4792
  * Date.jisx0301('13.02.03') #=> #<Date: 2001-02-03 ...>
4793
+ *
4794
+ * Raise an ArgumentError when the string length is longer than _limit_.
4795
+ * You can stop this check by passing `limit: nil`, but note that
4796
+ * it may take a long time to parse.
4646
4797
  */
4647
4798
  static VALUE
4648
4799
  date_s_jisx0301(int argc, VALUE *argv, VALUE klass)
4649
4800
  {
4650
- VALUE str, sg;
4801
+ VALUE str, sg, opt;
4651
4802
 
4652
- rb_scan_args(argc, argv, "02", &str, &sg);
4803
+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
4804
+ if (!NIL_P(opt)) argc--;
4653
4805
 
4654
4806
  switch (argc) {
4655
4807
  case 0:
@@ -4659,7 +4811,11 @@ date_s_jisx0301(int argc, VALUE *argv, VALUE klass)
4659
4811
  }
4660
4812
 
4661
4813
  {
4662
- VALUE hash = date_s__jisx0301(klass, str);
4814
+ int argc2 = 1;
4815
+ VALUE argv2[2];
4816
+ argv2[0] = str;
4817
+ if (!NIL_P(opt)) argv2[argc2++] = opt;
4818
+ VALUE hash = date_s__jisx0301(argc2, argv2, klass);
4663
4819
  return d_new_by_frags(klass, hash, sg);
4664
4820
  }
4665
4821
  }
@@ -7998,10 +8154,15 @@ datetime_s_strptime(int argc, VALUE *argv, VALUE klass)
7998
8154
 
7999
8155
  /*
8000
8156
  * call-seq:
8001
- * DateTime.parse(string='-4712-01-01T00:00:00+00:00'[, comp=true[, start=Date::ITALY]]) -> datetime
8157
+ * DateTime.parse(string='-4712-01-01T00:00:00+00:00'[, comp=true[, start=Date::ITALY]], limit: 128) -> datetime
8002
8158
  *
8003
8159
  * Parses the given representation of date and time, and creates a
8004
- * DateTime object. This method does not function as a validator.
8160
+ * DateTime object.
8161
+ *
8162
+ * This method **does not** function as a validator. If the input
8163
+ * string does not match valid formats strictly, you may get a cryptic
8164
+ * result. Should consider to use `DateTime.strptime` instead of this
8165
+ * method as possible.
8005
8166
  *
8006
8167
  * If the optional second argument is true and the detected year is in
8007
8168
  * the range "00" to "99", makes it full.
@@ -8012,13 +8173,18 @@ datetime_s_strptime(int argc, VALUE *argv, VALUE klass)
8012
8173
  * #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
8013
8174
  * DateTime.parse('3rd Feb 2001 04:05:06 PM')
8014
8175
  * #=> #<DateTime: 2001-02-03T16:05:06+00:00 ...>
8176
+ *
8177
+ * Raise an ArgumentError when the string length is longer than _limit_.
8178
+ * You can stop this check by passing `limit: nil`, but note that
8179
+ * it may take a long time to parse.
8015
8180
  */
8016
8181
  static VALUE
8017
8182
  datetime_s_parse(int argc, VALUE *argv, VALUE klass)
8018
8183
  {
8019
- VALUE str, comp, sg;
8184
+ VALUE str, comp, sg, opt;
8020
8185
 
8021
- rb_scan_args(argc, argv, "03", &str, &comp, &sg);
8186
+ rb_scan_args(argc, argv, "03:", &str, &comp, &sg, &opt);
8187
+ if (!NIL_P(opt)) argc--;
8022
8188
 
8023
8189
  switch (argc) {
8024
8190
  case 0:
@@ -8030,18 +8196,20 @@ datetime_s_parse(int argc, VALUE *argv, VALUE klass)
8030
8196
  }
8031
8197
 
8032
8198
  {
8033
- VALUE argv2[2], hash;
8034
-
8035
- argv2[0] = str;
8036
- argv2[1] = comp;
8037
- hash = date_s__parse(2, argv2, klass);
8199
+ int argc2 = 2;
8200
+ VALUE argv2[3];
8201
+ argv2[0] = str;
8202
+ argv2[1] = comp;
8203
+ argv2[2] = opt;
8204
+ if (!NIL_P(opt)) argc2++;
8205
+ VALUE hash = date_s__parse(argc2, argv2, klass);
8038
8206
  return dt_new_by_frags(klass, hash, sg);
8039
8207
  }
8040
8208
  }
8041
8209
 
8042
8210
  /*
8043
8211
  * call-seq:
8044
- * DateTime.iso8601(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY]) -> datetime
8212
+ * DateTime.iso8601(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> datetime
8045
8213
  *
8046
8214
  * Creates a new DateTime object by parsing from a string according to
8047
8215
  * some typical ISO 8601 formats.
@@ -8052,13 +8220,18 @@ datetime_s_parse(int argc, VALUE *argv, VALUE klass)
8052
8220
  * #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
8053
8221
  * DateTime.iso8601('2001-W05-6T04:05:06+07:00')
8054
8222
  * #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
8223
+ *
8224
+ * Raise an ArgumentError when the string length is longer than _limit_.
8225
+ * You can stop this check by passing `limit: nil`, but note that
8226
+ * it may take a long time to parse.
8055
8227
  */
8056
8228
  static VALUE
8057
8229
  datetime_s_iso8601(int argc, VALUE *argv, VALUE klass)
8058
8230
  {
8059
- VALUE str, sg;
8231
+ VALUE str, sg, opt;
8060
8232
 
8061
- rb_scan_args(argc, argv, "02", &str, &sg);
8233
+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
8234
+ if (!NIL_P(opt)) argc--;
8062
8235
 
8063
8236
  switch (argc) {
8064
8237
  case 0:
@@ -8068,27 +8241,37 @@ datetime_s_iso8601(int argc, VALUE *argv, VALUE klass)
8068
8241
  }
8069
8242
 
8070
8243
  {
8071
- VALUE hash = date_s__iso8601(klass, str);
8244
+ int argc2 = 1;
8245
+ VALUE argv2[2];
8246
+ argv2[0] = str;
8247
+ argv2[1] = opt;
8248
+ if (!NIL_P(opt)) argc2--;
8249
+ VALUE hash = date_s__iso8601(argc2, argv2, klass);
8072
8250
  return dt_new_by_frags(klass, hash, sg);
8073
8251
  }
8074
8252
  }
8075
8253
 
8076
8254
  /*
8077
8255
  * call-seq:
8078
- * DateTime.rfc3339(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY]) -> datetime
8256
+ * DateTime.rfc3339(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> datetime
8079
8257
  *
8080
8258
  * Creates a new DateTime object by parsing from a string according to
8081
8259
  * some typical RFC 3339 formats.
8082
8260
  *
8083
8261
  * DateTime.rfc3339('2001-02-03T04:05:06+07:00')
8084
8262
  * #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
8263
+ *
8264
+ * Raise an ArgumentError when the string length is longer than _limit_.
8265
+ * You can stop this check by passing `limit: nil`, but note that
8266
+ * it may take a long time to parse.
8085
8267
  */
8086
8268
  static VALUE
8087
8269
  datetime_s_rfc3339(int argc, VALUE *argv, VALUE klass)
8088
8270
  {
8089
- VALUE str, sg;
8271
+ VALUE str, sg, opt;
8090
8272
 
8091
- rb_scan_args(argc, argv, "02", &str, &sg);
8273
+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
8274
+ if (!NIL_P(opt)) argc--;
8092
8275
 
8093
8276
  switch (argc) {
8094
8277
  case 0:
@@ -8098,27 +8281,37 @@ datetime_s_rfc3339(int argc, VALUE *argv, VALUE klass)
8098
8281
  }
8099
8282
 
8100
8283
  {
8101
- VALUE hash = date_s__rfc3339(klass, str);
8284
+ int argc2 = 1;
8285
+ VALUE argv2[2];
8286
+ argv2[0] = str;
8287
+ argv2[1] = opt;
8288
+ if (!NIL_P(opt)) argc2++;
8289
+ VALUE hash = date_s__rfc3339(argc2, argv2, klass);
8102
8290
  return dt_new_by_frags(klass, hash, sg);
8103
8291
  }
8104
8292
  }
8105
8293
 
8106
8294
  /*
8107
8295
  * call-seq:
8108
- * DateTime.xmlschema(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY]) -> datetime
8296
+ * DateTime.xmlschema(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> datetime
8109
8297
  *
8110
8298
  * Creates a new DateTime object by parsing from a string according to
8111
8299
  * some typical XML Schema formats.
8112
8300
  *
8113
8301
  * DateTime.xmlschema('2001-02-03T04:05:06+07:00')
8114
8302
  * #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
8303
+ *
8304
+ * Raise an ArgumentError when the string length is longer than _limit_.
8305
+ * You can stop this check by passing `limit: nil`, but note that
8306
+ * it may take a long time to parse.
8115
8307
  */
8116
8308
  static VALUE
8117
8309
  datetime_s_xmlschema(int argc, VALUE *argv, VALUE klass)
8118
8310
  {
8119
- VALUE str, sg;
8311
+ VALUE str, sg, opt;
8120
8312
 
8121
- rb_scan_args(argc, argv, "02", &str, &sg);
8313
+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
8314
+ if (!NIL_P(opt)) argc--;
8122
8315
 
8123
8316
  switch (argc) {
8124
8317
  case 0:
@@ -8128,28 +8321,38 @@ datetime_s_xmlschema(int argc, VALUE *argv, VALUE klass)
8128
8321
  }
8129
8322
 
8130
8323
  {
8131
- VALUE hash = date_s__xmlschema(klass, str);
8324
+ int argc2 = 1;
8325
+ VALUE argv2[2];
8326
+ argv2[0] = str;
8327
+ argv2[1] = opt;
8328
+ if (!NIL_P(opt)) argc2++;
8329
+ VALUE hash = date_s__xmlschema(argc2, argv2, klass);
8132
8330
  return dt_new_by_frags(klass, hash, sg);
8133
8331
  }
8134
8332
  }
8135
8333
 
8136
8334
  /*
8137
8335
  * call-seq:
8138
- * DateTime.rfc2822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY]) -> datetime
8139
- * DateTime.rfc822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY]) -> datetime
8336
+ * DateTime.rfc2822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY], limit: 128) -> datetime
8337
+ * DateTime.rfc822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY], limit: 128) -> datetime
8140
8338
  *
8141
8339
  * Creates a new DateTime object by parsing from a string according to
8142
8340
  * some typical RFC 2822 formats.
8143
8341
  *
8144
8342
  * DateTime.rfc2822('Sat, 3 Feb 2001 04:05:06 +0700')
8145
8343
  * #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
8344
+ *
8345
+ * Raise an ArgumentError when the string length is longer than _limit_.
8346
+ * You can stop this check by passing `limit: nil`, but note that
8347
+ * it may take a long time to parse.
8146
8348
  */
8147
8349
  static VALUE
8148
8350
  datetime_s_rfc2822(int argc, VALUE *argv, VALUE klass)
8149
8351
  {
8150
- VALUE str, sg;
8352
+ VALUE str, sg, opt;
8151
8353
 
8152
- rb_scan_args(argc, argv, "02", &str, &sg);
8354
+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
8355
+ if (!NIL_P(opt)) argc--;
8153
8356
 
8154
8357
  switch (argc) {
8155
8358
  case 0:
@@ -8159,7 +8362,12 @@ datetime_s_rfc2822(int argc, VALUE *argv, VALUE klass)
8159
8362
  }
8160
8363
 
8161
8364
  {
8162
- VALUE hash = date_s__rfc2822(klass, str);
8365
+ int argc2 = 1;
8366
+ VALUE argv2[2];
8367
+ argv2[0] = str;
8368
+ argv2[1] = opt;
8369
+ if (!NIL_P(opt)) argc2++;
8370
+ VALUE hash = date_s__rfc2822(argc2, argv2, klass);
8163
8371
  return dt_new_by_frags(klass, hash, sg);
8164
8372
  }
8165
8373
  }
@@ -8173,13 +8381,18 @@ datetime_s_rfc2822(int argc, VALUE *argv, VALUE klass)
8173
8381
  *
8174
8382
  * DateTime.httpdate('Sat, 03 Feb 2001 04:05:06 GMT')
8175
8383
  * #=> #<DateTime: 2001-02-03T04:05:06+00:00 ...>
8384
+ *
8385
+ * Raise an ArgumentError when the string length is longer than _limit_.
8386
+ * You can stop this check by passing `limit: nil`, but note that
8387
+ * it may take a long time to parse.
8176
8388
  */
8177
8389
  static VALUE
8178
8390
  datetime_s_httpdate(int argc, VALUE *argv, VALUE klass)
8179
8391
  {
8180
- VALUE str, sg;
8392
+ VALUE str, sg, opt;
8181
8393
 
8182
- rb_scan_args(argc, argv, "02", &str, &sg);
8394
+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
8395
+ if (!NIL_P(opt)) argc--;
8183
8396
 
8184
8397
  switch (argc) {
8185
8398
  case 0:
@@ -8189,14 +8402,19 @@ datetime_s_httpdate(int argc, VALUE *argv, VALUE klass)
8189
8402
  }
8190
8403
 
8191
8404
  {
8192
- VALUE hash = date_s__httpdate(klass, str);
8405
+ int argc2 = 1;
8406
+ VALUE argv2[2];
8407
+ argv2[0] = str;
8408
+ argv2[1] = opt;
8409
+ if (!NIL_P(opt)) argc2++;
8410
+ VALUE hash = date_s__httpdate(argc2, argv2, klass);
8193
8411
  return dt_new_by_frags(klass, hash, sg);
8194
8412
  }
8195
8413
  }
8196
8414
 
8197
8415
  /*
8198
8416
  * call-seq:
8199
- * DateTime.jisx0301(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY]) -> datetime
8417
+ * DateTime.jisx0301(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> datetime
8200
8418
  *
8201
8419
  * Creates a new DateTime object by parsing from a string according to
8202
8420
  * some typical JIS X 0301 formats.
@@ -8208,13 +8426,18 @@ datetime_s_httpdate(int argc, VALUE *argv, VALUE klass)
8208
8426
  *
8209
8427
  * DateTime.jisx0301('13.02.03T04:05:06+07:00')
8210
8428
  * #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
8429
+ *
8430
+ * Raise an ArgumentError when the string length is longer than _limit_.
8431
+ * You can stop this check by passing `limit: nil`, but note that
8432
+ * it may take a long time to parse.
8211
8433
  */
8212
8434
  static VALUE
8213
8435
  datetime_s_jisx0301(int argc, VALUE *argv, VALUE klass)
8214
8436
  {
8215
- VALUE str, sg;
8437
+ VALUE str, sg, opt;
8216
8438
 
8217
- rb_scan_args(argc, argv, "02", &str, &sg);
8439
+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
8440
+ if (!NIL_P(opt)) argc--;
8218
8441
 
8219
8442
  switch (argc) {
8220
8443
  case 0:
@@ -8224,7 +8447,12 @@ datetime_s_jisx0301(int argc, VALUE *argv, VALUE klass)
8224
8447
  }
8225
8448
 
8226
8449
  {
8227
- VALUE hash = date_s__jisx0301(klass, str);
8450
+ int argc2 = 1;
8451
+ VALUE argv2[2];
8452
+ argv2[0] = str;
8453
+ argv2[1] = opt;
8454
+ if (!NIL_P(opt)) argc2++;
8455
+ VALUE hash = date_s__jisx0301(argc2, argv2, klass);
8228
8456
  return dt_new_by_frags(klass, hash, sg);
8229
8457
  }
8230
8458
  }
@@ -9102,13 +9330,13 @@ d_lite_zero(VALUE x)
9102
9330
  void
9103
9331
  Init_date_core(void)
9104
9332
  {
9105
- #undef rb_intern
9106
- #define rb_intern(str) rb_intern_const(str)
9107
-
9108
- id_cmp = rb_intern("<=>");
9109
- id_le_p = rb_intern("<=");
9110
- id_ge_p = rb_intern(">=");
9111
- id_eqeq_p = rb_intern("==");
9333
+ #ifdef HAVE_RB_EXT_RACTOR_SAFE
9334
+ RB_EXT_RACTOR_SAFE(true);
9335
+ #endif
9336
+ id_cmp = rb_intern_const("<=>");
9337
+ id_le_p = rb_intern_const("<=");
9338
+ id_ge_p = rb_intern_const(">=");
9339
+ id_eqeq_p = rb_intern_const("==");
9112
9340
 
9113
9341
  half_days_in_day = rb_rational_new2(INT2FIX(1), INT2FIX(2));
9114
9342
 
@@ -9383,19 +9611,19 @@ Init_date_core(void)
9383
9611
  rb_define_singleton_method(cDate, "strptime", date_s_strptime, -1);
9384
9612
  rb_define_singleton_method(cDate, "_parse", date_s__parse, -1);
9385
9613
  rb_define_singleton_method(cDate, "parse", date_s_parse, -1);
9386
- rb_define_singleton_method(cDate, "_iso8601", date_s__iso8601, 1);
9614
+ rb_define_singleton_method(cDate, "_iso8601", date_s__iso8601, -1);
9387
9615
  rb_define_singleton_method(cDate, "iso8601", date_s_iso8601, -1);
9388
- rb_define_singleton_method(cDate, "_rfc3339", date_s__rfc3339, 1);
9616
+ rb_define_singleton_method(cDate, "_rfc3339", date_s__rfc3339, -1);
9389
9617
  rb_define_singleton_method(cDate, "rfc3339", date_s_rfc3339, -1);
9390
- rb_define_singleton_method(cDate, "_xmlschema", date_s__xmlschema, 1);
9618
+ rb_define_singleton_method(cDate, "_xmlschema", date_s__xmlschema, -1);
9391
9619
  rb_define_singleton_method(cDate, "xmlschema", date_s_xmlschema, -1);
9392
- rb_define_singleton_method(cDate, "_rfc2822", date_s__rfc2822, 1);
9393
- rb_define_singleton_method(cDate, "_rfc822", date_s__rfc2822, 1);
9620
+ rb_define_singleton_method(cDate, "_rfc2822", date_s__rfc2822, -1);
9621
+ rb_define_singleton_method(cDate, "_rfc822", date_s__rfc2822, -1);
9394
9622
  rb_define_singleton_method(cDate, "rfc2822", date_s_rfc2822, -1);
9395
9623
  rb_define_singleton_method(cDate, "rfc822", date_s_rfc2822, -1);
9396
- rb_define_singleton_method(cDate, "_httpdate", date_s__httpdate, 1);
9624
+ rb_define_singleton_method(cDate, "_httpdate", date_s__httpdate, -1);
9397
9625
  rb_define_singleton_method(cDate, "httpdate", date_s_httpdate, -1);
9398
- rb_define_singleton_method(cDate, "_jisx0301", date_s__jisx0301, 1);
9626
+ rb_define_singleton_method(cDate, "_jisx0301", date_s__jisx0301, -1);
9399
9627
  rb_define_singleton_method(cDate, "jisx0301", date_s_jisx0301, -1);
9400
9628
 
9401
9629
  rb_define_method(cDate, "initialize", date_initialize, -1);
@@ -9515,6 +9743,8 @@ Init_date_core(void)
9515
9743
  * A subclass of Date that easily handles date, hour, minute, second,
9516
9744
  * and offset.
9517
9745
  *
9746
+ * DateTime class is considered deprecated. Use Time class.
9747
+ *
9518
9748
  * DateTime does not consider any leap seconds, does not track
9519
9749
  * any summer time rules.
9520
9750
  *
@@ -9575,18 +9805,18 @@ Init_date_core(void)
9575
9805
  * === When should you use DateTime and when should you use Time?
9576
9806
  *
9577
9807
  * It's a common misconception that
9578
- * {William Shakespeare}[http://en.wikipedia.org/wiki/William_Shakespeare]
9808
+ * {William Shakespeare}[https://en.wikipedia.org/wiki/William_Shakespeare]
9579
9809
  * and
9580
- * {Miguel de Cervantes}[http://en.wikipedia.org/wiki/Miguel_de_Cervantes]
9810
+ * {Miguel de Cervantes}[https://en.wikipedia.org/wiki/Miguel_de_Cervantes]
9581
9811
  * died on the same day in history -
9582
9812
  * so much so that UNESCO named April 23 as
9583
- * {World Book Day because of this fact}[http://en.wikipedia.org/wiki/World_Book_Day].
9813
+ * {World Book Day because of this fact}[https://en.wikipedia.org/wiki/World_Book_Day].
9584
9814
  * However, because England hadn't yet adopted the
9585
- * {Gregorian Calendar Reform}[http://en.wikipedia.org/wiki/Gregorian_calendar#Gregorian_reform]
9586
- * (and wouldn't until {1752}[http://en.wikipedia.org/wiki/Calendar_(New_Style)_Act_1750])
9815
+ * {Gregorian Calendar Reform}[https://en.wikipedia.org/wiki/Gregorian_calendar#Gregorian_reform]
9816
+ * (and wouldn't until {1752}[https://en.wikipedia.org/wiki/Calendar_(New_Style)_Act_1750])
9587
9817
  * their deaths are actually 10 days apart.
9588
9818
  * Since Ruby's Time class implements a
9589
- * {proleptic Gregorian calendar}[http://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar]
9819
+ * {proleptic Gregorian calendar}[https://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar]
9590
9820
  * and has no concept of calendar reform there's no way
9591
9821
  * to express this with Time objects. This is where DateTime steps in:
9592
9822
  *
@@ -9630,7 +9860,7 @@ Init_date_core(void)
9630
9860
  * #=> Fri, 04 May 1753 00:00:00 +0000
9631
9861
  *
9632
9862
  * As you can see, if we're accurately tracking the number of
9633
- * {solar years}[http://en.wikipedia.org/wiki/Tropical_year]
9863
+ * {solar years}[https://en.wikipedia.org/wiki/Tropical_year]
9634
9864
  * since Shakespeare's birthday then the correct anniversary date
9635
9865
  * would be the 4th May and not the 23rd April.
9636
9866
  *
@@ -9642,10 +9872,10 @@ Init_date_core(void)
9642
9872
  * making the same mistakes as UNESCO. If you also have to deal
9643
9873
  * with timezones then best of luck - just bear in mind that
9644
9874
  * you'll probably be dealing with
9645
- * {local solar times}[http://en.wikipedia.org/wiki/Solar_time],
9875
+ * {local solar times}[https://en.wikipedia.org/wiki/Solar_time],
9646
9876
  * since it wasn't until the 19th century that the introduction
9647
9877
  * of the railways necessitated the need for
9648
- * {Standard Time}[http://en.wikipedia.org/wiki/Standard_time#Great_Britain]
9878
+ * {Standard Time}[https://en.wikipedia.org/wiki/Standard_time#Great_Britain]
9649
9879
  * and eventually timezones.
9650
9880
  */
9651
9881
 
@@ -276,6 +276,7 @@ regcomp(const char *source, long len, int opt)
276
276
  VALUE pat;
277
277
 
278
278
  pat = rb_reg_new(source, len, opt);
279
+ rb_obj_freeze(pat);
279
280
  rb_gc_register_mark_object(pat);
280
281
  return pat;
281
282
  }
@@ -581,6 +581,7 @@ date__strptime_internal(const char *str, size_t slen,
581
581
  if (NIL_P(pat)) {
582
582
  pat = rb_reg_new(pat_source, sizeof pat_source - 1,
583
583
  ONIG_OPTION_IGNORECASE);
584
+ rb_obj_freeze(pat);
584
585
  rb_gc_register_mark_object(pat);
585
586
  }
586
587
 
data/ext/date/prereq.mk CHANGED
@@ -9,4 +9,4 @@ zonetab.h: zonetab.list
9
9
 
10
10
  .PHONY: update-zonetab
11
11
  update-zonetab:
12
- $(RUBY) -C $(srcdir) update-abbr.rb
12
+ $(RUBY) -C $(srcdir) update-abbr
@@ -47,12 +47,12 @@ utc, 0*3600
47
47
  wet, 0*3600
48
48
  at, -2*3600
49
49
  brst,-2*3600
50
- ndt, -(2*3600+1800)
50
+ ndt, -(1*3600+1800)
51
51
  art, -3*3600
52
52
  adt, -3*3600
53
53
  brt, -3*3600
54
54
  clst,-3*3600
55
- nst, -(3*3600+1800)
55
+ nst, -(2*3600+1800)
56
56
  ast, -4*3600
57
57
  clt, -4*3600
58
58
  akdt,-8*3600
@@ -62,7 +62,7 @@ hadt,-9*3600
62
62
  hdt, -9*3600
63
63
  yst, -9*3600
64
64
  ahst,-10*3600
65
- cat,-10*3600
65
+ cat,2*3600
66
66
  hast,-10*3600
67
67
  hst,-10*3600
68
68
  nt, -11*3600
@@ -82,7 +82,7 @@ fst, 2*3600
82
82
  mest, 2*3600
83
83
  mesz, 2*3600
84
84
  sast, 2*3600
85
- sst, 2*3600
85
+ sst, -11*3600
86
86
  bt, 3*3600
87
87
  eat, 3*3600
88
88
  eest, 3*3600
@@ -92,13 +92,13 @@ zp4, 4*3600
92
92
  zp5, 5*3600
93
93
  ist, (5*3600+1800)
94
94
  zp6, 6*3600
95
- wast, 7*3600
96
- cct, 8*3600
95
+ wast, 2*3600
96
+ cct, (6*3600+1800)
97
97
  sgt, 8*3600
98
98
  wadt, 8*3600
99
99
  jst, 9*3600
100
100
  kst, 9*3600
101
- east,10*3600
101
+ east,-6*3600
102
102
  gst, 10*3600
103
103
  eadt,11*3600
104
104
  idle,12*3600
data/lib/date.rb CHANGED
@@ -11,8 +11,6 @@ class Date
11
11
 
12
12
  class Infinity < Numeric # :nodoc:
13
13
 
14
- include Comparable
15
-
16
14
  def initialize(d=1) @d = d <=> 0 end
17
15
 
18
16
  def d() @d end
metadata CHANGED
@@ -1,18 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: date
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.1
4
+ version: 3.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tadayoshi Funaba
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-19 00:00:00.000000000 Z
11
+ date: 2021-11-15 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A subclass of Object includes Comparable module for handling dates.
14
14
  email:
15
- -
15
+ -
16
16
  executables: []
17
17
  extensions:
18
18
  - ext/date/extconf.rb
@@ -30,9 +30,10 @@ files:
30
30
  - lib/date.rb
31
31
  homepage: https://github.com/ruby/date
32
32
  licenses:
33
+ - Ruby
33
34
  - BSD-2-Clause
34
35
  metadata: {}
35
- post_install_message:
36
+ post_install_message:
36
37
  rdoc_options: []
37
38
  require_paths:
38
39
  - lib
@@ -47,8 +48,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
47
48
  - !ruby/object:Gem::Version
48
49
  version: '0'
49
50
  requirements: []
50
- rubygems_version: 3.2.0.pre1
51
- signing_key:
51
+ rubygems_version: 3.1.4
52
+ signing_key:
52
53
  specification_version: 4
53
54
  summary: A subclass of Object includes Comparable module for handling dates.
54
55
  test_files: []