Files
Orchard/src/Orchard.Web/Modules/Orchard.Scripting.Dlr/Services/RubyScriptExpressionEvaluator.cs
Renaud Paquay f96abb981a Replace dlr scripting implementation with the new lightweight engine
DLR scripting engine still available in new Orchard.Scripting.Dlr module

--HG--
branch : dev
rename : src/Orchard.Web/Modules/Orchard.Scripting/ScriptingManager.cs => src/Orchard.Web/Modules/Orchard.Scripting/ScriptExpressionEvaluator.cs
2010-11-28 12:03:11 -08:00

71 lines
2.8 KiB
C#

using System.Collections.Generic;
using System.Linq;
using Microsoft.Scripting.Hosting;
using Orchard.Caching;
namespace Orchard.Scripting.Dlr.Services {
public class RubyScriptExpressionEvaluator : IScriptExpressionEvaluator {
private readonly IScriptingManager _scriptingManager;
private readonly ICacheManager _cacheManager;
public RubyScriptExpressionEvaluator(IScriptingManager scriptingManager, ICacheManager cacheManager) {
_scriptingManager = scriptingManager;
_cacheManager = cacheManager;
}
public object Evaluate(string expression, IEnumerable<IGlobalMethodProvider> providers) {
object execContextType = _cacheManager.Get("---", ctx => (object)_scriptingManager.ExecuteExpression(@"
class ExecBlock
def initialize(callbacks)
@callbacks = callbacks
end
def method_missing(name, *args, &block)
@callbacks.send(name, args, &block);
end
end
class ExecContext
class << self
def alloc(thing)
instance_eval 'self.new {' + thing + '}'
end
end
def initialize(&block)
@block = block
end
def evaluate(callbacks)
ExecBlock.new(callbacks).instance_eval(&@block)
end
end
ExecContext
"));
var ops = _cacheManager.Get("----", ctx => (ObjectOperations)_scriptingManager.ExecuteOperation(x => x));
object execContext = _cacheManager.Get(expression, ctx => (object)ops.InvokeMember(execContextType, "alloc", expression));
dynamic result = ops.InvokeMember(execContext, "evaluate", new CallbackApi(this, providers));
return result;
}
public class CallbackApi {
private readonly RubyScriptExpressionEvaluator _ruleManager;
private readonly IEnumerable<IGlobalMethodProvider> _providers;
public CallbackApi(RubyScriptExpressionEvaluator ruleManager, IEnumerable<IGlobalMethodProvider> providers) {
_ruleManager = ruleManager;
_providers = providers;
}
public object send(string name, IList<object> args) {
return _ruleManager.Evaluate(_providers, name, args);
}
}
private object Evaluate(IEnumerable<IGlobalMethodProvider> providers, string name, IList<object> args) {
GlobalMethodContext ruleContext = new GlobalMethodContext { FunctionName = name, Arguments = args.ToArray() };
foreach (var ruleProvider in providers) {
ruleProvider.Process(ruleContext);
}
return ruleContext.Result;
}
}
}