Exemplo n.º 1
0
 /// <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
 }
Exemplo n.º 2
0
 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
                           ));
     }
 }
Exemplo n.º 3
0
        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);
            }
        }
Exemplo n.º 4
0
 public UserSubroutine(ASTSubStatementNode node)
 {
     Node    = node;
     _locals = new Dictionary <string, ISymbol>();
 }