Class<? extends NativeInvoker> newInvokerClass(JITSignature jitSignature, String methodName) { JITMethodGenerator generator = null; JITMethodGenerator[] generators = { new FastIntMethodGenerator(), new FastLongMethodGenerator(), new FastNumericMethodGenerator(),}; for (int i = 0; i < generators.length; i++) { if (generators[i].isSupported(jitSignature)) { generator = generators[i]; break; } } if (generator == null) { return null; } return new AsmClassBuilder(generator, jitSignature, methodName).build(); } }
private void emitResultConversion(SkinnyMethodAdapter mv, AsmClassBuilder builder, JITSignature signature) { if (signature.hasResultConverter()) { mv.aload(0); // [ result, this ] mv.getfield(builder.getClassName(), builder.getResultConverterFieldName(), ci(NativeDataConverter.class)); mv.swap(); // [ converter, result ] mv.aload(1); mv.swap(); // [ converter, thread context, result ] mv.invokevirtual(p(NativeDataConverter.class), "fromNative", sig(IRubyObject.class, ThreadContext.class, IRubyObject.class)); } }
public void generate(AsmClassBuilder builder, String functionName, JITSignature signature) { Class[] params = new Class[4 + signature.getParameterCount()]; params[0] = ThreadContext.class; params[1] = IRubyObject.class; params[2] = RubyModule.class; params[3] = String.class; Arrays.fill(params, 4, params.length, IRubyObject.class); SkinnyMethodAdapter mv = new SkinnyMethodAdapter(builder.getClassVisitor(), ACC_PUBLIC | ACC_FINAL, functionName, sig(IRubyObject.class, params), null, null); mv.start(); generate(builder, mv, signature, 5); mv.visitMaxs(30, 30); mv.visitEnd(); }
if (signature.hasParameterConverter(i)) { mv.aload(0); mv.getfield(builder.getClassName(), builder.getParameterConverterFieldName(i), ci(NativeDataConverter.class)); mv.aload(1); // ThreadContext mv.aload(1); // ThreadContext mv.aload(0); mv.getfield(p(JITNativeInvoker.class), builder.getParameterCallSiteName(i), ci(CachingCallSite.class)); mv.invokestatic(p(JITRuntime.class), parameterType == NativeType.STRING ? "convertToStringMemoryIO" : "convertToTransientStringMemoryIO", mv.aload(paramVar); mv.aload(0); mv.getfield(p(JITNativeInvoker.class), builder.getParameterCallSiteName(i), ci(CachingCallSite.class)); mv.invokestatic(p(JITRuntime.class), "convertToPointerMemoryIO", sig(org.jruby.ext.ffi.MemoryIO.class, ThreadContext.class, IRubyObject.class, CachingCallSite.class)); break;
AsmClassBuilder(JITMethodGenerator generator, JITSignature signature, String methodName) { this.generator = generator; this.signature = signature; this.methodName = methodName; switch (signature.getParameterCount()) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: parentClass = JITNativeInvoker.class; break; default: throw new UnsupportedOperationException("arity " + signature.getParameterCount() + " not supported"); } className = p(NativeInvoker.class) + "$ffi$" + nextClassID.getAndIncrement() + (REIFY ? ("$" + methodName) : ""); classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES); classVisitor = DEBUG ? newCheckClassAdapter(classWriter) : classWriter; classVisitor.visit(V1_5, ACC_PUBLIC | ACC_FINAL, className, null, p(parentClass), new String[0]); }
byte[] bytes = classWriter.toByteArray(); if (DEBUG) { ClassVisitor trace = newTraceClassVisitor(new PrintWriter(System.err)); new ClassReader(bytes).accept(trace, 0);
if (signature.hasParameterConverter(i)) { mv.aload(0); mv.getfield(builder.getClassName(), builder.getParameterConverterFieldName(i), ci(NativeDataConverter.class)); mv.aload(1); // ThreadContext mv.aload(1); // ThreadContext mv.aload(0); mv.getfield(p(JITNativeInvoker.class), builder.getParameterCallSiteName(i), ci(CachingCallSite.class)); mv.invokestatic(p(JITRuntime.class), parameterType == NativeType.STRING ? "convertToStringMemoryIO" : "convertToTransientStringMemoryIO", mv.aload(paramVar); mv.aload(0); mv.getfield(p(JITNativeInvoker.class), builder.getParameterCallSiteName(i), ci(CachingCallSite.class)); mv.invokestatic(p(JITRuntime.class), "convertToPointerMemoryIO", sig(org.jruby.ext.ffi.MemoryIO.class, ThreadContext.class, IRubyObject.class, CachingCallSite.class)); break;
AsmClassBuilder(JITMethodGenerator generator, JITSignature signature, String methodName) { this.generator = generator; this.signature = signature; this.methodName = methodName; switch (signature.getParameterCount()) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: parentClass = JITNativeInvoker.class; break; default: throw new UnsupportedOperationException("arity " + signature.getParameterCount() + " not supported"); } className = p(NativeInvoker.class) + "$ffi$" + nextClassID.getAndIncrement() + (REIFY ? ("$" + methodName) : ""); classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES); classVisitor = DEBUG ? newCheckClassAdapter(classWriter) : classWriter; classVisitor.visit(V1_5, ACC_PUBLIC | ACC_FINAL, className, null, p(parentClass), new String[0]); }
byte[] bytes = classWriter.toByteArray(); if (DEBUG) { ClassVisitor trace = newTraceClassVisitor(new PrintWriter(System.err)); new ClassReader(bytes).accept(trace, 0);
if (signature.hasParameterConverter(i)) { mv.aload(0); mv.getfield(builder.getClassName(), builder.getParameterConverterFieldName(i), ci(NativeDataConverter.class)); mv.aload(1); // ThreadContext mv.aload(1); // ThreadContext mv.aload(0); mv.getfield(p(JITNativeInvoker.class), builder.getParameterCallSiteName(i), ci(CachingCallSite.class)); mv.invokestatic(p(JITRuntime.class), parameterType == NativeType.STRING ? "convertToStringMemoryIO" : "convertToTransientStringMemoryIO", mv.aload(paramVar); mv.aload(0); mv.getfield(p(JITNativeInvoker.class), builder.getParameterCallSiteName(i), ci(CachingCallSite.class)); mv.invokestatic(p(JITRuntime.class), "convertToPointerMemoryIO", sig(org.jruby.ext.ffi.MemoryIO.class, ThreadContext.class, IRubyObject.class, CachingCallSite.class)); break;
private void emitResultConversion(SkinnyMethodAdapter mv, AsmClassBuilder builder, JITSignature signature) { if (signature.hasResultConverter()) { mv.aload(0); // [ result, this ] mv.getfield(builder.getClassName(), builder.getResultConverterFieldName(), ci(NativeDataConverter.class)); mv.swap(); // [ converter, result ] mv.aload(1); mv.swap(); // [ converter, thread context, result ] mv.invokevirtual(p(NativeDataConverter.class), "fromNative", sig(IRubyObject.class, ThreadContext.class, IRubyObject.class)); } }
Class<? extends NativeInvoker> newInvokerClass(JITSignature jitSignature, String methodName) { JITMethodGenerator generator = null; JITMethodGenerator[] generators = { new FastIntMethodGenerator(), new FastLongMethodGenerator(), new FastNumericMethodGenerator(),}; for (int i = 0; i < generators.length; i++) { if (generators[i].isSupported(jitSignature)) { generator = generators[i]; break; } } if (generator == null) { return null; } return new AsmClassBuilder(generator, jitSignature, methodName).build(); } }
public void generate(AsmClassBuilder builder, String functionName, JITSignature signature) { Class[] params = new Class[4 + signature.getParameterCount()]; params[0] = ThreadContext.class; params[1] = IRubyObject.class; params[2] = RubyModule.class; params[3] = String.class; Arrays.fill(params, 4, params.length, IRubyObject.class); SkinnyMethodAdapter mv = new SkinnyMethodAdapter(builder.getClassVisitor(), ACC_PUBLIC | ACC_FINAL, functionName, sig(IRubyObject.class, params), null, null); mv.start(); generate(builder, mv, signature, 5); mv.visitMaxs(30, 30); mv.visitEnd(); }
AsmClassBuilder(JITMethodGenerator generator, JITSignature signature, String methodName) { this.generator = generator; this.signature = signature; this.methodName = methodName; switch (signature.getParameterCount()) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: parentClass = JITNativeInvoker.class; break; default: throw new UnsupportedOperationException("arity " + signature.getParameterCount() + " not supported"); } className = p(NativeInvoker.class) + "$ffi$" + nextClassID.getAndIncrement() + (REIFY ? ("$" + methodName) : ""); classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES); classVisitor = DEBUG ? newCheckClassAdapter(classWriter) : classWriter; classVisitor.visit(V1_5, ACC_PUBLIC | ACC_FINAL, className, null, p(parentClass), new String[0]); }
byte[] bytes = classWriter.toByteArray(); if (DEBUG) { ClassVisitor trace = newTraceClassVisitor(new PrintWriter(System.err)); new ClassReader(bytes).accept(trace, 0);
if (signature.hasParameterConverter(i)) { mv.aload(0); mv.getfield(builder.getClassName(), builder.getParameterConverterFieldName(i), ci(NativeDataConverter.class)); mv.aload(1); // ThreadContext mv.aload(1); // ThreadContext mv.aload(0); mv.getfield(p(JITNativeInvoker.class), builder.getParameterCallSiteName(i), ci(CachingCallSite.class)); mv.invokestatic(p(JITRuntime.class), parameterType == NativeType.STRING ? "convertToStringMemoryIO" : "convertToTransientStringMemoryIO", mv.aload(paramVar); mv.aload(0); mv.getfield(p(JITNativeInvoker.class), builder.getParameterCallSiteName(i), ci(CachingCallSite.class)); mv.invokestatic(p(JITRuntime.class), "convertToPointerMemoryIO", sig(org.jruby.ext.ffi.MemoryIO.class, ThreadContext.class, IRubyObject.class, CachingCallSite.class)); break;
private void emitResultConversion(SkinnyMethodAdapter mv, AsmClassBuilder builder, JITSignature signature) { if (signature.hasResultConverter()) { mv.aload(0); // [ result, this ] mv.getfield(builder.getClassName(), builder.getResultConverterFieldName(), ci(NativeDataConverter.class)); mv.swap(); // [ converter, result ] mv.aload(1); mv.swap(); // [ converter, thread context, result ] mv.invokevirtual(p(NativeDataConverter.class), "fromNative", sig(IRubyObject.class, ThreadContext.class, IRubyObject.class)); } }
Class<? extends NativeInvoker> newInvokerClass(JITSignature jitSignature, String methodName) { JITMethodGenerator generator = null; JITMethodGenerator[] generators = { new FastIntMethodGenerator(), new FastLongMethodGenerator(), new FastNumericMethodGenerator(),}; for (int i = 0; i < generators.length; i++) { if (generators[i].isSupported(jitSignature)) { generator = generators[i]; break; } } if (generator == null) { return null; } return new AsmClassBuilder(generator, jitSignature, methodName).build(); } }
public void generate(AsmClassBuilder builder, String functionName, JITSignature signature) { Class[] params = new Class[4 + signature.getParameterCount()]; params[0] = ThreadContext.class; params[1] = IRubyObject.class; params[2] = RubyModule.class; params[3] = String.class; Arrays.fill(params, 4, params.length, IRubyObject.class); SkinnyMethodAdapter mv = new SkinnyMethodAdapter(builder.getClassVisitor(), ACC_PUBLIC | ACC_FINAL, functionName, sig(IRubyObject.class, params), null, null); mv.start(); generate(builder, mv, signature, 5); mv.visitMaxs(30, 30); mv.visitEnd(); }
AsmClassBuilder(JITMethodGenerator generator, JITSignature signature, String methodName) { this.generator = generator; this.signature = signature; this.methodName = methodName; switch (signature.getParameterCount()) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: parentClass = JITNativeInvoker.class; break; default: throw new UnsupportedOperationException("arity " + signature.getParameterCount() + " not supported"); } className = p(NativeInvoker.class) + "$ffi$" + nextClassID.getAndIncrement() + (REIFY ? ("$" + methodName) : ""); classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES); classVisitor = DEBUG ? newCheckClassAdapter(classWriter) : classWriter; classVisitor.visit(V1_5, ACC_PUBLIC | ACC_FINAL, className, null, p(parentClass), new String[0]); }