Stream.st
changeset 24804 64a11f77e263
parent 24786 1481f5b459f9
child 24810 7ae3dacf3ff0
--- a/Stream.st	Thu Sep 26 20:58:54 2019 +0200
+++ b/Stream.st	Sat Sep 28 14:52:23 2019 +0200
@@ -3448,6 +3448,24 @@
 
     "
      |s|
+     s := '12345678901234567890' readStream.
+     s readLimit:5.
+     s upTo:$3. 
+     self assert:(s position = 3).
+     s upTo:$x.    
+     self assert:(s position = 5).     
+     self assert:(s atEnd).     
+    "
+    "
+     |s|
+     s := '12345678901234567890' readStream.
+     s upTo:$x.    
+     self assert:(s position = 20).     
+     self assert:(s atEnd).     
+    "
+
+    "
+     |s|
      s := ReadStream on:#(1 2 3 4 5 6 7 8).
      Transcript showCR:(s upTo:4).
      Transcript showCR:s next
@@ -3484,6 +3502,7 @@
 
     "Modified: / 12-01-1998 / 21:58:38 / cg"
     "Modified: / 10-01-2018 / 18:30:36 / stefan"
+    "Modified (comment): / 24-09-2019 / 14:35:36 / Stefan Vogel"
 !
 
 upTo:anObject into:aStream
@@ -3498,13 +3517,21 @@
 
     |element|
 
-    [
-        element := self nextOrNil.
-        ((element isNil and:[self atEnd]) or:[element = anObject]) ifTrue:[
-            ^ self
+    anObject isImmediate ifTrue:[
+        "speed uo for anObject being an Integer or a Character <= 255
+         - identity compare is inlined and a lot faster"
+        [((element := aStream nextOrNil) notNil or:[self atEnd])
+         and:[element ~~ anObject]] whileTrue:[
+            aStream nextPut:element.
         ].
-        aStream nextPut:element.
-    ] loop.
+    ] ifFalse:[
+        [((element := aStream nextOrNil) notNil or:[self atEnd])
+         and:[element ~= anObject]] whileTrue:[
+            aStream nextPut:element.
+        ].
+    ].
+
+    "Modified (format): / 24-09-2019 / 14:35:01 / Stefan Vogel"
 !
 
 upToAllExcluding:aCollection