From 9014d0434ae02a913206aa85163cf19c7afca048 Mon Sep 17 00:00:00 2001 From: Rygor Borodoolin <6opoDuJIo@i.ua> Date: Fri, 11 Mar 2016 14:20:42 +0200 Subject: [PATCH 1/3] this check causes bug : this statement is always false for negative "pos", stopping exception from being thrown --- src/MoonSharp.Interpreter/CoreLib/TableModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MoonSharp.Interpreter/CoreLib/TableModule.cs b/src/MoonSharp.Interpreter/CoreLib/TableModule.cs index 1f623a06..80a4d72a 100644 --- a/src/MoonSharp.Interpreter/CoreLib/TableModule.cs +++ b/src/MoonSharp.Interpreter/CoreLib/TableModule.cs @@ -181,7 +181,7 @@ public static DynValue remove(ScriptExecutionContext executionContext, CallbackA int pos = vpos.IsNil() ? len : (int)vpos.Number; - if (pos >= len + 1 || (pos < 1 && len > 0)) + if (pos >= len + 1 || (pos < 0)) throw new ScriptRuntimeException("bad argument #1 to 'remove' (position out of bounds)"); for (int i = pos; i <= len; i++) From fbc3aa8ebfbf52278e7d730a5a8be387a13e2367 Mon Sep 17 00:00:00 2001 From: Rygor Borodoolin <6opoDuJIo@i.ua> Date: Fri, 11 Mar 2016 17:07:41 +0200 Subject: [PATCH 2/3] Table module now throws exception when you try to pass something else, than a number, into table.remove table.remove now not accept any negative indices table.remove now accept 0 index if table length equal to zero --- .../CoreLib/TableModule.cs | 40 +++++++++++-------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/src/MoonSharp.Interpreter/CoreLib/TableModule.cs b/src/MoonSharp.Interpreter/CoreLib/TableModule.cs index 80a4d72a..a4891469 100644 --- a/src/MoonSharp.Interpreter/CoreLib/TableModule.cs +++ b/src/MoonSharp.Interpreter/CoreLib/TableModule.cs @@ -170,29 +170,37 @@ public static DynValue insert(ScriptExecutionContext executionContext, CallbackA public static DynValue remove(ScriptExecutionContext executionContext, CallbackArguments args) { DynValue vlist = args.AsType(0, "table.remove", DataType.Table, false); - DynValue vpos = args.AsType(1, "table.remove", DataType.Number, true); - DynValue ret = DynValue.Nil; - if (args.Count > 2) - throw new ScriptRuntimeException("wrong number of arguments to 'remove'"); + if (args[1].Type != DataType.Number) + { + throw new ScriptRuntimeException(string.Format( "bad argument #2 to 'remove' (number expected, got {0})", args[1].Type.ToLuaTypeString())); + } + else + { + DynValue vpos = args.AsType(1, "table.remove", DataType.Number, true); + DynValue ret = DynValue.Nil; - int len = GetTableLength(executionContext, vlist); - Table list = vlist.Table; + if (args.Count > 2) + throw new ScriptRuntimeException("wrong number of arguments to 'remove'"); - int pos = vpos.IsNil() ? len : (int)vpos.Number; + int len = GetTableLength(executionContext, vlist); + Table list = vlist.Table; - if (pos >= len + 1 || (pos < 0)) - throw new ScriptRuntimeException("bad argument #1 to 'remove' (position out of bounds)"); + int pos = vpos.IsNil() ? len : (int)vpos.Number; - for (int i = pos; i <= len; i++) - { - if (i == pos) - ret = list.Get(i); + if (pos >= len + 1 || (pos < 0) || (pos == 0 && len > 0 /*this odd behaviour also occur in pure lua - don't throw exception if we try to delete 0 index of empty table(!)*/)) + throw new ScriptRuntimeException("bad argument #1 to 'remove' (position out of bounds)"); - list.Set(i, list.Get(i + 1)); - } + for (int i = pos; i <= len; i++) + { + if (i == pos) + ret = list.Get(i); + + list.Set(i, list.Get(i + 1)); + } - return ret; + return ret; + } } From 7707b35a500b62616a2cab9c6cad85e605618676 Mon Sep 17 00:00:00 2001 From: Rygor Borodoolin <6opoDuJIo@i.ua> Date: Fri, 11 Mar 2016 17:47:13 +0200 Subject: [PATCH 3/3] even closer to real behaviour : added case to table.remove(table, nil) --- .../CoreLib/TableModule.cs | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/src/MoonSharp.Interpreter/CoreLib/TableModule.cs b/src/MoonSharp.Interpreter/CoreLib/TableModule.cs index a4891469..b0443926 100644 --- a/src/MoonSharp.Interpreter/CoreLib/TableModule.cs +++ b/src/MoonSharp.Interpreter/CoreLib/TableModule.cs @@ -171,37 +171,40 @@ public static DynValue remove(ScriptExecutionContext executionContext, CallbackA { DynValue vlist = args.AsType(0, "table.remove", DataType.Table, false); - if (args[1].Type != DataType.Number) + switch (args[1].Type) { - throw new ScriptRuntimeException(string.Format( "bad argument #2 to 'remove' (number expected, got {0})", args[1].Type.ToLuaTypeString())); - } - else - { - DynValue vpos = args.AsType(1, "table.remove", DataType.Number, true); - DynValue ret = DynValue.Nil; + case DataType.Nil: + return DynValue.NewString(""); + + default: + throw new ScriptRuntimeException(string.Format("bad argument #2 to 'remove' (number expected, got {0})", args[1].Type.ToLuaTypeString())); - if (args.Count > 2) - throw new ScriptRuntimeException("wrong number of arguments to 'remove'"); + case DataType.Number: + DynValue vpos = args.AsType(1, "table.remove", DataType.Number, true); + DynValue ret = DynValue.Nil; - int len = GetTableLength(executionContext, vlist); - Table list = vlist.Table; + if (args.Count > 2) + throw new ScriptRuntimeException("wrong number of arguments to 'remove'"); - int pos = vpos.IsNil() ? len : (int)vpos.Number; + int len = GetTableLength(executionContext, vlist); + Table list = vlist.Table; - if (pos >= len + 1 || (pos < 0) || (pos == 0 && len > 0 /*this odd behaviour also occur in pure lua - don't throw exception if we try to delete 0 index of empty table(!)*/)) - throw new ScriptRuntimeException("bad argument #1 to 'remove' (position out of bounds)"); + int pos = vpos.IsNil() ? len : (int)vpos.Number; - for (int i = pos; i <= len; i++) - { - if (i == pos) - ret = list.Get(i); + if (pos >= len + 1 || (pos < 0) || (pos == 0 && len > 0 /*this odd behaviour also occur in pure lua - don't throw exception if we try to delete 0 index of empty table(!)*/)) + throw new ScriptRuntimeException("bad argument #1 to 'remove' (position out of bounds)"); - list.Set(i, list.Get(i + 1)); - } + for (int i = pos; i <= len; i++) + { + if (i == pos) + ret = list.Get(i); - return ret; + list.Set(i, list.Get(i + 1)); + } + + return ret; } - } + } //table.concat (list [, sep [, i [, j]]])