Browse Source

neko indexOf and lastIndexOf fix (#8117)

* special handling in neko indexOf and lastIndexOf when argument is empty string

* remove unnecessary lines

* edge cases in neko String.indexOf and lastIndexOf, some unit tests

* disable unit test that causes hl, java, and cs to fail
Aurel 6 years ago
parent
commit
ba1b03f82c
2 changed files with 17 additions and 2 deletions
  1. 12 2
      std/neko/_std/String.hx
  2. 5 0
      tests/unit/src/unitstd/String.unit.hx

+ 12 - 2
std/neko/_std/String.hx

@@ -71,7 +71,14 @@ import haxe.iterators.StringKeyValueIterator;
 
 
 	public function indexOf( str : String, ?startIndex : Int ) : Int {
 	public function indexOf( str : String, ?startIndex : Int ) : Int {
 		untyped {
 		untyped {
-			var p = try __dollar__sfind(this.__s,if( startIndex == null ) 0 else startIndex,str.__s) catch( e : Dynamic ) null;
+			var l = __dollar__ssize(this.__s);
+			if( startIndex == null || startIndex < -l )
+				startIndex = 0;
+			if( startIndex > l )
+				return -1;
+			if( __dollar__ssize(str.__s) == 0 )
+				return startIndex < 0 ? l + startIndex : startIndex;
+			var p = try __dollar__sfind(this.__s,startIndex,str.__s) catch( e : Dynamic ) null;
 			if( p == null )
 			if( p == null )
 				return -1;
 				return -1;
 			return p;
 			return p;
@@ -81,8 +88,11 @@ import haxe.iterators.StringKeyValueIterator;
 	public function lastIndexOf( str : String, ?startIndex : Int ) : Int {
 	public function lastIndexOf( str : String, ?startIndex : Int ) : Int {
 		untyped {
 		untyped {
 			var last = -1;
 			var last = -1;
+			var l = __dollar__ssize(this.__s);
 			if( startIndex == null )
 			if( startIndex == null )
-				startIndex = __dollar__ssize(this.__s);
+				startIndex = l;
+			if( __dollar__ssize(str.__s) == 0 )
+				return startIndex > l ? l : startIndex;
 			while( true ) {
 			while( true ) {
 				var p = try __dollar__sfind(this.__s,last+1,str.__s) catch( e : Dynamic ) null;
 				var p = try __dollar__sfind(this.__s,last+1,str.__s) catch( e : Dynamic ) null;
 				if( p == null || p > startIndex )
 				if( p == null || p > startIndex )

+ 5 - 0
tests/unit/src/unitstd/String.unit.hx

@@ -72,6 +72,11 @@ s.indexOf("oo") == 1;
 s.indexOf("o", 1) == 1;
 s.indexOf("o", 1) == 1;
 s.indexOf("o", 2) == 2;
 s.indexOf("o", 2) == 2;
 s.indexOf("o", 3) == -1;
 s.indexOf("o", 3) == -1;
+//s.indexOf("", -10) == 0;
+//s.indexOf("", 7) == 7; // see #8117
+//s.indexOf("", 8) == -1; // see #8117
+s.indexOf("r", 7) == -1;
+s.indexOf("r", 8) == -1;
 
 
 // lastIndexOf
 // lastIndexOf
 var s = "foofoofoobarbar";
 var s = "foofoofoobarbar";