예제 #1
0
        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;
            }
        }
예제 #2
0
        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;
            }
        }
예제 #3
0
        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;
            }
        }
예제 #4
0
        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);
        }