public void VisitNegateUnaryOp(NegateUnaryOpNode node) { node.RHS.AcceptExpressionVisitor(_expressionVisitor); int startAddr = _builder.AddInstruction(OpCode.PUSHWORD, 0); _builder.AddInstruction(OpCode.SUB); _builder.AddDebugSymbol(startAddr, node); }
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); }
public void VisitCompareInequalityBinOp(CompareInequalityBinOpNode node) { node.RHS.AcceptExpressionVisitor(_expressionVisitor); node.LHS.AcceptExpressionVisitor(_expressionVisitor); ComparisonOperationAddress = _functionBuilder.InstructionCount; _functionBuilder.AddInstruction(OpCode.CMPE); _functionBuilder.AddInstruction(OpCode.LNOT); }