protected override IEnumerable <IAstElement> VisitOrTransformChildren(AstElementTransform transform) { if (this.Result != null) { yield return(this.Result = (IAstExpression)transform(this.Result)); } }
private static object CompileAndEvaluate(IAstExpression expression) { var ast = new AstRoot( new ImportDefinition(new CompositeName("System")), new ImportDefinition(new CompositeName("System", "Linq")), new AstTypeDefinition( TypeDefintionTypes.Class, "Interactive", new AstFunctionDefinition("Evaluate", No.Parameters, new[] { new AstReturnStatement(expression) }, AstImplicitType.Instance) { Compilation = { Static = true } } ) ); ast = (AstRoot)processor.Process(ast); var stream = new MemoryStream(); compiler.Compile(ast, stream, new CompilationArguments { AssemblyName = "Dynamic-" + Guid.NewGuid(), AssemblyVersion = new Version("1.0.0.0"), Target = CompilationTarget.Library }); var assembly = Assembly.Load(stream.ToArray()); // this obviously leaks memory var evaluate = assembly.GetType("Interactive", true).GetMethod("Evaluate"); return evaluate.Invoke(null, null); }
private void EmitStelem(ILProcessor processor, TypeReference elementType, IAstExpression element, CilCompilationContext context) { if (elementType.IsPrimitive) { if (!StelemCodes.ContainsKey(elementType.MetadataType)) { throw new NotImplementedException("ListInitializerCompiler.EmitStelem: Element metadata type " + elementType.MetadataType + " is not yet supported."); } context.Compile(element); processor.Emit(StelemCodes[elementType.MetadataType]); return; } if (elementType.IsValueType) { processor.Emit(OpCodes.Ldelema, elementType); context.Compile(element); processor.Emit(OpCodes.Stobj, elementType); return; } context.Compile(element); processor.Emit(OpCodes.Stelem_Ref); }
public AstPropertyDefinition(string name, IAstTypeReference type, IAstExpression assignedValue) { Argument.RequireNotNullAndNotEmpty("name", name); this.Name = name; this.Type = type; this.AssignedValue = assignedValue; }
protected override IEnumerable <IAstElement> VisitOrTransformChildren(AstElementTransform transform) { yield return(this.Type = (IAstTypeReference)transform(this.Type)); if (this.AssignedValue != null) { yield return(this.AssignedValue = (IAstExpression)transform(this.AssignedValue)); } }
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 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 AstVariableDefinition(string name, IAstTypeReference type, IAstExpression value) { this.Name = @name; this.Type = type; this.AssignedValue = value; }
private void CompileFieldOrPropertyAssignment(ILProcessor processor, AstPropertyExpression property, IAstExpression value, CilCompilationContext context) { processor.Emit(OpCodes.Ldarg_0); context.Compile(value); var fieldOrProperty = context.ConvertReference(property.Reference); var field = fieldOrProperty.As <FieldReference>(); if (field == null) { throw new NotImplementedException("AssignmentCompiler: Assignment to " + fieldOrProperty + " is not yet supported."); } processor.Emit(OpCodes.Stfld, field); }
protected override IEnumerable<IAstElement> VisitOrTransformChildren(AstElementTransform transform) { yield return this.Left = (IAstExpression)transform(this.Left); yield return this.Operator = (IAstMethodReference)transform(this.Operator); yield return this.Right = (IAstExpression)transform(this.Right); }
protected override IEnumerable <IAstElement> VisitOrTransformChildren(AstElementTransform transform) { yield return(this.Target = (IAstAssignable)transform(this.Target)); yield return(this.Value = (IAstExpression)transform(this.Value)); }
protected override IEnumerable<IAstElement> VisitOrTransformChildren(AstElementTransform transform) { if (this.Result != null) yield return this.Result = (IAstExpression)transform(this.Result); }
public AstReturnStatement(IAstExpression result) { Result = result; }
public AssignmentStatement(IAstAssignable target, IAstExpression value) { this.Target = target; this.Value = value; }
protected override IEnumerable<IAstElement> VisitOrTransformChildren(AstElementTransform transform) { yield return this.Target = (IAstAssignable)transform(this.Target); yield return this.Value = (IAstExpression)transform(this.Value); }
public BinaryExpression(IAstExpression left, IAstMethodReference @operator, IAstExpression right) { this.Left = left; this.Operator = @operator; this.Right = right; }