Example #1
0
		public static Number RedirectState(Object state, EvaluationCallback lhs, EvaluationCallback rhs)
		{
			Combat.Character character = state as Combat.Character;
			if (character == null) return new Number();

			Number result = rhs(state);
			if (result.NumberType == NumberType.None) return new Number();

			EvaluationCallback indexcallback = Get(lhs.Target.GetType())(lhs.Target) as EvaluationCallback;
			if (indexcallback == null) return new Number();

			Number varindex = indexcallback(state);
			if (varindex.NumberType == NumberType.None) return new Number();

			if (lhs.Target.GetType().Name == typeof(Var).Name)
			{
				if (character.Variables.SetInteger(varindex.IntValue, false, result.IntValue) == true) return result;
			}
			else if (lhs.Target.GetType().Name == typeof(FVar).Name)
			{
				if (character.Variables.SetFloat(varindex.IntValue, false, result.FloatValue) == true) return result;
			}
			else if (lhs.Target.GetType().Name == typeof(SysVar).Name)
			{
				if (character.Variables.SetInteger(varindex.IntValue, true, result.IntValue) == true) return result;
			}
			else if (lhs.Target.GetType().Name == typeof(SysFVar).Name)
			{
				if (character.Variables.SetFloat(varindex.IntValue, true, result.FloatValue) == true) return result;
			}

			return new Number();
		}
Example #2
0
        public static Number RedirectState(Object state, EvaluationCallback lhs, EvaluationCallback rhs)
        {
            Combat.Character character = state as Combat.Character;
            if (character == null)
            {
                return(new Number());
            }

            Number result = rhs(state);

            if (result.NumberType == NumberType.None)
            {
                return(new Number());
            }

            EvaluationCallback indexcallback = Get(lhs.Target.GetType())(lhs.Target) as EvaluationCallback;

            if (indexcallback == null)
            {
                return(new Number());
            }

            Number varindex = indexcallback(state);

            if (varindex.NumberType == NumberType.None)
            {
                return(new Number());
            }

            if (lhs.Target.GetType().Name == typeof(Var).Name)
            {
                if (character.Variables.SetInteger(varindex.IntValue, false, result.IntValue) == true)
                {
                    return(result);
                }
            }
            else if (lhs.Target.GetType().Name == typeof(FVar).Name)
            {
                if (character.Variables.SetFloat(varindex.IntValue, false, result.FloatValue) == true)
                {
                    return(result);
                }
            }
            else if (lhs.Target.GetType().Name == typeof(SysVar).Name)
            {
                if (character.Variables.SetInteger(varindex.IntValue, true, result.IntValue) == true)
                {
                    return(result);
                }
            }
            else if (lhs.Target.GetType().Name == typeof(SysFVar).Name)
            {
                if (character.Variables.SetFloat(varindex.IntValue, true, result.FloatValue) == true)
                {
                    return(result);
                }
            }

            return(new Number());
        }
Example #3
0
        /// <summary>
        /// Initializes a <see cref="HazardousUsageEvaluator"/> that evaluates a return statement with a return value of the tracked type.
        /// </summary>
        /// <param name="evaluator">Evaluation callback.</param>
        public HazardousUsageEvaluator(HazardousUsageEvaluatorKind kind, EvaluationCallback evaluator)
        {
            if (kind != HazardousUsageEvaluatorKind.Return && kind != HazardousUsageEvaluatorKind.Initialization)
            {
                throw new ArgumentException(
                          "kind must be Return or Initialization.  Use other constructors for Invocation.",
                          nameof(kind));
            }

            Kind           = kind;
            ValueEvaluator = evaluator ?? throw new ArgumentNullException(nameof(evaluator));
        }
        /// <summary>
        /// Initializes a <see cref="HazardousUsageEvaluator"/> that evaluates a return statement with a return value of the tracked type.
        /// </summary>
        /// <param name="evaluator">Evaluation callback.</param>
        /// <param name="derivedClass">Whether to consider derived class.</param>
        public HazardousUsageEvaluator(HazardousUsageEvaluatorKind kind, EvaluationCallback evaluator, bool derivedClass = false)
        {
            if (kind is not HazardousUsageEvaluatorKind.Return and not HazardousUsageEvaluatorKind.Initialization and not HazardousUsageEvaluatorKind.Argument)
            {
                throw new ArgumentException(
                          "kind must be Return or Initialization or Argument.  Use other constructors for Invocation.",
                          nameof(kind));
            }

            Kind           = kind;
            DerivedClass   = derivedClass;
            ValueEvaluator = evaluator ?? throw new ArgumentNullException(nameof(evaluator));
        }
