diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Orchard.Widgets.csproj b/src/Orchard.Web/Modules/Orchard.Widgets/Orchard.Widgets.csproj index ea6196de0..2b580d82a 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/Orchard.Widgets.csproj +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Orchard.Widgets.csproj @@ -38,6 +38,10 @@ ..\..\..\..\lib\claysharp\ClaySharp.dll + + False + ..\..\..\..\lib\dlr\Microsoft.Scripting.dll + diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/RuleEngine/RuleManager.cs b/src/Orchard.Web/Modules/Orchard.Widgets/RuleEngine/RuleManager.cs index 6c960b494..7370f8db3 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/RuleEngine/RuleManager.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/RuleEngine/RuleManager.cs @@ -14,7 +14,7 @@ namespace Orchard.Widgets.RuleEngine { } public bool Matches(string expression) { - dynamic execContext = _scriptingManager.ExecuteExpression(@" + object execContextType = _scriptingManager.ExecuteExpression(@" class ExecContext def execute(callbacks, text) @callbacks = callbacks; @@ -27,13 +27,16 @@ namespace Orchard.Widgets.RuleEngine { @callbacks.send(name, args, &block); end end - ExecContext.new()"); - return execContext.execute(new CallbackApi(this), expression); + ExecContext + "); + + object execContext = _scriptingManager.ExecuteOperation(ops => ops.CreateInstance(execContextType)); + return _scriptingManager.ExecuteOperation(ops => ops.InvokeMember(execContext, "execute", new CallbackApi(this), expression)); } public class CallbackApi { private readonly RuleManager _ruleManager; - + public CallbackApi(RuleManager ruleManager) { _ruleManager = ruleManager; } @@ -44,7 +47,7 @@ namespace Orchard.Widgets.RuleEngine { } private object Evaluate(string name, IList args) { - RuleContext ruleContext = new RuleContext {FunctionName = name, Arguments = args.ToArray()}; + RuleContext ruleContext = new RuleContext { FunctionName = name, Arguments = args.ToArray() }; foreach (var ruleProvider in _ruleProviders) { ruleProvider.Process(ruleContext); diff --git a/src/Orchard/Scripting/IScriptingManager.cs b/src/Orchard/Scripting/IScriptingManager.cs index 65256b0b4..06eea09bb 100644 --- a/src/Orchard/Scripting/IScriptingManager.cs +++ b/src/Orchard/Scripting/IScriptingManager.cs @@ -1,8 +1,12 @@ -namespace Orchard.Scripting { +using System; +using Microsoft.Scripting.Hosting; + +namespace Orchard.Scripting { public interface IScriptingManager : IDependency { dynamic GetVariable(string name); void SetVariable(string name, object value); dynamic ExecuteExpression(string expression); void ExecuteFile(string fileName); + dynamic ExecuteOperation(Func invoke); } } diff --git a/src/Orchard/Scripting/ScriptingManager.cs b/src/Orchard/Scripting/ScriptingManager.cs index 545134f20..4589dc63f 100644 --- a/src/Orchard/Scripting/ScriptingManager.cs +++ b/src/Orchard/Scripting/ScriptingManager.cs @@ -5,10 +5,12 @@ namespace Orchard.Scripting { public class ScriptingManager : IScriptingManager { private readonly IScriptingRuntime _scriptingRuntime; private Lazy _scope; + private Lazy _operations; public ScriptingManager(IScriptingRuntime scriptingRuntime) { _scriptingRuntime = scriptingRuntime; _scope = new Lazy(()=>_scriptingRuntime.CreateScope()); + _operations = new Lazy(()=>_scope.Value.Engine.CreateOperations()); } public dynamic GetVariable(string name) { @@ -23,6 +25,10 @@ namespace Orchard.Scripting { return _scriptingRuntime.ExecuteExpression(expression, _scope.Value); } + public dynamic ExecuteOperation(Func invoke) { + return invoke(_operations.Value); + } + public void ExecuteFile(string fileName) { _scriptingRuntime.ExecuteFile(fileName, _scope.Value); }