@Override
    protected final void factorToStack() {
        Instructions instructions = getInstructions();
        LOG.print("push the first arithmetic factor to stack");
        leftFactor.loadToStack(block);
        if(LOG.isPrintEnabled()){
            if(!leftFactor.getResultType().equals(targetClass)){
                LOG.print("cast arithmetic factor from " + leftFactor.getResultType() + " to " + targetClass);
            }
        }
        instructions.unbox(leftFactor.getResultType().getType());
        instructions.cast(leftFactor.getResultType().getType(), targetClass.getType());
        
        if(LOG.isPrintEnabled()) {
            LOG.print("push the second arithmetic factor to stack");	
        }
        rightFactor.loadToStack(block);
        
        if(LOG.isPrintEnabled()){
            if(!rightFactor.getResultType().equals(targetClass)){
                LOG.print("cast arithmetic factor from " + rightFactor.getResultType() + " to " + targetClass);
            }
        }

        instructions.unbox(rightFactor.getResultType().getType());
        
        if(getOperatorSymbol().equals(Operator.SHIFT_LEFT) ||
           getOperatorSymbol().equals(Operator.SHIFT_RIGHT) ||
           getOperatorSymbol().equals(Operator.UNSIGNED_SHIFT_RIGHT) ){
            instructions.cast(rightFactor.getResultType().getType(), getType(int.class).getType());
        }else{
            instructions.cast(rightFactor.getResultType().getType(), targetClass.getType());
        }
    }