mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* enumerator.c: Use to_enum for Enumerable methods returning Enumerators.
This makes Lazy#cycle no longer needed, so it was removed. Make Enumerator#chunk and slice_before return lazy Enumerators. [Bug #7715] * internal.h: Remove ref to rb_enum_cycle_size; no longer needed * enum.c: Make enum_cycle_size static. * test/ruby/test_lazy_enumerator.rb: Test for above git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39058 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									44cd5f21e9
								
							
						
					
					
						commit
						1677cbce9d
					
				
					 5 changed files with 43 additions and 13 deletions
				
			
		
							
								
								
									
										14
									
								
								ChangeLog
									
										
									
									
									
								
							
							
						
						
									
										14
									
								
								ChangeLog
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,3 +1,17 @@
 | 
			
		|||
Tue Feb  5 12:48:38 2013  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>
 | 
			
		||||
 | 
			
		||||
	* enumerator.c: Use to_enum for Enumerable methods returning
 | 
			
		||||
	  Enumerators.
 | 
			
		||||
	  This makes Lazy#cycle no longer needed, so it was removed.
 | 
			
		||||
	  Make Enumerator#chunk and slice_before return lazy Enumerators.
 | 
			
		||||
	  [Bug #7715]
 | 
			
		||||
 | 
			
		||||
	* internal.h: Remove ref to rb_enum_cycle_size; no longer needed
 | 
			
		||||
 | 
			
		||||
	* enum.c: Make enum_cycle_size static.
 | 
			
		||||
 | 
			
		||||
	* test/ruby/test_lazy_enumerator.rb: Test for above
 | 
			
		||||
 | 
			
		||||
Tue Feb  5 12:48:10 2013  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>
 | 
			
		||||
 | 
			
		||||
	* enumerator.c: Finalize and document Lazy.new. [Bug #7248]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										5
									
								
								enum.c
									
										
									
									
									
								
							
							
						
						
									
										5
									
								
								enum.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -2238,9 +2238,8 @@ cycle_i(VALUE i, VALUE ary, int argc, VALUE *argv)
 | 
			
		|||
    return Qnil;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define enum_cycle_size rb_enum_cycle_size
 | 
			
		||||
VALUE
 | 
			
		||||
rb_enum_cycle_size(VALUE self, VALUE args)
 | 
			
		||||
static VALUE
 | 
			
		||||
enum_cycle_size(VALUE self, VALUE args)
 | 
			
		||||
{
 | 
			
		||||
    long mul;
 | 
			
		||||
    VALUE n = Qnil;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										18
									
								
								enumerator.c
									
										
									
									
									
								
							
							
						
						
									
										18
									
								
								enumerator.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -463,7 +463,13 @@ lazy_to_enum_i(VALUE self, VALUE meth, int argc, VALUE *argv, VALUE (*size_fn)(A
 | 
			
		|||
VALUE
 | 
			
		||||
rb_enumeratorize_with_size(VALUE obj, VALUE meth, int argc, VALUE *argv, VALUE (*size_fn)(ANYARGS))
 | 
			
		||||
{
 | 
			
		||||
    return enumerator_init(enumerator_allocate(rb_cEnumerator), obj, meth, argc, argv, size_fn, Qnil);
 | 
			
		||||
    /* Similar effect as calling obj.to_enum, i.e. dispatching to either
 | 
			
		||||
       Kernel#to_enum vs Lazy#to_enum */
 | 
			
		||||
    if (RTEST(rb_obj_is_kind_of(obj, rb_cLazy)))
 | 
			
		||||
	return lazy_to_enum_i(obj, meth, argc, argv, size_fn);
 | 
			
		||||
    else
 | 
			
		||||
	return enumerator_init(enumerator_allocate(rb_cEnumerator),
 | 
			
		||||
	    obj, meth, argc, argv, size_fn, Qnil);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static VALUE
 | 
			
		||||
| 
						 | 
				
			
			@ -1893,12 +1899,9 @@ lazy_drop_while(VALUE obj)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
static VALUE
 | 
			
		||||
lazy_cycle(int argc, VALUE *argv, VALUE obj)
 | 
			
		||||
lazy_super(int argc, VALUE *argv, VALUE lazy)
 | 
			
		||||
{
 | 
			
		||||
    if (rb_block_given_p()) {
 | 
			
		||||
	return rb_call_super(argc, argv);
 | 
			
		||||
    }
 | 
			
		||||
    return lazy_to_enum_i(obj, sym_cycle, argc, argv, rb_enum_cycle_size);
 | 
			
		||||
    return enumerable_lazy(rb_call_super(argc, argv));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static VALUE
 | 
			
		||||
| 
						 | 
				
			
			@ -2005,8 +2008,9 @@ InitVM_Enumerator(void)
 | 
			
		|||
    rb_define_method(rb_cLazy, "take_while", lazy_take_while, 0);
 | 
			
		||||
    rb_define_method(rb_cLazy, "drop", lazy_drop, 1);
 | 
			
		||||
    rb_define_method(rb_cLazy, "drop_while", lazy_drop_while, 0);
 | 
			
		||||
    rb_define_method(rb_cLazy, "cycle", lazy_cycle, -1);
 | 
			
		||||
    rb_define_method(rb_cLazy, "lazy", lazy_lazy, 0);
 | 
			
		||||
    rb_define_method(rb_cLazy, "chunk", lazy_super, -1);
 | 
			
		||||
    rb_define_method(rb_cLazy, "slice_before", lazy_super, -1);
 | 
			
		||||
 | 
			
		||||
    rb_define_alias(rb_cLazy, "force", "to_a");
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -90,9 +90,6 @@ ID rb_id_encoding(void);
 | 
			
		|||
/* encoding.c */
 | 
			
		||||
void rb_gc_mark_encodings(void);
 | 
			
		||||
 | 
			
		||||
/* enum.c */
 | 
			
		||||
VALUE rb_enum_cycle_size(VALUE self, VALUE args);
 | 
			
		||||
 | 
			
		||||
/* error.c */
 | 
			
		||||
NORETURN(PRINTF_ARGS(void rb_compile_bug(const char*, int, const char*, ...), 3, 4));
 | 
			
		||||
VALUE rb_check_backtrace(VALUE);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -447,4 +447,20 @@ EOS
 | 
			
		|||
      assert_raise(ArgumentError){ [].lazy.send(method) }
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_laziness_conservation
 | 
			
		||||
    bug7507 = '[ruby-core:51510]'
 | 
			
		||||
    {
 | 
			
		||||
      slice_before: //,
 | 
			
		||||
      with_index: nil,
 | 
			
		||||
      cycle: nil,
 | 
			
		||||
      each_with_object: 42,
 | 
			
		||||
      each_slice: 42,
 | 
			
		||||
      each_entry: nil,
 | 
			
		||||
      each_cons: 42,
 | 
			
		||||
    }.each do |method, arg|
 | 
			
		||||
      assert_equal Enumerator::Lazy, [].lazy.send(method, *arg).class, bug7507
 | 
			
		||||
    end
 | 
			
		||||
    assert_equal Enumerator::Lazy, [].lazy.chunk{}.class, bug7507
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue