예제 #1
0
        protected StatementList ReadBytecode()
        {
            var s          = new MemoryStream(_bytecode);
            var reader     = new BinaryReader(s);
            var bcReader   = new BytecodeReader(_self.Package, reader);
            var statements = new StatementList((Statement)null);

            while (s.Position < s.Length)
            {
                int           startOffset = (int)s.Position;
                BytecodeToken bc;
                try
                {
                    bc = bcReader.ReadNext();
                }
                catch (EndOfStreamException)
                {
                    break;
                }
                if (bc == null || bc is EndOfScriptToken)
                {
                    break;
                }
                statements.Add(new Statement(startOffset, (int)s.Position, bc));
                if (bc is ErrorBytecodeToken)
                {
                    var errorToken = (ErrorBytecodeToken)bc;
                    int bytecode   = errorToken.UnknownBytecode;
                    if (bytecode >= 0)
                    {
                        ProblemRegistry.RegisterUnknownBytecode((byte)bytecode, this, errorToken.SubsequentBytes);
                    }
                    else
                    {
                        ProblemRegistry.RegisterBytecodeError(this, errorToken.ToString());
                    }
                    break;
                }
            }
            return(statements);
        }
예제 #2
0
 protected StatementList ReadBytecode()
 {
     var s = new MemoryStream(_bytecode);
     var reader = new BinaryReader(s);
     var bcReader = new BytecodeReader(_self.Package, reader);
     var statements = new StatementList((Statement) null);
     while(s.Position < s.Length)
     {
         int startOffset = (int) s.Position;
         BytecodeToken bc;
         try
         {
             bc = bcReader.ReadNext();
         }
         catch (EndOfStreamException)
         {
             break;
         }
         if (bc == null || bc is EndOfScriptToken) break;
         statements.Add(new Statement(startOffset, (int) s.Position, bc));
         if (bc is ErrorBytecodeToken)
         {
             var errorToken = (ErrorBytecodeToken) bc;
             int bytecode = errorToken.UnknownBytecode;
             if (bytecode >= 0)
             {
                 ProblemRegistry.RegisterUnknownBytecode((byte) bytecode, this, errorToken.SubsequentBytes);
             }
             else
             {
                 ProblemRegistry.RegisterBytecodeError(this, errorToken.ToString());
             }
             break;
         }
     }
     return statements;
 }
예제 #3
0
 private StatementListBuilder AddStatement(int offset, BytecodeToken token)
 {
     _list.Add(new Statement(offset, token));
     return(this);
 }