diff options
| -rw-r--r-- | include/mruby/boxing_word.h | 22 | ||||
| -rw-r--r-- | mrbgems/mruby-compiler/core/parse.y | 1 | ||||
| -rw-r--r-- | mrbgems/mruby-io/mrblib/io.rb | 33 |
3 files changed, 28 insertions, 28 deletions
diff --git a/include/mruby/boxing_word.h b/include/mruby/boxing_word.h index 1a0c59ddb..7fda4919d 100644 --- a/include/mruby/boxing_word.h +++ b/include/mruby/boxing_word.h @@ -144,22 +144,12 @@ MRB_API mrb_value mrb_word_boxing_float_pool(struct mrb_state*, mrb_float); MRB_INLINE enum mrb_vtype mrb_type(mrb_value o) { - switch (o.w) { - case MRB_Qfalse: - case MRB_Qnil: - return MRB_TT_FALSE; - case MRB_Qtrue: - return MRB_TT_TRUE; - case MRB_Qundef: - return MRB_TT_UNDEF; - } - if (mrb_fixnum_p(o)) { - return MRB_TT_FIXNUM; - } - if (mrb_symbol_p(o)) { - return MRB_TT_SYMBOL; - } - return o.value.bp->tt; + return !mrb_bool(o) ? MRB_TT_FALSE : + mrb_true_p(o) ? MRB_TT_TRUE : + mrb_fixnum_p(o) ? MRB_TT_FIXNUM : + mrb_symbol_p(o) ? MRB_TT_SYMBOL : + mrb_undef_p(o) ? MRB_TT_UNDEF : + o.value.bp->tt; } #endif /* MRUBY_BOXING_WORD_H */ diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index d26a29a27..6576ab702 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -4526,6 +4526,7 @@ parse_string(parser_state *p) case 'm': f |= 4; break; case 'u': f |= 16; break; case 'n': f |= 32; break; + case 'o': break; default: tokadd(p, re_opt); break; } } diff --git a/mrbgems/mruby-io/mrblib/io.rb b/mrbgems/mruby-io/mrblib/io.rb index aaf22da2e..8297cb1b5 100644 --- a/mrbgems/mruby-io/mrblib/io.rb +++ b/mrbgems/mruby-io/mrblib/io.rb @@ -123,8 +123,8 @@ class IO def write(string) str = string.is_a?(String) ? string : string.to_s - return str.size unless str.size > 0 - if 0 < @buf.length + return 0 if str.empty? + unless @buf.empty? # reset real pos ignore buf seek(pos, SEEK_SET) end @@ -140,8 +140,8 @@ class IO def eof? _check_readable begin - buf = _read_buf - return buf.size == 0 + _read_buf + return @buf.empty? rescue EOFError return true end @@ -150,7 +150,7 @@ class IO def pos raise IOError if closed? - sysseek(0, SEEK_CUR) - @buf.length + sysseek(0, SEEK_CUR) - @buf.bytesize end alias_method :tell, :pos @@ -170,8 +170,13 @@ class IO end def _read_buf - return @buf if @buf && @buf.size > 0 - @buf = sysread(BUF_SIZE) + return @buf if @buf && @buf.bytesize >= 4 # maximum UTF-8 character is 4 bytes + @buf ||= "" + begin + @buf += sysread(BUF_SIZE) + rescue EOFError => e + raise e if @buf.empty? + end end def ungetc(substr) @@ -253,12 +258,14 @@ class IO break end - if limit && limit <= @buf.bytesize - array.push IO._bufread(@buf, limit) + if limit && limit <= @buf.size + array.push @buf[0, limit] + @buf[0, limit] = "" break elsif idx = @buf.index(rs) - len = idx + rs.bytesize - array.push IO._bufread(@buf, len) + len = idx + rs.size + array.push @buf[0, len] + @buf[0, len] = "" break else array.push @buf @@ -281,7 +288,9 @@ class IO def readchar _read_buf - IO._bufread(@buf, 1) + c = @buf[0] + @buf[0] = "" + c end def getc |
