示例#1
0
		internal override Result Eval(Evaluator evaluater, Result[] argArray) {
			if (_isFunction) {
				return EvalFunc(evaluater, argArray);
			} else {
				return EvalProp(evaluater, argArray);
			}
		}
示例#2
0
		protected override void ProcessArg(Evaluator evaluater, Result[] argArray) {
			base.ProcessArg(evaluater, argArray);
			Type type0 = argArray[0].Type;
			Type type1 = argArray[1].Type;
			if (type0 == null && type1 == null) {
				return;
			}

			if (type0 == null) {
				if (type1.IsValueType) {
					throw new InvalidCastException(string.Format("from null to {0}", type1.Name));
				}
			}
			if (type1 == null) {
				if (type0.IsValueType) {
					throw new InvalidCastException(string.Format("from null to {0}", type0.Name));
				}
			}

			int result;
			if (BinaryHelper.ComparePrimitiveType(type0, type1, out result)) {
				if (result > 0) {
					argArray[1].Value = ConvertHelper.ChangeType(argArray[1].Value, type0);
				} else if (result < 0) {
					argArray[0].Value = ConvertHelper.ChangeType(argArray[0].Value, type1);
				}
			}
		}
示例#3
0
		protected virtual void ProcessArg(Evaluator evaluater, Result[] argArray) {
			if (argArray.Length != 2) {
				throw new ArgumentException();
			}

			foreach (Result r in argArray) {
				if (!IsEvalableType(r.Type)) {
					throw new NotSupportedException();
				}
			}
		}
示例#4
0
		Result EvalProp(Evaluator evaluater, Result[] argArray) {
			if (argArray.Length == 0) {
				throw new ArgumentException();
			}

			if (argArray.Length == 1) {
				return argArray[0];
			}

			string memberName = argArray[1].Value as string;
			if (memberName == null) {
				throw new ArgumentException();
			}

			if (argArray[0] == null) {
				throw new ArgumentNullException("argArray[0]");
			}

			object target = argArray[0].Value;
			if (target == null) {
				throw new ArgumentException();
			}

			Type type = null;

			BindingFlags bindingFlags = BindingFlags.Default;
			if (target is Type) {
				type = (Type)target;
				target = null;
				bindingFlags = BindingFlags.Static;
			} else {
				type = target.GetType();
				bindingFlags = BindingFlags.Instance;
			}

			bindingFlags |= BindingFlags.Public;
			PropertyInfo pi = type.GetProperty(memberName, bindingFlags);
			if (pi != null) {
				return new Result(pi.PropertyType, pi.GetValue(target, null));
			}

			FieldInfo fi = type.GetField(memberName, bindingFlags);
			if (fi != null) {
				return new Result(fi.FieldType, fi.GetValue(target));
			}

			throw new ArgumentException();

		}
示例#5
0
		Result EvalFunc(Evaluator evaluater, Result[] argArray) {
			if (argArray.Length < 2) {
				throw new ArgumentException();
			}

			if (argArray[0] == null || argArray[1] == null) {
				throw new ArgumentNullException("argArray[0]");
			}

			object target = argArray[0].Value;
			if (target == null) {
				throw new ArgumentException();
			}

			string functionName = ConvertHelper.ToString(argArray[1].Value);

			Type type = null;
			BindingFlags bindingFlags = BindingFlags.Default;
			if (target is Type) {
				type = (Type)target;
				target = null;
				bindingFlags = BindingFlags.Static;
			} else {
				type = target.GetType();
				bindingFlags = BindingFlags.Instance;
			}
			bindingFlags |= BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.OptionalParamBinding;

			int length = argArray.Length - 2;
			object[] argValueAry = new object[length];
			for (int i = 0; i < length; i++) {
				argValueAry[i] = argArray[i + 2].Value;
			}
			Binder defaultBinder = Type.DefaultBinder;
			object ret = type.InvokeMember(functionName,
				bindingFlags, defaultBinder, target, argValueAry);
			if (ret != null)
				return new Result(ret.GetType(), ret);
			return new Result(null, null);

		}
