예제 #1
0
 public void Compile(CompilationContext context)
 {
     targetObject.Compile(context);
     value.Compile(context);
     CompilationHelper.PrepareValueOnStack(context, fieldInfo.FieldType, value.itemType);
     context.Emit(OpCodes.Stfld, fieldInfo);
 }
예제 #2
0
        public static void EmitCall(
            CompilationContext context,
            IAstRefOrAddr invocationObject,
            MethodInfo methodInfo,
            List<IAstStackItem> arguments)
        {
            if (arguments == null)
            {
                arguments = new List<IAstStackItem>();
            }
            if (invocationObject != null)
            {
                invocationObject.Compile(context);
            }

            ParameterInfo[] args = methodInfo.GetParameters();
            if (args.Length != arguments.Count)
            {
                throw new Exception("Invalid method parameters count");
            }

            for (int i = 0; i < args.Length; ++i)
            {
                arguments[i].Compile(context);
                PrepareValueOnStack(context, args[i].ParameterType, arguments[i].itemType);
            }
            if (methodInfo.IsVirtual)
            {
                context.EmitCall(OpCodes.Callvirt, methodInfo);
            }
            else
            {
                context.EmitCall(OpCodes.Call, methodInfo);
            }
        }
    /// <summary>
    ///   Emits the call.
    /// </summary>
    /// <param name="context">The context.</param>
    /// <param name="invocationObject">The invocation object.</param>
    /// <param name="methodInfo">The method info.</param>
    /// <param name="arguments">The arguments.</param>
    /// <exception cref="Exception"></exception>
    public static void EmitCall(
        CompilationContext context,
        IAstRefOrAddr invocationObject,
        MethodInfo methodInfo,
        List <IAstStackItem> arguments)
    {
        arguments ??= new List <IAstStackItem>();

        if (invocationObject != null)
        {
            invocationObject.Compile(context);
        }

        var args = methodInfo.GetParameters();

        if (args.Length != arguments.Count)
        {
            throw new Exception("Invalid method parameters count");
        }

        for (var i = 0; i < args.Length; ++i)
        {
            arguments[i].Compile(context);
            PrepareValueOnStack(context, args[i].ParameterType, arguments[i].ItemType);
        }

        context.EmitCall(methodInfo.IsVirtual ? OpCodes.Callvirt : OpCodes.Call, methodInfo);
    }
예제 #4
0
 public virtual void Compile(CompilationContext context)
 {
     if (sourceObject != null)
     {
         sourceObject.Compile(context);
         context.Emit(OpCodes.Ldfld, fieldInfo);
     }
     else
     {
         context.Emit(OpCodes.Ldsfld, fieldInfo);
     }
 }
 /// <summary>
 /// </summary>
 /// <param name="context">The context.</param>
 public virtual void Compile(CompilationContext context)
 {
     SourceObject.Compile(context);
     context.Emit(OpCodes.Ldfld, FieldInfo);
 }