class org.jruby.util.ShellLauncher$ChannelPumper extends java.lang.Thread implements org.jruby.util.ShellLauncher$Pumper
  minor version: 0
  major version: 59
  flags: flags: (0x0020) ACC_SUPER
  this_class: org.jruby.util.ShellLauncher$ChannelPumper
  super_class: java.lang.Thread
{
  private final java.nio.channels.FileChannel inChannel;
    descriptor: Ljava/nio/channels/FileChannel;
    flags: (0x0012) ACC_PRIVATE, ACC_FINAL

  private final java.nio.channels.FileChannel outChannel;
    descriptor: Ljava/nio/channels/FileChannel;
    flags: (0x0012) ACC_PRIVATE, ACC_FINAL

  private final org.jruby.util.ShellLauncher$Pumper$Slave slave;
    descriptor: Lorg/jruby/util/ShellLauncher$Pumper$Slave;
    flags: (0x0012) ACC_PRIVATE, ACC_FINAL

  private final java.lang.Object sync;
    descriptor: Ljava/lang/Object;
    flags: (0x0012) ACC_PRIVATE, ACC_FINAL

  private volatile boolean quit;
    descriptor: Z
    flags: (0x0042) ACC_PRIVATE, ACC_VOLATILE

  private final org.jruby.Ruby runtime;
    descriptor: Lorg/jruby/Ruby;
    flags: (0x0012) ACC_PRIVATE, ACC_FINAL

  private static volatile int[] $SWITCH_TABLE$org$jruby$util$ShellLauncher$Pumper$Slave;
    descriptor: [I
    flags: (0x104a) ACC_PRIVATE, ACC_STATIC, ACC_VOLATILE, ACC_SYNTHETIC

  void <init>(org.jruby.Ruby, java.nio.channels.FileChannel, java.nio.channels.FileChannel, org.jruby.util.ShellLauncher$Pumper$Slave, java.lang.Object);
    descriptor: (Lorg/jruby/Ruby;Ljava/nio/channels/FileChannel;Ljava/nio/channels/FileChannel;Lorg/jruby/util/ShellLauncher$Pumper$Slave;Ljava/lang/Object;)V
    flags: (0x0000) 
    Code:
      stack=2, locals=6, args_size=6
        start local 0 // org.jruby.util.ShellLauncher$ChannelPumper this
        start local 1 // org.jruby.Ruby runtime
        start local 2 // java.nio.channels.FileChannel inChannel
        start local 3 // java.nio.channels.FileChannel outChannel
        start local 4 // org.jruby.util.ShellLauncher$Pumper$Slave slave
        start local 5 // java.lang.Object sync
         0: .line 1483
            aload 0 /* this */
            invokespecial java.lang.Thread.<init>:()V
         1: .line 1485
            aload 0 /* this */
            aload 2 /* inChannel */
            putfield org.jruby.util.ShellLauncher$ChannelPumper.inChannel:Ljava/nio/channels/FileChannel;
         2: .line 1486
            aload 0 /* this */
            aload 3 /* outChannel */
            putfield org.jruby.util.ShellLauncher$ChannelPumper.outChannel:Ljava/nio/channels/FileChannel;
         3: .line 1487
            aload 0 /* this */
            aload 4 /* slave */
            putfield org.jruby.util.ShellLauncher$ChannelPumper.slave:Lorg/jruby/util/ShellLauncher$Pumper$Slave;
         4: .line 1488
            aload 0 /* this */
            aload 5 /* sync */
            putfield org.jruby.util.ShellLauncher$ChannelPumper.sync:Ljava/lang/Object;
         5: .line 1489
            aload 0 /* this */
            aload 1 /* runtime */
            putfield org.jruby.util.ShellLauncher$ChannelPumper.runtime:Lorg/jruby/Ruby;
         6: .line 1490
            aload 0 /* this */
            iconst_1
            invokevirtual org.jruby.util.ShellLauncher$ChannelPumper.setDaemon:(Z)V
         7: .line 1491
            return
        end local 5 // java.lang.Object sync
        end local 4 // org.jruby.util.ShellLauncher$Pumper$Slave slave
        end local 3 // java.nio.channels.FileChannel outChannel
        end local 2 // java.nio.channels.FileChannel inChannel
        end local 1 // org.jruby.Ruby runtime
        end local 0 // org.jruby.util.ShellLauncher$ChannelPumper this
      LocalVariableTable:
        Start  End  Slot        Name  Signature
            0    8     0        this  Lorg/jruby/util/ShellLauncher$ChannelPumper;
            0    8     1     runtime  Lorg/jruby/Ruby;
            0    8     2   inChannel  Ljava/nio/channels/FileChannel;
            0    8     3  outChannel  Ljava/nio/channels/FileChannel;
            0    8     4       slave  Lorg/jruby/util/ShellLauncher$Pumper$Slave;
            0    8     5        sync  Ljava/lang/Object;
    MethodParameters:
            Name  Flags
      runtime     
      inChannel   
      outChannel  
      slave       
      sync        

  public void run();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=5, args_size=1
        start local 0 // org.jruby.util.ShellLauncher$ChannelPumper this
         0: .line 1494
            aload 0 /* this */
            getfield org.jruby.util.ShellLauncher$ChannelPumper.runtime:Lorg/jruby/Ruby;
            invokevirtual org.jruby.Ruby.getCurrentContext:()Lorg/jruby/runtime/ThreadContext;
            iconst_0
            invokevirtual org.jruby.runtime.ThreadContext.setEventHooksEnabled:(Z)V
         1: .line 1495
            sipush 1024
            invokestatic java.nio.ByteBuffer.allocateDirect:(I)Ljava/nio/ByteBuffer;
            astore 1 /* buf */
        start local 1 // java.nio.ByteBuffer buf
         2: .line 1496
            aload 1 /* buf */
            invokestatic com.headius.backport9.buffer.Buffers.clearBuffer:(Ljava/nio/Buffer;)Ljava/nio/Buffer;
            pop
         3: .line 1498
            goto 9
         4: .line 1499
      StackMap locals: java.nio.ByteBuffer
      StackMap stack:
            aload 0 /* this */
            getfield org.jruby.util.ShellLauncher$ChannelPumper.inChannel:Ljava/nio/channels/FileChannel;
            aload 1 /* buf */
            invokevirtual java.nio.channels.FileChannel.read:(Ljava/nio/ByteBuffer;)I
            istore 2 /* read */
        start local 2 // int read
         5: .line 1500
            iload 2 /* read */
            iconst_m1
            if_icmpne 6
            goto 40
         6: .line 1501
      StackMap locals: int
      StackMap stack:
            aload 1 /* buf */
            invokestatic com.headius.backport9.buffer.Buffers.flipBuffer:(Ljava/nio/Buffer;)Ljava/nio/Buffer;
            pop
         7: .line 1502
            aload 0 /* this */
            getfield org.jruby.util.ShellLauncher$ChannelPumper.outChannel:Ljava/nio/channels/FileChannel;
            aload 1 /* buf */
            invokevirtual java.nio.channels.FileChannel.write:(Ljava/nio/ByteBuffer;)I
            pop
         8: .line 1503
            aload 1 /* buf */
            invokestatic com.headius.backport9.buffer.Buffers.clearBuffer:(Ljava/nio/Buffer;)Ljava/nio/Buffer;
            pop
        end local 2 // int read
         9: .line 1498
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            getfield org.jruby.util.ShellLauncher$ChannelPumper.quit:Z
            ifne 40
            aload 0 /* this */
            getfield org.jruby.util.ShellLauncher$ChannelPumper.inChannel:Ljava/nio/channels/FileChannel;
            invokevirtual java.nio.channels.FileChannel.isOpen:()Z
            ifeq 40
            aload 0 /* this */
            getfield org.jruby.util.ShellLauncher$ChannelPumper.outChannel:Ljava/nio/channels/FileChannel;
            invokevirtual java.nio.channels.FileChannel.isOpen:()Z
            ifne 4
        10: .line 1505
            goto 40
      StackMap locals:
      StackMap stack: java.lang.Exception
        11: pop
        12: .line 1509
            aload 0 /* this */
            getfield org.jruby.util.ShellLauncher$ChannelPumper.sync:Ljava/lang/Object;
            dup
            astore 4
            monitorenter
        13: .line 1510
            invokestatic org.jruby.util.ShellLauncher$ChannelPumper.$SWITCH_TABLE$org$jruby$util$ShellLauncher$Pumper$Slave:()[I
            aload 0 /* this */
            getfield org.jruby.util.ShellLauncher$ChannelPumper.slave:Lorg/jruby/util/ShellLauncher$Pumper$Slave;
            invokevirtual org.jruby.util.ShellLauncher$Pumper$Slave.ordinal:()I
            iaload
            tableswitch { // 1 - 2
                    1: 18
                    2: 14
              default: 21
          }
        14: .line 1512
      StackMap locals: org.jruby.util.ShellLauncher$ChannelPumper java.nio.ByteBuffer top top java.lang.Object
      StackMap stack:
            aload 0 /* this */
            getfield org.jruby.util.ShellLauncher$ChannelPumper.outChannel:Ljava/nio/channels/FileChannel;
            invokevirtual java.nio.channels.FileChannel.close:()V
        15: goto 21
      StackMap locals:
      StackMap stack: java.io.IOException
        16: pop
        17: .line 1513
            goto 21
        18: .line 1515
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            getfield org.jruby.util.ShellLauncher$ChannelPumper.inChannel:Ljava/nio/channels/FileChannel;
            invokevirtual java.nio.channels.FileChannel.close:()V
        19: goto 21
      StackMap locals:
      StackMap stack: java.io.IOException
        20: pop
        21: .line 1509
      StackMap locals:
      StackMap stack:
            aload 4
            monitorexit
        22: goto 53
      StackMap locals:
      StackMap stack: java.lang.Throwable
        23: aload 4
            monitorexit
        24: athrow
        25: .line 1506
      StackMap locals: org.jruby.util.ShellLauncher$ChannelPumper java.nio.ByteBuffer
      StackMap stack: java.lang.Throwable
            astore 3
        26: .line 1509
            aload 0 /* this */
            getfield org.jruby.util.ShellLauncher$ChannelPumper.sync:Ljava/lang/Object;
            dup
            astore 4
            monitorenter
        27: .line 1510
            invokestatic org.jruby.util.ShellLauncher$ChannelPumper.$SWITCH_TABLE$org$jruby$util$ShellLauncher$Pumper$Slave:()[I
            aload 0 /* this */
            getfield org.jruby.util.ShellLauncher$ChannelPumper.slave:Lorg/jruby/util/ShellLauncher$Pumper$Slave;
            invokevirtual org.jruby.util.ShellLauncher$Pumper$Slave.ordinal:()I
            iaload
            tableswitch { // 1 - 2
                    1: 32
                    2: 28
              default: 35
          }
        28: .line 1512
      StackMap locals: org.jruby.util.ShellLauncher$ChannelPumper java.nio.ByteBuffer top java.lang.Throwable java.lang.Object
      StackMap stack:
            aload 0 /* this */
            getfield org.jruby.util.ShellLauncher$ChannelPumper.outChannel:Ljava/nio/channels/FileChannel;
            invokevirtual java.nio.channels.FileChannel.close:()V
        29: goto 35
      StackMap locals:
      StackMap stack: java.io.IOException
        30: pop
        31: .line 1513
            goto 35
        32: .line 1515
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            getfield org.jruby.util.ShellLauncher$ChannelPumper.inChannel:Ljava/nio/channels/FileChannel;
            invokevirtual java.nio.channels.FileChannel.close:()V
        33: goto 35
      StackMap locals:
      StackMap stack: java.io.IOException
        34: pop
        35: .line 1509
      StackMap locals:
      StackMap stack:
            aload 4
            monitorexit
        36: goto 39
      StackMap locals:
      StackMap stack: java.lang.Throwable
        37: aload 4
            monitorexit
        38: athrow
        39: .line 1518
      StackMap locals:
      StackMap stack:
            aload 3
            athrow
        40: .line 1509
      StackMap locals: org.jruby.util.ShellLauncher$ChannelPumper java.nio.ByteBuffer
      StackMap stack:
            aload 0 /* this */
            getfield org.jruby.util.ShellLauncher$ChannelPumper.sync:Ljava/lang/Object;
            dup
            astore 4
            monitorenter
        41: .line 1510
            invokestatic org.jruby.util.ShellLauncher$ChannelPumper.$SWITCH_TABLE$org$jruby$util$ShellLauncher$Pumper$Slave:()[I
            aload 0 /* this */
            getfield org.jruby.util.ShellLauncher$ChannelPumper.slave:Lorg/jruby/util/ShellLauncher$Pumper$Slave;
            invokevirtual org.jruby.util.ShellLauncher$Pumper$Slave.ordinal:()I
            iaload
            tableswitch { // 1 - 2
                    1: 46
                    2: 42
              default: 49
          }
        42: .line 1512
      StackMap locals: org.jruby.util.ShellLauncher$ChannelPumper java.nio.ByteBuffer top top java.lang.Object
      StackMap stack:
            aload 0 /* this */
            getfield org.jruby.util.ShellLauncher$ChannelPumper.outChannel:Ljava/nio/channels/FileChannel;
            invokevirtual java.nio.channels.FileChannel.close:()V
        43: goto 49
      StackMap locals:
      StackMap stack: java.io.IOException
        44: pop
        45: .line 1513
            goto 49
        46: .line 1515
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            getfield org.jruby.util.ShellLauncher$ChannelPumper.inChannel:Ljava/nio/channels/FileChannel;
            invokevirtual java.nio.channels.FileChannel.close:()V
        47: goto 49
      StackMap locals:
      StackMap stack: java.io.IOException
        48: pop
        49: .line 1509
      StackMap locals:
      StackMap stack:
            aload 4
            monitorexit
        50: goto 53
      StackMap locals:
      StackMap stack: java.lang.Throwable
        51: aload 4
            monitorexit
        52: athrow
        53: .line 1519
      StackMap locals: org.jruby.util.ShellLauncher$ChannelPumper java.nio.ByteBuffer
      StackMap stack:
            return
        end local 1 // java.nio.ByteBuffer buf
        end local 0 // org.jruby.util.ShellLauncher$ChannelPumper this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0   54     0  this  Lorg/jruby/util/ShellLauncher$ChannelPumper;
            2   54     1   buf  Ljava/nio/ByteBuffer;
            5    9     2  read  I
      Exception table:
        from    to  target  type
           3    10      11  Class java.lang.Exception
          14    15      16  Class java.io.IOException
          18    19      20  Class java.io.IOException
          13    22      23  any
          23    24      23  any
           3    12      25  any
          28    29      30  Class java.io.IOException
          32    33      34  Class java.io.IOException
          27    36      37  any
          37    38      37  any
          42    43      44  Class java.io.IOException
          46    47      48  Class java.io.IOException
          41    50      51  any
          51    52      51  any

  public void quit();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
        start local 0 // org.jruby.util.ShellLauncher$ChannelPumper this
         0: .line 1521
            aload 0 /* this */
            iconst_1
            putfield org.jruby.util.ShellLauncher$ChannelPumper.quit:Z
         1: .line 1522
            aload 0 /* this */
            invokevirtual org.jruby.util.ShellLauncher$ChannelPumper.interrupt:()V
         2: .line 1523
            return
        end local 0 // org.jruby.util.ShellLauncher$ChannelPumper this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    3     0  this  Lorg/jruby/util/ShellLauncher$ChannelPumper;

  static int[] $SWITCH_TABLE$org$jruby$util$ShellLauncher$Pumper$Slave();
    descriptor: ()[I
    flags: (0x1008) ACC_STATIC, ACC_SYNTHETIC
    Code:
      stack=3, locals=1, args_size=0
         0: .line 1475
            getstatic org.jruby.util.ShellLauncher$ChannelPumper.$SWITCH_TABLE$org$jruby$util$ShellLauncher$Pumper$Slave:[I
            dup
            ifnull 1
            areturn
      StackMap locals:
      StackMap stack: int[]
         1: pop
            invokestatic org.jruby.util.ShellLauncher$Pumper$Slave.values:()[Lorg/jruby/util/ShellLauncher$Pumper$Slave;
            arraylength
            newarray 10
            astore 0
         2: aload 0
            getstatic org.jruby.util.ShellLauncher$Pumper$Slave.IN:Lorg/jruby/util/ShellLauncher$Pumper$Slave;
            invokevirtual org.jruby.util.ShellLauncher$Pumper$Slave.ordinal:()I
            iconst_1
            iastore
         3: goto 5
      StackMap locals: int[]
      StackMap stack: java.lang.NoSuchFieldError
         4: pop
      StackMap locals:
      StackMap stack:
         5: aload 0
            getstatic org.jruby.util.ShellLauncher$Pumper$Slave.OUT:Lorg/jruby/util/ShellLauncher$Pumper$Slave;
            invokevirtual org.jruby.util.ShellLauncher$Pumper$Slave.ordinal:()I
            iconst_2
            iastore
         6: goto 8
      StackMap locals:
      StackMap stack: java.lang.NoSuchFieldError
         7: pop
      StackMap locals:
      StackMap stack:
         8: aload 0
            dup
            putstatic org.jruby.util.ShellLauncher$ChannelPumper.$SWITCH_TABLE$org$jruby$util$ShellLauncher$Pumper$Slave:[I
            areturn
      LocalVariableTable:
        Start  End  Slot  Name  Signature
      Exception table:
        from    to  target  type
           2     3       4  Class java.lang.NoSuchFieldError
           5     6       7  Class java.lang.NoSuchFieldError
}
SourceFile: "ShellLauncher.java"
NestHost: org.jruby.util.ShellLauncher
InnerClasses:
  private ChannelPumper = org.jruby.util.ShellLauncher$ChannelPumper of org.jruby.util.ShellLauncher
  private abstract Pumper = org.jruby.util.ShellLauncher$Pumper of org.jruby.util.ShellLauncher
  public final Slave = org.jruby.util.ShellLauncher$Pumper$Slave of org.jruby.util.ShellLauncher$Pumper