예제 #1
0
        public override void Compile(ILProcessor processor, AstVariableDefinition variable, CilCompilationContext context)
        {
            var variableDefinition = context.DefineVariable(variable.Name, variable.Type);

            context.MapDefinition(variable, variableDefinition);

            if (variable.AssignedValue == null)
            {
                return;
            }

            context.Compile(variable.AssignedValue);
            processor.Emit(OpCodes.Stloc, variableDefinition);
        }
예제 #2
0
        public static void CompileTarget(ILProcessor processor, IAstExpression target, IAstMethodReference function, CilCompilationContext context)
        {
            context.Compile(target);
            if (function.Location == MethodLocation.Extension)
                return;

            var targetType = context.ConvertReference(target.ExpressionType);
            if (!targetType.IsValueType)
                return;

            var variable = context.DefineVariable("x", targetType);
            processor.Emit(OpCodes.Stloc, variable);
            processor.Emit(OpCodes.Ldloca_S, variable);
        }
예제 #3
0
        public override void Compile(ILProcessor processor, AstListInitializer initializer, CilCompilationContext context)
        {
            var temporaryVariable = context.DefineVariable("temp", initializer.ExpressionType);
            var elementType       = context.ConvertReference(initializer.Elements[0].ExpressionType); // temporary cheating

            processor.EmitLdcI4(initializer.Elements.Count);
            processor.Emit(OpCodes.Newarr, elementType);
            processor.Emit(OpCodes.Stloc, temporaryVariable);
            for (var i = 0; i < initializer.Elements.Count; i++)
            {
                processor.Emit(OpCodes.Ldloc, temporaryVariable);
                processor.EmitLdcI4(i);
                EmitStelem(processor, elementType, initializer.Elements[i], context);
            }

            processor.Emit(OpCodes.Ldloc, temporaryVariable);
        }
예제 #4
0
        private static void EmitBigIntegerBytes(ILProcessor processor, BigInteger value, CilCompilationContext context)
        {
            var bytes         = value.ToByteArray();
            var bytesVariable = context.DefineVariable("t", ByteArray); // temporary cheating

            processor.EmitLdcI4(bytes.Length);
            processor.Emit(OpCodes.Newarr, context.ConvertReference(Byte));
            processor.Emit(OpCodes.Stloc, bytesVariable);
            for (var i = 0; i < bytes.Length; i++)
            {
                processor.Emit(OpCodes.Ldloc, bytesVariable);
                processor.EmitLdcI4(i);
                processor.EmitLdcI4(bytes[i]);
                processor.Emit(OpCodes.Stelem_I1);
            }

            processor.Emit(OpCodes.Ldloc, bytesVariable);
        }
예제 #5
0
        public static void CompileTarget(ILProcessor processor, IAstExpression target, IAstMethodReference function, CilCompilationContext context)
        {
            context.Compile(target);
            if (function.Location == MethodLocation.Extension)
            {
                return;
            }

            var targetType = context.ConvertReference(target.ExpressionType);

            if (!targetType.IsValueType)
            {
                return;
            }

            var variable = context.DefineVariable("x", targetType);

            processor.Emit(OpCodes.Stloc, variable);
            processor.Emit(OpCodes.Ldloca_S, variable);
        }
예제 #6
0
        private static void CompileDecimal(ILProcessor processor, PrimitiveValue value, CilCompilationContext context)
        {
            var @decimal = (Decimal)value.Value;
            var bits     = @decimal.GetBits();

            var bitsVariable = context.DefineVariable("t", Int32Array); // temporary cheating

            processor.EmitLdcI4(bits.Length);
            processor.Emit(OpCodes.Newarr, context.ConvertReference(Int32));
            processor.Emit(OpCodes.Stloc, bitsVariable);
            for (var i = 0; i < bits.Length; i++)
            {
                processor.Emit(OpCodes.Ldloc, bitsVariable);
                processor.EmitLdcI4(i);
                processor.EmitLdcI4(bits[i]);
                processor.Emit(OpCodes.Stelem_I4);
            }
            processor.Emit(OpCodes.Ldloc, bitsVariable);
            processor.Emit(OpCodes.Newobj, context.ConvertReference(NewDecimalFromBits));
        }