summaryrefslogtreecommitdiff
path: root/enum.c
diff options
context:
space:
mode:
Diffstat (limited to 'enum.c')
-rw-r--r--enum.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/enum.c b/enum.c
index 0715772a39..b09e82623f 100644
--- a/enum.c
+++ b/enum.c
@@ -1499,9 +1499,14 @@ static VALUE
enum_take(VALUE obj, VALUE n)
{
VALUE args[2];
+ long len = NUM2LONG(n);
- args[1] = NUM2LONG(n);
- args[0] = rb_ary_new2(args[1]);
+ if (len < 0) {
+ rb_raise(rb_eArgError, "attempt to take negative size");
+ }
+
+ args[1] = len;
+ args[0] = rb_ary_new();
rb_block_call(obj, id_each, 0, 0, take_i, (VALUE)args);
return args[0];
}
@@ -1566,9 +1571,14 @@ static VALUE
enum_drop(VALUE obj, VALUE n)
{
VALUE args[2];
+ long len = NUM2LONG(n);
- args[1] = NUM2ULONG(n);
- args[0] = rb_ary_new2(args[1]);
+ if (len < 0) {
+ rb_raise(rb_eArgError, "attempt to drop negative size");
+ }
+
+ args[1] = len;
+ args[0] = rb_ary_new();
rb_block_call(obj, id_each, 0, 0, drop_i, (VALUE)args);
return args[0];
}