Example #5
0
        public EvaluationCallback Create(Node node)
        {
            DynamicMethod method = new DynamicMethod(String.Empty, typeof(Number), new Type[] { typeof(Object) }, typeof(Compiler), true);

            CompilerState compilerstate = new CompilerState();

            compilerstate.Generator     = method.GetILGenerator();
            compilerstate.FunctionState = compilerstate.Generator.DeclareLocal(typeof(Object));
            compilerstate.ErrorLabel    = compilerstate.Generator.DefineLabel();
            compilerstate.ErrorVariable = compilerstate.Generator.DeclareLocal(typeof(Boolean));

            compilerstate.Generator.Emit(OpCodes.Ldarg, 0);
            StoreLocalVariable(compilerstate, compilerstate.FunctionState);

            LocalVariableInfo result = Emit(compilerstate, node);

            if (result.LocalType == typeof(Int32))
            {
                LoadLocalVariable(compilerstate, result);
                compilerstate.Generator.Emit(OpCodes.Newobj, typeof(Number).GetConstructor(new Type[] { typeof(Int32) }));
            }
            else if (result.LocalType == typeof(Single))
            {
                LoadLocalVariable(compilerstate, result);
                compilerstate.Generator.Emit(OpCodes.Newobj, typeof(Number).GetConstructor(new Type[] { typeof(Single) }));
            }
            else
            {
                throw new Exception();
            }

            compilerstate.Generator.Emit(OpCodes.Ret);

            compilerstate.Generator.MarkLabel(compilerstate.ErrorLabel);
            LoadLocalVariable(compilerstate, compilerstate.Generator.DeclareLocal(typeof(Number)));
            compilerstate.Generator.Emit(OpCodes.Ret);

            EvaluationCallback callback = (EvaluationCallback)method.CreateDelegate(typeof(EvaluationCallback));

            return(callback);
        }
Example #6
0
        EvaluationCallback SingleFunctionBuild(Node node)
        {
            DynamicMethod method    = new DynamicMethod(String.Empty, typeof(Number), new Type[] { typeof(Object) }, typeof(TreeCompiler));
            ILGenerator   generator = method.GetILGenerator();

            foreach (Node n in EnumerateNodes(node))
            {
                if (n.Token.Data is Evaluation.Tokenizing.CustomFunctionData)
                {
                    generator.Emit(OpCodes.Ldarg, 0);
                }
            }

            SingleFunctionBuild(generator, node);

            generator.Emit(OpCodes.Ret);

            EvaluationCallback callback = (EvaluationCallback)method.CreateDelegate(typeof(EvaluationCallback));

            return(callback);
        }
Example #7
0
 /// <summary>
 /// Initializes a <see cref="HazardousUsageEvaluator"/> that evaluates a method invocation with an argument of the type being tracked by PropertySetAnalysis.
 /// </summary>
 /// <param name="instanceTypeName">Name of the instance that the method is invoked on.</param>
 /// <param name="methodName">Name of the method within <see cref="instanceTypeName"/>.</param>
 /// <param name="parameterNameOfPropertySetObject">Name of the method parameter containing the type being tracked by PropertySetAnalysis.</param>
 /// <param name="evaluator">Evaluation callback.</param>
 public HazardousUsageEvaluator(string instanceTypeName, string methodName, string parameterNameOfPropertySetObject, EvaluationCallback evaluator)
 {
     InstanceTypeName = instanceTypeName ?? throw new ArgumentNullException(nameof(instanceTypeName));
     MethodName       = methodName ?? throw new ArgumentNullException(nameof(methodName));
     ParameterNameOfPropertySetObject = parameterNameOfPropertySetObject ?? throw new ArgumentNullException(nameof(parameterNameOfPropertySetObject));
     Evaluator = evaluator ?? throw new ArgumentNullException(nameof(evaluator));
 }
Example #8
0
 /// <summary>
 /// Initializes a <see cref="HazardousUsageEvaluator"/> that evaluates a method invocation on the type being tracked by PropertySetAnalysis.
 /// </summary>
 /// <param name="trackedTypeMethodName">Name of the method within the tracked type.</param>
 /// <param name="evaluator">Evaluation callback.</param>
 public HazardousUsageEvaluator(string trackedTypeMethodName, EvaluationCallback evaluator)
 {
     MethodName = trackedTypeMethodName ?? throw new ArgumentNullException(nameof(trackedTypeMethodName));
     Evaluator  = evaluator ?? throw new ArgumentNullException(nameof(evaluator));
 }
