/// <summary> /// Builds subroutine /// </summary> /// <param name="subNode">Subroutine node</param> /// <param name="subSym">Subroutine symbol</param> private void BuildSubroutine(ASTSubStatementNode subNode, UserSubroutine subSym) { _context = new MethodContext(_codeHolder.GetMethodBuilder(subNode.Name, subSym), subSym.GetLocalsList()); _emitter = new CodeEmiter(_context.ILGenerator); if (subNode.Body != null) { BuildStatement(subNode.Body); } else { _emitter.Nop(); } _emitter.MarkLabel(_context.MethodEnd); _emitter.Ret(); _builtSubs.Add(subNode.Name, _context); //add to built }
private void CheckSubroutine(ASTSubStatementNode subNode) { _currentSub = (UserSubroutine)_symbolTable.FindSymbol(subNode.Name); if (subNode.Body != null) { CheckBody(subNode.Body); } else { _messages.Add(new MessageRecord( MsgCode.EmptyBody, subNode.SourcePath, subNode.StartLine, subNode.StartPos, null )); } }
private void VisitSubStatement(ASTSubStatementNode subNode) { //check overriding var existsSub = (ISubroutine)Symbols.FindSymbol(subNode.Name); if (existsSub != null) { if (existsSub is NativeSubroutine) { Messages.Add(new MessageRecord(MsgCode.NativeSubOverride, subNode.SourcePath, subNode.StartLine, subNode.StartPos, subNode.Name)); } else { Messages.Add(new MessageRecord(MsgCode.UserSubOverride, subNode.SourcePath, subNode.StartLine, subNode.StartPos, subNode.Name)); } } else { UserSubroutine sub = new UserSubroutine(subNode); //add arguments if (subNode.ArgList != null) { foreach (var a in subNode.ArgList.Arguments) { sub.AddLocal(a.Name, new Argument()); } } _currentSubroutine = sub; //body check if (subNode.Body != null) { VisitBodyStatement(subNode.Body); } Symbols.AddSymbol(subNode.Name, _currentSubroutine); } }
public UserSubroutine(ASTSubStatementNode node) { Node = node; _locals = new Dictionary <string, ISymbol>(); }