Browse Source

fixed string.substring()

Frederic Torres 11 years ago
parent
commit
56e67e2830
1 changed files with 17 additions and 2 deletions
  1. 17 2
      Jint/Native/String/StringPrototype.cs

+ 17 - 2
Jint/Native/String/StringPrototype.cs

@@ -99,6 +99,19 @@ namespace Jint.Native.String
             return s.ToLowerInvariant();
             return s.ToLowerInvariant();
         }
         }
 
 
+        private static int ToIntegerSupportInfinity(JsValue numberVal)
+        {
+            var doubleVal = TypeConverter.ToInteger(numberVal);
+            var intVal = (int) doubleVal;
+            if (double.IsPositiveInfinity(doubleVal))
+                intVal = int.MaxValue;
+            else if (double.IsNegativeInfinity(doubleVal))
+                intVal = int.MinValue;
+            else
+                intVal = (int) doubleVal;
+            return intVal;
+        }
+
         private JsValue Substring(JsValue thisObj, JsValue[] arguments)
         private JsValue Substring(JsValue thisObj, JsValue[] arguments)
         {
         {
             TypeConverter.CheckObjectCoercible(Engine, thisObj);
             TypeConverter.CheckObjectCoercible(Engine, thisObj);
@@ -118,10 +131,12 @@ namespace Jint.Native.String
             }
             }
 
 
             var len = s.Length;
             var len = s.Length;
-            var intStart = (int)TypeConverter.ToInteger(start);
-            var intEnd = arguments.At(1) == Undefined.Instance ? len : (int)TypeConverter.ToInteger(end);
+            var intStart = ToIntegerSupportInfinity(start);
+
+            var intEnd = arguments.At(1) == Undefined.Instance ? len : (int)ToIntegerSupportInfinity(end);
             var finalStart = System.Math.Min(len, System.Math.Max(intStart, 0));
             var finalStart = System.Math.Min(len, System.Math.Max(intStart, 0));
             var finalEnd = System.Math.Min(len, System.Math.Max(intEnd, 0));
             var finalEnd = System.Math.Min(len, System.Math.Max(intEnd, 0));
+            // Swap value if finalStart < finalEnd
             var from = System.Math.Min(finalStart, finalEnd);
             var from = System.Math.Min(finalStart, finalEnd);
             var to = System.Math.Max(finalStart, finalEnd);
             var to = System.Math.Max(finalStart, finalEnd);
             return s.Substring(from, to - from);
             return s.Substring(from, to - from);