示例#6
0
		protected override Result DoEval(Evaluator evaluater, Result[] argArray) {
			int ret = System.Convert.ToInt32(argArray[0].Value) & System.Convert.ToInt32(argArray[1].Value);
			return new Result(typeof(int), ret);
		}
示例#7
0
 protected override void ProcessArg(Evaluator evaluater, Result[] argArray)
 {
     base.ProcessArg(evaluater, argArray);
 }
示例#8
0
 internal override Result Eval(Evaluator evaluater, Result[] argArray)
 {
     ProcessArg(evaluater, argArray);
     return(DoEval(evaluater, argArray));
 }
示例#9
0
		protected override Result DoEval(Evaluator evaluater, Result[] argArray) {
			Type type = typeof(int);
			int ret = System.Convert.ToInt32(argArray[0].Value) % System.Convert.ToInt32(argArray[1].Value);
			return new Result(type, ConvertHelper.ChangeType(ret, type));
		}
示例#10
0
        protected override Result DoEval(Evaluator evaluater, Result[] argArray)
        {
            int ret = System.Convert.ToInt32(argArray[0].Value) & System.Convert.ToInt32(argArray[1].Value);

            return(new Result(typeof(int), ret));
        }
示例#11
0
		protected override Result DoEval(Evaluator evaluater, Result[] argArray) {
			Type type = argArray[0].Type;
			double ret = System.Convert.ToDouble(argArray[0].Value) / System.Convert.ToDouble(argArray[1].Value);
			return new Result(type, ConvertHelper.ChangeType(ret, type));
		}
示例#12
0
		protected override Result DoEval(Evaluator evaluater, Result[] argArray) {
			return new Result(typeof(bool), (bool)argArray[0].Value && (bool)argArray[1].Value);
		}
示例#13
0
		internal override Result Eval(Evaluator evaluater, Result[] argArray) {
			ProcessArg(evaluater, argArray);
			return DoEval(evaluater, argArray);
		}
示例#14
0
 protected abstract Result DoEval(Evaluator evaluater, Result[] argArray);
示例#15
0
		protected abstract Result DoEval(Evaluator evaluater, Result[] argArray);
示例#16
0
		protected override Result DoEval(Evaluator evaluater, Result[] argArray) {
			int result = 0;
			if (argArray[0].IsNull() && argArray[1].IsNull()) {
				return ProcessResult(0);
			}
			IComparable cb0 = argArray[0].Value as IComparable;
			IComparable cb1 = argArray[1].Value as IComparable;
			if (cb0 != null) {
				result = cb0.CompareTo(argArray[1].Value);
			} else if (cb1 != null) {
				result = -cb1.CompareTo(argArray[0].Value);
			} else {
				throw new NotSupportedException();
			}
			return ProcessResult(result);
		}
示例#17
0
		protected override void ProcessArg(Evaluator evaluater, Result[] argArray) {
			base.ProcessArg(evaluater, argArray);
		}
示例#18
0
 protected override Result DoEval(Evaluator evaluater, Result[] argArray)
 {
     return(new Result(typeof(bool), (bool)argArray[0].Value && (bool)argArray[1].Value));
 }
示例#19
0
        protected override void ProcessArg(Evaluator evaluater, Result[] argArray)
        {
            base.ProcessArg(evaluater, argArray);
            Type type0 = argArray[0].Type;
            Type type1 = argArray[1].Type;
            int  result;

            if (type0 == null && type1 == null)
            {
                return;
            }

            if (type0 == null)
            {
                if (type1.IsValueType)
                {
                    throw new InvalidCastException(string.Format("from null to {0}", type1.Name));
                }

                if (type1 == typeof(string))
                {
                    argArray[0].Type = typeof(string);
                    return;
                }
                else
                {
                    throw new InvalidCastException(string.Format("from null to {0}", type1.Name));
                }
            }

            if (type1 == null)
            {
                if (type0.IsValueType)
                {
                    throw new InvalidCastException(string.Format("from null to {0}", type0.Name));
                }

                if (type0 == typeof(string))
                {
                    argArray[1].Type = typeof(string);
                    return;
                }
                else
                {
                    throw new InvalidCastException(string.Format("from null to {0}", type0.Name));
                }
            }

            if (BinaryHelper.ComparePrimitiveType(type0, type1, out result))
            {
                if (result > 0)
                {
                    argArray[1].Value = ConvertHelper.ChangeType(argArray[1].Value, type0);
                }
                else if (result < 0)
                {
                    argArray[0].Value = ConvertHelper.ChangeType(argArray[0].Value, type1);
                }
            }
            else
            {
                throw new InvalidCastException(string.Format("from {1} to {0}", type0.Name, type1.Name));
            }
        }
