コード例 #1
0
ファイル: Assign.cs プロジェクト: OxPatient/Rule-Engine
 /// <summary>
 ///     Sets up the command
 /// </summary>
 public override void Setup()
 {
     ILGenerator generator = MethodBase.CurrentMethod.Generator;
     if (RightHandSide.DataType.IsValueType
         && !LeftHandSide.DataType.IsValueType)
     {
         RightHandSide = MethodBase.CurrentMethod.Box(RightHandSide);
     }
     else if (!RightHandSide.DataType.IsValueType
              && LeftHandSide.DataType.IsValueType)
     {
         RightHandSide = MethodBase.CurrentMethod.UnBox(RightHandSide, LeftHandSide.DataType);
     }
     else if (!RightHandSide.DataType.IsValueType
              && !LeftHandSide.DataType.IsValueType
              && RightHandSide.DataType != LeftHandSide.DataType)
     {
         RightHandSide = MethodBase.CurrentMethod.Cast(RightHandSide, LeftHandSide.DataType);
     }
     if (LeftHandSide is FieldBuilder || LeftHandSide is IPropertyBuilder)
         generator.Emit(OpCodes.Ldarg_0);
     if (RightHandSide is FieldBuilder || RightHandSide is IPropertyBuilder)
         generator.Emit(OpCodes.Ldarg_0);
     RightHandSide.Load(generator);
     if (RightHandSide.DataType != LeftHandSide.DataType)
     {
         if (ConversionOpCodes.ContainsKey(LeftHandSide.DataType))
         {
             generator.Emit(ConversionOpCodes[LeftHandSide.DataType]);
         }
     }
     LeftHandSide.Save(generator);
 }
コード例 #2
0
ファイル: Call.cs プロジェクト: OxPatient/Rule-Engine
 /// <summary>
 ///     Constructor
 /// </summary>
 /// <param name="objectCallingOn">Object calling on</param>
 /// <param name="method">Method builder</param>
 /// <param name="methodCalling">Method calling on the object</param>
 /// <param name="parameters">List of parameters to send in</param>
 public Call(IMethodBuilder method, VariableBase objectCallingOn, MethodInfo methodCalling, object[] parameters)
 {
     ObjectCallingOn = objectCallingOn;
     MethodCalling = methodCalling;
     MethodCallingFrom = method;
     if (methodCalling.ReturnType != null && methodCalling.ReturnType != typeof (void))
     {
         Result =
             method.CreateLocal(
                 methodCalling.Name + "ReturnObject" +
                 MethodBase.ObjectCounter.ToString(CultureInfo.InvariantCulture), methodCalling.ReturnType);
     }
     if (parameters != null)
     {
         Parameters = new VariableBase[parameters.Length];
         for (int x = 0; x < parameters.Length; ++x)
         {
             if (parameters[x] is VariableBase)
                 Parameters[x] = (VariableBase) parameters[x];
             else
                 Parameters[x] = MethodCallingFrom.CreateConstant(parameters[x]);
         }
     }
     else
     {
         Parameters = null;
     }
 }
コード例 #3
0
ファイル: Assign.cs プロジェクト: OxPatient/Rule-Engine
 /// <summary>
 ///     Constructor
 /// </summary>
 /// <param name="leftHandSide">Left hand side</param>
 /// <param name="value">Value to store</param>
 public Assign(VariableBase leftHandSide, object value)
 {
     if (leftHandSide == null)
         throw new ArgumentNullException("leftHandSide");
     LeftHandSide = leftHandSide;
     var tempValue = value as VariableBase;
     RightHandSide = tempValue == null ? MethodBase.CurrentMethod.CreateConstant(value) : tempValue;
 }
コード例 #4
0
ファイル: ElseIf.cs プロジェクト: OxPatient/Rule-Engine
 /// <summary>
 ///     Constructor
 /// </summary>
 /// <param name="endIfLabel">End if label (for this else if)</param>
 /// <param name="comparisonType">Comparison type</param>
 /// <param name="leftHandSide">Left hand side</param>
 /// <param name="rightHandSide">Right hand side</param>
 public ElseIf(Label endIfLabel, Comparison comparisonType, VariableBase leftHandSide, VariableBase rightHandSide)
 {
     EndIfLabel = endIfLabel;
     if (leftHandSide != null)
         LeftHandSide = leftHandSide;
     else
         LeftHandSide = MethodBase.CurrentMethod.CreateConstant(null);
     if (rightHandSide != null)
         RightHandSide = rightHandSide;
     else
         RightHandSide = MethodBase.CurrentMethod.CreateConstant(null);
     ComparisonType = comparisonType;
 }
