class com.oracle.truffle.nfi.impl.NFIContext
  minor version: 0
  major version: 59
  flags: flags: (0x0020) ACC_SUPER
  this_class: com.oracle.truffle.nfi.impl.NFIContext
  super_class: java.lang.Object
{
  final com.oracle.truffle.nfi.impl.NFILanguageImpl language;
    descriptor: Lcom/oracle/truffle/nfi/impl/NFILanguageImpl;
    flags: (0x0010) ACC_FINAL

  com.oracle.truffle.api.TruffleLanguage$Env env;
    descriptor: Lcom/oracle/truffle/api/TruffleLanguage$Env;
    flags: (0x0000) 

  private long nativeContext;
    descriptor: J
    flags: (0x0002) ACC_PRIVATE

  private final java.lang.ThreadLocal<com.oracle.truffle.nfi.impl.NFIContext$NativeEnv> nativeEnv;
    descriptor: Ljava/lang/ThreadLocal;
    flags: (0x0012) ACC_PRIVATE, ACC_FINAL
    Signature: Ljava/lang/ThreadLocal<Lcom/oracle/truffle/nfi/impl/NFIContext$NativeEnv;>;

  final com.oracle.truffle.nfi.impl.LibFFIType[] simpleTypeMap;
    descriptor: [Lcom/oracle/truffle/nfi/impl/LibFFIType;
    flags: (0x0010) ACC_FINAL
    RuntimeVisibleAnnotations: 
      com.oracle.truffle.api.CompilerDirectives$CompilationFinal(dimensions = 1)

  final com.oracle.truffle.nfi.impl.LibFFIType[] arrayTypeMap;
    descriptor: [Lcom/oracle/truffle/nfi/impl/LibFFIType;
    flags: (0x0010) ACC_FINAL
    RuntimeVisibleAnnotations: 
      com.oracle.truffle.api.CompilerDirectives$CompilationFinal(dimensions = 1)

  com.oracle.truffle.nfi.impl.LibFFIType cachedEnvType;
    descriptor: Lcom/oracle/truffle/nfi/impl/LibFFIType;
    flags: (0x0000) 
    RuntimeVisibleAnnotations: 
      com.oracle.truffle.api.CompilerDirectives$CompilationFinal()

  private final java.util.HashMap<java.lang.Long, com.oracle.truffle.nfi.impl.ClosureNativePointer> nativePointerMap;
    descriptor: Ljava/util/HashMap;
    flags: (0x0012) ACC_PRIVATE, ACC_FINAL
    Signature: Ljava/util/HashMap<Ljava/lang/Long;Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;>;

  int RTLD_GLOBAL;
    descriptor: I
    flags: (0x0000) 
    RuntimeVisibleAnnotations: 
      com.oracle.truffle.api.CompilerDirectives$CompilationFinal()

  int RTLD_LOCAL;
    descriptor: I
    flags: (0x0000) 
    RuntimeVisibleAnnotations: 
      com.oracle.truffle.api.CompilerDirectives$CompilationFinal()

  int RTLD_LAZY;
    descriptor: I
    flags: (0x0000) 
    RuntimeVisibleAnnotations: 
      com.oracle.truffle.api.CompilerDirectives$CompilationFinal()

  int RTLD_NOW;
    descriptor: I
    flags: (0x0000) 
    RuntimeVisibleAnnotations: 
      com.oracle.truffle.api.CompilerDirectives$CompilationFinal()

  int ISOLATED_NAMESPACE;
    descriptor: I
    flags: (0x0000) 
    RuntimeVisibleAnnotations: 
      com.oracle.truffle.api.CompilerDirectives$CompilationFinal()

  private volatile long isolatedNamespaceId;
    descriptor: J
    flags: (0x0042) ACC_PRIVATE, ACC_VOLATILE

  static final boolean $assertionsDisabled;
    descriptor: Z
    flags: (0x1018) ACC_STATIC, ACC_FINAL, ACC_SYNTHETIC

  static void <clinit>();
    descriptor: ()V
    flags: (0x0008) ACC_STATIC
    Code:
      stack=1, locals=0, args_size=0
         0: .line 54
            ldc Lcom/oracle/truffle/nfi/impl/NFIContext;
            invokevirtual java.lang.Class.desiredAssertionStatus:()Z
            ifne 1
            iconst_1
            goto 2
      StackMap locals:
      StackMap stack:
         1: iconst_0
      StackMap locals:
      StackMap stack: int
         2: putstatic com.oracle.truffle.nfi.impl.NFIContext.$assertionsDisabled:Z
            return
      LocalVariableTable:
        Start  End  Slot  Name  Signature

  void <init>(com.oracle.truffle.nfi.impl.NFILanguageImpl, com.oracle.truffle.api.TruffleLanguage$Env);
    descriptor: (Lcom/oracle/truffle/nfi/impl/NFILanguageImpl;Lcom/oracle/truffle/api/TruffleLanguage$Env;)V
    flags: (0x0000) 
    Code:
      stack=4, locals=3, args_size=3
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // com.oracle.truffle.nfi.impl.NFILanguageImpl language
        start local 2 // com.oracle.truffle.api.TruffleLanguage$Env env
         0: .line 99
            aload 0 /* this */
            invokespecial java.lang.Object.<init>:()V
         1: .line 60
            aload 0 /* this */
            new com.oracle.truffle.nfi.impl.NFIContext$NativeEnvSupplier
            dup
            aload 0 /* this */
            invokespecial com.oracle.truffle.nfi.impl.NFIContext$NativeEnvSupplier.<init>:(Lcom/oracle/truffle/nfi/impl/NFIContext;)V
            invokestatic java.lang.ThreadLocal.withInitial:(Ljava/util/function/Supplier;)Ljava/lang/ThreadLocal;
            putfield com.oracle.truffle.nfi.impl.NFIContext.nativeEnv:Ljava/lang/ThreadLocal;
         2: .line 62
            aload 0 /* this */
            invokestatic com.oracle.truffle.nfi.spi.types.NativeSimpleType.values:()[Lcom/oracle/truffle/nfi/spi/types/NativeSimpleType;
            arraylength
            anewarray com.oracle.truffle.nfi.impl.LibFFIType
            putfield com.oracle.truffle.nfi.impl.NFIContext.simpleTypeMap:[Lcom/oracle/truffle/nfi/impl/LibFFIType;
         3: .line 63
            aload 0 /* this */
            invokestatic com.oracle.truffle.nfi.spi.types.NativeSimpleType.values:()[Lcom/oracle/truffle/nfi/spi/types/NativeSimpleType;
            arraylength
            anewarray com.oracle.truffle.nfi.impl.LibFFIType
            putfield com.oracle.truffle.nfi.impl.NFIContext.arrayTypeMap:[Lcom/oracle/truffle/nfi/impl/LibFFIType;
         4: .line 66
            aload 0 /* this */
            new java.util.HashMap
            dup
            invokespecial java.util.HashMap.<init>:()V
            putfield com.oracle.truffle.nfi.impl.NFIContext.nativePointerMap:Ljava/util/HashMap;
         5: .line 100
            aload 0 /* this */
            aload 1 /* language */
            putfield com.oracle.truffle.nfi.impl.NFIContext.language:Lcom/oracle/truffle/nfi/impl/NFILanguageImpl;
         6: .line 101
            aload 0 /* this */
            aload 2 /* env */
            putfield com.oracle.truffle.nfi.impl.NFIContext.env:Lcom/oracle/truffle/api/TruffleLanguage$Env;
         7: .line 102
            return
        end local 2 // com.oracle.truffle.api.TruffleLanguage$Env env
        end local 1 // com.oracle.truffle.nfi.impl.NFILanguageImpl language
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot      Name  Signature
            0    8     0      this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    8     1  language  Lcom/oracle/truffle/nfi/impl/NFILanguageImpl;
            0    8     2       env  Lcom/oracle/truffle/api/TruffleLanguage$Env;
    MethodParameters:
          Name  Flags
      language  
      env       

  void patchEnv(com.oracle.truffle.api.TruffleLanguage$Env);
    descriptor: (Lcom/oracle/truffle/api/TruffleLanguage$Env;)V
    flags: (0x0000) 
    Code:
      stack=2, locals=2, args_size=2
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // com.oracle.truffle.api.TruffleLanguage$Env newEnv
         0: .line 105
            aload 0 /* this */
            aload 1 /* newEnv */
            putfield com.oracle.truffle.nfi.impl.NFIContext.env:Lcom/oracle/truffle/api/TruffleLanguage$Env;
         1: .line 106
            return
        end local 1 // com.oracle.truffle.api.TruffleLanguage$Env newEnv
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot    Name  Signature
            0    2     0    this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    2     1  newEnv  Lcom/oracle/truffle/api/TruffleLanguage$Env;
    MethodParameters:
        Name  Flags
      newEnv  

  long getNativeEnv();
    descriptor: ()J
    flags: (0x0000) 
    Code:
      stack=2, locals=1, args_size=1
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
         0: .line 110
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativeEnv:Ljava/lang/ThreadLocal;
            invokevirtual java.lang.ThreadLocal.get:()Ljava/lang/Object;
            checkcast com.oracle.truffle.nfi.impl.NFIContext$NativeEnv
            getfield com.oracle.truffle.nfi.impl.NFIContext$NativeEnv.pointer:J
            lreturn
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lcom/oracle/truffle/nfi/impl/NFIContext;

  void initialize();
    descriptor: ()V
    flags: (0x0000) 
    Code:
      stack=3, locals=1, args_size=1
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
         0: .line 114
            invokestatic com.oracle.truffle.nfi.impl.NFIContext.loadNFILib:()V
         1: .line 115
            invokestatic com.oracle.truffle.nfi.impl.NativeAllocation.ensureGCThreadRunning:()V
         2: .line 116
            aload 0 /* this */
            aload 0 /* this */
            invokevirtual com.oracle.truffle.nfi.impl.NFIContext.initializeNativeContext:()J
            putfield com.oracle.truffle.nfi.impl.NFIContext.nativeContext:J
         3: .line 117
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativeEnv:Ljava/lang/ThreadLocal;
            invokevirtual java.lang.ThreadLocal.remove:()V
         4: .line 118
            return
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    5     0  this  Lcom/oracle/truffle/nfi/impl/NFIContext;

  void dispose();
    descriptor: ()V
    flags: (0x0000) 
    Code:
      stack=4, locals=2, args_size=1
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
         0: .line 121
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativeContext:J
            lconst_0
            lcmp
            ifeq 3
         1: .line 122
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativeContext:J
            invokestatic com.oracle.truffle.nfi.impl.NFIContext.disposeNativeContext:(J)V
         2: .line 123
            aload 0 /* this */
            lconst_0
            putfield com.oracle.truffle.nfi.impl.NFIContext.nativeContext:J
         3: .line 125
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativeEnv:Ljava/lang/ThreadLocal;
            aconst_null
            invokevirtual java.lang.ThreadLocal.set:(Ljava/lang/Object;)V
         4: .line 126
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativePointerMap:Ljava/util/HashMap;
            dup
            astore 1
            monitorenter
         5: .line 127
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativePointerMap:Ljava/util/HashMap;
            invokevirtual java.util.HashMap.clear:()V
         6: .line 126
            aload 1
            monitorexit
         7: goto 10
      StackMap locals: com.oracle.truffle.nfi.impl.NFIContext java.util.HashMap
      StackMap stack: java.lang.Throwable
         8: aload 1
            monitorexit
         9: athrow
        10: .line 129
      StackMap locals:
      StackMap stack:
            return
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0   11     0  this  Lcom/oracle/truffle/nfi/impl/NFIContext;
      Exception table:
        from    to  target  type
           5     7       8  any
           8     9       8  any

  private com.oracle.truffle.nfi.impl.ClosureNativePointer getClosureNativePointer(long);
    descriptor: (J)Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;
    flags: (0x0002) ACC_PRIVATE
    Code:
      stack=3, locals=4, args_size=2
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // long codePointer
         0: .line 132
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativePointerMap:Ljava/util/HashMap;
            dup
            astore 3
            monitorenter
         1: .line 133
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativePointerMap:Ljava/util/HashMap;
            lload 1 /* codePointer */
            invokestatic java.lang.Long.valueOf:(J)Ljava/lang/Long;
            invokevirtual java.util.HashMap.get:(Ljava/lang/Object;)Ljava/lang/Object;
            checkcast com.oracle.truffle.nfi.impl.ClosureNativePointer
            aload 3
            monitorexit
         2: areturn
         3: .line 132
      StackMap locals: com.oracle.truffle.nfi.impl.NFIContext long java.util.HashMap
      StackMap stack: java.lang.Throwable
            aload 3
            monitorexit
         4: athrow
        end local 1 // long codePointer
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot         Name  Signature
            0    5     0         this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    5     1  codePointer  J
      Exception table:
        from    to  target  type
           1     2       3  any
           3     4       3  any
    MethodParameters:
             Name  Flags
      codePointer  

  void removeClosureNativePointer(long);
    descriptor: (J)V
    flags: (0x0000) 
    Code:
      stack=3, locals=4, args_size=2
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // long codePointer
         0: .line 138
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativePointerMap:Ljava/util/HashMap;
            dup
            astore 3
            monitorenter
         1: .line 139
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativePointerMap:Ljava/util/HashMap;
            lload 1 /* codePointer */
            invokestatic java.lang.Long.valueOf:(J)Ljava/lang/Long;
            invokevirtual java.util.HashMap.remove:(Ljava/lang/Object;)Ljava/lang/Object;
            pop
         2: .line 138
            aload 3
            monitorexit
         3: goto 6
      StackMap locals: com.oracle.truffle.nfi.impl.NFIContext long java.util.HashMap
      StackMap stack: java.lang.Throwable
         4: aload 3
            monitorexit
         5: athrow
         6: .line 141
      StackMap locals:
      StackMap stack:
            return
        end local 1 // long codePointer
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot         Name  Signature
            0    7     0         this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    7     1  codePointer  J
      Exception table:
        from    to  target  type
           1     3       4  any
           4     5       4  any
    MethodParameters:
             Name  Flags
      codePointer  

  com.oracle.truffle.nfi.impl.ClosureNativePointer createClosureNativePointer(long, long, com.oracle.truffle.api.CallTarget, com.oracle.truffle.nfi.impl.LibFFISignature);
    descriptor: (JJLcom/oracle/truffle/api/CallTarget;Lcom/oracle/truffle/nfi/impl/LibFFISignature;)Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;
    flags: (0x0000) 
    Code:
      stack=7, locals=9, args_size=5
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // long nativeClosure
        start local 3 // long codePointer
        start local 5 // com.oracle.truffle.api.CallTarget callTarget
        start local 6 // com.oracle.truffle.nfi.impl.LibFFISignature signature
         0: .line 145
            aload 0 /* this */
            lload 1 /* nativeClosure */
            lload 3 /* codePointer */
            aload 5 /* callTarget */
            aload 6 /* signature */
            invokestatic com.oracle.truffle.nfi.impl.ClosureNativePointer.create:(Lcom/oracle/truffle/nfi/impl/NFIContext;JJLcom/oracle/truffle/api/CallTarget;Lcom/oracle/truffle/nfi/impl/LibFFISignature;)Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;
            astore 7 /* ret */
        start local 7 // com.oracle.truffle.nfi.impl.ClosureNativePointer ret
         1: .line 146
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativePointerMap:Ljava/util/HashMap;
            dup
            astore 8
            monitorenter
         2: .line 147
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativePointerMap:Ljava/util/HashMap;
            lload 3 /* codePointer */
            invokestatic java.lang.Long.valueOf:(J)Ljava/lang/Long;
            aload 7 /* ret */
            invokevirtual java.util.HashMap.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
            pop
         3: .line 146
            aload 8
            monitorexit
         4: goto 7
      StackMap locals: com.oracle.truffle.nfi.impl.NFIContext long long com.oracle.truffle.api.CallTarget com.oracle.truffle.nfi.impl.LibFFISignature com.oracle.truffle.nfi.impl.ClosureNativePointer java.util.HashMap
      StackMap stack: java.lang.Throwable
         5: aload 8
            monitorexit
         6: athrow
         7: .line 149
      StackMap locals:
      StackMap stack:
            aload 7 /* ret */
            areturn
        end local 7 // com.oracle.truffle.nfi.impl.ClosureNativePointer ret
        end local 6 // com.oracle.truffle.nfi.impl.LibFFISignature signature
        end local 5 // com.oracle.truffle.api.CallTarget callTarget
        end local 3 // long codePointer
        end local 1 // long nativeClosure
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot           Name  Signature
            0    8     0           this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    8     1  nativeClosure  J
            0    8     3    codePointer  J
            0    8     5     callTarget  Lcom/oracle/truffle/api/CallTarget;
            0    8     6      signature  Lcom/oracle/truffle/nfi/impl/LibFFISignature;
            1    8     7            ret  Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;
      Exception table:
        from    to  target  type
           2     4       5  any
           5     6       5  any
    MethodParameters:
               Name  Flags
      nativeClosure  
      codePointer    
      callTarget     
      signature      

  void newClosureRef(long);
    descriptor: (J)V
    flags: (0x0000) 
    Code:
      stack=3, locals=3, args_size=2
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // long codePointer
         0: .line 154
            aload 0 /* this */
            lload 1 /* codePointer */
            invokevirtual com.oracle.truffle.nfi.impl.NFIContext.getClosureNativePointer:(J)Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;
            invokevirtual com.oracle.truffle.nfi.impl.ClosureNativePointer.addRef:()V
         1: .line 155
            return
        end local 1 // long codePointer
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot         Name  Signature
            0    2     0         this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    2     1  codePointer  J
    MethodParameters:
             Name  Flags
      codePointer  

  void releaseClosureRef(long);
    descriptor: (J)V
    flags: (0x0000) 
    Code:
      stack=3, locals=3, args_size=2
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // long codePointer
         0: .line 159
            aload 0 /* this */
            lload 1 /* codePointer */
            invokevirtual com.oracle.truffle.nfi.impl.NFIContext.getClosureNativePointer:(J)Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;
            invokevirtual com.oracle.truffle.nfi.impl.ClosureNativePointer.releaseRef:()V
         1: .line 160
            return
        end local 1 // long codePointer
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot         Name  Signature
            0    2     0         this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    2     1  codePointer  J
    MethodParameters:
             Name  Flags
      codePointer  

  java.lang.Object getClosureObject(long);
    descriptor: (J)Ljava/lang/Object;
    flags: (0x0000) 
    Code:
      stack=3, locals=3, args_size=2
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // long codePointer
         0: .line 164
            aload 0 /* this */
            lload 1 /* codePointer */
            invokevirtual com.oracle.truffle.nfi.impl.NFIContext.getClosureNativePointer:(J)Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;
            invokestatic com.oracle.truffle.nfi.impl.LibFFIClosure.newClosureWrapper:(Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;)Lcom/oracle/truffle/nfi/impl/LibFFIClosure;
            areturn
        end local 1 // long codePointer
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot         Name  Signature
            0    1     0         this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    1     1  codePointer  J
    MethodParameters:
             Name  Flags
      codePointer  

  com.oracle.truffle.nfi.impl.LibFFILibrary loadLibrary(java.lang.String, int);
    descriptor: (Ljava/lang/String;I)Lcom/oracle/truffle/nfi/impl/LibFFILibrary;
    flags: (0x0000) 
    Code:
      stack=4, locals=3, args_size=3
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // java.lang.String name
        start local 2 // int flags
         0: .line 169
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativeContext:J
            aload 1 /* name */
            iload 2 /* flags */
            invokestatic com.oracle.truffle.nfi.impl.NFIContext.loadLibrary:(JLjava/lang/String;I)J
            invokestatic com.oracle.truffle.nfi.impl.LibFFILibrary.create:(J)Lcom/oracle/truffle/nfi/impl/LibFFILibrary;
            areturn
        end local 2 // int flags
        end local 1 // java.lang.String name
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot   Name  Signature
            0    1     0   this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    1     1   name  Ljava/lang/String;
            0    1     2  flags  I
    RuntimeVisibleAnnotations: 
      com.oracle.truffle.api.CompilerDirectives$TruffleBoundary()
    MethodParameters:
       Name  Flags
      name   
      flags  

  java.lang.Object lookupSymbol(com.oracle.truffle.nfi.impl.LibFFILibrary, java.lang.String);
    descriptor: (Lcom/oracle/truffle/nfi/impl/LibFFILibrary;Ljava/lang/String;)Ljava/lang/Object;
    flags: (0x0000) 
    Code:
      stack=8, locals=3, args_size=3
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // com.oracle.truffle.nfi.impl.LibFFILibrary library
        start local 2 // java.lang.String name
         0: .line 173
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.language:Lcom/oracle/truffle/nfi/impl/NFILanguageImpl;
            aload 1 /* library */
            aload 2 /* name */
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativeContext:J
            aload 1 /* library */
            getfield com.oracle.truffle.nfi.impl.LibFFILibrary.handle:J
            aload 2 /* name */
            invokestatic com.oracle.truffle.nfi.impl.NFIContext.lookup:(JJLjava/lang/String;)J
            invokestatic com.oracle.truffle.nfi.impl.LibFFISymbol.create:(Lcom/oracle/truffle/nfi/impl/NFILanguageImpl;Lcom/oracle/truffle/nfi/impl/LibFFILibrary;Ljava/lang/String;J)Ljava/lang/Object;
            areturn
        end local 2 // java.lang.String name
        end local 1 // com.oracle.truffle.nfi.impl.LibFFILibrary library
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot     Name  Signature
            0    1     0     this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    1     1  library  Lcom/oracle/truffle/nfi/impl/LibFFILibrary;
            0    1     2     name  Ljava/lang/String;
    MethodParameters:
         Name  Flags
      library  
      name     

  com.oracle.truffle.nfi.impl.LibFFIType lookupSimpleType(com.oracle.truffle.nfi.spi.types.NativeSimpleType);
    descriptor: (Lcom/oracle/truffle/nfi/spi/types/NativeSimpleType;)Lcom/oracle/truffle/nfi/impl/LibFFIType;
    flags: (0x0000) 
    Code:
      stack=2, locals=2, args_size=2
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // com.oracle.truffle.nfi.spi.types.NativeSimpleType type
         0: .line 177
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.simpleTypeMap:[Lcom/oracle/truffle/nfi/impl/LibFFIType;
            aload 1 /* type */
            invokevirtual com.oracle.truffle.nfi.spi.types.NativeSimpleType.ordinal:()I
            aaload
            areturn
        end local 1 // com.oracle.truffle.nfi.spi.types.NativeSimpleType type
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    1     1  type  Lcom/oracle/truffle/nfi/spi/types/NativeSimpleType;
    MethodParameters:
      Name  Flags
      type  

  com.oracle.truffle.nfi.impl.LibFFIType lookupArrayType(com.oracle.truffle.nfi.spi.types.NativeSimpleType);
    descriptor: (Lcom/oracle/truffle/nfi/spi/types/NativeSimpleType;)Lcom/oracle/truffle/nfi/impl/LibFFIType;
    flags: (0x0000) 
    Code:
      stack=2, locals=2, args_size=2
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // com.oracle.truffle.nfi.spi.types.NativeSimpleType type
         0: .line 181
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.arrayTypeMap:[Lcom/oracle/truffle/nfi/impl/LibFFIType;
            aload 1 /* type */
            invokevirtual com.oracle.truffle.nfi.spi.types.NativeSimpleType.ordinal:()I
            aaload
            areturn
        end local 1 // com.oracle.truffle.nfi.spi.types.NativeSimpleType type
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    1     1  type  Lcom/oracle/truffle/nfi/spi/types/NativeSimpleType;
    MethodParameters:
      Name  Flags
      type  

  com.oracle.truffle.nfi.impl.LibFFIType lookupEnvType();
    descriptor: ()Lcom/oracle/truffle/nfi/impl/LibFFIType;
    flags: (0x0000) 
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
         0: .line 186
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.cachedEnvType:Lcom/oracle/truffle/nfi/impl/LibFFIType;
            areturn
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lcom/oracle/truffle/nfi/impl/NFIContext;
    RuntimeVisibleAnnotations: 
      com.oracle.truffle.api.CompilerDirectives$TruffleBoundary()

  protected void initializeSimpleType(com.oracle.truffle.nfi.spi.types.NativeSimpleType, int, int, long);
    descriptor: (Lcom/oracle/truffle/nfi/spi/types/NativeSimpleType;IIJ)V
    flags: (0x0004) ACC_PROTECTED
    Code:
      stack=7, locals=8, args_size=5
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // com.oracle.truffle.nfi.spi.types.NativeSimpleType simpleType
        start local 2 // int size
        start local 3 // int alignment
        start local 4 // long ffiType
         0: .line 190
            aload 1 /* simpleType */
            invokevirtual com.oracle.truffle.nfi.spi.types.NativeSimpleType.ordinal:()I
            istore 6 /* idx */
        start local 6 // int idx
         1: .line 191
            getstatic com.oracle.truffle.nfi.spi.types.NativeSimpleType.POINTER:Lcom/oracle/truffle/nfi/spi/types/NativeSimpleType;
            invokevirtual com.oracle.truffle.nfi.spi.types.NativeSimpleType.ordinal:()I
            istore 7 /* pointerIdx */
        start local 7 // int pointerIdx
         2: .line 193
            getstatic com.oracle.truffle.nfi.impl.NFIContext.$assertionsDisabled:Z
            ifne 3
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.simpleTypeMap:[Lcom/oracle/truffle/nfi/impl/LibFFIType;
            iload 6 /* idx */
            aaload
            ifnull 3
            new java.lang.AssertionError
            dup
            new java.lang.StringBuilder
            dup
            ldc "initializeSimpleType called twice for "
            invokespecial java.lang.StringBuilder.<init>:(Ljava/lang/String;)V
            aload 1 /* simpleType */
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
            invokevirtual java.lang.StringBuilder.toString:()Ljava/lang/String;
            invokespecial java.lang.AssertionError.<init>:(Ljava/lang/Object;)V
            athrow
         3: .line 194
      StackMap locals: int int
      StackMap stack:
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.language:Lcom/oracle/truffle/nfi/impl/NFILanguageImpl;
            getfield com.oracle.truffle.nfi.impl.NFILanguageImpl.simpleTypeMap:[Lcom/oracle/truffle/nfi/impl/LibFFIType$CachedTypeInfo;
            iload 6 /* idx */
            aaload
            ifnonnull 9
         4: .line 195
            getstatic com.oracle.truffle.nfi.impl.NFIContext.$assertionsDisabled:Z
            ifne 5
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.language:Lcom/oracle/truffle/nfi/impl/NFILanguageImpl;
            getfield com.oracle.truffle.nfi.impl.NFILanguageImpl.arrayTypeMap:[Lcom/oracle/truffle/nfi/impl/LibFFIType$CachedTypeInfo;
            iload 6 /* idx */
            aaload
            ifnull 5
            new java.lang.AssertionError
            dup
            invokespecial java.lang.AssertionError.<init>:()V
            athrow
         5: .line 196
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.language:Lcom/oracle/truffle/nfi/impl/NFILanguageImpl;
            getfield com.oracle.truffle.nfi.impl.NFILanguageImpl.simpleTypeMap:[Lcom/oracle/truffle/nfi/impl/LibFFIType$CachedTypeInfo;
            iload 6 /* idx */
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.language:Lcom/oracle/truffle/nfi/impl/NFILanguageImpl;
            aload 1 /* simpleType */
            iload 2 /* size */
            iload 3 /* alignment */
            invokestatic com.oracle.truffle.nfi.impl.LibFFIType.createSimpleTypeInfo:(Lcom/oracle/truffle/nfi/impl/NFILanguageImpl;Lcom/oracle/truffle/nfi/spi/types/NativeSimpleType;II)Lcom/oracle/truffle/nfi/impl/LibFFIType$CachedTypeInfo;
            aastore
         6: .line 197
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.language:Lcom/oracle/truffle/nfi/impl/NFILanguageImpl;
            getfield com.oracle.truffle.nfi.impl.NFILanguageImpl.arrayTypeMap:[Lcom/oracle/truffle/nfi/impl/LibFFIType$CachedTypeInfo;
            iload 6 /* idx */
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.language:Lcom/oracle/truffle/nfi/impl/NFILanguageImpl;
            getfield com.oracle.truffle.nfi.impl.NFILanguageImpl.simpleTypeMap:[Lcom/oracle/truffle/nfi/impl/LibFFIType$CachedTypeInfo;
            iload 7 /* pointerIdx */
            aaload
            aload 1 /* simpleType */
            invokestatic com.oracle.truffle.nfi.impl.LibFFIType.createArrayTypeInfo:(Lcom/oracle/truffle/nfi/impl/LibFFIType$CachedTypeInfo;Lcom/oracle/truffle/nfi/spi/types/NativeSimpleType;)Lcom/oracle/truffle/nfi/impl/LibFFIType$CachedTypeInfo;
            aastore
         7: .line 198
            iload 6 /* idx */
            iload 7 /* pointerIdx */
            if_icmpne 9
         8: .line 199
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.language:Lcom/oracle/truffle/nfi/impl/NFILanguageImpl;
            new com.oracle.truffle.nfi.impl.LibFFIType$EnvType
            dup
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.language:Lcom/oracle/truffle/nfi/impl/NFILanguageImpl;
            getfield com.oracle.truffle.nfi.impl.NFILanguageImpl.simpleTypeMap:[Lcom/oracle/truffle/nfi/impl/LibFFIType$CachedTypeInfo;
            iload 7 /* pointerIdx */
            aaload
            invokespecial com.oracle.truffle.nfi.impl.LibFFIType$EnvType.<init>:(Lcom/oracle/truffle/nfi/impl/LibFFIType$CachedTypeInfo;)V
            putfield com.oracle.truffle.nfi.impl.NFILanguageImpl.cachedEnvType:Lcom/oracle/truffle/nfi/impl/LibFFIType$CachedTypeInfo;
         9: .line 202
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.simpleTypeMap:[Lcom/oracle/truffle/nfi/impl/LibFFIType;
            iload 6 /* idx */
            new com.oracle.truffle.nfi.impl.LibFFIType
            dup
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.language:Lcom/oracle/truffle/nfi/impl/NFILanguageImpl;
            getfield com.oracle.truffle.nfi.impl.NFILanguageImpl.simpleTypeMap:[Lcom/oracle/truffle/nfi/impl/LibFFIType$CachedTypeInfo;
            iload 6 /* idx */
            aaload
            lload 4 /* ffiType */
            invokespecial com.oracle.truffle.nfi.impl.LibFFIType.<init>:(Lcom/oracle/truffle/nfi/impl/LibFFIType$CachedTypeInfo;J)V
            aastore
        10: .line 203
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.arrayTypeMap:[Lcom/oracle/truffle/nfi/impl/LibFFIType;
            iload 6 /* idx */
            new com.oracle.truffle.nfi.impl.LibFFIType
            dup
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.language:Lcom/oracle/truffle/nfi/impl/NFILanguageImpl;
            getfield com.oracle.truffle.nfi.impl.NFILanguageImpl.arrayTypeMap:[Lcom/oracle/truffle/nfi/impl/LibFFIType$CachedTypeInfo;
            iload 6 /* idx */
            aaload
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.simpleTypeMap:[Lcom/oracle/truffle/nfi/impl/LibFFIType;
            iload 7 /* pointerIdx */
            aaload
            getfield com.oracle.truffle.nfi.impl.LibFFIType.type:J
            invokespecial com.oracle.truffle.nfi.impl.LibFFIType.<init>:(Lcom/oracle/truffle/nfi/impl/LibFFIType$CachedTypeInfo;J)V
            aastore
        11: .line 204
            iload 6 /* idx */
            iload 7 /* pointerIdx */
            if_icmpne 13
        12: .line 205
            aload 0 /* this */
            new com.oracle.truffle.nfi.impl.LibFFIType
            dup
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.language:Lcom/oracle/truffle/nfi/impl/NFILanguageImpl;
            getfield com.oracle.truffle.nfi.impl.NFILanguageImpl.cachedEnvType:Lcom/oracle/truffle/nfi/impl/LibFFIType$CachedTypeInfo;
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.simpleTypeMap:[Lcom/oracle/truffle/nfi/impl/LibFFIType;
            iload 7 /* pointerIdx */
            aaload
            getfield com.oracle.truffle.nfi.impl.LibFFIType.type:J
            invokespecial com.oracle.truffle.nfi.impl.LibFFIType.<init>:(Lcom/oracle/truffle/nfi/impl/LibFFIType$CachedTypeInfo;J)V
            putfield com.oracle.truffle.nfi.impl.NFIContext.cachedEnvType:Lcom/oracle/truffle/nfi/impl/LibFFIType;
        13: .line 207
      StackMap locals:
      StackMap stack:
            return
        end local 7 // int pointerIdx
        end local 6 // int idx
        end local 4 // long ffiType
        end local 3 // int alignment
        end local 2 // int size
        end local 1 // com.oracle.truffle.nfi.spi.types.NativeSimpleType simpleType
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot        Name  Signature
            0   14     0        this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0   14     1  simpleType  Lcom/oracle/truffle/nfi/spi/types/NativeSimpleType;
            0   14     2        size  I
            0   14     3   alignment  I
            0   14     4     ffiType  J
            1   14     6         idx  I
            2   14     7  pointerIdx  I
    MethodParameters:
            Name  Flags
      simpleType  
      size        
      alignment   
      ffiType     

  private native long initializeNativeContext();
    descriptor: ()J
    flags: (0x0102) ACC_PRIVATE, ACC_NATIVE

  private static native void disposeNativeContext(long);
    descriptor: (J)V
    flags: (0x010a) ACC_PRIVATE, ACC_STATIC, ACC_NATIVE
    MethodParameters:
         Name  Flags
      context  

  private static native long initializeNativeEnv(long);
    descriptor: (J)J
    flags: (0x010a) ACC_PRIVATE, ACC_STATIC, ACC_NATIVE
    MethodParameters:
         Name  Flags
      context  

  private static void loadNFILib();
    descriptor: ()V
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=1, locals=1, args_size=0
         0: .line 216
            ldc "truffle.nfi.library"
            invokestatic java.lang.System.getProperty:(Ljava/lang/String;)Ljava/lang/String;
            astore 0 /* nfiLib */
        start local 0 // java.lang.String nfiLib
         1: .line 217
            aload 0 /* nfiLib */
            ifnonnull 4
         2: .line 218
            ldc "trufflenfi"
            invokestatic java.lang.System.loadLibrary:(Ljava/lang/String;)V
         3: .line 219
            goto 5
         4: .line 220
      StackMap locals: java.lang.String
      StackMap stack:
            aload 0 /* nfiLib */
            invokestatic java.lang.System.load:(Ljava/lang/String;)V
         5: .line 222
      StackMap locals:
      StackMap stack:
            return
        end local 0 // java.lang.String nfiLib
      LocalVariableTable:
        Start  End  Slot    Name  Signature
            1    6     0  nfiLib  Ljava/lang/String;

  com.oracle.truffle.nfi.impl.ClosureNativePointer allocateClosureObjectRet(com.oracle.truffle.nfi.impl.LibFFISignature, com.oracle.truffle.api.CallTarget);
    descriptor: (Lcom/oracle/truffle/nfi/impl/LibFFISignature;Lcom/oracle/truffle/api/CallTarget;)Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;
    flags: (0x0000) 
    Code:
      stack=4, locals=3, args_size=3
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // com.oracle.truffle.nfi.impl.LibFFISignature signature
        start local 2 // com.oracle.truffle.api.CallTarget callTarget
         0: .line 225
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativeContext:J
            aload 1 /* signature */
            aload 2 /* callTarget */
            invokestatic com.oracle.truffle.nfi.impl.NFIContext.allocateClosureObjectRet:(JLcom/oracle/truffle/nfi/impl/LibFFISignature;Lcom/oracle/truffle/api/CallTarget;)Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;
            areturn
        end local 2 // com.oracle.truffle.api.CallTarget callTarget
        end local 1 // com.oracle.truffle.nfi.impl.LibFFISignature signature
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot        Name  Signature
            0    1     0        this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    1     1   signature  Lcom/oracle/truffle/nfi/impl/LibFFISignature;
            0    1     2  callTarget  Lcom/oracle/truffle/api/CallTarget;
    MethodParameters:
            Name  Flags
      signature   
      callTarget  

  com.oracle.truffle.nfi.impl.ClosureNativePointer allocateClosureStringRet(com.oracle.truffle.nfi.impl.LibFFISignature, com.oracle.truffle.api.CallTarget);
    descriptor: (Lcom/oracle/truffle/nfi/impl/LibFFISignature;Lcom/oracle/truffle/api/CallTarget;)Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;
    flags: (0x0000) 
    Code:
      stack=4, locals=3, args_size=3
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // com.oracle.truffle.nfi.impl.LibFFISignature signature
        start local 2 // com.oracle.truffle.api.CallTarget callTarget
         0: .line 229
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativeContext:J
            aload 1 /* signature */
            aload 2 /* callTarget */
            invokestatic com.oracle.truffle.nfi.impl.NFIContext.allocateClosureStringRet:(JLcom/oracle/truffle/nfi/impl/LibFFISignature;Lcom/oracle/truffle/api/CallTarget;)Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;
            areturn
        end local 2 // com.oracle.truffle.api.CallTarget callTarget
        end local 1 // com.oracle.truffle.nfi.impl.LibFFISignature signature
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot        Name  Signature
            0    1     0        this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    1     1   signature  Lcom/oracle/truffle/nfi/impl/LibFFISignature;
            0    1     2  callTarget  Lcom/oracle/truffle/api/CallTarget;
    MethodParameters:
            Name  Flags
      signature   
      callTarget  

  com.oracle.truffle.nfi.impl.ClosureNativePointer allocateClosureBufferRet(com.oracle.truffle.nfi.impl.LibFFISignature, com.oracle.truffle.api.CallTarget);
    descriptor: (Lcom/oracle/truffle/nfi/impl/LibFFISignature;Lcom/oracle/truffle/api/CallTarget;)Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;
    flags: (0x0000) 
    Code:
      stack=4, locals=3, args_size=3
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // com.oracle.truffle.nfi.impl.LibFFISignature signature
        start local 2 // com.oracle.truffle.api.CallTarget callTarget
         0: .line 233
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativeContext:J
            aload 1 /* signature */
            aload 2 /* callTarget */
            invokestatic com.oracle.truffle.nfi.impl.NFIContext.allocateClosureBufferRet:(JLcom/oracle/truffle/nfi/impl/LibFFISignature;Lcom/oracle/truffle/api/CallTarget;)Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;
            areturn
        end local 2 // com.oracle.truffle.api.CallTarget callTarget
        end local 1 // com.oracle.truffle.nfi.impl.LibFFISignature signature
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot        Name  Signature
            0    1     0        this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    1     1   signature  Lcom/oracle/truffle/nfi/impl/LibFFISignature;
            0    1     2  callTarget  Lcom/oracle/truffle/api/CallTarget;
    MethodParameters:
            Name  Flags
      signature   
      callTarget  

  com.oracle.truffle.nfi.impl.ClosureNativePointer allocateClosureVoidRet(com.oracle.truffle.nfi.impl.LibFFISignature, com.oracle.truffle.api.CallTarget);
    descriptor: (Lcom/oracle/truffle/nfi/impl/LibFFISignature;Lcom/oracle/truffle/api/CallTarget;)Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;
    flags: (0x0000) 
    Code:
      stack=4, locals=3, args_size=3
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // com.oracle.truffle.nfi.impl.LibFFISignature signature
        start local 2 // com.oracle.truffle.api.CallTarget callTarget
         0: .line 237
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativeContext:J
            aload 1 /* signature */
            aload 2 /* callTarget */
            invokestatic com.oracle.truffle.nfi.impl.NFIContext.allocateClosureVoidRet:(JLcom/oracle/truffle/nfi/impl/LibFFISignature;Lcom/oracle/truffle/api/CallTarget;)Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;
            areturn
        end local 2 // com.oracle.truffle.api.CallTarget callTarget
        end local 1 // com.oracle.truffle.nfi.impl.LibFFISignature signature
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot        Name  Signature
            0    1     0        this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    1     1   signature  Lcom/oracle/truffle/nfi/impl/LibFFISignature;
            0    1     2  callTarget  Lcom/oracle/truffle/api/CallTarget;
    MethodParameters:
            Name  Flags
      signature   
      callTarget  

  private static native com.oracle.truffle.nfi.impl.ClosureNativePointer allocateClosureObjectRet(long, com.oracle.truffle.nfi.impl.LibFFISignature, com.oracle.truffle.api.CallTarget);
    descriptor: (JLcom/oracle/truffle/nfi/impl/LibFFISignature;Lcom/oracle/truffle/api/CallTarget;)Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;
    flags: (0x010a) ACC_PRIVATE, ACC_STATIC, ACC_NATIVE
    MethodParameters:
               Name  Flags
      nativeContext  
      signature      
      callTarget     

  private static native com.oracle.truffle.nfi.impl.ClosureNativePointer allocateClosureStringRet(long, com.oracle.truffle.nfi.impl.LibFFISignature, com.oracle.truffle.api.CallTarget);
    descriptor: (JLcom/oracle/truffle/nfi/impl/LibFFISignature;Lcom/oracle/truffle/api/CallTarget;)Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;
    flags: (0x010a) ACC_PRIVATE, ACC_STATIC, ACC_NATIVE
    MethodParameters:
               Name  Flags
      nativeContext  
      signature      
      callTarget     

  private static native com.oracle.truffle.nfi.impl.ClosureNativePointer allocateClosureBufferRet(long, com.oracle.truffle.nfi.impl.LibFFISignature, com.oracle.truffle.api.CallTarget);
    descriptor: (JLcom/oracle/truffle/nfi/impl/LibFFISignature;Lcom/oracle/truffle/api/CallTarget;)Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;
    flags: (0x010a) ACC_PRIVATE, ACC_STATIC, ACC_NATIVE
    MethodParameters:
               Name  Flags
      nativeContext  
      signature      
      callTarget     

  private static native com.oracle.truffle.nfi.impl.ClosureNativePointer allocateClosureVoidRet(long, com.oracle.truffle.nfi.impl.LibFFISignature, com.oracle.truffle.api.CallTarget);
    descriptor: (JLcom/oracle/truffle/nfi/impl/LibFFISignature;Lcom/oracle/truffle/api/CallTarget;)Lcom/oracle/truffle/nfi/impl/ClosureNativePointer;
    flags: (0x010a) ACC_PRIVATE, ACC_STATIC, ACC_NATIVE
    MethodParameters:
               Name  Flags
      nativeContext  
      signature      
      callTarget     

  long prepareSignature(com.oracle.truffle.nfi.impl.LibFFIType, int, com.oracle.truffle.nfi.impl.LibFFIType[]);
    descriptor: (Lcom/oracle/truffle/nfi/impl/LibFFIType;I[Lcom/oracle/truffle/nfi/impl/LibFFIType;)J
    flags: (0x0080) ACC_VARARGS
    Code:
      stack=5, locals=4, args_size=4
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // com.oracle.truffle.nfi.impl.LibFFIType retType
        start local 2 // int argCount
        start local 3 // com.oracle.truffle.nfi.impl.LibFFIType[] args
         0: .line 249
            getstatic com.oracle.truffle.nfi.impl.NFIContext.$assertionsDisabled:Z
            ifne 1
            aload 3 /* args */
            arraylength
            iload 2 /* argCount */
            if_icmpge 1
            new java.lang.AssertionError
            dup
            invokespecial java.lang.AssertionError.<init>:()V
            athrow
         1: .line 250
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativeContext:J
            aload 1 /* retType */
            iload 2 /* argCount */
            aload 3 /* args */
            invokestatic com.oracle.truffle.nfi.impl.NFIContext.prepareSignature:(JLcom/oracle/truffle/nfi/impl/LibFFIType;I[Lcom/oracle/truffle/nfi/impl/LibFFIType;)J
            lreturn
        end local 3 // com.oracle.truffle.nfi.impl.LibFFIType[] args
        end local 2 // int argCount
        end local 1 // com.oracle.truffle.nfi.impl.LibFFIType retType
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot      Name  Signature
            0    2     0      this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    2     1   retType  Lcom/oracle/truffle/nfi/impl/LibFFIType;
            0    2     2  argCount  I
            0    2     3      args  [Lcom/oracle/truffle/nfi/impl/LibFFIType;
    MethodParameters:
          Name  Flags
      retType   
      argCount  
      args      

  long prepareSignatureVarargs(com.oracle.truffle.nfi.impl.LibFFIType, int, int, com.oracle.truffle.nfi.impl.LibFFIType[]);
    descriptor: (Lcom/oracle/truffle/nfi/impl/LibFFIType;II[Lcom/oracle/truffle/nfi/impl/LibFFIType;)J
    flags: (0x0080) ACC_VARARGS
    Code:
      stack=6, locals=5, args_size=5
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // com.oracle.truffle.nfi.impl.LibFFIType retType
        start local 2 // int argCount
        start local 3 // int nFixedArgs
        start local 4 // com.oracle.truffle.nfi.impl.LibFFIType[] args
         0: .line 254
            getstatic com.oracle.truffle.nfi.impl.NFIContext.$assertionsDisabled:Z
            ifne 1
            aload 4 /* args */
            arraylength
            iload 2 /* argCount */
            if_icmpge 1
            new java.lang.AssertionError
            dup
            invokespecial java.lang.AssertionError.<init>:()V
            athrow
         1: .line 255
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativeContext:J
            aload 1 /* retType */
            iload 2 /* argCount */
            iload 3 /* nFixedArgs */
            aload 4 /* args */
            invokestatic com.oracle.truffle.nfi.impl.NFIContext.prepareSignatureVarargs:(JLcom/oracle/truffle/nfi/impl/LibFFIType;II[Lcom/oracle/truffle/nfi/impl/LibFFIType;)J
            lreturn
        end local 4 // com.oracle.truffle.nfi.impl.LibFFIType[] args
        end local 3 // int nFixedArgs
        end local 2 // int argCount
        end local 1 // com.oracle.truffle.nfi.impl.LibFFIType retType
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot        Name  Signature
            0    2     0        this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    2     1     retType  Lcom/oracle/truffle/nfi/impl/LibFFIType;
            0    2     2    argCount  I
            0    2     3  nFixedArgs  I
            0    2     4        args  [Lcom/oracle/truffle/nfi/impl/LibFFIType;
    MethodParameters:
            Name  Flags
      retType     
      argCount    
      nFixedArgs  
      args        

  private static native long prepareSignature(long, com.oracle.truffle.nfi.impl.LibFFIType, int, com.oracle.truffle.nfi.impl.LibFFIType[]);
    descriptor: (JLcom/oracle/truffle/nfi/impl/LibFFIType;I[Lcom/oracle/truffle/nfi/impl/LibFFIType;)J
    flags: (0x018a) ACC_PRIVATE, ACC_STATIC, ACC_VARARGS, ACC_NATIVE
    MethodParameters:
               Name  Flags
      nativeContext  
      retType        
      argCount       
      args           

  private static native long prepareSignatureVarargs(long, com.oracle.truffle.nfi.impl.LibFFIType, int, int, com.oracle.truffle.nfi.impl.LibFFIType[]);
    descriptor: (JLcom/oracle/truffle/nfi/impl/LibFFIType;II[Lcom/oracle/truffle/nfi/impl/LibFFIType;)J
    flags: (0x018a) ACC_PRIVATE, ACC_STATIC, ACC_VARARGS, ACC_NATIVE
    MethodParameters:
               Name  Flags
      nativeContext  
      retType        
      argCount       
      nFixedArgs     
      args           

  void executeNative(long, long, byte[], int, int[], java.lang.Object[], byte[]);
    descriptor: (JJ[BI[I[Ljava/lang/Object;[B)V
    flags: (0x0000) 
    Code:
      stack=11, locals=10, args_size=8
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // long cif
        start local 3 // long functionPointer
        start local 5 // byte[] primArgs
        start local 6 // int patchCount
        start local 7 // int[] patchOffsets
        start local 8 // java.lang.Object[] objArgs
        start local 9 // byte[] ret
         0: .line 263
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativeContext:J
            lload 1 /* cif */
            lload 3 /* functionPointer */
            aload 5 /* primArgs */
            iload 6 /* patchCount */
            aload 7 /* patchOffsets */
            aload 8 /* objArgs */
            aload 9 /* ret */
            invokestatic com.oracle.truffle.nfi.impl.NFIContext.executeNative:(JJJ[BI[I[Ljava/lang/Object;[B)V
         1: .line 264
            return
        end local 9 // byte[] ret
        end local 8 // java.lang.Object[] objArgs
        end local 7 // int[] patchOffsets
        end local 6 // int patchCount
        end local 5 // byte[] primArgs
        end local 3 // long functionPointer
        end local 1 // long cif
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot             Name  Signature
            0    2     0             this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    2     1              cif  J
            0    2     3  functionPointer  J
            0    2     5         primArgs  [B
            0    2     6       patchCount  I
            0    2     7     patchOffsets  [I
            0    2     8          objArgs  [Ljava/lang/Object;
            0    2     9              ret  [B
    MethodParameters:
                 Name  Flags
      cif              
      functionPointer  
      primArgs         
      patchCount       
      patchOffsets     
      objArgs          
      ret              

  long executePrimitive(long, long, byte[], int, int[], java.lang.Object[]);
    descriptor: (JJ[BI[I[Ljava/lang/Object;)J
    flags: (0x0000) 
    Code:
      stack=10, locals=9, args_size=7
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // long cif
        start local 3 // long functionPointer
        start local 5 // byte[] primArgs
        start local 6 // int patchCount
        start local 7 // int[] patchOffsets
        start local 8 // java.lang.Object[] objArgs
         0: .line 267
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativeContext:J
            lload 1 /* cif */
            lload 3 /* functionPointer */
            aload 5 /* primArgs */
            iload 6 /* patchCount */
            aload 7 /* patchOffsets */
            aload 8 /* objArgs */
            invokestatic com.oracle.truffle.nfi.impl.NFIContext.executePrimitive:(JJJ[BI[I[Ljava/lang/Object;)J
            lreturn
        end local 8 // java.lang.Object[] objArgs
        end local 7 // int[] patchOffsets
        end local 6 // int patchCount
        end local 5 // byte[] primArgs
        end local 3 // long functionPointer
        end local 1 // long cif
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot             Name  Signature
            0    1     0             this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    1     1              cif  J
            0    1     3  functionPointer  J
            0    1     5         primArgs  [B
            0    1     6       patchCount  I
            0    1     7     patchOffsets  [I
            0    1     8          objArgs  [Ljava/lang/Object;
    MethodParameters:
                 Name  Flags
      cif              
      functionPointer  
      primArgs         
      patchCount       
      patchOffsets     
      objArgs          

  java.lang.Object executeObject(long, long, byte[], int, int[], java.lang.Object[]);
    descriptor: (JJ[BI[I[Ljava/lang/Object;)Ljava/lang/Object;
    flags: (0x0000) 
    Code:
      stack=10, locals=9, args_size=7
        start local 0 // com.oracle.truffle.nfi.impl.NFIContext this
        start local 1 // long cif
        start local 3 // long functionPointer
        start local 5 // byte[] primArgs
        start local 6 // int patchCount
        start local 7 // int[] patchOffsets
        start local 8 // java.lang.Object[] objArgs
         0: .line 271
            aload 0 /* this */
            getfield com.oracle.truffle.nfi.impl.NFIContext.nativeContext:J
            lload 1 /* cif */
            lload 3 /* functionPointer */
            aload 5 /* primArgs */
            iload 6 /* patchCount */
            aload 7 /* patchOffsets */
            aload 8 /* objArgs */
            invokestatic com.oracle.truffle.nfi.impl.NFIContext.executeObject:(JJJ[BI[I[Ljava/lang/Object;)Ljava/lang/Object;
            areturn
        end local 8 // java.lang.Object[] objArgs
        end local 7 // int[] patchOffsets
        end local 6 // int patchCount
        end local 5 // byte[] primArgs
        end local 3 // long functionPointer
        end local 1 // long cif
        end local 0 // com.oracle.truffle.nfi.impl.NFIContext this
      LocalVariableTable:
        Start  End  Slot             Name  Signature
            0    1     0             this  Lcom/oracle/truffle/nfi/impl/NFIContext;
            0    1     1              cif  J
            0    1     3  functionPointer  J
            0    1     5         primArgs  [B
            0    1     6       patchCount  I
            0    1     7     patchOffsets  [I
            0    1     8          objArgs  [Ljava/lang/Object;
    MethodParameters:
                 Name  Flags
      cif              
      functionPointer  
      primArgs         
      patchCount       
      patchOffsets     
      objArgs          

  private static native void executeNative(long, long, long, byte[], int, int[], java.lang.Object[], byte[]);
    descriptor: (JJJ[BI[I[Ljava/lang/Object;[B)V
    flags: (0x010a) ACC_PRIVATE, ACC_STATIC, ACC_NATIVE
    RuntimeVisibleAnnotations: 
      com.oracle.truffle.api.CompilerDirectives$TruffleBoundary()
    MethodParameters:
                 Name  Flags
      nativeContext    
      cif              
      functionPointer  
      primArgs         
      patchCount       
      patchOffsets     
      objArgs          
      ret              

  private static native long executePrimitive(long, long, long, byte[], int, int[], java.lang.Object[]);
    descriptor: (JJJ[BI[I[Ljava/lang/Object;)J
    flags: (0x010a) ACC_PRIVATE, ACC_STATIC, ACC_NATIVE
    RuntimeVisibleAnnotations: 
      com.oracle.truffle.api.CompilerDirectives$TruffleBoundary()
    MethodParameters:
                 Name  Flags
      nativeContext    
      cif              
      functionPointer  
      primArgs         
      patchCount       
      patchOffsets     
      objArgs          

  private static native java.lang.Object executeObject(long, long, long, byte[], int, int[], java.lang.Object[]);
    descriptor: (JJJ[BI[I[Ljava/lang/Object;)Ljava/lang/Object;
    flags: (0x010a) ACC_PRIVATE, ACC_STATIC, ACC_NATIVE
    RuntimeVisibleAnnotations: 
      com.oracle.truffle.api.CompilerDirectives$TruffleBoundary()
    MethodParameters:
                 Name  Flags
      nativeContext    
      cif              
      functionPointer  
      primArgs         
      patchCount       
      patchOffsets     
      objArgs          

  private static native long loadLibrary(long, java.lang.String, int);
    descriptor: (JLjava/lang/String;I)J
    flags: (0x010a) ACC_PRIVATE, ACC_STATIC, ACC_NATIVE
    MethodParameters:
               Name  Flags
      nativeContext  
      name           
      flags          

  private static native long lookup(long, long, java.lang.String);
    descriptor: (JJLjava/lang/String;)J
    flags: (0x010a) ACC_PRIVATE, ACC_STATIC, ACC_NATIVE
    RuntimeVisibleAnnotations: 
      com.oracle.truffle.api.CompilerDirectives$TruffleBoundary()
    MethodParameters:
               Name  Flags
      nativeContext  
      library        
      name           

  static native void freeLibrary(long);
    descriptor: (J)V
    flags: (0x0108) ACC_STATIC, ACC_NATIVE
    MethodParameters:
         Name  Flags
      library  
}
SourceFile: "NFIContext.java"
NestMembers:
  com.oracle.truffle.nfi.impl.NFIContext$NativeEnv  com.oracle.truffle.nfi.impl.NFIContext$NativeEnvSupplier
InnerClasses:
  public abstract CompilationFinal = com.oracle.truffle.api.CompilerDirectives$CompilationFinal of com.oracle.truffle.api.CompilerDirectives
  public abstract TruffleBoundary = com.oracle.truffle.api.CompilerDirectives$TruffleBoundary of com.oracle.truffle.api.CompilerDirectives
  public final Env = com.oracle.truffle.api.TruffleLanguage$Env of com.oracle.truffle.api.TruffleLanguage
  abstract CachedTypeInfo = com.oracle.truffle.nfi.impl.LibFFIType$CachedTypeInfo of com.oracle.truffle.nfi.impl.LibFFIType
  final EnvType = com.oracle.truffle.nfi.impl.LibFFIType$EnvType of com.oracle.truffle.nfi.impl.LibFFIType
  private NativeEnv = com.oracle.truffle.nfi.impl.NFIContext$NativeEnv of com.oracle.truffle.nfi.impl.NFIContext
  private NativeEnvSupplier = com.oracle.truffle.nfi.impl.NFIContext$NativeEnvSupplier of com.oracle.truffle.nfi.impl.NFIContext