Beispiel #1
0
 private static int DumpNextBytecodes(StreamWriter writer, UnBytecodeOwner function, byte[] bytes, int startOffset, int nextBytecodes)
 {
     using (var stream = new MemoryStream(bytes))
     {
         stream.Position = startOffset;
         using (var reader = new BinaryReader(stream))
         {
             var bytecodeReader = new BytecodeReader(function.Package, reader);
             for (int i = 0; i < nextBytecodes; i++)
             {
                 try
                 {
                     var bytecodeToken = bytecodeReader.ReadNext();
                     writer.WriteLine($"      {bytecodeToken}");
                 }
                 catch (Exception)
                 {
                     writer.WriteLine("      error reading next bytecode");
                     break;
                 }
             }
             return((int)reader.BaseStream.Position);
         }
     }
 }
Beispiel #2
0
        protected StatementList ReadBytecode(out BytecodeReader bcReader)
        {
            var s      = new MemoryStream(_bytecode);
            var reader = new EndianReader(s)
            {
                Endian = _self.FileRef.Endian
            };

            bcReader = new BytecodeReader(_self.FileRef, reader);
            var  statements  = new StatementList((Statement)null);
            bool keepParsing = true;

            while (s.Position < s.Length && keepParsing)
            {
                int startOffset = (int)s.Position;
                //Debug.WriteLine("Reading token at 0x" + startOffset.ToString("X4"));

                BytecodeToken bc;
                try
                {
                    bc = bcReader.ReadNext();
                }
                catch (Exception)
                {
                    //extra bytes at the end can trigger this. They are not used. may be something like byte aligning or something
                    break;
                }
                if (bc == null /*|| bc is EndOfScriptToken*/)
                {
                    break;
                }
                statements.Add(new Statement(startOffset, (int)s.Position, bc, bcReader));
                if (bc is ErrorBytecodeToken errorToken)
                {
                    int bytecode = errorToken.UnknownBytecode;
                    if (bytecode >= 0)
                    {
                        ProblemRegistry.RegisterUnknownBytecode((byte)bytecode, this, errorToken.SubsequentBytes);
                    }
                    else
                    {
                        ProblemRegistry.RegisterBytecodeError(this, errorToken.ToString());
                    }
                    break;
                }

                if (/*bc is LabelTableToken || /*bc is StopToken ||*/ bc is EndOfScriptToken)
                {
                    keepParsing = false;
                    break; //Nothing else to parse is bytecode
                }
            }
            return(statements);
        }