ext/utf8/string_utf8.c in utf8-0.1.1 vs ext/utf8/string_utf8.c in utf8-0.1.2

- old
+ new

@@ -28,19 +28,21 @@ /* * call-seq: each_char {|utf8_char| ...} * * Iterates over the string, yielding one UTF8 character at a time */ -static VALUE rb_cString_UTF8_each_char(VALUE self) { +static VALUE rb_cString_UTF8_each_char(int argc, VALUE *argv, VALUE self) { unsigned char *str = (unsigned char *)RSTRING_PTR(self); size_t len = RSTRING_LEN(self), i=0; int8_t lastCharLen=0; VALUE utf8Str; // this will return an Enumerator wrapping this string, yielding this method // when Enumerator#each is called - RETURN_ENUMERATOR(self, 0, 0); + if (!rb_block_given_p()) { + return rb_funcall(self, rb_intern("to_enum"), 1, ID2SYM(rb_intern("each_char"))); + } for(; i<len; i+=lastCharLen) { lastCharLen = utf8CharLen(str, len); if (lastCharLen < 0) { rb_raise(rb_eArgError, "invalid utf-8 byte sequence"); @@ -257,8 +259,8 @@ void init_String_UTF8() { VALUE rb_cString_UTF8 = rb_define_class_under(rb_cString, "UTF8", rb_cString); rb_define_method(rb_cString_UTF8, "length", rb_cString_UTF8_length, 0); - rb_define_method(rb_cString_UTF8, "each_char", rb_cString_UTF8_each_char, 0); + rb_define_method(rb_cString_UTF8, "each_char", rb_cString_UTF8_each_char, -1); rb_define_method(rb_cString_UTF8, "[]", rb_cString_UTF8_slice, -1); } \ No newline at end of file