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"));
                }
            }
Пример #2
0
 public void Visit(ASTNode_Application node)
 {
     node.procedureNode.AcceptVisitor(this);
     foreach (var n in node.actualNodes)
     {
         n.AcceptVisitor(this);
     }
 }
Пример #3
0
            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);
            }
Пример #4
0
 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);
 }
Пример #5
0
            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"));
                }
            }
Пример #6
0
 public void Visit(ASTNode_Application node)
 {
     node.procedureNode.AcceptVisitor(this);
     foreach (var n in node.actualNodes) n.AcceptVisitor(this);
 }