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); }
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); }
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); }
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); }
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); }
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)); }