/// <summary>
        /// Loads the arguments supplied into the runtime.
        /// </summary>
        /// <param name="args">The metadata of the arguments.</param>
        /// <param name="argValues">The argument values as strings</param>
        public RunResult LoadArguments(List <ArgAttribute> args, List <string> argValues)
        {
            var errors = new List <ScriptError>();
            var start  = DateTime.Now;

            for (var ndx = 0; ndx < args.Count; ndx++)
            {
                var arg    = args[ndx];
                var argVal = argValues[ndx];
                try
                {
                    var langType      = LangTypeHelper.ConvertToLangTypeFromLangTypeName(arg.Type);
                    var langValueText = argVal;
                    if (string.IsNullOrEmpty(argVal) && !arg.Required && arg.DefaultValue != null)
                    {
                        langValueText = Convert.ToString(arg.DefaultValue);
                    }

                    var langValue = LangTypeHelper.ConvertToLangValue(langType, langValueText);
                    this.Context.Memory.SetValue(arg.Name, langValue, false);
                    this.Context.Symbols.DefineVariable(arg.Name, langType);
                }
                catch (Exception)
                {
                    var error = new ScriptError();
                    error.Message = "Unable to create variable : " + arg.Name + " with value : " + argVal;
                    errors.Add(error);
                    throw;
                }
            }
            var end    = DateTime.Now;
            var result = new RunResult(start, end, errors.Count == 0, errors);

            return(result);
        }
Esempio n. 2
0
        /// <summary>
        /// Evaluate value.
        /// </summary>
        /// <returns></returns>
        public override object DoEvaluate()
        {
            // 1. Null
            if (this.Value == LObjects.Null)
            {
                return(this.Value);
            }

            // 2. Actual value.
            var ltype = LangTypeHelper.ConvertToLangValue(this.Value);

            return(ltype);
        }
Esempio n. 3
0
        /// <summary>
        /// Adds new elements to the end of an array, and returns the new length
        /// </summary>
        /// <param name="target">The target list to apply this method on.</param>
        /// <param name="elements">The elements to add</param>
        /// <returns>The new length</returns>
        public int Push(LObject target, params object[] elements)
        {
            if (elements == null || elements.Length == 0)
            {
                return(0);
            }

            // Add
            var list = target.GetValue() as IList;

            foreach (object elem in elements)
            {
                var langType = LangTypeHelper.ConvertToLangValue(elem);
                list.Add(langType);
            }

            return(list.Count);
        }
Esempio n. 4
0
        /// <summary>
        /// Evaluate a constant.
        /// </summary>
        /// <param name="val"></param>
        /// <returns></returns>
        public object VisitConstant(ConstantExpr expr)
        {
            var val = expr.Value;

            // 1. Null
            if (val == LObjects.Null)
            {
                return(val);
            }

            if (val is LObject)
            {
                return(val);
            }

            // 2. Actual value.
            var ltype = LangTypeHelper.ConvertToLangValue(val);

            return(ltype);
        }
        /// <summary>
        /// Adds new elements to the end of an array, and returns the new length
        /// </summary>
        /// <param name="target">The target list to apply this method on.</param>
        /// <param name="elements">The elements to add</param>
        /// <returns>The new length</returns>
        public int Push(LObject target, params object[] elements)
        {
            if (elements == null || elements.Length == 0)
            {
                return(0);
            }

            // Add
            var list = target.GetValue() as IList;

            if (list == null)
            {
                return(0);
            }

            foreach (object elem in elements)
            {
                if (list.GetType().IsGenericType)
                {
                    var gt = list.GetType().GetGenericArguments()[0];
                    if (gt != null && gt.FullName.StartsWith("ComLib.Lang"))
                    {
                        var langVal = LangTypeHelper.ConvertToLangValue(elem);
                        list.Add(langVal);
                    }
                    else
                    {
                        list.Add(elem);
                    }
                }
                else
                {
                    var langType = LangTypeHelper.ConvertToLangValue(elem);
                    list.Add(langType);
                }
            }

            return(list.Count);
        }
Esempio n. 6
0
        /// <summary>
        /// Evaluate the result of indexing an object e.g. users[0] or users["admins"]
        /// </summary>
        /// <param name="regmethods"></param>
        /// <param name="node"></param>
        /// <param name="target"></param>
        /// <param name="ndxObj"></param>
        /// <returns></returns>
        public static LObject AccessIndex(RegisteredMethods regmethods, AstNode node, LObject target, LObject ndxObj)
        {
            object result = LObjects.Null;

            // Case 1: Array access users[0];
            if (target.Type == LTypes.Array || target.Type.TypeVal == LTypes.Table.TypeVal)
            {
                var ndx     = ((LNumber)ndxObj).Value;
                var isArray = target.Type == LTypes.Array;
                var methods = isArray ? regmethods.Get(LTypes.Array) : regmethods.Get(LTypes.Table);

                // TODO: Make this generic.
                var length = Convert.ToInt32(methods.ExecuteMethod(target, "length", null));
                if (ndx >= length)
                {
                    throw ExceptionHelper.BuildRunTimeException(node, "Index out of bounds : '" + ndx + "'");
                }

                result = methods.GetByNumericIndex(target, (int)ndx);
            }
            // Case 2: Map access. users["kishore"];
            else if (target.Type == LTypes.Map)
            {
                var memberName = ((LString)ndxObj).Value;
                var methods    = regmethods.Get(LTypes.Map);
                if (!methods.HasProperty(target, memberName))
                {
                    throw ExceptionHelper.BuildRunTimeException(node, "Property does not exist : '" + memberName + "'");
                }

                result = methods.GetByStringMember(target, memberName);
            }
            // Conver to lang type.
            if (result != LObjects.Null && !(result is LObject))
            {
                result = LangTypeHelper.ConvertToLangValue(result);
            }
            return((LObject)result);
        }