Exemple #1
0
        public void VisitNegateUnaryOp(NegateUnaryOpNode node)
        {
            node.RHS.AcceptExpressionVisitor(_expressionVisitor);
            int startAddr = _builder.AddInstruction(OpCode.PUSHWORD, 0);

            _builder.AddInstruction(OpCode.SUB);
            _builder.AddDebugSymbol(startAddr, node);
        }
Exemple #2
0
        private ILFunction GenerateFunction(FunctionDefinitionNode node, List <string> strings)
        {
            StackLayoutGenerator layoutGenerator = new StackLayoutGenerator(_typeSizeManager);

            layoutGenerator.VisitFunctionDefinition(node);
            FunctionStackLayout    layout  = layoutGenerator.GetLayout();
            FunctionBuilder        builder = new FunctionBuilder(layout, _module.BaseModule.SymbolMap);
            FunctionCodeGenVisitor functionCodeGenVisitor = new FunctionCodeGenVisitor(
                builder, layout, _functionManager, _module, _semanticContext, _structLayoutManager,
                _typeSizeManager, strings);

            builder.AddInstruction(OpCode.PUSH, 0, layout.EndAddress);
            functionCodeGenVisitor.VisitBody(node.Body);

            if (builder.InstructionCount == 0 || builder.Instructions[builder.InstructionCount - 1].Op != OpCode.RETURN)
            {
                builder.AddInstruction(OpCode.RETURN);
            }

            return(builder.Build(node));
        }
        public void VisitAssignment(AssignmentNode node)
        {
            AddressOfVisitor addressOfVisitor
                = new AddressOfVisitor(_layout, _module, _structLayoutManager);

            node.Lhs.AcceptAddressableVisitor(addressOfVisitor);

            node.Rhs.AcceptExpressionVisitor(this);

            int size = GetExpressionResultSize(node.Rhs);
            int addr = _functionBuilder.AddInstruction(OpCode.WRITE, addressOfVisitor.AbsoluteStackAddress, size);

            _functionBuilder.AddDebugSymbol(addr, node);
        }
Exemple #4
0
 public void VisitCompareInequalityBinOp(CompareInequalityBinOpNode node)
 {
     node.RHS.AcceptExpressionVisitor(_expressionVisitor);
     node.LHS.AcceptExpressionVisitor(_expressionVisitor);
     ComparisonOperationAddress = _functionBuilder.InstructionCount;
     _functionBuilder.AddInstruction(OpCode.CMPE);
     _functionBuilder.AddInstruction(OpCode.LNOT);
 }