Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package org.jruby.ext.ffi.jffi;
  
  
  import  org.objectweb.asm.ClassReader;
 import  org.objectweb.asm.ClassVisitor;
 import  org.objectweb.asm.ClassWriter;
 
 import static org.jruby.util.CodegenUtils.*;
 import static org.objectweb.asm.Opcodes.*;

 
 final class AsmClassBuilder {
     public static final boolean DEBUG = false || ..load() || ..load();
     private static final AtomicLong nextClassID = new AtomicLong(0);
     private final JITSignature signature;
     private final ClassWriter classWriter;
     private final ClassVisitor classVisitor;
     private final String className;
     private final Class parentClass;
     private final JITMethodGenerator generator;
     
     AsmClassBuilder(JITMethodGenerator generatorJITSignature signature) {
         this. = generator;
         this. = signature;
         
         switch (signature.getParameterCount()) {
             case 0:
             case 1:
             case 2:
             case 3:
             case 4:
             case 5:
             case 6:
                  = JITNativeInvoker.class;
                 break;
 
             default:
                 throw new UnsupportedOperationException("arity " 
                         + signature.getParameterCount()  + " not supported");
         }
         
          = p(NativeInvoker.class) + "$ffi$" + .getAndIncrement();
         
          = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
         .visit(V1_5, ACC_PUBLIC | ACC_FINAL, null
                 p(), new String[0]);
     }
     
     Class<? extends NativeInvokerbuild() {
         // Create the constructor to set the 'library' & functions fields
         SkinnyMethodAdapter init = new SkinnyMethodAdapter(, ACC_PUBLIC, "<init>",
                 sig(void.classRubyModule.classcom.kenai.jffi.Function.classSignature.class),
                 nullnull);
         
         init.start();
 
         // Invoker the superclass's constructor
         init.aload(0); // this
         init.aload(1); // implementationClass
         init.aload(2); // jffi function
         init.aload(3); // signature
         init.invokespecial(p(), "<init>",
                 sig(void.classRubyModule.classcom.kenai.jffi.Function.classSignature.class));
         init.voidreturn();
         init.visitMaxs(10, 10);
         init.visitEnd();
         
         .generate(this"call");
 
         .visitEnd();
 
         try {
             byte[] bytes = .toByteArray();
             if () {
                 ClassVisitor trace = newTraceClassVisitor(new PrintWriter(.));
                 new ClassReader(bytes).accept(trace, 0);
             }
 
             JITClassLoader loader = new JITClassLoader(getClass().getClassLoader());
             
             return loader.defineClass(c(), bytes);
             
         } catch (Throwable ex) {
             throw new RuntimeException(ex);
         }
     }
     
     public static ClassVisitor newCheckClassAdapter(ClassVisitor cv) {
         try {
             Class<? extends ClassVisitor> tmvClass = Class.forName("org.objectweb.asm.util.CheckClassAdapter").asSubclass(ClassVisitor.class);
            Constructor<? extends ClassVisitor> c = tmvClass.getDeclaredConstructor(ClassVisitor.class);
            return c.newInstance(cv);
        } catch (Throwable t) {
            return cv;
        }
    }
    
    public static final ClassVisitor newTraceClassVisitor(PrintWriter out) {
        try {
            Class<? extends ClassVisitor> tmvClass = Class.forName("org.objectweb.asm.util.TraceClassVisitor").asSubclass(ClassVisitor.class);
            Constructor<? extends ClassVisitor> c = tmvClass.getDeclaredConstructor(PrintWriter.class);
            return c.newInstance(out);
        } catch (Throwable t) {
            return null;
        }
    }
    
    final String getFunctionFieldName() {
        return "function";
    }
    
        return "resultConverter";
    }
    
    final String getParameterConverterFieldName(int i) {
        return "parameterConverter" + i;
    }
        return "fallbackInvoker";
    }
    final ClassVisitor getClassVisitor() {
        return ;
    }
    
    final String getClassName() {
        return ;
    }
    
    
    static final class JITClassLoader extends ClassLoader {
        public JITClassLoader() {
        }
        public JITClassLoader(ClassLoader parent) {
            super(parent);
        }
        public Class defineClass(String namebyte[] b) {
            Class klass = defineClass(nameb, 0, b.length);
            resolveClass(klass);
            return klass;
        }
        
    }
New to GrepCode? Check out our FAQ X