io:read: don't resize output buffer if unnecessary
Even with a short-circuit test in the VM primitives, resize still has an overly high runtime cost in tight loops. For #376.db4
							parent
							
								
									bab801b321
								
							
						
					
					
						commit
						f31fb8a968
					
				| 
						 | 
					@ -119,9 +119,13 @@ SYMBOL: error-stream
 | 
				
			||||||
: (new-sequence-for-stream) ( n stream -- seq )
 | 
					: (new-sequence-for-stream) ( n stream -- seq )
 | 
				
			||||||
    stream-exemplar new-sequence ; inline
 | 
					    stream-exemplar new-sequence ; inline
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: resize-if-necessary ( wanted-n got-n seq -- seq' )
 | 
				
			||||||
 | 
					    2over = [ [ 2drop ] dip ] [ resize nip ] if ; inline
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: (read-into-new) ( n stream quot -- seq/f )
 | 
					: (read-into-new) ( n stream quot -- seq/f )
 | 
				
			||||||
 | 
					    [ dup ] 2dip
 | 
				
			||||||
    [ 2dup (new-sequence-for-stream) swap ] dip curry keep
 | 
					    [ 2dup (new-sequence-for-stream) swap ] dip curry keep
 | 
				
			||||||
    over 0 = [ 2drop f ] [ resize ] if ; inline
 | 
					    over 0 = [ 3drop f ] [ resize-if-necessary ] if ; inline
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: (read-into) ( buf stream quot -- buf-slice/f )
 | 
					: (read-into) ( buf stream quot -- buf-slice/f )
 | 
				
			||||||
    [ dup length over ] 2dip call
 | 
					    [ dup length over ] 2dip call
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue