AnnulusGames 1 an în urmă
părinte
comite
65544e0c6c
2 a modificat fișierele cu 26 adăugiri și 12 ștergeri
  1. 15 8
      src/Lua/LuaTable.cs
  2. 11 4
      src/Lua/Standard/Basic/NextFunction.cs

+ 15 - 8
src/Lua/LuaTable.cs

@@ -170,7 +170,7 @@ public sealed class LuaTable
         array[arrayIndex] = value;
     }
 
-    public KeyValuePair<LuaValue, LuaValue> GetNext(LuaValue key)
+    public bool TryGetNext(LuaValue key, out KeyValuePair<LuaValue, LuaValue> pair)
     {
         var index = -1;
         if (key.Type is LuaValueType.Nil)
@@ -189,30 +189,37 @@ public sealed class LuaTable
             {
                 if (span[i].Type is not LuaValueType.Nil)
                 {
-                    return new(index + i + 1, span[i]);
+                    pair = new(index + i + 1, span[i]);
+                    return true;
                 }
             }
 
-            foreach (var pair in dictionary)
+            foreach (var kv in dictionary)
             {
-                return pair;
+                pair = kv;
+                return true;
             }
         }
         else
         {
             var foundKey = false;
-            foreach (var pair in dictionary)
+            foreach (var kv in dictionary)
             {
-                if (foundKey) return pair;
+                if (foundKey)
+                {
+                    pair = kv;
+                    return true;
+                }
 
-                if (pair.Key.Equals(key))
+                if (kv.Key.Equals(key))
                 {
                     foundKey = true;
                 }
             }
         }
 
-        return default;
+        pair = default;
+        return false;
     }
 
     public void Clear()

+ 11 - 4
src/Lua/Standard/Basic/NextFunction.cs

@@ -10,9 +10,16 @@ public sealed class NextFunction : LuaFunction
         var arg0 = context.GetArgument<LuaTable>(0);
         var arg1 = context.HasArgument(1) ? context.Arguments[1] : LuaValue.Nil;
 
-        var kv = arg0.GetNext(arg1);
-        buffer.Span[0] = kv.Key;
-        buffer.Span[1] = kv.Value;
-        return new(2);
+        if (arg0.TryGetNext(arg1, out var kv))
+        {
+            buffer.Span[0] = kv.Key;
+            buffer.Span[1] = kv.Value;
+            return new(2);
+        }
+        else
+        {
+            buffer.Span[0] = LuaValue.Nil;
+            return new(1);
+        }
     }
 }