public class com.oracle.truffle.nfi.test.StringAsInterfaceNFITest
  minor version: 0
  major version: 59
  flags: flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: com.oracle.truffle.nfi.test.StringAsInterfaceNFITest
  super_class: java.lang.Object
{
  private static com.oracle.truffle.nfi.test.StringAsInterfaceNFITest$StdLib stdlib;
    descriptor: Lcom/oracle/truffle/nfi/test/StringAsInterfaceNFITest$StdLib;
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC

  private static java.lang.Object rawStdLib;
    descriptor: Ljava/lang/Object;
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC

  public static com.oracle.truffle.tck.TruffleRunner$RunWithPolyglotRule runWithPolyglot;
    descriptor: Lcom/oracle/truffle/tck/TruffleRunner$RunWithPolyglotRule;
    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
    RuntimeVisibleAnnotations: 
      org.junit.ClassRule()

  static void <clinit>();
    descriptor: ()V
    flags: (0x0008) ACC_STATIC
    Code:
      stack=4, locals=0, args_size=0
         0: .line 62
            new com.oracle.truffle.tck.TruffleRunner$RunWithPolyglotRule
            dup
            iconst_0
            anewarray java.lang.String
            invokestatic org.graalvm.polyglot.Context.newBuilder:([Ljava/lang/String;)Lorg/graalvm/polyglot/Context$Builder;
            iconst_1
            invokevirtual org.graalvm.polyglot.Context$Builder.allowNativeAccess:(Z)Lorg/graalvm/polyglot/Context$Builder;
            invokespecial com.oracle.truffle.tck.TruffleRunner$RunWithPolyglotRule.<init>:(Lorg/graalvm/polyglot/Context$Builder;)V
            putstatic com.oracle.truffle.nfi.test.StringAsInterfaceNFITest.runWithPolyglot:Lcom/oracle/truffle/tck/TruffleRunner$RunWithPolyglotRule;
            return
      LocalVariableTable:
        Start  End  Slot  Name  Signature

  public void <init>();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // com.oracle.truffle.nfi.test.StringAsInterfaceNFITest this
         0: .line 58
            aload 0 /* this */
            invokespecial java.lang.Object.<init>:()V
            return
        end local 0 // com.oracle.truffle.nfi.test.StringAsInterfaceNFITest this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lcom/oracle/truffle/nfi/test/StringAsInterfaceNFITest;

  public static void loadLibraries();
    descriptor: ()V
    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
    Code:
      stack=4, locals=1, args_size=0
         0: .line 66
            getstatic com.oracle.truffle.api.TruffleOptions.AOT:Z
            ifne 1
            getstatic com.oracle.truffle.nfi.test.NFITest.IS_WINDOWS:Z
            ifeq 2
         1: .line 69
      StackMap locals:
      StackMap stack:
            return
         2: .line 72
      StackMap locals:
      StackMap stack:
            getstatic com.oracle.truffle.nfi.test.StringAsInterfaceNFITest.runWithPolyglot:Lcom/oracle/truffle/tck/TruffleRunner$RunWithPolyglotRule;
            invokevirtual com.oracle.truffle.tck.TruffleRunner$RunWithPolyglotRule.getTruffleTestEnv:()Lcom/oracle/truffle/api/TruffleLanguage$Env;
            ldc "nfi"
            ldc "default {\n  strdup(string):string;\n  malloc(UINT32):pointer;\n  free(pointer):void;\n}"
         3: .line 76
            ldc "(load default)"
         4: .line 72
            invokestatic com.oracle.truffle.api.source.Source.newBuilder:(Ljava/lang/String;Ljava/lang/CharSequence;Ljava/lang/String;)Lcom/oracle/truffle/api/source/Source$LiteralBuilder;
         5: .line 77
            iconst_1
            invokevirtual com.oracle.truffle.api.source.Source$LiteralBuilder.internal:(Z)Lcom/oracle/truffle/api/source/Source$LiteralBuilder;
            invokevirtual com.oracle.truffle.api.source.Source$LiteralBuilder.build:()Lcom/oracle/truffle/api/source/Source;
            iconst_0
            anewarray java.lang.String
         6: .line 72
            invokevirtual com.oracle.truffle.api.TruffleLanguage$Env.parseInternal:(Lcom/oracle/truffle/api/source/Source;[Ljava/lang/String;)Lcom/oracle/truffle/api/CallTarget;
            astore 0 /* load */
        start local 0 // com.oracle.truffle.api.CallTarget load
         7: .line 78
            aload 0 /* load */
            iconst_0
            anewarray java.lang.Object
            invokeinterface com.oracle.truffle.api.CallTarget.call:([Ljava/lang/Object;)Ljava/lang/Object;
            putstatic com.oracle.truffle.nfi.test.StringAsInterfaceNFITest.rawStdLib:Ljava/lang/Object;
         8: .line 79
            getstatic com.oracle.truffle.nfi.test.StringAsInterfaceNFITest.runWithPolyglot:Lcom/oracle/truffle/tck/TruffleRunner$RunWithPolyglotRule;
            invokevirtual com.oracle.truffle.tck.TruffleRunner$RunWithPolyglotRule.getPolyglotContext:()Lorg/graalvm/polyglot/Context;
            getstatic com.oracle.truffle.nfi.test.StringAsInterfaceNFITest.rawStdLib:Ljava/lang/Object;
            invokevirtual org.graalvm.polyglot.Context.asValue:(Ljava/lang/Object;)Lorg/graalvm/polyglot/Value;
            ldc Lcom/oracle/truffle/nfi/test/StringAsInterfaceNFITest$StdLib;
            invokevirtual org.graalvm.polyglot.Value.as:(Ljava/lang/Class;)Ljava/lang/Object;
            checkcast com.oracle.truffle.nfi.test.StringAsInterfaceNFITest$StdLib
            putstatic com.oracle.truffle.nfi.test.StringAsInterfaceNFITest.stdlib:Lcom/oracle/truffle/nfi/test/StringAsInterfaceNFITest$StdLib;
         9: .line 80
            return
        end local 0 // com.oracle.truffle.api.CallTarget load
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            7   10     0  load  Lcom/oracle/truffle/api/CallTarget;
    RuntimeVisibleAnnotations: 
      org.junit.BeforeClass()

  private static void assumptions();
    descriptor: ()V
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=2, locals=0, args_size=0
         0: .line 98
            ldc "disable test on AOT"
            getstatic com.oracle.truffle.api.TruffleOptions.AOT:Z
            invokestatic org.junit.Assume.assumeFalse:(Ljava/lang/String;Z)V
         1: .line 101
            ldc "disable test on Windows"
            getstatic com.oracle.truffle.nfi.test.NFITest.IS_WINDOWS:Z
            invokestatic org.junit.Assume.assumeFalse:(Ljava/lang/String;Z)V
         2: .line 102
            return
      LocalVariableTable:
        Start  End  Slot  Name  Signature

  public void testDuplicateAString();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=1
        start local 0 // com.oracle.truffle.nfi.test.StringAsInterfaceNFITest this
         0: .line 106
            invokestatic com.oracle.truffle.nfi.test.StringAsInterfaceNFITest.assumptions:()V
         1: .line 107
            getstatic com.oracle.truffle.nfi.test.StringAsInterfaceNFITest.stdlib:Lcom/oracle/truffle/nfi/test/StringAsInterfaceNFITest$StdLib;
            ldc "Ahoj"
            invokeinterface com.oracle.truffle.nfi.test.StringAsInterfaceNFITest$StdLib.strdup:(Ljava/lang/String;)Ljava/lang/String;
            astore 1 /* copy */
        start local 1 // java.lang.String copy
         2: .line 108
            ldc "Ahoj"
            aload 1 /* copy */
            invokestatic org.junit.Assert.assertEquals:(Ljava/lang/Object;Ljava/lang/Object;)V
         3: .line 109
            return
        end local 1 // java.lang.String copy
        end local 0 // com.oracle.truffle.nfi.test.StringAsInterfaceNFITest this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    4     0  this  Lcom/oracle/truffle/nfi/test/StringAsInterfaceNFITest;
            2    4     1  copy  Ljava/lang/String;
    RuntimeVisibleAnnotations: 
      org.junit.Test()

  public void testAllocAndRelease();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=1
        start local 0 // com.oracle.truffle.nfi.test.StringAsInterfaceNFITest this
         0: .line 113
            invokestatic com.oracle.truffle.nfi.test.StringAsInterfaceNFITest.assumptions:()V
         1: .line 114
            getstatic com.oracle.truffle.nfi.test.StringAsInterfaceNFITest.stdlib:Lcom/oracle/truffle/nfi/test/StringAsInterfaceNFITest$StdLib;
            sipush 512
            invokeinterface com.oracle.truffle.nfi.test.StringAsInterfaceNFITest$StdLib.malloc:(I)Ljava/lang/Object;
            astore 1 /* mem */
        start local 1 // java.lang.Object mem
         2: .line 115
            getstatic com.oracle.truffle.nfi.test.StringAsInterfaceNFITest.stdlib:Lcom/oracle/truffle/nfi/test/StringAsInterfaceNFITest$StdLib;
            aload 1 /* mem */
            invokeinterface com.oracle.truffle.nfi.test.StringAsInterfaceNFITest$StdLib.free:(Ljava/lang/Object;)V
         3: .line 116
            return
        end local 1 // java.lang.Object mem
        end local 0 // com.oracle.truffle.nfi.test.StringAsInterfaceNFITest this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    4     0  this  Lcom/oracle/truffle/nfi/test/StringAsInterfaceNFITest;
            2    4     1   mem  Ljava/lang/Object;
    RuntimeVisibleAnnotations: 
      org.junit.Test()

  public void testAllocAndReleaseWithInvoke();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=7, locals=2, args_size=1
        start local 0 // com.oracle.truffle.nfi.test.StringAsInterfaceNFITest this
         0: .line 120
            invokestatic com.oracle.truffle.nfi.test.StringAsInterfaceNFITest.assumptions:()V
         1: .line 121
            getstatic com.oracle.truffle.nfi.test.NFITest.UNCACHED_INTEROP:Lcom/oracle/truffle/api/interop/InteropLibrary;
            getstatic com.oracle.truffle.nfi.test.StringAsInterfaceNFITest.rawStdLib:Ljava/lang/Object;
            ldc "malloc"
            iconst_1
            anewarray java.lang.Object
            dup
            iconst_0
            sipush 512
            invokestatic java.lang.Integer.valueOf:(I)Ljava/lang/Integer;
            aastore
            invokevirtual com.oracle.truffle.api.interop.InteropLibrary.invokeMember:(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object;
            astore 1 /* mem */
        start local 1 // java.lang.Object mem
         2: .line 122
            ldc "some memory allocated"
            aload 1 /* mem */
            invokestatic org.junit.Assert.assertNotNull:(Ljava/lang/String;Ljava/lang/Object;)V
         3: .line 123
            getstatic com.oracle.truffle.nfi.test.NFITest.UNCACHED_INTEROP:Lcom/oracle/truffle/api/interop/InteropLibrary;
            getstatic com.oracle.truffle.nfi.test.StringAsInterfaceNFITest.rawStdLib:Ljava/lang/Object;
            ldc "free"
            iconst_1
            anewarray java.lang.Object
            dup
            iconst_0
            aload 1 /* mem */
            aastore
            invokevirtual com.oracle.truffle.api.interop.InteropLibrary.invokeMember:(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object;
            pop
         4: .line 124
            return
        end local 1 // java.lang.Object mem
        end local 0 // com.oracle.truffle.nfi.test.StringAsInterfaceNFITest this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    5     0  this  Lcom/oracle/truffle/nfi/test/StringAsInterfaceNFITest;
            2    5     1   mem  Ljava/lang/Object;
    Exceptions:
      throws java.lang.Exception
    RuntimeVisibleAnnotations: 
      org.junit.Test()

  public void canViewDefaultLibraryAsAnotherInterface();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=4, locals=5, args_size=1
        start local 0 // com.oracle.truffle.nfi.test.StringAsInterfaceNFITest this
         0: .line 128
            invokestatic com.oracle.truffle.nfi.test.StringAsInterfaceNFITest.assumptions:()V
         1: .line 129
            getstatic com.oracle.truffle.nfi.test.StringAsInterfaceNFITest.runWithPolyglot:Lcom/oracle/truffle/tck/TruffleRunner$RunWithPolyglotRule;
            invokevirtual com.oracle.truffle.tck.TruffleRunner$RunWithPolyglotRule.getTruffleTestEnv:()Lcom/oracle/truffle/api/TruffleLanguage$Env;
            ldc "nfi"
            ldc "default {\n  strndup(string, UINT32):string;\n}"
         2: .line 131
            ldc "(load default)"
         3: .line 129
            invokestatic com.oracle.truffle.api.source.Source.newBuilder:(Ljava/lang/String;Ljava/lang/CharSequence;Ljava/lang/String;)Lcom/oracle/truffle/api/source/Source$LiteralBuilder;
         4: .line 132
            iconst_1
            invokevirtual com.oracle.truffle.api.source.Source$LiteralBuilder.internal:(Z)Lcom/oracle/truffle/api/source/Source$LiteralBuilder;
            invokevirtual com.oracle.truffle.api.source.Source$LiteralBuilder.build:()Lcom/oracle/truffle/api/source/Source;
            iconst_0
            anewarray java.lang.String
         5: .line 129
            invokevirtual com.oracle.truffle.api.TruffleLanguage$Env.parseInternal:(Lcom/oracle/truffle/api/source/Source;[Ljava/lang/String;)Lcom/oracle/truffle/api/CallTarget;
            astore 1 /* load */
        start local 1 // com.oracle.truffle.api.CallTarget load
         6: .line 133
            getstatic com.oracle.truffle.nfi.test.StringAsInterfaceNFITest.runWithPolyglot:Lcom/oracle/truffle/tck/TruffleRunner$RunWithPolyglotRule;
            invokevirtual com.oracle.truffle.tck.TruffleRunner$RunWithPolyglotRule.getPolyglotContext:()Lorg/graalvm/polyglot/Context;
            aload 1 /* load */
            iconst_0
            anewarray java.lang.Object
            invokeinterface com.oracle.truffle.api.CallTarget.call:([Ljava/lang/Object;)Ljava/lang/Object;
            invokevirtual org.graalvm.polyglot.Context.asValue:(Ljava/lang/Object;)Lorg/graalvm/polyglot/Value;
            ldc Lcom/oracle/truffle/nfi/test/StringAsInterfaceNFITest$Strndup;
            invokevirtual org.graalvm.polyglot.Value.as:(Ljava/lang/Class;)Ljava/lang/Object;
            checkcast com.oracle.truffle.nfi.test.StringAsInterfaceNFITest$Strndup
            astore 2 /* second */
        start local 2 // com.oracle.truffle.nfi.test.StringAsInterfaceNFITest$Strndup second
         7: .line 135
            getstatic com.oracle.truffle.nfi.test.StringAsInterfaceNFITest.stdlib:Lcom/oracle/truffle/nfi/test/StringAsInterfaceNFITest$StdLib;
            ldc "Hello World!"
            invokeinterface com.oracle.truffle.nfi.test.StringAsInterfaceNFITest$StdLib.strdup:(Ljava/lang/String;)Ljava/lang/String;
            astore 3 /* copy */
        start local 3 // java.lang.String copy
         8: .line 136
            aload 2 /* second */
            aload 3 /* copy */
            iconst_5
            invokeinterface com.oracle.truffle.nfi.test.StringAsInterfaceNFITest$Strndup.strndup:(Ljava/lang/String;I)Ljava/lang/String;
            astore 4 /* hello */
        start local 4 // java.lang.String hello
         9: .line 137
            ldc "Hello"
            aload 4 /* hello */
            invokestatic org.junit.Assert.assertEquals:(Ljava/lang/Object;Ljava/lang/Object;)V
        10: .line 138
            return
        end local 4 // java.lang.String hello
        end local 3 // java.lang.String copy
        end local 2 // com.oracle.truffle.nfi.test.StringAsInterfaceNFITest$Strndup second
        end local 1 // com.oracle.truffle.api.CallTarget load
        end local 0 // com.oracle.truffle.nfi.test.StringAsInterfaceNFITest this
      LocalVariableTable:
        Start  End  Slot    Name  Signature
            0   11     0    this  Lcom/oracle/truffle/nfi/test/StringAsInterfaceNFITest;
            6   11     1    load  Lcom/oracle/truffle/api/CallTarget;
            7   11     2  second  Lcom/oracle/truffle/nfi/test/StringAsInterfaceNFITest$Strndup;
            8   11     3    copy  Ljava/lang/String;
            9   11     4   hello  Ljava/lang/String;
    RuntimeVisibleAnnotations: 
      org.junit.Test()
}
SourceFile: "StringAsInterfaceNFITest.java"
NestMembers:
  com.oracle.truffle.nfi.test.StringAsInterfaceNFITest$StdLib  com.oracle.truffle.nfi.test.StringAsInterfaceNFITest$Strndup
InnerClasses:
  public final Env = com.oracle.truffle.api.TruffleLanguage$Env of com.oracle.truffle.api.TruffleLanguage
  public final LiteralBuilder = com.oracle.truffle.api.source.Source$LiteralBuilder of com.oracle.truffle.api.source.Source
  abstract StdLib = com.oracle.truffle.nfi.test.StringAsInterfaceNFITest$StdLib of com.oracle.truffle.nfi.test.StringAsInterfaceNFITest
  abstract Strndup = com.oracle.truffle.nfi.test.StringAsInterfaceNFITest$Strndup of com.oracle.truffle.nfi.test.StringAsInterfaceNFITest
  public final RunWithPolyglotRule = com.oracle.truffle.tck.TruffleRunner$RunWithPolyglotRule of com.oracle.truffle.tck.TruffleRunner
  public final Builder = org.graalvm.polyglot.Context$Builder of org.graalvm.polyglot.Context