public void Visit(ASTNode_Application node) { var delegateType = JITInterpreter_DS.Instance().GetDelegateType(node.actualNodes.Count); mTailCallFlags.Push(false); node.procedureNode.AcceptVisitor(this); mTailCallFlags.Pop(); mILGenerator.Emit(OpCodes.Castclass, delegateType); foreach (var n in node.actualNodes) { mTailCallFlags.Push(false); n.AcceptVisitor(this); mTailCallFlags.Pop(); } if (mTailCallFlags.All(b => b)) { mILGenerator.Emit(OpCodes.Tailcall); mILGenerator.Emit(OpCodes.Callvirt, delegateType.GetMethod("Invoke")); mILGenerator.Emit(OpCodes.Ret); } else { mILGenerator.Emit(OpCodes.Callvirt, delegateType.GetMethod("Invoke")); } }
public void Visit(ASTNode_Application node) { node.procedureNode.AcceptVisitor(this); foreach (var n in node.actualNodes) { n.AcceptVisitor(this); } }
public void Visit(ASTNode_Application node) { node.procedureNode.AcceptVisitor(this); var p = (Procedure)Value; var actuals = new List <object>(); foreach (var e in node.actualNodes) { e.AcceptVisitor(this); actuals.Add(Value); } Value = p(actuals); }
public void Visit(ASTNode_Application node) { node.procedureNode.AcceptVisitor(this); var p = (Procedure)Value; var actuals = new List<object>(); foreach (var e in node.actualNodes) { e.AcceptVisitor(this); actuals.Add(Value); } Value = p(actuals); }
public void Visit(ASTNode_Application node) { var delegateType = JITInterpreter_DS2.Instance().GetDelegateType(node.actualNodes.Count); mTaillCallFlags.Push(false); node.procedureNode.AcceptVisitor(this); mTaillCallFlags.Pop(); mILGenerator.Emit(OpCodes.Castclass, delegateType); foreach (var n in node.actualNodes) { mTaillCallFlags.Push(false); n.AcceptVisitor(this); mTaillCallFlags.Pop(); } if (mTaillCallFlags.All(b => b)) { mILGenerator.Emit(OpCodes.Tailcall); mILGenerator.Emit(OpCodes.Callvirt, delegateType.GetMethod("Invoke")); mILGenerator.Emit(OpCodes.Ret); } else { mILGenerator.Emit(OpCodes.Callvirt, delegateType.GetMethod("Invoke")); } }
public void Visit(ASTNode_Application node) { node.procedureNode.AcceptVisitor(this); foreach (var n in node.actualNodes) n.AcceptVisitor(this); }