public bool VisitNode(SwitchStatement node) { // switch (expression) { /n contents /n } Write("switch ("); node.Expression.AcceptVisitor(this); Append(") {0}", "{"); NestingLevel += 2; // double-indent, only case/default are single-indented node.Body.AcceptVisitor(this); NestingLevel -= 2; Write("{0}", "}"); return true; }
public bool VisitNode(SwitchStatement node) { throw new NotImplementedException(); }
public SwitchStatement DecompileSwitch() { PopByte(); var objIndex = ReadObject(); var unknByte = ReadByte(); var expr = DecompileExpression(); var scopeStatements = new List<Statement>(); UInt16 endOffset = 0xFFFF; // set it at max to begin with, so we can begin looping Scopes.Add(scopeStatements); CurrentScope.Push(Scopes.Count - 1); while (Position < endOffset && Position < Size) { if (CurrentIs(StandardByteCodes.Jump)) // break detected, save the endOffset { // executes for all occurences, to handle them all. StartPositions.Push((UInt16)Position); PopByte(); endOffset = ReadUInt16(); var breakStatement = new BreakStatement(null, null); StatementLocations.Add(StartPositions.Pop(), breakStatement); scopeStatements.Add(breakStatement); continue; } var current = DecompileStatement(); if (current == null) return null; // ERROR ? scopeStatements.Add(current); if (current is DefaultStatement && endOffset == 0xFFFF) break; // If no break was detected, we end the switch rather than include the rest of ALL code in the default. } CurrentScope.Pop(); var statement = new SwitchStatement(expr, new CodeBody(scopeStatements, null, null), null, null); StatementLocations.Add(StartPositions.Pop(), statement); return statement; }