/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }