@@ -368,6 +368,17 @@ mrb_time_local(mrb_state *mrb, mrb_value self)
368368 time_mktime (mrb , ayear , amonth , aday , ahour , amin , asec , ausec , MRB_TIMEZONE_LOCAL ));
369369}
370370
371+ static struct mrb_time *
372+ time_get_ptr (mrb_state * mrb , mrb_value time )
373+ {
374+ struct mrb_time * tm ;
375+
376+ tm = DATA_GET_PTR (mrb , time , & mrb_time_type , struct mrb_time );
377+ if (!tm ) {
378+ mrb_raise (mrb , E_ARGUMENT_ERROR , "uninitialized time" );
379+ }
380+ return tm ;
381+ }
371382
372383static mrb_value
373384mrb_time_eq (mrb_state * mrb , mrb_value self )
@@ -377,7 +388,7 @@ mrb_time_eq(mrb_state *mrb, mrb_value self)
377388 mrb_bool eq_p ;
378389
379390 mrb_get_args (mrb , "o" , & other );
380- tm1 = DATA_CHECK_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
391+ tm1 = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
381392 tm2 = DATA_CHECK_GET_PTR (mrb , other , & mrb_time_type , struct mrb_time );
382393 eq_p = tm1 && tm2 && tm1 -> sec == tm2 -> sec && tm1 -> usec == tm2 -> usec ;
383394
@@ -391,7 +402,7 @@ mrb_time_cmp(mrb_state *mrb, mrb_value self)
391402 struct mrb_time * tm1 , * tm2 ;
392403
393404 mrb_get_args (mrb , "o" , & other );
394- tm1 = DATA_CHECK_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
405+ tm1 = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
395406 tm2 = DATA_CHECK_GET_PTR (mrb , other , & mrb_time_type , struct mrb_time );
396407 if (!tm1 || !tm2 ) return mrb_nil_value ();
397408 if (tm1 -> sec > tm2 -> sec ) {
@@ -417,7 +428,7 @@ mrb_time_plus(mrb_state *mrb, mrb_value self)
417428 struct mrb_time * tm ;
418429
419430 mrb_get_args (mrb , "f" , & f );
420- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
431+ tm = time_get_ptr (mrb , self );
421432 return mrb_time_make (mrb , mrb_obj_class (mrb , self ), (double )tm -> sec + f , (double )tm -> usec , tm -> timezone );
422433}
423434
@@ -429,8 +440,7 @@ mrb_time_minus(mrb_state *mrb, mrb_value self)
429440 struct mrb_time * tm , * tm2 ;
430441
431442 mrb_get_args (mrb , "o" , & other );
432- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
433-
443+ tm = time_get_ptr (mrb , self );
434444 tm2 = DATA_CHECK_GET_PTR (mrb , other , & mrb_time_type , struct mrb_time );
435445 if (tm2 ) {
436446 f = (mrb_float )(tm -> sec - tm2 -> sec )
@@ -450,7 +460,7 @@ mrb_time_wday(mrb_state *mrb, mrb_value self)
450460{
451461 struct mrb_time * tm ;
452462
453- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
463+ tm = time_get_ptr (mrb , self );
454464 return mrb_fixnum_value (tm -> datetime .tm_wday );
455465}
456466
@@ -461,7 +471,7 @@ mrb_time_yday(mrb_state *mrb, mrb_value self)
461471{
462472 struct mrb_time * tm ;
463473
464- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
474+ tm = time_get_ptr (mrb , self );
465475 return mrb_fixnum_value (tm -> datetime .tm_yday + 1 );
466476}
467477
@@ -472,7 +482,7 @@ mrb_time_year(mrb_state *mrb, mrb_value self)
472482{
473483 struct mrb_time * tm ;
474484
475- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
485+ tm = time_get_ptr (mrb , self );
476486 return mrb_fixnum_value (tm -> datetime .tm_year + 1900 );
477487}
478488
@@ -483,7 +493,7 @@ mrb_time_zone(mrb_state *mrb, mrb_value self)
483493{
484494 struct mrb_time * tm ;
485495
486- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
496+ tm = time_get_ptr (mrb , self );
487497 if (tm -> timezone <= MRB_TIMEZONE_NONE ) return mrb_nil_value ();
488498 if (tm -> timezone >= MRB_TIMEZONE_LAST ) return mrb_nil_value ();
489499 return mrb_str_new_static (mrb ,
@@ -501,7 +511,7 @@ mrb_time_asctime(mrb_state *mrb, mrb_value self)
501511 char buf [256 ];
502512 int len ;
503513
504- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
514+ tm = time_get_ptr (mrb , self );
505515 d = & tm -> datetime ;
506516 len = snprintf (buf , sizeof (buf ), "%s %s %02d %02d:%02d:%02d %s%d" ,
507517 wday_names [d -> tm_wday ], mon_names [d -> tm_mon ], d -> tm_mday ,
@@ -518,8 +528,7 @@ mrb_time_day(mrb_state *mrb, mrb_value self)
518528{
519529 struct mrb_time * tm ;
520530
521- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
522- if (!tm ) return mrb_nil_value ();
531+ tm = time_get_ptr (mrb , self );
523532 return mrb_fixnum_value (tm -> datetime .tm_mday );
524533}
525534
@@ -531,7 +540,7 @@ mrb_time_dst_p(mrb_state *mrb, mrb_value self)
531540{
532541 struct mrb_time * tm ;
533542
534- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
543+ tm = time_get_ptr (mrb , self );
535544 return mrb_bool_value (tm -> datetime .tm_isdst );
536545}
537546
@@ -543,7 +552,7 @@ mrb_time_getutc(mrb_state *mrb, mrb_value self)
543552{
544553 struct mrb_time * tm , * tm2 ;
545554
546- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
555+ tm = time_get_ptr (mrb , self );
547556 tm2 = (struct mrb_time * )mrb_malloc (mrb , sizeof (* tm ));
548557 * tm2 = * tm ;
549558 tm2 -> timezone = MRB_TIMEZONE_UTC ;
@@ -558,7 +567,7 @@ mrb_time_getlocal(mrb_state *mrb, mrb_value self)
558567{
559568 struct mrb_time * tm , * tm2 ;
560569
561- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
570+ tm = time_get_ptr (mrb , self );
562571 tm2 = (struct mrb_time * )mrb_malloc (mrb , sizeof (* tm ));
563572 * tm2 = * tm ;
564573 tm2 -> timezone = MRB_TIMEZONE_LOCAL ;
@@ -573,7 +582,7 @@ mrb_time_hour(mrb_state *mrb, mrb_value self)
573582{
574583 struct mrb_time * tm ;
575584
576- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
585+ tm = time_get_ptr (mrb , self );
577586 return mrb_fixnum_value (tm -> datetime .tm_hour );
578587}
579588
@@ -638,7 +647,7 @@ mrb_time_localtime(mrb_state *mrb, mrb_value self)
638647{
639648 struct mrb_time * tm ;
640649
641- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
650+ tm = time_get_ptr (mrb , self );
642651 tm -> timezone = MRB_TIMEZONE_LOCAL ;
643652 mrb_time_update_datetime (tm );
644653 return self ;
@@ -651,7 +660,7 @@ mrb_time_mday(mrb_state *mrb, mrb_value self)
651660{
652661 struct mrb_time * tm ;
653662
654- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
663+ tm = time_get_ptr (mrb , self );
655664 return mrb_fixnum_value (tm -> datetime .tm_mday );
656665}
657666
@@ -662,7 +671,7 @@ mrb_time_min(mrb_state *mrb, mrb_value self)
662671{
663672 struct mrb_time * tm ;
664673
665- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
674+ tm = time_get_ptr (mrb , self );
666675 return mrb_fixnum_value (tm -> datetime .tm_min );
667676}
668677
@@ -673,7 +682,7 @@ mrb_time_mon(mrb_state *mrb, mrb_value self)
673682{
674683 struct mrb_time * tm ;
675684
676- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
685+ tm = time_get_ptr (mrb , self );
677686 return mrb_fixnum_value (tm -> datetime .tm_mon + 1 );
678687}
679688
@@ -684,7 +693,7 @@ mrb_time_sec(mrb_state *mrb, mrb_value self)
684693{
685694 struct mrb_time * tm ;
686695
687- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
696+ tm = time_get_ptr (mrb , self );
688697 return mrb_fixnum_value (tm -> datetime .tm_sec );
689698}
690699
@@ -696,7 +705,7 @@ mrb_time_to_f(mrb_state *mrb, mrb_value self)
696705{
697706 struct mrb_time * tm ;
698707
699- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
708+ tm = time_get_ptr (mrb , self );
700709 return mrb_float_value (mrb , (mrb_float )tm -> sec + (mrb_float )tm -> usec /1.0e6 );
701710}
702711
@@ -707,7 +716,7 @@ mrb_time_to_i(mrb_state *mrb, mrb_value self)
707716{
708717 struct mrb_time * tm ;
709718
710- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
719+ tm = time_get_ptr (mrb , self );
711720 if (tm -> sec > MRB_INT_MAX || tm -> sec < MRB_INT_MIN ) {
712721 return mrb_float_value (mrb , (mrb_float )tm -> sec );
713722 }
@@ -721,7 +730,7 @@ mrb_time_usec(mrb_state *mrb, mrb_value self)
721730{
722731 struct mrb_time * tm ;
723732
724- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
733+ tm = time_get_ptr (mrb , self );
725734 if (tm -> usec > MRB_INT_MAX || tm -> usec < MRB_INT_MIN ) {
726735 return mrb_float_value (mrb , (mrb_float )tm -> usec );
727736 }
@@ -735,7 +744,7 @@ mrb_time_utc(mrb_state *mrb, mrb_value self)
735744{
736745 struct mrb_time * tm ;
737746
738- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
747+ tm = time_get_ptr (mrb , self );
739748 tm -> timezone = MRB_TIMEZONE_UTC ;
740749 mrb_time_update_datetime (tm );
741750 return self ;
@@ -748,7 +757,7 @@ mrb_time_utc_p(mrb_state *mrb, mrb_value self)
748757{
749758 struct mrb_time * tm ;
750759
751- tm = DATA_GET_PTR (mrb , self , & mrb_time_type , struct mrb_time );
760+ tm = time_get_ptr (mrb , self );
752761 return mrb_bool_value (tm -> timezone == MRB_TIMEZONE_UTC );
753762}
754763
0 commit comments