summaryrefslogtreecommitdiff
path: root/enumerator.c
diff options
context:
space:
mode:
Diffstat (limited to 'enumerator.c')
-rw-r--r--enumerator.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/enumerator.c b/enumerator.c
index a930c2bfa6..0801517657 100644
--- a/enumerator.c
+++ b/enumerator.c
@@ -56,7 +56,7 @@ enumerator_ptr(VALUE obj)
"wrong argument type %s (expected %s)",
rb_obj_classname(obj), rb_class2name(rb_cEnumerator));
}
- if (!ptr) {
+ if (!ptr || ptr->obj == Qundef) {
rb_raise(rb_eArgError, "uninitialized enumerator");
}
return ptr;
@@ -204,8 +204,13 @@ static VALUE
enumerator_allocate(VALUE klass)
{
struct enumerator *ptr;
- return Data_Make_Struct(klass, struct enumerator,
- enumerator_mark, -1, ptr);
+ VALUE enum_obj;
+
+ enum_obj = Data_Make_Struct(klass, struct enumerator,
+ enumerator_mark, -1, ptr);
+ ptr->obj = Qundef;
+
+ return enum_obj;
}
static VALUE
@@ -217,7 +222,13 @@ enumerator_each_i(VALUE v, VALUE enum_obj, int argc, VALUE *argv)
static VALUE
enumerator_init(VALUE enum_obj, VALUE obj, VALUE meth, int argc, VALUE *argv)
{
- struct enumerator *ptr = enumerator_ptr(enum_obj);
+ struct enumerator *ptr;
+
+ Data_Get_Struct(enum_obj, struct enumerator, ptr);
+
+ if (!ptr) {
+ rb_raise(rb_eArgError, "unallocated enumerator");
+ }
ptr->obj = obj;
ptr->meth = rb_to_id(meth);
@@ -237,8 +248,7 @@ enumerator_init(VALUE enum_obj, VALUE obj, VALUE meth, int argc, VALUE *argv)
* used as an Enumerable object using the given object's given
* method with the given arguments.
*
- * Use of this method is not discouraged. Use Kernel#enum_for()
- * instead.
+ * Use of this method is discouraged. Use Kernel#enum_for() instead.
*/
static VALUE
enumerator_initialize(int argc, VALUE *argv, VALUE obj)