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); }
private void DecompileReplicationBlock(TextBuilder result, StatementList statementList) { result.Append("replication\n{\n").PushIndent(); for (int i = 0; i < statementList.Count; i++) { List <String> names = FindReplicatedProperties(statementList [i].StartOffset); if (names.Count > 0) { result.Indent().Append("if (").Append(statementList[i].Token.ToString()).Append(")").NewLine(); result.Indent().Append(" "); foreach (string name in names) { result.Append(name); if (name != names.Last()) { result.Append(", "); } } result.Append(";").NewLine().NewLine(); } } result.Append("}").NewLine().NewLine().PopIndent(); }
protected void DecompileBytecode(StatementList statements, TextBuilder result, bool createControlStatements) { var labelTableStatement = statements.Find(s => s.Token is LabelTableToken); var labelTable = labelTableStatement != null ? (LabelTableToken) labelTableStatement.Token : null; result.HasErrors = statements.HasErrors(); if (createControlStatements) { try { statements.CreateControlStatements(); } catch (Exception) { ProblemRegistry.RegisterIncompleteControlFlow(this); } if (statements.IsIncompleteControlFlow()) { ProblemRegistry.RegisterIncompleteControlFlow(this); } statements.RemoveRedundantReturns(); } statements.Print(result, labelTable, !createControlStatements); }
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; }
protected void DecompileBytecode(StatementList statements, TextBuilder result, bool createControlStatements) { var labelTableStatement = statements.Find(s => s.Token is LabelTableToken); var labelTable = labelTableStatement != null ? (LabelTableToken)labelTableStatement.Token : null; result.HasErrors = statements.HasErrors(); if (createControlStatements) { try { statements.CreateControlStatements(); } catch (Exception) { ProblemRegistry.RegisterIncompleteControlFlow(this); } if (statements.IsIncompleteControlFlow()) { ProblemRegistry.RegisterIncompleteControlFlow(this); } statements.RemoveRedundantReturns(); } statements.Print(result, labelTable, !createControlStatements); }
public WhileStatement(int startOffset, BytecodeToken token, StatementList children, int endOffset) : base(startOffset, token, children, endOffset) { }
private static void RemoveRedundantPop(StatementList children) { for(int i=0; i<children.Count; i++) { if (children [i] is CompositeStatement) { RemoveRedundantPop(((CompositeStatement) children [i]).Children); } else if (i < children.Count-1 && children [i].Token is IteratorPopToken && children [i+1].Token is ReturnToken) { children.RemoveRange(i, 1); } } }
protected CompositeStatement(int startOffset, BytecodeToken token, StatementList children, int endOffset) : base(startOffset, token) { _children = children; _children.Parent = this; EndOffset = endOffset; }
internal void ReplaceRange(int index, StatementList oldStatements, Statement newStatement) { oldStatements._statements.ForEach(c => _statements.Remove(c)); _statements.Insert(index, newStatement); newStatement.Parent = _parent; }
private void DecompileReplicationBlock(TextBuilder result, StatementList statementList) { result.Append("replication\n{\n").PushIndent(); for(int i=0; i<statementList.Count; i++) { List<String> names = FindReplicatedProperties(statementList [i].StartOffset); if (names.Count > 0) { result.Indent().Append("if (").Append(statementList[i].Token.ToString()).Append(")").NewLine(); result.Indent().Append(" "); foreach (string name in names) { result.Append(name); if (name != names.Last()) result.Append(", "); } result.Append(";").NewLine().NewLine(); } } result.Append("}").NewLine().NewLine().PopIndent(); }
public SwitchStatement(int startOffset, BytecodeToken token, StatementList children, int endOffset) : base(startOffset, token, children, endOffset) { }