Browse Source

Implementing Array.prototype.reverse

Sebastien Ros 12 years ago
parent
commit
62567272fb

+ 34 - 1
Jint/Native/Array/ArrayPrototype.cs

@@ -123,7 +123,40 @@ namespace Jint.Native.Array
 
         private object Reverse(object thisObj, object[] arguments)
         {
-            throw new NotImplementedException();
+            var o = TypeConverter.ToObject(Engine, thisObj);
+            var lenVal = o.Get("length");
+            var len = TypeConverter.ToUint32(lenVal);
+            var middle = (uint)System.Math.Floor(len/2);
+            uint lower = 0;
+            while (lower != middle)
+            {
+                var upper = len - lower - 1;
+                var upperP = TypeConverter.ToString(upper);
+                var lowerP = TypeConverter.ToString(lower);
+                var lowerValue = o.Get(lowerP);
+                var upperValue = o.Get(upperP);
+                var lowerExists = o.HasProperty(lowerP);
+                var upperExists = o.HasProperty(upperP);
+                if (lowerExists && upperExists)
+                {
+                    o.Put(lowerP, upperValue, true);
+                    o.Put(upperP, lowerValue, true);
+                }
+                if (!lowerExists && upperExists)
+                {
+                    o.Put(lowerP, upperValue, true);
+                    o.Delete(upperP, true);
+                }
+                if (lowerExists && !upperExists)
+                {
+                    o.Delete(lowerP, true);
+                    o.Put(upperP, lowerValue, true);
+                }
+
+                lower++;
+            }
+
+            return o;
         }
 
         private object Join(object thisObj, object[] arguments)

+ 0 - 1
Jint/Runtime/ExpressionIntepreter.cs

@@ -1,7 +1,6 @@
 using System;
 using System.Linq;
 using Jint.Native;
-using Jint.Native.Array;
 using Jint.Native.Function;
 using Jint.Native.Object;
 using Jint.Parser.Ast;

+ 1 - 1
Jint/Runtime/TypeConverter.cs

@@ -275,7 +275,7 @@ namespace Jint.Runtime
             var p = o as IPrimitiveType;
             if (p != null)
             {
-                o = p;
+                o = p.PrimitiveValue;
             }
 
             if (o is bool)