Browse Source

Fix: bit32.replace

AnnulusGames 1 year ago
parent
commit
5626d8927c
1 changed files with 13 additions and 6 deletions
  1. 13 6
      src/Lua/Standard/Bitwise/ReplaceFunction.cs

+ 13 - 6
src/Lua/Standard/Bitwise/ReplaceFunction.cs

@@ -19,17 +19,24 @@ public sealed class ReplaceFunction : LuaFunction
         LuaRuntimeException.ThrowBadArgumentIfNumberIsNotInteger(context.State, this, 3, arg2);
         LuaRuntimeException.ThrowBadArgumentIfNumberIsNotInteger(context.State, this, 4, arg3);
 
-        var n = (uint)arg0;
-        var v = (uint)arg1;
+        var n = Bit32Helper.ToUInt32(arg0);
+        var v = Bit32Helper.ToUInt32(arg1);
         var field = (int)arg2;
         var width = (int)arg3;
 
         Bit32Helper.ValidateFieldAndWidth(context.State, this, 2, field, width);
+        uint mask;
+        if (width == 32)
+        {
+            mask = 0xFFFFFFFF;
+        }
+        else
+        {
+            mask = (uint)((1 << width) - 1);
+        }
 
-        var mask = (uint)((1 << width) - 1);
-        n &= ~mask;
-        v &= mask;
-        n |= v;
+        v = v & mask;
+        n = (n & ~(mask << field)) | (v << field);
         buffer.Span[0] = n;
         return new(1);
     }