Skip to content

Commit eefae4a

Browse files
committed
add rb_vm_check_call() and use its function to check/call the method
1 parent 860cb40 commit eefae4a

File tree

6 files changed

+30
-30
lines changed

6 files changed

+30
-30
lines changed

error.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -581,12 +581,15 @@ exc_equal(VALUE exc, SEL sel, VALUE obj)
581581
if (rb_obj_class(exc) != rb_obj_class(obj)) {
582582
SEL sel_message = sel_registerName("message");
583583
SEL sel_backtrace = sel_registerName("backtrace");
584-
if (!rb_vm_respond_to(obj, sel_message, false)
585-
|| !rb_vm_respond_to(obj, sel_backtrace, false)) {
584+
585+
mesg = rb_vm_check_call(obj, sel_message, 0, NULL);
586+
if (mesg == Qundef) {
587+
return Qfalse;
588+
}
589+
backtrace = rb_vm_check_call(obj, sel_backtrace, 0, NULL);
590+
if (backtrace == Qundef) {
586591
return Qfalse;
587592
}
588-
mesg = rb_vm_call(obj, sel_message, 0, NULL);
589-
backtrace = rb_vm_call(obj, sel_backtrace, 0, NULL);
590593
}
591594
else {
592595
mesg = rb_attr_get(obj, id_mesg);

eval.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ VALUE
357357
rb_make_exception(int argc, VALUE *argv)
358358
{
359359
VALUE mesg;
360-
ID exception;
360+
SEL sel_exception;
361361
int n;
362362

363363
mesg = Qnil;
@@ -382,11 +382,11 @@ rb_make_exception(int argc, VALUE *argv)
382382
case 3:
383383
n = 1;
384384
exception_call:
385-
exception = rb_intern("exception");
386-
if (!rb_respond_to(argv[0], exception)) {
385+
sel_exception = sel_registerName("exception");
386+
mesg = rb_vm_check_call(argv[0], sel_exception, n, argv+1);
387+
if (mesg == Qundef) {
387388
rb_raise(rb_eTypeError, "exception class/object expected");
388389
}
389-
mesg = rb_funcall(argv[0], exception, n, argv[1]);
390390
break;
391391
default:
392392
rb_raise(rb_eArgError, "wrong number of arguments");

file.c

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -108,14 +108,9 @@ rb_get_path_check(VALUE obj, int level)
108108
rb_insecure_operation();
109109
}
110110

111-
if (rb_vm_respond_to(obj, selToPath, true)) {
112-
tmp = rb_vm_call(obj, selToPath, 0, NULL);
113-
}
114-
else {
115-
tmp = rb_check_string_type(obj);
116-
if (NIL_P(tmp)) {
117-
tmp = obj;
118-
}
111+
tmp = rb_vm_check_call(obj, selToPath, 0, NULL);
112+
if (tmp == Qundef) {
113+
tmp = obj;
119114
}
120115
StringValue(tmp);
121116

object.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2500,7 +2500,8 @@ convert_type(VALUE val, const char *tname, const char *method, int raise)
25002500
// if (!rb_obj_respond_to(val, m, Qtrue)) {
25012501

25022502
SEL sel = sel_registerName(method);
2503-
if (!rb_vm_respond_to(val, sel, true)) {
2503+
VALUE result = rb_vm_check_call(val, sel, 0, NULL);
2504+
if (result == Qundef) {
25042505
if (raise) {
25052506
rb_raise(rb_eTypeError, "can't convert %s into %s",
25062507
NIL_P(val) ? "nil" :
@@ -2509,11 +2510,9 @@ convert_type(VALUE val, const char *tname, const char *method, int raise)
25092510
rb_obj_classname(val),
25102511
tname);
25112512
}
2512-
else {
2513-
return Qnil;
2514-
}
2513+
return Qnil;
25152514
}
2516-
return rb_vm_call(val, sel, 0, NULL);
2515+
return result;
25172516
}
25182517

25192518
VALUE

time.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -678,10 +678,7 @@ num_exact(VALUE v)
678678
goto typeerror;
679679

680680
default:
681-
tmp = Qundef;
682-
if (rb_vm_respond_to(v, sel_to_r, true)) {
683-
tmp = rb_vm_call(v, sel_to_r, 0, NULL);
684-
}
681+
tmp = rb_vm_check_call(v, sel_to_r, 0, NULL);
685682
if (tmp != Qundef) {
686683
if (rb_respond_to(v, rb_intern("to_str"))) goto typeerror;
687684
v = tmp;
@@ -1502,7 +1499,7 @@ calc_wday(int year, int month, int day)
15021499
static VALUE
15031500
guess_local_offset(struct vtm *vtm_utc, int *isdst_ret, const char **zone_ret)
15041501
{
1505-
struct tm tm;
1502+
struct tm tm = {0}; // avoid warning for gcc
15061503
long gmtoff;
15071504
const char *zone;
15081505
time_t t;
@@ -2381,10 +2378,7 @@ time_timespec(VALUE num, int interval)
23812378

23822379
default:
23832380
i = INT2FIX(1);
2384-
ary = Qundef;
2385-
if (rb_vm_respond_to(num, sel_divmod, true)) {
2386-
ary = rb_vm_call(num, sel_divmod, 1, &i);
2387-
}
2381+
ary = rb_vm_check_call(num, sel_divmod, 1, &i);
23882382
if (ary != Qundef && !NIL_P(ary = rb_check_array_type(ary))) {
23892383
i = rb_ary_entry(ary, 0);
23902384
f = rb_ary_entry(ary, 1);

vm.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,15 @@ rb_vm_method_call(rb_vm_method_t *m, rb_vm_block_t *block, int argc,
692692
argc, argv);
693693
}
694694

695+
static inline VALUE
696+
rb_vm_check_call(VALUE self, SEL sel, int argc, const VALUE *argv)
697+
{
698+
if (!rb_vm_respond_to(self, sel, true)) {
699+
return Qundef;
700+
}
701+
return rb_vm_call(self, sel, argc, argv);
702+
}
703+
695704
VALUE rb_vm_yield_args(void *vm, int argc, const VALUE *argv);
696705

697706
static inline VALUE

0 commit comments

Comments
 (0)