summaryrefslogtreecommitdiff
path: root/ext/stringio
diff options
context:
space:
mode:
Diffstat (limited to 'ext/stringio')
-rw-r--r--ext/stringio/stringio.c25
1 files changed, 11 insertions, 14 deletions
diff --git a/ext/stringio/stringio.c b/ext/stringio/stringio.c
index 4c135ef8c2..bfe1700c5a 100644
--- a/ext/stringio/stringio.c
+++ b/ext/stringio/stringio.c
@@ -807,25 +807,22 @@ strio_ungetbyte(VALUE self, VALUE c)
struct StringIO *ptr = readable(self);
check_modifiable(ptr);
- switch (TYPE(c)) {
- case T_NIL:
- return Qnil;
- case T_FIXNUM:
- case T_BIGNUM: ;
+ if (NIL_P(c)) return Qnil;
+ if (RB_INTEGER_TYPE_P(c)) {
/* rb_int_and() not visible from exts */
VALUE v = rb_funcall(c, '&', 1, INT2FIX(0xff));
const char cc = NUM2INT(v) & 0xFF;
strio_unget_bytes(ptr, &cc, 1);
- return Qnil;
- default:
- SafeStringValue(c);
}
-
- const char *cp = RSTRING_PTR(c);
- long cl = RSTRING_LEN(c);
- if (cl == 0) return Qnil;
- strio_unget_bytes(ptr, cp, cl);
- RB_GC_GUARD(c);
+ else {
+ long cl;
+ SafeStringValue(c);
+ cl = RSTRING_LEN(c);
+ if (cl > 0) {
+ strio_unget_bytes(ptr, RSTRING_PTR(c), cl);
+ RB_GC_GUARD(c);
+ }
+ }
return Qnil;
}