Ensure LuaValues are disposed.
Adding in these missing calls prevents these instances from having to be finalized.
This commit is contained in:
@@ -64,7 +64,19 @@ namespace OpenRA.Scripting
|
||||
}
|
||||
}
|
||||
|
||||
// For global-level bindings
|
||||
/// <summary>
|
||||
/// Provides global bindings in Lua code.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Instance methods and properties declared in derived classes will be made available in Lua. Use
|
||||
/// <see cref="ScriptGlobalAttribute"/> on your derived class to specify the name exposed in Lua. It is recommended
|
||||
/// to apply <see cref="DescAttribute"/> against each method or property to provide a description of what it does.
|
||||
///
|
||||
/// Any parameters to your method that are <see cref="LuaValue"/>s will be disposed automatically when your method
|
||||
/// completes. If you need to return any of these values, or need them to live longer than your method, you must
|
||||
/// use <see cref="LuaValue.CopyReference"/> to get your own copy of the value. Any copied values you return will
|
||||
/// be disposed automatically, but you assume responsibility for disposing any other copies.
|
||||
/// </remarks>
|
||||
public abstract class ScriptGlobal : ScriptObjectWrapper
|
||||
{
|
||||
protected override string DuplicateKeyError(string memberName) { return "Table '{0}' defines multiple members '{1}'".F(Name, memberName); }
|
||||
@@ -78,11 +90,27 @@ namespace OpenRA.Scripting
|
||||
var type = this.GetType();
|
||||
var names = type.GetCustomAttributes<ScriptGlobalAttribute>(true);
|
||||
if (names.Length != 1)
|
||||
throw new InvalidOperationException("[LuaGlobal] attribute not found for global table '{0}'".F(type));
|
||||
throw new InvalidOperationException("[ScriptGlobal] attribute not found for global table '{0}'".F(type));
|
||||
|
||||
Name = names.First().Name;
|
||||
Bind(new[] { this });
|
||||
}
|
||||
|
||||
protected IEnumerable<T> FilteredObjects<T>(IEnumerable<T> objects, LuaFunction filter)
|
||||
{
|
||||
if (filter != null)
|
||||
{
|
||||
objects = objects.Where(a =>
|
||||
{
|
||||
using (var luaObject = a.ToLuaValue(Context))
|
||||
using (var filterResult = filter.Call(luaObject))
|
||||
using (var result = filterResult.First())
|
||||
return result.ToBoolean();
|
||||
});
|
||||
}
|
||||
|
||||
return objects;
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class ScriptGlobalAttribute : Attribute
|
||||
|
||||
Reference in New Issue
Block a user