Example #9
0
		EvaluationCallback NestedFunctionBuild(Node node)
		{
			if (node.Token.Data is Evaluation.Tokenizing.NumberData)
			{
				Number number = (node.Token.Data as Evaluation.Tokenizing.NumberData).GetNumber(node.Token.ToString());
				return GetNumberCallback(number);
			}

			if (node.Token.Data is Evaluation.Tokenizing.RangeData)
			{
				Object[] args = new Object[node.Children.Count + node.Arguments.Count];

				for (Int32 i = 0; i != node.Children.Count; ++i) args[i] = NestedFunctionBuild(node.Children[i]);
				for (Int32 i = 0; i != node.Arguments.Count; ++i) args[i + node.Children.Count] = node.Arguments[i];

				Constructor constructor = GetRangeConstructor();
				IFunction function = (IFunction)constructor(args);

				return function.Evaluate;
			}

			if (node.Token.AsOperator == Operator.Assignment)
			{
				Object[] args = new Object[node.Children.Count + node.Arguments.Count];

				for (Int32 i = 0; i != node.Children.Count; ++i) args[i] = NestedFunctionBuild(node.Children[i]);
				for (Int32 i = 0; i != node.Arguments.Count; ++i) args[i + node.Children.Count] = node.Arguments[i];

				Constructor constructor = GetCustomFunctionConstructor("_Assignment", typeof(Evaluation.Triggers._Assignment), args);
				IFunction function = (IFunction)constructor(args);

				return function.Evaluate;
			}

			if (node.Token.AsOperator != Operator.None)
			{
				Constructor constructor = GetOperatorTypeConstructor(node.Token.Data as OperatorData);
				EvaluationCallback[] childcallbacks;

				if (node.Token.AsOperator == Operator.Minus && node.Children.Count == 1)
				{
					childcallbacks = new EvaluationCallback[2] { GetNumberCallback(new Number(0)), NestedFunctionBuild(node.Children[0]) };
				}
				else
				{
					childcallbacks = new EvaluationCallback[node.Children.Count];
					for (Int32 i = 0; i != node.Children.Count; ++i) childcallbacks[i] = NestedFunctionBuild(node.Children[i]);
				}

				IFunction function = (IFunction)constructor(childcallbacks);
				return function.Evaluate;
			}

			if (node.Token.Data is Evaluation.Tokenizing.CustomFunctionData)
			{
				Object[] args = new Object[node.Children.Count + node.Arguments.Count];

				for (Int32 i = 0; i != node.Children.Count; ++i) args[i] = NestedFunctionBuild(node.Children[i]);
				for (Int32 i = 0; i != node.Arguments.Count; ++i) args[i + node.Children.Count] = node.Arguments[i];

				CustomFunctionData data = node.Token.Data as CustomFunctionData;

				Constructor constructor = GetCustomFunctionConstructor(data.Name, data.Type, args);
				IFunction function = (IFunction)constructor(args);

				return function.Evaluate;
			}

			return null;
		}
Example #10
0
        EvaluationCallback NestedFunctionBuild(Node node)
        {
            if (node.Token.Data is Evaluation.Tokenizing.NumberData)
            {
                Number number = (node.Token.Data as Evaluation.Tokenizing.NumberData).GetNumber(node.Token.ToString());
                return(GetNumberCallback(number));
            }

            if (node.Token.Data is Evaluation.Tokenizing.RangeData)
            {
                Object[] args = new Object[node.Children.Count + node.Arguments.Count];

                for (Int32 i = 0; i != node.Children.Count; ++i)
                {
                    args[i] = NestedFunctionBuild(node.Children[i]);
                }
                for (Int32 i = 0; i != node.Arguments.Count; ++i)
                {
                    args[i + node.Children.Count] = node.Arguments[i];
                }

                Constructor constructor = GetRangeConstructor();
                IFunction   function    = (IFunction)constructor(args);

                return(function.Evaluate);
            }

            if (node.Token.AsOperator == Operator.Assignment)
            {
                Object[] args = new Object[node.Children.Count + node.Arguments.Count];

                for (Int32 i = 0; i != node.Children.Count; ++i)
                {
                    args[i] = NestedFunctionBuild(node.Children[i]);
                }
                for (Int32 i = 0; i != node.Arguments.Count; ++i)
                {
                    args[i + node.Children.Count] = node.Arguments[i];
                }

                Constructor constructor = GetCustomFunctionConstructor("_Assignment", typeof(Evaluation.Triggers._Assignment), args);
                IFunction   function    = (IFunction)constructor(args);

                return(function.Evaluate);
            }

            if (node.Token.AsOperator != Operator.None)
            {
                Constructor          constructor = GetOperatorTypeConstructor(node.Token.Data as OperatorData);
                EvaluationCallback[] childcallbacks;

                if (node.Token.AsOperator == Operator.Minus && node.Children.Count == 1)
                {
                    childcallbacks = new EvaluationCallback[2] {
                        GetNumberCallback(new Number(0)), NestedFunctionBuild(node.Children[0])
                    };
                }
                else
                {
                    childcallbacks = new EvaluationCallback[node.Children.Count];
                    for (Int32 i = 0; i != node.Children.Count; ++i)
                    {
                        childcallbacks[i] = NestedFunctionBuild(node.Children[i]);
                    }
                }

                IFunction function = (IFunction)constructor(childcallbacks);
                return(function.Evaluate);
            }

            if (node.Token.Data is Evaluation.Tokenizing.CustomFunctionData)
            {
                Object[] args = new Object[node.Children.Count + node.Arguments.Count];

                for (Int32 i = 0; i != node.Children.Count; ++i)
                {
                    args[i] = NestedFunctionBuild(node.Children[i]);
                }
                for (Int32 i = 0; i != node.Arguments.Count; ++i)
                {
                    args[i + node.Children.Count] = node.Arguments[i];
                }

                CustomFunctionData data = node.Token.Data as CustomFunctionData;

                Constructor constructor = GetCustomFunctionConstructor(data.Name, data.Type, args);
                IFunction   function    = (IFunction)constructor(args);

                return(function.Evaluate);
            }

            return(null);
        }