Пример #1
0
 /// <summary>
 /// Prepares the PowerCalls (Call and Dict) for using in a Script
 /// </summary>
 /// <param name="variables">the variables that are being prepared</param>
 /// <param name="prepareVariables">an action that is used to prepare a new scope for special methodcalls</param>
 /// <param name="visitor">A visitor instance that is executing the current script and contains the required root variables for child-scripts</param>
 public void PreparePowerCalls(IDictionary <string, object> variables, InitializeScopeVariables prepareVariables, ScriptVisitor visitor)
 {
     variables["Dict"] = new Func <object[], object[], Dictionary <string, object> >((a, b) =>
                                                                                     Dict(a, b));
     variables["Call"] =
         new Func <string, IDictionary <string, object>, object>((a, b) => CallScript(a, b, prepareVariables, visitor.CopyInitial()));
 }
Пример #2
0
        /// <summary>
        /// Parses one single Expression-Block
        /// </summary>
        /// <param name="expression">the target expression to execute</param>
        /// <param name="implicitContext">implicit context that is used for the interpreter-session that is used for the codeblock</param>
        /// <param name="scopeInitializer">an initializer that can be used to provide special methods and values to the initial scope</param>
        /// <returns>the evaluation result</returns>
        public static object ParseBlock(string expression, object implicitContext, InitializeScopeVariables scopeInitializer = null)
        {
            ScriptVisitor visitor;

            using (var session = InterpreterBuffer.GetReplInstance(implicitContext, scopeInitializer, out visitor))
            {
                return(ParseBlock(expression, session));
            }
        }
Пример #3
0
        /// <summary>
        /// Gets an existing free repl session or creates a new one if required
        /// </summary>
        /// <param name="baseValues">the base values used to initialize the repl - session</param>
        /// <param name="scopeInitializer">a callback that is used to prepare the scope variables for the scripting</param>
        /// <param name="visitorInstance">the visitor instance that is capable to process expressions and scripts</param>
        /// <returns>a runner item that can be used to control the repl session</returns>
        public static IDisposable GetReplInstance(object implicitContext,
                                                  InitializeScopeVariables scopeInitializer,
                                                  out ScriptVisitor visitorInstance)
        {
            Scope s = new Scope(new Dictionary <string, object> {
                { "$data", implicitContext }
            });

            s.ImplicitContext = "$data";
            return(GetReplInstance(s, scopeInitializer, out visitorInstance));
        }
Пример #4
0
        /// <summary>
        /// Excecutes a Script
        /// </summary>
        /// <param name="variables">the initial variables for the script</param>
        /// <param name="prepareVariables">a callback that will be used in order to initialize lazy-evaluation variable values</param>
        /// <returns>the return value that was generated by the script</returns>
        public TOutput Execute(IDictionary <string, object> variables, InitializeScopeVariables prepareVariables)
        {
            ScriptVisitor            visitor;
            InitializeScopeVariables dff = prepareVariables ??
                                           (a =>
            {
                DefaultCallbacks.PrepareDefaultCallbacks(a.Scope, a.ReplSession);
            });
            InitializeScopeVariables newInitializer = args =>
            {
                PreparePowerCalls(args.Scope, prepareVariables, args.Visitor);
                dff(args);
            };

            using (var session = InterpreterBuffer.GetReplInstance(variables, newInitializer, out visitor))
            {
                // todo: reactivate
                return(Execute(session));
            }
        }
Пример #5
0
        /// <summary>
        /// Gets an existing free repl session or creates a new one if required
        /// </summary>
        /// <param name="baseValues">the base values used to initialize the repl - session</param>
        /// <param name="scopeInitializer">a callback that is used to prepare the scope variables for the scripting</param>
        /// <param name="visitorInstance">the visitor instance that is capable to process expressions and scripts</param>
        /// <returns>a runner item that can be used to control the repl session</returns>
        public static IDisposable GetReplInstance(IDictionary <string, object> baseValues,
                                                  InitializeScopeVariables scopeInitializer,
                                                  out ScriptVisitor visitorInstance)
        {
            bool simpleInit = (baseValues is Scope);

            lock (runners)
            {
                RunnerItem retVal = runners.FirstOrDefault(n => !simpleInit && n.Lock());
                if (retVal == null)
                {
                    ScriptVisitor visitor = simpleInit
                        ? new ScriptVisitor((Scope)baseValues)
                        : new ScriptVisitor();
                    retVal = new RunnerItem(visitor, simpleInit);
                    retVal.Lock();
                    if (visitor.Reactivateable)
                    {
                        runners.Add(retVal);
                    }
                }

                visitorInstance = (ScriptVisitor)retVal.Visitor;
                if (!simpleInit)
                {
                    visitorInstance.ClearScope(baseValues);
                }

                InitializeScopeVariables dff = scopeInitializer ??
                                               (a =>
                {
                    DefaultCallbacks.PrepareDefaultCallbacks(a.Scope, a.ReplSession);
                });
                visitorInstance.Prepare(dff);
                return(retVal);
            }
        }
Пример #6
0
        /// <summary>
        /// Parses one single Expression
        /// </summary>
        /// <param name="expression">the target expression to execute</param>
        /// <param name="variables">the initial variables that are provided to the expression</param>
        /// <param name="scopeInitializer">an initializer that can be used to provide special methods and values to the initial scope</param>
        /// <returns>the evaluation result</returns>
        public static object Parse(string expression, IDictionary <string, object> variables, InitializeScopeVariables scopeInitializer = null)
        {
            ScriptVisitor visitor;

            using (var session = InterpreterBuffer.GetReplInstance(variables, scopeInitializer, out visitor))
            {
                return(Parse(expression, session));
            }
        }
Пример #7
0
        /// <summary>
        /// Begins a repl - session
        /// </summary>
        /// <param name="baseValues">the base values that are used for the current session</param>
        /// <param name="scopePreparer">a callback that is used to prepare the repl session variables</param>
        /// <returns>a value that can be used to end this repl - session</returns>
        public static IDisposable BeginRepl(IDictionary <string, object> baseValues, InitializeScopeVariables scopePreparer)
        {
            ScriptVisitor visitor;

            return(InterpreterBuffer.GetReplInstance(baseValues, scopePreparer, out visitor));
        }
Пример #8
0
        /// <summary>
        /// Calls a Script inside a script
        /// </summary>
        /// <param name="scriptFile">the script file</param>
        /// <param name="initialVariables">the initial variables</param>
        /// <param name="prepareVariables">a value preparer for root values</param>
        /// <param name="baseValues">the initial values that are contained in the root-script</param>
        /// <returns>the value of the script</returns>
        private static object CallScript(string scriptFile, IDictionary <string, object> initialVariables, InitializeScopeVariables prepareVariables, IDictionary <string, object> baseValues)
        {
            bool dontClear = initialVariables is IScope;
            IDictionary <string, object> construct = (initialVariables is IScope)
                ? initialVariables
                : new Dictionary <string, object>(initialVariables);

            try
            {
                foreach (KeyValuePair <string, object> tmp in baseValues)
                {
                    if (!construct.ContainsKey(tmp.Key))
                    {
                        construct[tmp.Key] = tmp.Value;
                    }
                }

                ScriptFile <object> file = ScriptFile <object> .FromFile(scriptFile);

                return(file.Execute(construct, prepareVariables));
            }
            finally
            {
                if (!dontClear)
                {
                    construct.Clear();
                }
            }
        }