示例#20
0
		protected override Result DoEval(Evaluator evaluater, Result[] argArray) {
			int ret = 0;
			if (_isleft)
				ret = System.Convert.ToInt32(argArray[0].Value) << System.Convert.ToInt32(argArray[1].Value);
			else {
				ret = System.Convert.ToInt32(argArray[0].Value) >> System.Convert.ToInt32(argArray[1].Value);
			}
			return new Result(typeof(int), ret);
		}
示例#21
0
		protected override Result DoEval(Evaluator evaluater, Result[] argArray) {
			Type type0 = argArray[0].Type;
			Type type1 = argArray[1].Type;
			if (type0 == null && type1 == null) {
				return new Result(null, null);
			} else {
				if (type0 == typeof(string))
					return new Result(ConvertHelper.ToString(argArray[0].Value) + ConvertHelper.ToString(argArray[1].Value));
				else {
					double ret = System.Convert.ToDouble(argArray[0].Value) + System.Convert.ToDouble(argArray[1].Value);
					return new Result(type0, ConvertHelper.ChangeType(ret, type0));
				}
			}
		}
示例#22
0
		internal override Result Eval(Evaluator evaluater, Result[] argArray) {
			if (argArray.Length < 2) {
				throw new ArgumentException();
			}

			object target = argArray[0].Value;
			if (target == null) {
				throw new ArgumentException();
			}
			int length = argArray.Length - 1;

			Type type = null;
			BindingFlags bindingFlags = BindingFlags.Default;

			if (target is Type) {
				type = (Type)target;
				target = null;
				bindingFlags = BindingFlags.Static;
			} else {
				type = target.GetType();
				bindingFlags = BindingFlags.Instance;
			}
			bindingFlags = BindingFlags.Public;

			Type[] argTypeArray = new Type[length];
			object[] argValueAry = new object[length];
			for (int i = 0; i < length; i++) {
				argTypeArray[i] = argArray[i + 1].Type;
				argValueAry[i] = argArray[i + 1].Value;
			}

			Binder defaultBinder = Type.DefaultBinder;
			PropertyInfo pi = type.GetProperty("Item", bindingFlags, defaultBinder, null, argTypeArray, null);
			if (pi == null) {
				pi = type.GetProperty("Items", bindingFlags, defaultBinder, null, argTypeArray, null);
			}
			if (pi != null) {
				return new Result(pi.PropertyType, pi.GetValue(target, argValueAry));
			}

			if (target == null) {
				throw new ArgumentException();
			}

			object ret;

			if (target is string) {
				string s = (string)target;
				int index = (int)ConvertHelper.ChangeType(argArray[1].Value, typeof(int));
				ret = s[index];
				return new Result(typeof(char), ret);
			}

			if (target is Array) {
				Array array = (Array)target;
				if (array.Rank != (argArray.Length - 1)) {
					throw new ArgumentException();
				}

				int[] indices = new int[length];
				for (int i = 0; i < length; i++) {
					indices[i] = (int)ConvertHelper.ChangeType(argArray[i + 1].Value, typeof(int));
				}

				ret = array.GetValue(indices);
				if (ret != null)
					return new Result(ret.GetType(), ret);
				return new Result(null, null);
			}

			if (target is IList) {
				IList list = (IList)target;
				if (argArray.Length != 2) {
					throw new ArgumentException();
				}
				int index = (int)ConvertHelper.ChangeType(argArray[1].Value, typeof(int));
				ret = list[index];
				if (ret != null)
					return new Result(ret.GetType(), ret);
				return new Result(null, null);
			}

			throw new ArgumentException();
		}
示例#23
0
		internal override Result Eval(Evaluator evaluater, Result[] argArray) {
			return new Result(_type, _value);
		}