public void SaveBranchStackValue(OpCodePart opCode, BaseWriter baseWriter) { switch (opCode.ToCode()) { case Code.Br: case Code.Br_S: case Code.Beq: case Code.Beq_S: case Code.Blt: case Code.Blt_S: case Code.Bgt: case Code.Bgt_S: case Code.Ble: case Code.Ble_S: case Code.Bge: case Code.Bge_S: case Code.Blt_Un: case Code.Blt_Un_S: case Code.Bgt_Un: case Code.Bgt_Un_S: case Code.Ble_Un: case Code.Ble_Un_S: case Code.Bge_Un: case Code.Bge_Un_S: case Code.Bne_Un: case Code.Bne_Un_S: case Code.Brtrue: case Code.Brtrue_S: case Code.Brfalse: case Code.Brfalse_S: if (opCode.IsJumpForward() && this.main.Any()) { // to clone whole stack var clonedStack = this.main.ToList(); clonedStack.Reverse(); opCode.BranchStackValue = new Stack <OpCodePart>(clonedStack); } break; } }
public void SaveBranchStackValue(OpCodePart opCode, BaseWriter baseWriter) { switch (opCode.ToCode()) { case Code.Br: case Code.Br_S: case Code.Beq: case Code.Beq_S: case Code.Blt: case Code.Blt_S: case Code.Bgt: case Code.Bgt_S: case Code.Ble: case Code.Ble_S: case Code.Bge: case Code.Bge_S: case Code.Blt_Un: case Code.Blt_Un_S: case Code.Bgt_Un: case Code.Bgt_Un_S: case Code.Ble_Un: case Code.Ble_Un_S: case Code.Bge_Un: case Code.Bge_Un_S: case Code.Bne_Un: case Code.Bne_Un_S: case Code.Brtrue: case Code.Brtrue_S: case Code.Brfalse: case Code.Brfalse_S: if (opCode.IsJumpForward() && this.main.Any()) { opCode.BranchStackValue = this.main.Peek(); } break; } }
public void SaveBranchStackValue(OpCodePart opCode, BaseWriter baseWriter) { switch (opCode.ToCode()) { case Code.Br: case Code.Br_S: case Code.Beq: case Code.Beq_S: case Code.Blt: case Code.Blt_S: case Code.Bgt: case Code.Bgt_S: case Code.Ble: case Code.Ble_S: case Code.Bge: case Code.Bge_S: case Code.Blt_Un: case Code.Blt_Un_S: case Code.Bgt_Un: case Code.Bgt_Un_S: case Code.Ble_Un: case Code.Ble_Un_S: case Code.Bge_Un: case Code.Bge_Un_S: case Code.Bne_Un: case Code.Bne_Un_S: case Code.Brtrue: case Code.Brtrue_S: case Code.Brfalse: case Code.Brfalse_S: if (opCode.IsJumpForward() && this.main.Any()) { // to clone whole stack var clonedStack = this.main.ToList(); clonedStack.Reverse(); opCode.BranchStackValue = new Stack<OpCodePart>(clonedStack); } break; } }
private static bool JumpOrLabelPoint(OpCodePart current, out bool startOrEnd) { if ((current.OpCode.FlowControl == FlowControl.Cond_Branch || current.OpCode.FlowControl == FlowControl.Branch) && current.IsJumpForward() && !current.Any(Code.Leave, Code.Leave_S)) { startOrEnd = false; return(true); } if (current.JumpDestination != null && current.JumpDestination.Any()) { startOrEnd = true; return(true); } startOrEnd = false; return(false); }