コード例 #5
0
ファイル: If.cs プロジェクト: OxPatient/Rule-Engine
 /// <summary>
 ///     Constructor
 /// </summary>
 /// <param name="comparisonType">Comparison type</param>
 /// <param name="leftHandSide">Left hand side</param>
 /// <param name="rightHandSide">Right hand side</param>
 public If(Comparison comparisonType, VariableBase leftHandSide, VariableBase rightHandSide)
 {
     ILGenerator generator = MethodBase.CurrentMethod.Generator;
     EndIfLabel = generator.DefineLabel();
     EndIfFinalLabel = generator.DefineLabel();
     if (leftHandSide != null)
         LeftHandSide = leftHandSide;
     else
         LeftHandSide = MethodBase.CurrentMethod.CreateConstant(null);
     if (rightHandSide != null)
         RightHandSide = rightHandSide;
     else
         RightHandSide = MethodBase.CurrentMethod.CreateConstant(null);
     ComparisonType = comparisonType;
 }
コード例 #6
0
ファイル: NewObj.cs プロジェクト: OxPatient/Rule-Engine
 /// <summary>
 ///     Constructor
 /// </summary>
 /// <param name="constructor">Constructor to use</param>
 /// <param name="parameters">Variables sent to the constructor</param>
 public NewObj(ConstructorInfo constructor, object[] parameters)
 {
     Constructor = constructor;
     if (parameters != null)
     {
         Parameters = new VariableBase[parameters.Length];
         for (int x = 0; x < parameters.Length; ++x)
         {
             if (parameters[x] is VariableBase)
                 Parameters[x] = (VariableBase) parameters[x];
             else
                 Parameters[x] = MethodBase.CurrentMethod.CreateConstant(parameters[x]);
         }
     }
     Result =
         MethodBase.CurrentMethod.CreateLocal(
             "ObjLocal" + MethodBase.ObjectCounter.ToString(CultureInfo.InvariantCulture),
             constructor.DeclaringType);
 }
コード例 #7
0
ファイル: Call.cs プロジェクト: OxPatient/Rule-Engine
 /// <summary>
 ///     Constructor
 /// </summary>
 /// <param name="objectCallingOn">Object calling on</param>
 /// <param name="method">Method builder</param>
 /// <param name="methodCalling">Method calling on the object</param>
 /// <param name="parameters">List of parameters to send in</param>
 public Call(IMethodBuilder method, VariableBase objectCallingOn, ConstructorInfo methodCalling,
             object[] parameters)
 {
     ObjectCallingOn = objectCallingOn;
     ConstructorCalling = methodCalling;
     MethodCallingFrom = method;
     if (parameters != null)
     {
         Parameters = new VariableBase[parameters.Length];
         for (int x = 0; x < parameters.Length; ++x)
         {
             if (parameters[x] is VariableBase)
                 Parameters[x] = (VariableBase) parameters[x];
             else
                 Parameters[x] = MethodCallingFrom.CreateConstant(parameters[x]);
         }
     }
     else
     {
         Parameters = null;
     }
 }
コード例 #8
0
ファイル: If.cs プロジェクト: OxPatient/Rule-Engine
 /// <summary>
 ///     Defines an else if statement
 /// </summary>
 /// <param name="comparisonType">Comparison type</param>
 /// <param name="leftHandSide">left hand side value</param>
 /// <param name="rightHandSide">right hand side value</param>
 public virtual void ElseIf(VariableBase leftHandSide, Comparison comparisonType, VariableBase rightHandSide)
 {
     ILGenerator generator = MethodBase.CurrentMethod.Generator;
     generator.Emit(OpCodes.Br, EndIfFinalLabel);
     generator.MarkLabel(EndIfLabel);
     EndIfLabel = generator.DefineLabel();
     MethodBase.CurrentMethod.Commands.Add(new ElseIf(EndIfLabel, comparisonType, leftHandSide, rightHandSide));
 }
コード例 #9
0
ファイル: UnBox.cs プロジェクト: OxPatient/Rule-Engine
 /// <summary>
 ///     Unboxes a value to a specified type
 /// </summary>
 /// <param name="value">Value to unbox</param>
 /// <param name="valueType">Value type</param>
 public UnBox(VariableBase value, Type valueType)
 {
     Value = value;
     ValueType = valueType;
 }
コード例 #10
0
        /// <summary>
        ///     Creates a while statement
        /// </summary>
        /// <param name="leftHandSide">Left hand side variable</param>
        /// <param name="comparisonType">Comparison type</param>
        /// <param name="rightHandSide">Right hand side variable</param>
        /// <returns>The while object</returns>
        public virtual While While(VariableBase leftHandSide, Comparison comparisonType, VariableBase rightHandSide)
        {
            SetCurrentMethod();
            var tempCommand = new While(comparisonType, leftHandSide, rightHandSide);

            tempCommand.Setup();
            Commands.Add(tempCommand);
            return(tempCommand);
        }
