@@ -336,33 +336,38 @@ rb_search_method_entry(VALUE recv, ID mid)
336
336
VALUE klass = CLASS_OF (recv );
337
337
338
338
if (!klass ) {
339
+ VALUE flags , klass ;
339
340
if (IMMEDIATE_P (recv )) {
340
341
rb_raise (rb_eNotImpError ,
341
342
"method `%s' called on unexpected immediate object (%p)" ,
342
343
rb_id2name (mid ), (void * )recv );
343
344
}
344
- if (RBASIC (recv )-> flags == 0 ) {
345
+ flags = RBASIC (recv )-> flags ;
346
+ klass = RBASIC (recv )-> klass ;
347
+ if (flags == 0 ) {
345
348
rb_raise (rb_eNotImpError ,
346
349
"method `%s' called on terminated object"
347
350
" (%p flags=0x%" PRIxVALUE " klass=0x%" PRIxVALUE ")" ,
348
- rb_id2name (mid ), (void * )recv ,
349
- RBASIC (recv )-> flags , RBASIC (recv )-> klass );
351
+ rb_id2name (mid ), (void * )recv , flags , klass );
350
352
}
351
353
else {
352
354
int type = BUILTIN_TYPE (recv );
353
355
const char * typestr = rb_type_str (type );
354
- if (typestr )
356
+ if (typestr && T_OBJECT <= type && type < T_NIL )
355
357
rb_raise (rb_eNotImpError ,
356
358
"method `%s' called on hidden %s object"
357
359
" (%p flags=0x%" PRIxVALUE " klass=0x%" PRIxVALUE ")" ,
358
- rb_id2name (mid ), typestr , (void * )recv ,
359
- RBASIC (recv )-> flags , RBASIC (recv )-> klass );
360
+ rb_id2name (mid ), typestr , (void * )recv , flags , klass );
361
+ if (typestr )
362
+ rb_raise (rb_eNotImpError ,
363
+ "method `%s' called on unexpected %s object"
364
+ " (%p flags=0x%" PRIxVALUE " klass=0x%" PRIxVALUE ")" ,
365
+ rb_id2name (mid ), typestr , (void * )recv , flags , klass );
360
366
else
361
367
rb_raise (rb_eNotImpError ,
362
- "method `%s' called on hidden T_???" "(0x%02x) object"
368
+ "method `%s' called on broken T_???" "(0x%02x) object"
363
369
" (%p flags=0x%" PRIxVALUE " klass=0x%" PRIxVALUE ")" ,
364
- rb_id2name (mid ), type , (void * )recv ,
365
- RBASIC (recv )-> flags , RBASIC (recv )-> klass );
370
+ rb_id2name (mid ), type , (void * )recv , flags , klass );
366
371
}
367
372
}
368
373
return rb_method_entry (klass , mid );
0 commit comments