Esempio n. 1
0
        /// <summary>
        /// Execute script
        /// </summary>
        /// <param name="script">script to execute</param>
        /// <param name="args">script parameters</param>
        /// <param name="isolation">isolation</param>
        /// <returns>script return value</returns>
        public object ExecuteScript(Script script, IEnumerable <string> args, CallIsolation isolation)
        {
            string location = script.Location;

            if (!string.IsNullOrEmpty(script.Id))
            {
                location += "#" + script.Id;
            }
            WriteVerbose(string.Format("Context> Executing script {0} with isolation {1} ", location, isolation));

            Vars snapshot = null;

            if (isolation != CallIsolation.None)
            {
                snapshot = new Vars(this);
            }
            try
            {
                // Clear vars
                if (isolation == CallIsolation.High)
                {
                    base.Clear();
                }


                // Print usage
                object ret = RunOnStack(ScriptOperation.ParsingArguments, script,
                                        delegate
                {
                    script.ParseArguments(args);
                    if (script.Usage.ShouldDisplayUsage(args, this))
                    {
                        Write(OutputType.Out, GetAutoUsage(script, -1));
                        return(script.Usage.ExitCode);
                    }
                    return(null);
                });

                if (ret == null)
                {
                    ret = RunOnStack(ScriptOperation.Executing, script, script.ExecuteScript);
                }
                return(ReturnValue.Unwrap(ret));
            }
            finally
            {
                if (snapshot != null)
                {
                    base.Clear();
                    AddRange(snapshot);
                }
            }
        }
Esempio n. 2
0
        public object ExecuteMember(CallIsolation isolation, string name, object[] par)
        {
            IScriptAction f = Methods.Items.Find(delegate(IScriptAction x) { return(x.Id == name); });

            if (f == null)
            {
                throw new ParsingException("Cannot find method " + name);
            }

            List <CallParam> cp = new List <CallParam>();

            if (par != null)
            {
                foreach (var o in par)
                {
                    cp.Add(new CallParam(null, o, TransformRules.None));
                }
            }
            return(Context.ExecuteAction(f, cp, isolation));
        }
Esempio n. 3
0
        public object ExecuteMember(CallIsolation isolation, string name, object[] par)
        {
            IScriptAction f=Methods.Items.Find(delegate(IScriptAction x) { return x.Id == name; });
            if (f == null)
                throw new ParsingException("Cannot find method " + name);

            List<CallParam> cp=new List<CallParam>();
            if (par!=null)
                foreach (var o in par)
                    cp.Add(new CallParam(null, o,TransformRules.None));
            return Context.ExecuteAction(f, cp, isolation);
        }
Esempio n. 4
0
        /// <summary>
        /// Execute script action
        /// </summary>
        /// <param name="action">action to execute</param>
        /// <param name="args">list of parameters, in case the action is Call</param>
        /// <param name="isolation">isolation</param>
        /// <returns>action result</returns>
        public object ExecuteAction(IScriptAction action, IEnumerable <CallParam> args, CallIsolation isolation)
        {
            Vars snapshot = null;

            if (isolation != CallIsolation.None)
            {
                snapshot = new Vars(this);
            }
            try
            {
                // Clear vars
                if (isolation == CallIsolation.High)
                {
                    base.Clear();
                }


                return(RunOnStack(ScriptOperation.Executing, action, delegate
                {
                    Sub sub = action as Sub;
                    if (sub != null)
                    {
                        return sub.ExecuteSub(args);
                    }
                    return action.Execute();
                }));
            }
            finally
            {
                if (snapshot != null)
                {
                    base.Clear();
                    AddRange(snapshot);
                }
            }
        }