コード例 #11
0
ファイル: MethodBase.cs プロジェクト: OxPatient/Rule-Engine
 /// <summary>
 ///     Unboxes an object
 /// </summary>
 /// <param name="value">Value to unbox</param>
 /// <param name="valueType">Type to unbox to</param>
 /// <returns>The resulting variable</returns>
 public virtual VariableBase UnBox(VariableBase value, Type valueType)
 {
     var tempCommand = new UnBox(value, valueType);
     tempCommand.Setup();
     Commands.Add(tempCommand);
     ++ObjectCounter;
     return tempCommand.Result;
 }
コード例 #12
0
ファイル: MethodBase.cs プロジェクト: OxPatient/Rule-Engine
 /// <summary>
 ///     Throws an exception
 /// </summary>
 /// <param name="exception">Exception to throw</param>
 public virtual void Throw(VariableBase exception)
 {
     var tempCommand = new Throw(exception);
     tempCommand.Setup();
     Commands.Add(tempCommand);
 }
コード例 #13
0
ファイル: MethodBase.cs プロジェクト: OxPatient/Rule-Engine
 /// <summary>
 ///     Calls a constructor
 /// </summary>
 /// <param name="objectCallingOn">Object to call the constructor on</param>
 /// <param name="methodCalling">Constructor to call</param>
 /// <param name="parameters">parameters to use</param>
 public virtual void Call(VariableBase objectCallingOn, ConstructorInfo methodCalling, object[] parameters)
 {
     SetCurrentMethod();
     var tempCommand = new Call(this, objectCallingOn, methodCalling, parameters);
     tempCommand.Setup();
     Commands.Add(tempCommand);
     ++ObjectCounter;
 }
コード例 #14
0
ファイル: MethodBase.cs プロジェクト: OxPatient/Rule-Engine
 /// <summary>
 ///     Calls a method
 /// </summary>
 /// <param name="objectCallingOn">Object to call the method on</param>
 /// <param name="methodCalling">Method to call</param>
 /// <param name="parameters">parameters to use</param>
 /// <returns>The result of the method call</returns>
 public virtual VariableBase Call(VariableBase objectCallingOn, MethodInfo methodCalling, object[] parameters)
 {
     SetCurrentMethod();
     var tempCommand = new Call(this, objectCallingOn, methodCalling, parameters);
     tempCommand.Setup();
     Commands.Add(tempCommand);
     ++ObjectCounter;
     return tempCommand.Result;
 }
コード例 #15
0
ファイル: MethodBase.cs プロジェクト: OxPatient/Rule-Engine
 /// <summary>
 ///     Assigns a value to a variable
 /// </summary>
 /// <param name="leftHandSide">Variable to assign to</param>
 /// <param name="value">Value to assign</param>
 public virtual void Assign(VariableBase leftHandSide, object value)
 {
     SetCurrentMethod();
     var tempCommand = new Assign(leftHandSide, value);
     tempCommand.Setup();
     Commands.Add(tempCommand);
 }
コード例 #16
0
ファイル: Cast.cs プロジェクト: OxPatient/Rule-Engine
 /// <summary>
 ///     Constructor
 /// </summary>
 /// <param name="value">Value to cast</param>
 /// <param name="valueType">Desired type to cast to</param>
 public Cast(VariableBase value, Type valueType)
 {
     Value = value;
     ValueType = valueType;
 }
コード例 #17
0
ファイル: MethodBase.cs プロジェクト: OxPatient/Rule-Engine
 /// <summary>
 ///     Creates a while statement
 /// </summary>
 /// <param name="leftHandSide">Left hand side variable</param>
 /// <param name="comparisonType">Comparison type</param>
 /// <param name="rightHandSide">Right hand side variable</param>
 /// <returns>The while object</returns>
 public virtual While While(VariableBase leftHandSide, Comparison comparisonType, VariableBase rightHandSide)
 {
     SetCurrentMethod();
     var tempCommand = new While(comparisonType, leftHandSide, rightHandSide);
     tempCommand.Setup();
     Commands.Add(tempCommand);
     return tempCommand;
 }
コード例 #18
0
ファイル: Throw.cs プロジェクト: OxPatient/Rule-Engine
 /// <summary>
 ///     Constructor
 /// </summary>
 /// <param name="exception">Exception to throw</param>
 public Throw(VariableBase exception)
 {
     Exception = exception;
 }