@@ -466,9 +466,10 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
466
466
{
467
467
char c ;
468
468
int i = 0 ;
469
- mrb_value * sp = mrb -> c -> stack + 1 ;
470
469
va_list ap ;
471
470
int argc = mrb -> c -> ci -> argc ;
471
+ int arg_i = 0 ;
472
+ mrb_bool array_argv ;
472
473
mrb_bool opt = FALSE;
473
474
mrb_bool given = TRUE;
474
475
@@ -477,8 +478,14 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
477
478
struct RArray * a = mrb_ary_ptr (mrb -> c -> stack [1 ]);
478
479
479
480
argc = a -> len ;
480
- sp = a -> ptr ;
481
+ array_argv = TRUE;
482
+ } else {
483
+ array_argv = FALSE;
481
484
}
485
+
486
+ #define ARGV \
487
+ (array_argv ? mrb_ary_ptr(mrb->c->stack[1])->ptr : (mrb->c->stack + 1))
488
+
482
489
while ((c = * format ++ )) {
483
490
switch (c ) {
484
491
case '|' : case '*' : case '&' : case '?' :
@@ -502,7 +509,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
502
509
503
510
p = va_arg (ap , mrb_value * );
504
511
if (i < argc ) {
505
- * p = * sp ++ ;
512
+ * p = ARGV [ arg_i ++ ] ;
506
513
i ++ ;
507
514
}
508
515
}
@@ -515,7 +522,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
515
522
if (i < argc ) {
516
523
mrb_value ss ;
517
524
518
- ss = * sp ++ ;
525
+ ss = ARGV [ arg_i ++ ] ;
519
526
switch (mrb_type (ss )) {
520
527
case MRB_TT_CLASS :
521
528
case MRB_TT_MODULE :
@@ -537,14 +544,14 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
537
544
p = va_arg (ap , mrb_value * );
538
545
if (* format == '!' ) {
539
546
format ++ ;
540
- if (i < argc && mrb_nil_p (* sp )) {
541
- * p = * sp ++ ;
547
+ if (i < argc && mrb_nil_p (ARGV [ arg_i ] )) {
548
+ * p = ARGV [ arg_i ++ ] ;
542
549
i ++ ;
543
550
break ;
544
551
}
545
552
}
546
553
if (i < argc ) {
547
- * p = to_str (mrb , * sp ++ );
554
+ * p = to_str (mrb , ARGV [ arg_i ++ ] );
548
555
i ++ ;
549
556
}
550
557
}
@@ -556,14 +563,14 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
556
563
p = va_arg (ap , mrb_value * );
557
564
if (* format == '!' ) {
558
565
format ++ ;
559
- if (i < argc && mrb_nil_p (* sp )) {
560
- * p = * sp ++ ;
566
+ if (i < argc && mrb_nil_p (ARGV [ arg_i ] )) {
567
+ * p = ARGV [ arg_i ++ ] ;
561
568
i ++ ;
562
569
break ;
563
570
}
564
571
}
565
572
if (i < argc ) {
566
- * p = to_ary (mrb , * sp ++ );
573
+ * p = to_ary (mrb , ARGV [ arg_i ++ ] );
567
574
i ++ ;
568
575
}
569
576
}
@@ -575,14 +582,14 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
575
582
p = va_arg (ap , mrb_value * );
576
583
if (* format == '!' ) {
577
584
format ++ ;
578
- if (i < argc && mrb_nil_p (* sp )) {
579
- * p = * sp ++ ;
585
+ if (i < argc && mrb_nil_p (ARGV [ arg_i ] )) {
586
+ * p = ARGV [ arg_i ++ ] ;
580
587
i ++ ;
581
588
break ;
582
589
}
583
590
}
584
591
if (i < argc ) {
585
- * p = to_hash (mrb , * sp ++ );
592
+ * p = to_hash (mrb , ARGV [ arg_i ++ ] );
586
593
i ++ ;
587
594
}
588
595
}
@@ -597,15 +604,15 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
597
604
pl = va_arg (ap , mrb_int * );
598
605
if (* format == '!' ) {
599
606
format ++ ;
600
- if (i < argc && mrb_nil_p (* sp )) {
607
+ if (i < argc && mrb_nil_p (ARGV [ arg_i ] )) {
601
608
* ps = NULL ;
602
609
* pl = 0 ;
603
610
i ++ ;
604
611
break ;
605
612
}
606
613
}
607
614
if (i < argc ) {
608
- ss = to_str (mrb , * sp ++ );
615
+ ss = to_str (mrb , ARGV [ arg_i ++ ] );
609
616
* ps = RSTRING_PTR (ss );
610
617
* pl = RSTRING_LEN (ss );
611
618
i ++ ;
@@ -620,14 +627,14 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
620
627
ps = va_arg (ap , const char * * );
621
628
if (* format == '!' ) {
622
629
format ++ ;
623
- if (i < argc && mrb_nil_p (* sp )) {
630
+ if (i < argc && mrb_nil_p (ARGV [ arg_i ] )) {
624
631
* ps = NULL ;
625
- i ++ ; sp ++ ;
632
+ i ++ ; arg_i ++ ;
626
633
break ;
627
634
}
628
635
}
629
636
if (i < argc ) {
630
- ss = to_str (mrb , * sp ++ );
637
+ ss = to_str (mrb , ARGV [ arg_i ++ ] );
631
638
* ps = mrb_string_value_cstr (mrb , & ss );
632
639
i ++ ;
633
640
}
@@ -644,15 +651,15 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
644
651
pl = va_arg (ap , mrb_int * );
645
652
if (* format == '!' ) {
646
653
format ++ ;
647
- if (i < argc && mrb_nil_p (* sp )) {
654
+ if (i < argc && mrb_nil_p (ARGV [ arg_i ] )) {
648
655
* pb = 0 ;
649
656
* pl = 0 ;
650
- i ++ ; sp ++ ;
657
+ i ++ ; arg_i ++ ;
651
658
break ;
652
659
}
653
660
}
654
661
if (i < argc ) {
655
- aa = to_ary (mrb , * sp ++ );
662
+ aa = to_ary (mrb , ARGV [ arg_i ++ ] );
656
663
a = mrb_ary_ptr (aa );
657
664
* pb = a -> ptr ;
658
665
* pl = a -> len ;
@@ -666,8 +673,8 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
666
673
667
674
p = va_arg (ap , mrb_float * );
668
675
if (i < argc ) {
669
- * p = mrb_to_flo (mrb , * sp );
670
- sp ++ ;
676
+ * p = mrb_to_flo (mrb , ARGV [ arg_i ] );
677
+ arg_i ++ ;
671
678
i ++ ;
672
679
}
673
680
}
@@ -678,13 +685,13 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
678
685
679
686
p = va_arg (ap , mrb_int * );
680
687
if (i < argc ) {
681
- switch (mrb_type (* sp )) {
688
+ switch (mrb_type (ARGV [ arg_i ] )) {
682
689
case MRB_TT_FIXNUM :
683
- * p = mrb_fixnum (* sp );
690
+ * p = mrb_fixnum (ARGV [ arg_i ] );
684
691
break ;
685
692
case MRB_TT_FLOAT :
686
693
{
687
- mrb_float f = mrb_float (* sp );
694
+ mrb_float f = mrb_float (ARGV [ arg_i ] );
688
695
689
696
if (!FIXABLE (f )) {
690
697
mrb_raise (mrb , E_RANGE_ERROR , "float too big for int" );
@@ -696,10 +703,10 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
696
703
mrb_raise (mrb , E_TYPE_ERROR , "no implicit conversion of String into Integer" );
697
704
break ;
698
705
default :
699
- * p = mrb_fixnum (mrb_Integer (mrb , * sp ));
706
+ * p = mrb_fixnum (mrb_Integer (mrb , ARGV [ arg_i ] ));
700
707
break ;
701
708
}
702
- sp ++ ;
709
+ arg_i ++ ;
703
710
i ++ ;
704
711
}
705
712
}
@@ -709,7 +716,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
709
716
mrb_bool * boolp = va_arg (ap , mrb_bool * );
710
717
711
718
if (i < argc ) {
712
- mrb_value b = * sp ++ ;
719
+ mrb_value b = ARGV [ arg_i ++ ] ;
713
720
* boolp = mrb_test (b );
714
721
i ++ ;
715
722
}
@@ -723,7 +730,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
723
730
if (i < argc ) {
724
731
mrb_value ss ;
725
732
726
- ss = * sp ++ ;
733
+ ss = ARGV [ arg_i ++ ] ;
727
734
* symp = to_sym (mrb , ss );
728
735
i ++ ;
729
736
}
@@ -738,14 +745,14 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
738
745
type = va_arg (ap , struct mrb_data_type const * );
739
746
if (* format == '!' ) {
740
747
format ++ ;
741
- if (i < argc && mrb_nil_p (* sp )) {
748
+ if (i < argc && mrb_nil_p (ARGV [ arg_i ] )) {
742
749
* datap = 0 ;
743
- i ++ ; sp ++ ;
750
+ i ++ ; arg_i ++ ;
744
751
break ;
745
752
}
746
753
}
747
754
if (i < argc ) {
748
- * datap = mrb_data_get_ptr (mrb , * sp ++ , type );
755
+ * datap = mrb_data_get_ptr (mrb , ARGV [ arg_i ++ ] , type );
749
756
++ i ;
750
757
}
751
758
}
@@ -787,10 +794,10 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
787
794
if (argc > i ) {
788
795
* pl = argc - i ;
789
796
if (* pl > 0 ) {
790
- * var = sp ;
797
+ * var = ARGV + arg_i ;
791
798
}
792
799
i = argc ;
793
- sp += * pl ;
800
+ arg_i += * pl ;
794
801
}
795
802
else {
796
803
* pl = 0 ;
@@ -803,6 +810,9 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
803
810
break ;
804
811
}
805
812
}
813
+
814
+ #undef ARGV
815
+
806
816
if (!c && argc > i ) {
807
817
mrb_raise (mrb , E_ARGUMENT_ERROR , "wrong number of arguments" );
808
818
}
0 commit comments