def createConsumerInvokeSetOne(): cw = ClassWriter(0) cw.visit( 52, Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER, "my/InvokeSetOne", "<T::Lnet/imglib2/type/operators/SetOne>Ljava/lang/ObjectLjava/util/function/Consumer<TT>;", "java/lang/Object", ["java/util/function/Consumer"]) mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", None, None) mv.visitCode() mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", False) mv.visitInsn(Opcodes.RETURN) mv.visitMaxs(1, 1) mv.visitEnd() mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL, "accept", "(Lnet/imglib2/type/operators/SetOne;)V", "(TT)V", None) mv.visitCode() mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "net/imglib2/type/operators/SetOne", "setOne", "()V", True) mv.visitInsn(Opcodes.RETURN) mv.visitMaxs(1, 2) mv.visitEnd() mv = cw.visitMethod( Opcodes.ACC_PUBLIC + Opcodes.ACC_BRIDGE + Opcodes.ACC_SYNTHETIC, "accept", "(Ljava/lang/Object;)V", None, None) mv.visitCode() mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitTypeInsn(Opcodes.CHECKCAST, "net/imglib2/type/operators/SetOne") mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "my/InvokeSetOne", "accept", "(Lnet/imglib2/type/operators/SetOne;)V", False) mv.visitInsn(Opcodes.RETURN) mv.visitMaxs(2, 2) mv.visitEnd() cw.visitEnd() # Load class return CustomClassLoader().defineClass("my.InvokeSetOne", cw.toByteArray())
def defineBiConsumerTypeSet(imglib2Type, classname=None): """ A class to use in e.g. an ImgLib2 LoopBuilder.setImages(img1, img2).forEachPixel(<instance of this BiConsumer class>) where both image are of the same Type, and the value of one has to be set as the value of the other, like this: type1.set(type2) In java, this would be written as: LoopBuilder.setImages(img1, img2).forEachPixel( (type1, type2) -> type1.set(type2) ); """ typeClassname = imglib2Type.getName().replace(".", "/") if classname is None: classname = "asm/loop/BiConsumer_%s_set" % imglib2Type.getSimpleName() classWriter = ClassWriter(0) classWriter.visit( Opcodes.V1_8, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER, classname, "<T::L%s<TT;>;>Ljava/lang/Object;Ljava/util/function/BiConsumer<TT;TT;>;" % typeClassname, "java/lang/Object", ["java/util/function/BiConsumer"]) # Constructor methodVisitor = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", None, None) methodVisitor.visitCode() methodVisitor.visitVarInsn(Opcodes.ALOAD, 0) methodVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", False) methodVisitor.visitInsn(Opcodes.RETURN) methodVisitor.visitMaxs(1, 1) methodVisitor.visitEnd() # BiConsumer.accept method implementation with body Type.set(Type) methodVisitor = classWriter.visitMethod( Opcodes.ACC_PUBLIC, "accept", "(L%s;L%s;)V" % (typeClassname, typeClassname), "(TT;TT;)V", None) methodVisitor.visitCode() methodVisitor.visitVarInsn(Opcodes.ALOAD, 2) methodVisitor.visitVarInsn(Opcodes.ALOAD, 1) methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, typeClassname, "set", "(L%s;)V" % typeClassname, False) methodVisitor.visitInsn(Opcodes.RETURN) methodVisitor.visitMaxs(2, 3) methodVisitor.visitEnd() # BiConsumer.accept method with Object,Object arguments: to provide a bridge between the BiConsumer.accept method and the class accept method methodVisitor = classWriter.visitMethod( Opcodes.ACC_PUBLIC | Opcodes.ACC_BRIDGE | Opcodes.ACC_SYNTHETIC, "accept", "(Ljava/lang/Object;Ljava/lang/Object;)V", None, None) methodVisitor.visitCode() methodVisitor.visitVarInsn(Opcodes.ALOAD, 0) methodVisitor.visitVarInsn(Opcodes.ALOAD, 1) methodVisitor.visitTypeInsn(Opcodes.CHECKCAST, typeClassname) methodVisitor.visitVarInsn(Opcodes.ALOAD, 2) methodVisitor.visitTypeInsn(Opcodes.CHECKCAST, typeClassname) methodVisitor.visitMethodInsn( Opcodes.INVOKEVIRTUAL, classname, "accept", "(L%s;L%s;)V" % (typeClassname, typeClassname), False) methodVisitor.visitInsn(Opcodes.RETURN) methodVisitor.visitMaxs(3, 3) methodVisitor.visitEnd() classWriter.visitEnd() loader = CustomClassLoader() biconsumerClass = loader.defineClass(classname, classWriter.toByteArray()) return biconsumerClass
def createNativePointMatchesClass(classloader=None): # Class my/PointMatchesFast cw = ClassWriter(0) cw.visit(52, Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER, "my/PointMatchesFast", None, "java/lang/Object", None) fv = cw.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL, "pointmatches", "Ljava/util/List;", "Ljava/util/List<Lmpicbg/models/PointMatch;>;", None) fv.visitEnd() mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "(Ljava/util/List;)V", "(Ljava/util/List<Lmpicbg/models/PointMatch;>;)V", None) mv.visitCode() mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V") mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitFieldInsn(Opcodes.PUTFIELD, "my/PointMatchesFast", "pointmatches", "Ljava/util/List;") mv.visitInsn(Opcodes.RETURN) mv.visitMaxs(2, 2) mv.visitEnd() for PM_method, C_method in (("fromFeatures", "matches"), ("fromFeaturesScaleInvariant", "matchesScaleInvariant")): mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, PM_method, "(Ljava/util/List;Ljava/util/List;DD)Lmy/PointMatchesFast;", "(Ljava/util/List<Lmy/ConstellationFast;>;Ljava/util/List<Lmy/ConstellationFast;>;DD)Lmy/PointMatchesFast;", None) mv.visitCode() mv.visitTypeInsn(Opcodes.NEW, "java/util/ArrayList") mv.visitInsn(Opcodes.DUP) mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V") mv.visitVarInsn(Opcodes.ASTORE, 6) mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "iterator", "()Ljava/util/Iterator;") mv.visitVarInsn(Opcodes.ASTORE, 7) l0 = Label() mv.visitLabel(l0) mv.visitFrame(Opcodes.F_APPEND,2, ["java/util/List", "java/util/Iterator"], 0, None) mv.visitVarInsn(Opcodes.ALOAD, 7) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z") l1 = Label() mv.visitJumpInsn(Opcodes.IFEQ, l1) mv.visitVarInsn(Opcodes.ALOAD, 7) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;") mv.visitTypeInsn(Opcodes.CHECKCAST, "my/ConstellationFast") mv.visitVarInsn(Opcodes.ASTORE, 8) mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "iterator", "()Ljava/util/Iterator;") mv.visitVarInsn(Opcodes.ASTORE, 9) l2 = Label() mv.visitLabel(l2) mv.visitFrame(Opcodes.F_APPEND,2, ["my/ConstellationFast", "java/util/Iterator"], 0, None) mv.visitVarInsn(Opcodes.ALOAD, 9) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z") l3 = Label() mv.visitJumpInsn(Opcodes.IFEQ, l3) mv.visitVarInsn(Opcodes.ALOAD, 9) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;") mv.visitTypeInsn(Opcodes.CHECKCAST, "my/ConstellationFast") mv.visitVarInsn(Opcodes.ASTORE, 10) mv.visitVarInsn(Opcodes.ALOAD, 8) mv.visitVarInsn(Opcodes.ALOAD, 10) mv.visitVarInsn(Opcodes.DLOAD, 2) mv.visitVarInsn(Opcodes.DLOAD, 4) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "my/ConstellationFast", C_method, "(Lmy/ConstellationFast;DD)Z") l4 = Label() mv.visitJumpInsn(Opcodes.IFEQ, l4) mv.visitVarInsn(Opcodes.ALOAD, 6) mv.visitTypeInsn(Opcodes.NEW, "mpicbg/models/PointMatch") mv.visitInsn(Opcodes.DUP) mv.visitVarInsn(Opcodes.ALOAD, 8) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "position", "Lmpicbg/models/Point;") mv.visitVarInsn(Opcodes.ALOAD, 10) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "position", "Lmpicbg/models/Point;") mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "mpicbg/models/PointMatch", "<init>", "(Lmpicbg/models/Point;Lmpicbg/models/Point;)V") mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "add", "(Ljava/lang/Object;)Z") mv.visitInsn(Opcodes.POP) mv.visitLabel(l4) mv.visitFrame(Opcodes.F_SAME, 0, None, 0, None) mv.visitJumpInsn(Opcodes.GOTO, l2) mv.visitLabel(l3) mv.visitFrame(Opcodes.F_CHOP,2, None, 0, None) mv.visitJumpInsn(Opcodes.GOTO, l0) mv.visitLabel(l1) mv.visitFrame(Opcodes.F_CHOP,1, None, 0, None) mv.visitTypeInsn(Opcodes.NEW, "my/PointMatchesFast") mv.visitInsn(Opcodes.DUP) mv.visitVarInsn(Opcodes.ALOAD, 6) mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "my/PointMatchesFast", "<init>", "(Ljava/util/List;)V") mv.visitInsn(Opcodes.ARETURN) mv.visitMaxs(6, 11) mv.visitEnd() mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "fromNearbyFeatures", "(DLjava/util/List;Ljava/util/List;DD)Lmy/PointMatchesFast;", "(DLjava/util/List<Lmy/ConstellationFast;>;Ljava/util/List<Lmy/ConstellationFast;>;DD)Lmy/PointMatchesFast;", None) mv.visitCode() mv.visitTypeInsn(Opcodes.NEW, "java/util/ArrayList") mv.visitInsn(Opcodes.DUP) mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V") mv.visitVarInsn(Opcodes.ASTORE, 8) mv.visitVarInsn(Opcodes.ALOAD, 3) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "iterator", "()Ljava/util/Iterator;") mv.visitVarInsn(Opcodes.ASTORE, 9) l0 = Label() mv.visitLabel(l0) mv.visitFrame(Opcodes.F_APPEND,2, ["java/util/List", "java/util/Iterator"], 0, None) mv.visitVarInsn(Opcodes.ALOAD, 9) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z") l1 = Label() mv.visitJumpInsn(Opcodes.IFEQ, l1) mv.visitVarInsn(Opcodes.ALOAD, 9) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;") mv.visitTypeInsn(Opcodes.CHECKCAST, "my/ConstellationFast") mv.visitVarInsn(Opcodes.ASTORE, 10) mv.visitVarInsn(Opcodes.ALOAD, 8) mv.visitVarInsn(Opcodes.ALOAD, 10) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "position", "Lmpicbg/models/Point;") mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "mpicbg/models/Point", "getW", "()[D") mv.visitMethodInsn(Opcodes.INVOKESTATIC, "net/imglib2/RealPoint", "wrap", "([D)Lnet/imglib2/RealPoint;") mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "add", "(Ljava/lang/Object;)Z") mv.visitInsn(Opcodes.POP) mv.visitJumpInsn(Opcodes.GOTO, l0) mv.visitLabel(l1) mv.visitFrame(Opcodes.F_CHOP,1, None, 0, None) mv.visitTypeInsn(Opcodes.NEW, "net/imglib2/neighborsearch/RadiusNeighborSearchOnKDTree") mv.visitInsn(Opcodes.DUP) mv.visitTypeInsn(Opcodes.NEW, "net/imglib2/KDTree") mv.visitInsn(Opcodes.DUP) mv.visitVarInsn(Opcodes.ALOAD, 3) mv.visitVarInsn(Opcodes.ALOAD, 8) mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "net/imglib2/KDTree", "<init>", "(Ljava/util/List;Ljava/util/List;)V") mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "net/imglib2/neighborsearch/RadiusNeighborSearchOnKDTree", "<init>", "(Lnet/imglib2/KDTree;)V") mv.visitVarInsn(Opcodes.ASTORE, 9) mv.visitTypeInsn(Opcodes.NEW, "java/util/ArrayList") mv.visitInsn(Opcodes.DUP) mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V") mv.visitVarInsn(Opcodes.ASTORE, 10) mv.visitVarInsn(Opcodes.ALOAD, 2) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "iterator", "()Ljava/util/Iterator;") mv.visitVarInsn(Opcodes.ASTORE, 11) l2 = Label() mv.visitLabel(l2) mv.visitFrame(Opcodes.F_APPEND,3, ["net/imglib2/neighborsearch/RadiusNeighborSearchOnKDTree", "java/util/List", "java/util/Iterator"], 0, None) mv.visitVarInsn(Opcodes.ALOAD, 11) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z") l3 = Label() mv.visitJumpInsn(Opcodes.IFEQ, l3) mv.visitVarInsn(Opcodes.ALOAD, 11) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;") mv.visitTypeInsn(Opcodes.CHECKCAST, "my/ConstellationFast") mv.visitVarInsn(Opcodes.ASTORE, 12) mv.visitVarInsn(Opcodes.ALOAD, 9) mv.visitVarInsn(Opcodes.ALOAD, 12) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "position", "Lmpicbg/models/Point;") mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "mpicbg/models/Point", "getW", "()[D") mv.visitMethodInsn(Opcodes.INVOKESTATIC, "net/imglib2/RealPoint", "wrap", "([D)Lnet/imglib2/RealPoint;") mv.visitVarInsn(Opcodes.DLOAD, 0) mv.visitInsn(Opcodes.ICONST_0) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/imglib2/neighborsearch/RadiusNeighborSearchOnKDTree", "search", "(Lnet/imglib2/RealLocalizable;DZ)V") mv.visitInsn(Opcodes.ICONST_0) mv.visitVarInsn(Opcodes.ISTORE, 13) mv.visitVarInsn(Opcodes.ALOAD, 9) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/imglib2/neighborsearch/RadiusNeighborSearchOnKDTree", "numNeighbors", "()I") mv.visitVarInsn(Opcodes.ISTORE, 14) l4 = Label() mv.visitLabel(l4) mv.visitFrame(Opcodes.F_APPEND,3, ["my/ConstellationFast", Opcodes.INTEGER, Opcodes.INTEGER], 0, None) mv.visitVarInsn(Opcodes.ILOAD, 13) mv.visitVarInsn(Opcodes.ILOAD, 14) l5 = Label() mv.visitJumpInsn(Opcodes.IF_ICMPGE, l5) mv.visitVarInsn(Opcodes.ALOAD, 9) mv.visitVarInsn(Opcodes.ILOAD, 13) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/imglib2/neighborsearch/RadiusNeighborSearchOnKDTree", "getSampler", "(I)Lnet/imglib2/Sampler;") mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "net/imglib2/Sampler", "get", "()Ljava/lang/Object;") mv.visitTypeInsn(Opcodes.CHECKCAST, "my/ConstellationFast") mv.visitVarInsn(Opcodes.ASTORE, 15) mv.visitVarInsn(Opcodes.ALOAD, 12) mv.visitVarInsn(Opcodes.ALOAD, 15) mv.visitVarInsn(Opcodes.DLOAD, 4) mv.visitVarInsn(Opcodes.DLOAD, 6) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "my/ConstellationFast", "matches", "(Lmy/ConstellationFast;DD)Z") l6 = Label() mv.visitJumpInsn(Opcodes.IFEQ, l6) mv.visitVarInsn(Opcodes.ALOAD, 10) mv.visitTypeInsn(Opcodes.NEW, "mpicbg/models/PointMatch") mv.visitInsn(Opcodes.DUP) mv.visitVarInsn(Opcodes.ALOAD, 12) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "position", "Lmpicbg/models/Point;") mv.visitVarInsn(Opcodes.ALOAD, 15) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "position", "Lmpicbg/models/Point;") mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "mpicbg/models/PointMatch", "<init>", "(Lmpicbg/models/Point;Lmpicbg/models/Point;)V") mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "add", "(Ljava/lang/Object;)Z") mv.visitInsn(Opcodes.POP) mv.visitLabel(l6) mv.visitFrame(Opcodes.F_SAME, 0, None, 0, None) mv.visitIincInsn(13, 1) mv.visitJumpInsn(Opcodes.GOTO, l4) mv.visitLabel(l5) mv.visitFrame(Opcodes.F_CHOP,3, None, 0, None) mv.visitJumpInsn(Opcodes.GOTO, l2) mv.visitLabel(l3) mv.visitFrame(Opcodes.F_CHOP,1, None, 0, None) mv.visitTypeInsn(Opcodes.NEW, "my/PointMatchesFast") mv.visitInsn(Opcodes.DUP) mv.visitVarInsn(Opcodes.ALOAD, 10) mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "my/PointMatchesFast", "<init>", "(Ljava/util/List;)V") mv.visitInsn(Opcodes.ARETURN) mv.visitMaxs(6, 16) mv.visitEnd() mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL, "toRows", "()[[D", None, None) mv.visitCode() mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitFieldInsn(Opcodes.GETFIELD, "my/PointMatchesFast", "pointmatches", "Ljava/util/List;") mv.visitInsn(Opcodes.ICONST_0) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "get", "(I)Ljava/lang/Object;", True) mv.visitTypeInsn(Opcodes.CHECKCAST, "mpicbg/models/PointMatch") mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "mpicbg/models/PointMatch", "getP1", "()Lmpicbg/models/Point;", False) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "mpicbg/models/Point", "getW", "()[D", False) mv.visitInsn(Opcodes.ARRAYLENGTH) mv.visitVarInsn(Opcodes.ISTORE, 1) mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitFieldInsn(Opcodes.GETFIELD, "my/PointMatchesFast", "pointmatches", "Ljava/util/List;") mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "size", "()I", True) mv.visitVarInsn(Opcodes.ILOAD, 1) mv.visitVarInsn(Opcodes.ILOAD, 1) mv.visitInsn(Opcodes.IADD) mv.visitMultiANewArrayInsn("[[D", 2) mv.visitVarInsn(Opcodes.ASTORE, 2) mv.visitInsn(Opcodes.ICONST_0) mv.visitVarInsn(Opcodes.ISTORE, 3) l0 = Label() mv.visitLabel(l0) mv.visitFrame(Opcodes.F_APPEND,3, [Opcodes.INTEGER, "[[D", Opcodes.INTEGER], 0, None) mv.visitVarInsn(Opcodes.ILOAD, 3) mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitFieldInsn(Opcodes.GETFIELD, "my/PointMatchesFast", "pointmatches", "Ljava/util/List;") mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "size", "()I", True) l1 = Label() mv.visitJumpInsn(Opcodes.IF_ICMPGE, l1) mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitFieldInsn(Opcodes.GETFIELD, "my/PointMatchesFast", "pointmatches", "Ljava/util/List;") mv.visitVarInsn(Opcodes.ILOAD, 3) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "get", "(I)Ljava/lang/Object;", True) mv.visitTypeInsn(Opcodes.CHECKCAST, "mpicbg/models/PointMatch") mv.visitVarInsn(Opcodes.ASTORE, 4) mv.visitVarInsn(Opcodes.ALOAD, 4) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "mpicbg/models/PointMatch", "getP1", "()Lmpicbg/models/Point;", False) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "mpicbg/models/Point", "getW", "()[D", False) mv.visitVarInsn(Opcodes.ASTORE, 5) mv.visitVarInsn(Opcodes.ALOAD, 4) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "mpicbg/models/PointMatch", "getP2", "()Lmpicbg/models/Point;", False) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "mpicbg/models/Point", "getW", "()[D", False) mv.visitVarInsn(Opcodes.ASTORE, 6) mv.visitInsn(Opcodes.ICONST_0) mv.visitVarInsn(Opcodes.ISTORE, 7) l2 = Label() mv.visitLabel(l2) mv.visitFrame(Opcodes.F_FULL, 8, ["my/PointMatchesFast", Opcodes.INTEGER, "[[D", Opcodes.INTEGER, "mpicbg/models/PointMatch", "[D", "[D", Opcodes.INTEGER], 0, []) mv.visitVarInsn(Opcodes.ILOAD, 7) mv.visitVarInsn(Opcodes.ILOAD, 1) l3 = Label() mv.visitJumpInsn(Opcodes.IF_ICMPGE, l3) mv.visitVarInsn(Opcodes.ALOAD, 2) mv.visitVarInsn(Opcodes.ILOAD, 3) mv.visitInsn(Opcodes.AALOAD) mv.visitVarInsn(Opcodes.ILOAD, 7) mv.visitVarInsn(Opcodes.ALOAD, 5) mv.visitVarInsn(Opcodes.ILOAD, 7) mv.visitInsn(Opcodes.DALOAD) mv.visitInsn(Opcodes.DASTORE) mv.visitIincInsn(7, 1) mv.visitJumpInsn(Opcodes.GOTO, l2) mv.visitLabel(l3) mv.visitFrame(Opcodes.F_CHOP,1, None, 0, None) mv.visitInsn(Opcodes.ICONST_0) mv.visitVarInsn(Opcodes.ISTORE, 7) l4 = Label() mv.visitLabel(l4) mv.visitFrame(Opcodes.F_APPEND,1, [Opcodes.INTEGER], 0, None) mv.visitVarInsn(Opcodes.ILOAD, 7) mv.visitVarInsn(Opcodes.ILOAD, 1) l5 = Label() mv.visitJumpInsn(Opcodes.IF_ICMPGE, l5) mv.visitVarInsn(Opcodes.ALOAD, 2) mv.visitVarInsn(Opcodes.ILOAD, 3) mv.visitInsn(Opcodes.AALOAD) mv.visitVarInsn(Opcodes.ILOAD, 1) mv.visitVarInsn(Opcodes.ILOAD, 7) mv.visitInsn(Opcodes.IADD) mv.visitVarInsn(Opcodes.ALOAD, 6) mv.visitVarInsn(Opcodes.ILOAD, 7) mv.visitInsn(Opcodes.DALOAD) mv.visitInsn(Opcodes.DASTORE) mv.visitIincInsn(7, 1) mv.visitJumpInsn(Opcodes.GOTO, l4) mv.visitLabel(l5) mv.visitFrame(Opcodes.F_FULL, 4, ["my/PointMatchesFast", Opcodes.INTEGER, "[[D", Opcodes.INTEGER], 0, []) mv.visitIincInsn(3, 1) mv.visitJumpInsn(Opcodes.GOTO, l0) mv.visitLabel(l1) mv.visitFrame(Opcodes.F_CHOP,1, None, 0, None) mv.visitVarInsn(Opcodes.ALOAD, 2) mv.visitInsn(Opcodes.ARETURN) mv.visitMaxs(4, 8) mv.visitEnd() mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "fromRows", "(Ljava/util/Iterator;)Lmy/PointMatchesFast;", "(Ljava/util/Iterator<Ljava/util/List<Ljava/lang/String;>;>;)Lmy/PointMatchesFast;", None) mv.visitCode() mv.visitTypeInsn(Opcodes.NEW, "java/util/ArrayList") mv.visitInsn(Opcodes.DUP) mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V", False) mv.visitVarInsn(Opcodes.ASTORE, 1) l0 = Label() mv.visitLabel(l0) mv.visitFrame(Opcodes.F_APPEND,1, ["java/util/List"], 0, None) mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z", True) l1 = Label() mv.visitJumpInsn(Opcodes.IFEQ, l1) mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;", True) mv.visitTypeInsn(Opcodes.CHECKCAST, "java/util/List") mv.visitVarInsn(Opcodes.ASTORE, 2) mv.visitVarInsn(Opcodes.ALOAD, 2) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "size", "()I", True) mv.visitInsn(Opcodes.ICONST_2) mv.visitInsn(Opcodes.IDIV) mv.visitVarInsn(Opcodes.ISTORE, 3) mv.visitVarInsn(Opcodes.ILOAD, 3) mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_DOUBLE) mv.visitVarInsn(Opcodes.ASTORE, 4) mv.visitVarInsn(Opcodes.ILOAD, 3) mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_DOUBLE) mv.visitVarInsn(Opcodes.ASTORE, 5) mv.visitInsn(Opcodes.ICONST_0) mv.visitVarInsn(Opcodes.ISTORE, 6) l2 = Label() mv.visitLabel(l2) mv.visitFrame(Opcodes.F_FULL, 7, ["java/util/Iterator", "java/util/List", "java/util/List", Opcodes.INTEGER, "[D", "[D", Opcodes.INTEGER], 0, []) mv.visitVarInsn(Opcodes.ILOAD, 6) mv.visitVarInsn(Opcodes.ILOAD, 3) l3 = Label() mv.visitJumpInsn(Opcodes.IF_ICMPGE, l3) mv.visitVarInsn(Opcodes.ALOAD, 4) mv.visitVarInsn(Opcodes.ILOAD, 6) mv.visitVarInsn(Opcodes.ALOAD, 2) mv.visitVarInsn(Opcodes.ILOAD, 6) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "get", "(I)Ljava/lang/Object;", True) mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/String") mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Double", "parseDouble", "(Ljava/lang/String;)D", False) mv.visitInsn(Opcodes.DASTORE) mv.visitIincInsn(6, 1) mv.visitJumpInsn(Opcodes.GOTO, l2) mv.visitLabel(l3) mv.visitFrame(Opcodes.F_CHOP,1, None, 0, None) mv.visitInsn(Opcodes.ICONST_0) mv.visitVarInsn(Opcodes.ISTORE, 6) l4 = Label() mv.visitLabel(l4) mv.visitFrame(Opcodes.F_APPEND,1, [Opcodes.INTEGER], 0, None) mv.visitVarInsn(Opcodes.ILOAD, 6) mv.visitVarInsn(Opcodes.ILOAD, 3) l5 = Label() mv.visitJumpInsn(Opcodes.IF_ICMPGE, l5) mv.visitVarInsn(Opcodes.ALOAD, 5) mv.visitVarInsn(Opcodes.ILOAD, 6) mv.visitVarInsn(Opcodes.ALOAD, 2) mv.visitVarInsn(Opcodes.ILOAD, 3) mv.visitVarInsn(Opcodes.ILOAD, 6) mv.visitInsn(Opcodes.IADD) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "get", "(I)Ljava/lang/Object;", True) mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/String") mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Double", "parseDouble", "(Ljava/lang/String;)D", False) mv.visitInsn(Opcodes.DASTORE) mv.visitIincInsn(6, 1) mv.visitJumpInsn(Opcodes.GOTO, l4) mv.visitLabel(l5) mv.visitFrame(Opcodes.F_CHOP,1, None, 0, None) mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitTypeInsn(Opcodes.NEW, "mpicbg/models/PointMatch") mv.visitInsn(Opcodes.DUP) mv.visitTypeInsn(Opcodes.NEW, "mpicbg/models/Point") mv.visitInsn(Opcodes.DUP) mv.visitVarInsn(Opcodes.ALOAD, 4) mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "mpicbg/models/Point", "<init>", "([D)V", False) mv.visitTypeInsn(Opcodes.NEW, "mpicbg/models/Point") mv.visitInsn(Opcodes.DUP) mv.visitVarInsn(Opcodes.ALOAD, 5) mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "mpicbg/models/Point", "<init>", "([D)V", False) mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "mpicbg/models/PointMatch", "<init>", "(Lmpicbg/models/Point;Lmpicbg/models/Point;)V", False) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "add", "(Ljava/lang/Object;)Z", True) mv.visitInsn(Opcodes.POP) mv.visitJumpInsn(Opcodes.GOTO, l0) mv.visitLabel(l1) mv.visitFrame(Opcodes.F_FULL, 2, ["java/util/Iterator", "java/util/List"], 0, []) mv.visitTypeInsn(Opcodes.NEW, "my/PointMatchesFast") mv.visitInsn(Opcodes.DUP) mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "my/PointMatchesFast", "<init>", "(Ljava/util/List;)V", False) mv.visitInsn(Opcodes.ARETURN) mv.visitMaxs(7, 7) mv.visitEnd() mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "csvHeader", "(Lmpicbg/models/PointMatch;)[Ljava/lang/String;", None, None) mv.visitCode() mv.visitInsn(Opcodes.ICONST_3) mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "mpicbg/models/PointMatch", "getP1", "()Lmpicbg/models/Point;", False) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "mpicbg/models/Point", "getW", "()[D", False) mv.visitInsn(Opcodes.ARRAYLENGTH) l0 = Label() mv.visitJumpInsn(Opcodes.IF_ICMPNE, l0) mv.visitIntInsn(Opcodes.BIPUSH, 6) mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/String") mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_0) mv.visitLdcInsn("x1") mv.visitInsn(Opcodes.AASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_1) mv.visitLdcInsn("y1") mv.visitInsn(Opcodes.AASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_2) mv.visitLdcInsn("z1") mv.visitInsn(Opcodes.AASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_3) mv.visitLdcInsn("x2") mv.visitInsn(Opcodes.AASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_4) mv.visitLdcInsn("y2") mv.visitInsn(Opcodes.AASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_5) mv.visitLdcInsn("z2") mv.visitInsn(Opcodes.AASTORE) l1 = Label() mv.visitJumpInsn(Opcodes.GOTO, l1) mv.visitLabel(l0) mv.visitFrame(Opcodes.F_SAME, 0, None, 0, None) mv.visitInsn(Opcodes.ICONST_4) mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/String") mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_0) mv.visitLdcInsn("x1") mv.visitInsn(Opcodes.AASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_1) mv.visitLdcInsn("y1") mv.visitInsn(Opcodes.AASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_2) mv.visitLdcInsn("x2") mv.visitInsn(Opcodes.AASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_3) mv.visitLdcInsn("y2") mv.visitInsn(Opcodes.AASTORE) mv.visitLabel(l1) mv.visitFrame(Opcodes.F_SAME1, 0, None, 1, ["[Ljava/lang/String;"]) mv.visitInsn(Opcodes.ARETURN) mv.visitMaxs(4, 1) mv.visitEnd() mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "asRow", "(Lmpicbg/models/PointMatch;)[D", None, None) mv.visitCode() mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "mpicbg/models/PointMatch", "getP1", "()Lmpicbg/models/Point;", False) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "mpicbg/models/Point", "getW", "()[D", False) mv.visitVarInsn(Opcodes.ASTORE, 1) mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "mpicbg/models/PointMatch", "getP2", "()Lmpicbg/models/Point;", False) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "mpicbg/models/Point", "getW", "()[D", False) mv.visitVarInsn(Opcodes.ASTORE, 2) mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitInsn(Opcodes.ARRAYLENGTH) mv.visitVarInsn(Opcodes.ALOAD, 2) mv.visitInsn(Opcodes.ARRAYLENGTH) mv.visitInsn(Opcodes.IADD) mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_DOUBLE) mv.visitVarInsn(Opcodes.ASTORE, 3) mv.visitInsn(Opcodes.ICONST_0) mv.visitVarInsn(Opcodes.ISTORE, 4) l0 = Label() mv.visitLabel(l0) mv.visitFrame(Opcodes.F_FULL, 5, ["mpicbg/models/PointMatch", "[D", "[D", "[D", Opcodes.INTEGER], 0, []) mv.visitVarInsn(Opcodes.ILOAD, 4) mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitInsn(Opcodes.ARRAYLENGTH) l1 = Label() mv.visitJumpInsn(Opcodes.IF_ICMPGE, l1) mv.visitVarInsn(Opcodes.ALOAD, 3) mv.visitVarInsn(Opcodes.ILOAD, 4) mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitVarInsn(Opcodes.ILOAD, 4) mv.visitInsn(Opcodes.DALOAD) mv.visitInsn(Opcodes.DASTORE) mv.visitIincInsn(4, 1) mv.visitJumpInsn(Opcodes.GOTO, l0) mv.visitLabel(l1) mv.visitFrame(Opcodes.F_CHOP,1, None, 0, None) mv.visitInsn(Opcodes.ICONST_0) mv.visitVarInsn(Opcodes.ISTORE, 4) l2 = Label() mv.visitLabel(l2) mv.visitFrame(Opcodes.F_APPEND,1, [Opcodes.INTEGER], 0, None) mv.visitVarInsn(Opcodes.ILOAD, 4) mv.visitVarInsn(Opcodes.ALOAD, 2) mv.visitInsn(Opcodes.ARRAYLENGTH) l3 = Label() mv.visitJumpInsn(Opcodes.IF_ICMPGE, l3) mv.visitVarInsn(Opcodes.ALOAD, 3) mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitInsn(Opcodes.ARRAYLENGTH) mv.visitVarInsn(Opcodes.ILOAD, 4) mv.visitInsn(Opcodes.IADD) mv.visitVarInsn(Opcodes.ALOAD, 2) mv.visitVarInsn(Opcodes.ILOAD, 4) mv.visitInsn(Opcodes.DALOAD) mv.visitInsn(Opcodes.DASTORE) mv.visitIincInsn(4, 1) mv.visitJumpInsn(Opcodes.GOTO, l2) mv.visitLabel(l3) mv.visitFrame(Opcodes.F_CHOP,1, None, 0, None) mv.visitVarInsn(Opcodes.ALOAD, 3) mv.visitInsn(Opcodes.ARETURN) mv.visitMaxs(4, 5) mv.visitEnd() cw.visitEnd() if not classloader: classloader = CustomClassLoader() return classloader.defineClass("my/PointMatchesFast", cw.toByteArray())
def createNativeConstellationClass(classloader=None): """ A Constellation class implemented natively in java using the ASM library. """ cw = ClassWriter(0) cw.visit(52, Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER, "my/ConstellationFast", None, "java/lang/Object", None) fv = cw.visitField(Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL, "angle", "D", None, None) fv.visitEnd() fv = cw.visitField(Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL, "len1", "D", None, None) fv.visitEnd() fv = cw.visitField(Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL, "len2", "D", None, None) fv.visitEnd() fv = cw.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL, "position", "Lmpicbg/models/Point;", None, None) fv.visitEnd() fv = cw.visitField(Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL, "len_ratio", "D", None, None) fv.visitEnd() mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "(DDD[D)V", None, None) mv.visitCode() mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V") mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitVarInsn(Opcodes.DLOAD, 1) mv.visitFieldInsn(Opcodes.PUTFIELD, "my/ConstellationFast", "angle", "D") mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitVarInsn(Opcodes.DLOAD, 3) mv.visitFieldInsn(Opcodes.PUTFIELD, "my/ConstellationFast", "len1", "D") mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitVarInsn(Opcodes.DLOAD, 5) mv.visitFieldInsn(Opcodes.PUTFIELD, "my/ConstellationFast", "len2", "D") mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitVarInsn(Opcodes.DLOAD, 3) mv.visitVarInsn(Opcodes.DLOAD, 3) mv.visitVarInsn(Opcodes.DLOAD, 5) mv.visitInsn(Opcodes.DADD) mv.visitInsn(Opcodes.DDIV) mv.visitFieldInsn(Opcodes.PUTFIELD, "my/ConstellationFast", "len_ratio", "D") mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitTypeInsn(Opcodes.NEW, "mpicbg/models/Point") mv.visitInsn(Opcodes.DUP) mv.visitVarInsn(Opcodes.ALOAD, 7) mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "mpicbg/models/Point", "<init>", "([D)V") mv.visitFieldInsn(Opcodes.PUTFIELD, "my/ConstellationFast", "position", "Lmpicbg/models/Point;") mv.visitInsn(Opcodes.RETURN) mv.visitMaxs(7, 8) mv.visitEnd() mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL, "matches", "(Lmy/ConstellationFast;DD)Z", None, None) mv.visitCode() mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "angle", "D") mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "angle", "D") mv.visitInsn(Opcodes.DSUB) mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Math", "abs", "(D)D") mv.visitVarInsn(Opcodes.DLOAD, 2) mv.visitInsn(Opcodes.DCMPG) l0 = Label() mv.visitJumpInsn(Opcodes.IFGE, l0) mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "len1", "D") mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "len1", "D") mv.visitInsn(Opcodes.DSUB) mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Math", "abs", "(D)D") mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "len2", "D") mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "len2", "D") mv.visitInsn(Opcodes.DSUB) mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Math", "abs", "(D)D") mv.visitInsn(Opcodes.DADD) mv.visitVarInsn(Opcodes.DLOAD, 4) mv.visitInsn(Opcodes.DCMPG) mv.visitJumpInsn(Opcodes.IFGE, l0) mv.visitInsn(Opcodes.ICONST_1) l1 = Label() mv.visitJumpInsn(Opcodes.GOTO, l1) mv.visitLabel(l0) mv.visitFrame(Opcodes.F_SAME, 0, None, 0, None) mv.visitInsn(Opcodes.ICONST_0) mv.visitLabel(l1) mv.visitFrame(Opcodes.F_SAME1, 0, None, 1, [Opcodes.INTEGER]) mv.visitInsn(Opcodes.IRETURN) mv.visitMaxs(6, 6) mv.visitEnd() mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL, "matchesScaleInvariant", "(Lmy/ConstellationFast;DD)Z", None, None) mv.visitCode() mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "angle", "D") mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "angle", "D") mv.visitInsn(Opcodes.DSUB) mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Math", "abs", "(D)D") mv.visitVarInsn(Opcodes.DLOAD, 2) mv.visitInsn(Opcodes.DCMPG) l0 = Label() mv.visitJumpInsn(Opcodes.IFGE, l0) mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "len_ratio", "D") mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "len_ratio", "D") mv.visitInsn(Opcodes.DSUB) mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Math", "abs", "(D)D") mv.visitVarInsn(Opcodes.DLOAD, 4) mv.visitInsn(Opcodes.DCMPG) mv.visitJumpInsn(Opcodes.IFGE, l0) mv.visitInsn(Opcodes.ICONST_1) l1 = Label() mv.visitJumpInsn(Opcodes.GOTO, l1) mv.visitLabel(l0) mv.visitFrame(Opcodes.F_SAME, 0, None, 0, None) mv.visitInsn(Opcodes.ICONST_0) mv.visitLabel(l1) mv.visitFrame(Opcodes.F_SAME1, 0, None, 1, [Opcodes.INTEGER]) mv.visitInsn(Opcodes.IRETURN) mv.visitMaxs(4, 6) mv.visitEnd() mv = cw.visitMethod(Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "computeAngle", "(DDDDDDDD)D", None, None) mv.visitCode() mv.visitVarInsn(Opcodes.DLOAD, 6) mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Math", "sqrt", "(D)D") mv.visitVarInsn(Opcodes.DSTORE, 16) mv.visitVarInsn(Opcodes.DLOAD, 14) mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Math", "sqrt", "(D)D") mv.visitVarInsn(Opcodes.DSTORE, 18) mv.visitVarInsn(Opcodes.DLOAD, 0) mv.visitVarInsn(Opcodes.DLOAD, 8) mv.visitInsn(Opcodes.DMUL) mv.visitVarInsn(Opcodes.DLOAD, 2) mv.visitVarInsn(Opcodes.DLOAD, 10) mv.visitInsn(Opcodes.DMUL) mv.visitInsn(Opcodes.DADD) mv.visitVarInsn(Opcodes.DLOAD, 4) mv.visitVarInsn(Opcodes.DLOAD, 12) mv.visitInsn(Opcodes.DMUL) mv.visitInsn(Opcodes.DADD) mv.visitVarInsn(Opcodes.DSTORE, 20) mv.visitVarInsn(Opcodes.DLOAD, 20) mv.visitVarInsn(Opcodes.DLOAD, 16) mv.visitVarInsn(Opcodes.DLOAD, 18) mv.visitInsn(Opcodes.DMUL) mv.visitInsn(Opcodes.DDIV) mv.visitVarInsn(Opcodes.DSTORE, 22) mv.visitVarInsn(Opcodes.DLOAD, 22) mv.visitInsn(Opcodes.DCONST_1) mv.visitInsn(Opcodes.DCMPL) l0 = Label() mv.visitJumpInsn(Opcodes.IFLE, l0) mv.visitInsn(Opcodes.DCONST_1) l1 = Label() mv.visitJumpInsn(Opcodes.GOTO, l1) mv.visitLabel(l0) mv.visitFrame(Opcodes.F_FULL, 12, [Opcodes.DOUBLE, Opcodes.DOUBLE, Opcodes.DOUBLE, Opcodes.DOUBLE, Opcodes.DOUBLE, Opcodes.DOUBLE, Opcodes.DOUBLE, Opcodes.DOUBLE, Opcodes.DOUBLE, Opcodes.DOUBLE, Opcodes.DOUBLE, Opcodes.DOUBLE], 0, []) mv.visitVarInsn(Opcodes.DLOAD, 22) mv.visitLdcInsn(Double("-1.0")) mv.visitInsn(Opcodes.DCMPG) l2 = Label() mv.visitJumpInsn(Opcodes.IFGE, l2) mv.visitLdcInsn(Double("-1.0")) mv.visitJumpInsn(Opcodes.GOTO, l1) mv.visitLabel(l2) mv.visitFrame(Opcodes.F_SAME, 0, None, 0, None) mv.visitVarInsn(Opcodes.DLOAD, 22) mv.visitLabel(l1) mv.visitFrame(Opcodes.F_SAME1, 0, None, 1, [Opcodes.DOUBLE]) mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Math", "acos", "(D)D") mv.visitInsn(Opcodes.DRETURN) mv.visitMaxs(6, 24) mv.visitEnd() mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "fromSearch", "(Lnet/imglib2/RealLocalizable;Lnet/imglib2/RealLocalizable;DLnet/imglib2/RealLocalizable;D)Lmy/ConstellationFast;", None, None) mv.visitCode() mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitInsn(Opcodes.ICONST_0) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "net/imglib2/RealLocalizable", "getFloatPosition", "(I)F") mv.visitInsn(Opcodes.F2D) mv.visitVarInsn(Opcodes.DSTORE, 7) mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitInsn(Opcodes.ICONST_1) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "net/imglib2/RealLocalizable", "getFloatPosition", "(I)F") mv.visitInsn(Opcodes.F2D) mv.visitVarInsn(Opcodes.DSTORE, 9) mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitInsn(Opcodes.ICONST_2) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "net/imglib2/RealLocalizable", "getFloatPosition", "(I)F") mv.visitInsn(Opcodes.F2D) mv.visitVarInsn(Opcodes.DSTORE, 11) mv.visitTypeInsn(Opcodes.NEW, "my/ConstellationFast") mv.visitInsn(Opcodes.DUP) mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitInsn(Opcodes.ICONST_0) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "net/imglib2/RealLocalizable", "getFloatPosition", "(I)F") mv.visitInsn(Opcodes.F2D) mv.visitVarInsn(Opcodes.DLOAD, 7) mv.visitInsn(Opcodes.DSUB) mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitInsn(Opcodes.ICONST_1) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "net/imglib2/RealLocalizable", "getFloatPosition", "(I)F") mv.visitInsn(Opcodes.F2D) mv.visitVarInsn(Opcodes.DLOAD, 9) mv.visitInsn(Opcodes.DSUB) mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitInsn(Opcodes.ICONST_2) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "net/imglib2/RealLocalizable", "getFloatPosition", "(I)F") mv.visitInsn(Opcodes.F2D) mv.visitVarInsn(Opcodes.DLOAD, 11) mv.visitInsn(Opcodes.DSUB) mv.visitVarInsn(Opcodes.DLOAD, 2) mv.visitVarInsn(Opcodes.ALOAD, 4) mv.visitInsn(Opcodes.ICONST_0) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "net/imglib2/RealLocalizable", "getFloatPosition", "(I)F") mv.visitInsn(Opcodes.F2D) mv.visitVarInsn(Opcodes.DLOAD, 7) mv.visitInsn(Opcodes.DSUB) mv.visitVarInsn(Opcodes.ALOAD, 4) mv.visitInsn(Opcodes.ICONST_1) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "net/imglib2/RealLocalizable", "getFloatPosition", "(I)F") mv.visitInsn(Opcodes.F2D) mv.visitVarInsn(Opcodes.DLOAD, 9) mv.visitInsn(Opcodes.DSUB) mv.visitVarInsn(Opcodes.ALOAD, 4) mv.visitInsn(Opcodes.ICONST_2) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "net/imglib2/RealLocalizable", "getFloatPosition", "(I)F") mv.visitInsn(Opcodes.F2D) mv.visitVarInsn(Opcodes.DLOAD, 11) mv.visitInsn(Opcodes.DSUB) mv.visitVarInsn(Opcodes.DLOAD, 5) mv.visitMethodInsn(Opcodes.INVOKESTATIC, "my/ConstellationFast", "computeAngle", "(DDDDDDDD)D") mv.visitVarInsn(Opcodes.DLOAD, 2) mv.visitVarInsn(Opcodes.DLOAD, 5) mv.visitInsn(Opcodes.ICONST_3) mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_DOUBLE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_0) mv.visitVarInsn(Opcodes.DLOAD, 7) mv.visitInsn(Opcodes.DASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_1) mv.visitVarInsn(Opcodes.DLOAD, 9) mv.visitInsn(Opcodes.DASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_2) mv.visitVarInsn(Opcodes.DLOAD, 11) mv.visitInsn(Opcodes.DASTORE) mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "my/ConstellationFast", "<init>", "(DDD[D)V") mv.visitInsn(Opcodes.ARETURN) mv.visitMaxs(18, 13) mv.visitEnd() mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "fromRow", "(Ljava/util/List;)Lmy/ConstellationFast;", "(Ljava/util/List<Ljava/lang/Double;>;)Lmy/ConstellationFast;", None) mv.visitCode() mv.visitTypeInsn(Opcodes.NEW, "my/ConstellationFast") mv.visitInsn(Opcodes.DUP) mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitInsn(Opcodes.ICONST_0) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "get", "(I)Ljava/lang/Object;") mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Double") mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D") mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitInsn(Opcodes.ICONST_1) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "get", "(I)Ljava/lang/Object;") mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Double") mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D") mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitInsn(Opcodes.ICONST_2) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "get", "(I)Ljava/lang/Object;") mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Double") mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D") mv.visitInsn(Opcodes.ICONST_3) mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_DOUBLE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_0) mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitInsn(Opcodes.ICONST_3) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "get", "(I)Ljava/lang/Object;") mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Double") mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D") mv.visitInsn(Opcodes.DASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_1) mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitInsn(Opcodes.ICONST_4) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "get", "(I)Ljava/lang/Object;") mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Double") mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D") mv.visitInsn(Opcodes.DASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_2) mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitInsn(Opcodes.ICONST_5) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "get", "(I)Ljava/lang/Object;") mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Double") mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D") mv.visitInsn(Opcodes.DASTORE) mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "my/ConstellationFast", "<init>", "(DDD[D)V") mv.visitInsn(Opcodes.ARETURN) mv.visitMaxs(13, 1) mv.visitEnd() mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL, "asRow", "()[D", None, None) mv.visitCode() mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "position", "Lmpicbg/models/Point;") mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "mpicbg/models/Point", "getW", "()[D") mv.visitVarInsn(Opcodes.ASTORE, 1) mv.visitIntInsn(Opcodes.BIPUSH, 6) mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_DOUBLE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_0) mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "angle", "D") mv.visitInsn(Opcodes.DASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_1) mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "len1", "D") mv.visitInsn(Opcodes.DASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_2) mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "len2", "D") mv.visitInsn(Opcodes.DASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_3) mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitInsn(Opcodes.ICONST_0) mv.visitInsn(Opcodes.DALOAD) mv.visitInsn(Opcodes.DASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_4) mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitInsn(Opcodes.ICONST_1) mv.visitInsn(Opcodes.DALOAD) mv.visitInsn(Opcodes.DASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_5) mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitInsn(Opcodes.ICONST_2) mv.visitInsn(Opcodes.DALOAD) mv.visitInsn(Opcodes.DASTORE) mv.visitInsn(Opcodes.ARETURN) mv.visitMaxs(5, 2) mv.visitEnd() mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "csvHeader", "()[Ljava/lang/String;", None, None) mv.visitCode() mv.visitIntInsn(Opcodes.BIPUSH, 6) mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/String") mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_0) mv.visitLdcInsn("angle") mv.visitInsn(Opcodes.AASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_1) mv.visitLdcInsn("len1") mv.visitInsn(Opcodes.AASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_2) mv.visitLdcInsn("len2") mv.visitInsn(Opcodes.AASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_3) mv.visitLdcInsn("x") mv.visitInsn(Opcodes.AASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_4) mv.visitLdcInsn("y") mv.visitInsn(Opcodes.AASTORE) mv.visitInsn(Opcodes.DUP) mv.visitInsn(Opcodes.ICONST_5) mv.visitLdcInsn("z") mv.visitInsn(Opcodes.AASTORE) mv.visitInsn(Opcodes.ARETURN) mv.visitMaxs(4, 0) mv.visitEnd() mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "extractFeatures", "(Ljava/util/List;Lnet/imglib2/neighborsearch/RadiusNeighborSearchOnKDTree;DDD)Ljava/util/List;", "(Ljava/util/List<Lnet/imglib2/RealLocalizable;>;Lnet/imglib2/neighborsearch/RadiusNeighborSearchOnKDTree<Lnet/imglib2/RealLocalizable;>;DDD)Ljava/util/List<Lmy/ConstellationFast;>;", None) mv.visitCode() mv.visitTypeInsn(Opcodes.NEW, "java/util/ArrayList") mv.visitInsn(Opcodes.DUP) mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V") mv.visitVarInsn(Opcodes.ASTORE, 8) mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "iterator", "()Ljava/util/Iterator;") mv.visitVarInsn(Opcodes.ASTORE, 9) l0 = Label() mv.visitLabel(l0) mv.visitFrame(Opcodes.F_APPEND,2, ["java/util/List", "java/util/Iterator"], 0, None) mv.visitVarInsn(Opcodes.ALOAD, 9) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z") l1 = Label() mv.visitJumpInsn(Opcodes.IFEQ, l1) mv.visitVarInsn(Opcodes.ALOAD, 9) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;") mv.visitTypeInsn(Opcodes.CHECKCAST, "net/imglib2/RealLocalizable") mv.visitVarInsn(Opcodes.ASTORE, 10) mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitVarInsn(Opcodes.ALOAD, 10) mv.visitVarInsn(Opcodes.DLOAD, 2) mv.visitInsn(Opcodes.ICONST_1) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/imglib2/neighborsearch/RadiusNeighborSearchOnKDTree", "search", "(Lnet/imglib2/RealLocalizable;DZ)V") mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/imglib2/neighborsearch/RadiusNeighborSearchOnKDTree", "numNeighbors", "()I") mv.visitVarInsn(Opcodes.ISTORE, 11) mv.visitVarInsn(Opcodes.ILOAD, 11) mv.visitInsn(Opcodes.ICONST_2) l2 = Label() mv.visitJumpInsn(Opcodes.IF_ICMPLE, l2) mv.visitInsn(Opcodes.ICONST_0) mv.visitVarInsn(Opcodes.ISTORE, 12) mv.visitVarInsn(Opcodes.ILOAD, 11) mv.visitInsn(Opcodes.ICONST_2) mv.visitInsn(Opcodes.ISUB) mv.visitVarInsn(Opcodes.ISTORE, 13) mv.visitVarInsn(Opcodes.ILOAD, 11) mv.visitInsn(Opcodes.ICONST_1) mv.visitInsn(Opcodes.ISUB) mv.visitVarInsn(Opcodes.ISTORE, 14) l3 = Label() mv.visitLabel(l3) mv.visitFrame(Opcodes.F_FULL, 12, ["java/util/List", "net/imglib2/neighborsearch/RadiusNeighborSearchOnKDTree", Opcodes.DOUBLE, Opcodes.DOUBLE, Opcodes.DOUBLE, "java/util/List", "java/util/Iterator", "net/imglib2/RealLocalizable", Opcodes.INTEGER, Opcodes.INTEGER, Opcodes.INTEGER, Opcodes.INTEGER], 0, []) mv.visitVarInsn(Opcodes.ILOAD, 13) mv.visitJumpInsn(Opcodes.IFLE, l2) mv.visitVarInsn(Opcodes.DLOAD, 6) mv.visitVarInsn(Opcodes.ILOAD, 12) mv.visitInsn(Opcodes.I2D) mv.visitInsn(Opcodes.DCMPL) l4 = Label() mv.visitJumpInsn(Opcodes.IFNE, l4) mv.visitJumpInsn(Opcodes.GOTO, l2) mv.visitLabel(l4) mv.visitFrame(Opcodes.F_SAME, 0, None, 0, None) mv.visitVarInsn(Opcodes.ALOAD, 10) mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitVarInsn(Opcodes.ILOAD, 13) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/imglib2/neighborsearch/RadiusNeighborSearchOnKDTree", "getPosition", "(I)Lnet/imglib2/RealLocalizable;") mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitVarInsn(Opcodes.ILOAD, 13) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/imglib2/neighborsearch/RadiusNeighborSearchOnKDTree", "getSquareDistance", "(I)D") mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitVarInsn(Opcodes.ILOAD, 14) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/imglib2/neighborsearch/RadiusNeighborSearchOnKDTree", "getPosition", "(I)Lnet/imglib2/RealLocalizable;") mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitVarInsn(Opcodes.ILOAD, 14) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/imglib2/neighborsearch/RadiusNeighborSearchOnKDTree", "getSquareDistance", "(I)D") mv.visitMethodInsn(Opcodes.INVOKESTATIC, "my/ConstellationFast", "fromSearch", "(Lnet/imglib2/RealLocalizable;Lnet/imglib2/RealLocalizable;DLnet/imglib2/RealLocalizable;D)Lmy/ConstellationFast;") mv.visitVarInsn(Opcodes.ASTORE, 15) mv.visitVarInsn(Opcodes.ALOAD, 15) mv.visitFieldInsn(Opcodes.GETFIELD, "my/ConstellationFast", "angle", "D") mv.visitVarInsn(Opcodes.DLOAD, 4) mv.visitInsn(Opcodes.DCMPL) l5 = Label() mv.visitJumpInsn(Opcodes.IFLT, l5) mv.visitIincInsn(12, 1) mv.visitVarInsn(Opcodes.ALOAD, 8) mv.visitVarInsn(Opcodes.ALOAD, 15) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "add", "(Ljava/lang/Object;)Z") mv.visitInsn(Opcodes.POP) mv.visitLabel(l5) mv.visitFrame(Opcodes.F_SAME, 0, None, 0, None) mv.visitIincInsn(13, -1) mv.visitIincInsn(14, -1) mv.visitJumpInsn(Opcodes.GOTO, l3) mv.visitLabel(l2) mv.visitFrame(Opcodes.F_FULL, 7, ["java/util/List", "net/imglib2/neighborsearch/RadiusNeighborSearchOnKDTree", Opcodes.DOUBLE, Opcodes.DOUBLE, Opcodes.DOUBLE, "java/util/List", "java/util/Iterator"], 0, []) mv.visitJumpInsn(Opcodes.GOTO, l0) mv.visitLabel(l1) mv.visitFrame(Opcodes.F_CHOP,1, None, 0, None) mv.visitVarInsn(Opcodes.ALOAD, 8) mv.visitInsn(Opcodes.ARETURN) mv.visitMaxs(7, 16) mv.visitEnd() cw.visitEnd() if not classloader: classloader = CustomClassLoader() return classloader.defineClass("my/ConstellationFast", cw.toByteArray())
False) bridge.visitInsn(Opcodes.RETURN) bridge.visitMaxs(3, 3) bridge.visitEnd() """ class Loader(ClassLoader): def defineClass(self, name, bytes): # Inheritance of protected methods is complicated in jython m = super(ClassLoader, self).__thisclass__.getDeclaredMethod("defineClass", String, Class.forName("[B"), Integer.TYPE, Integer.TYPE) m.setAccessible(True) return m.invoke(self, name.replace("/", "."), bytes, 0, len(bytes)) clazz = Loader().defineClass(class_name, cw.toByteArray()) """ loader = ClassLoader.getSystemClassLoader() defineClass = loader.getClass().getSuperclass().getSuperclass().getSuperclass().getDeclaredMethod("defineClass", String, Class.forName("[B"), Integer.TYPE, Integer.TYPE) defineClass.setAccessible(True) bytes = cw.toByteArray() clazz = defineClass.invoke(loader, class_name.replace("/", "."), bytes, 0, len(bytes)) """ bt = UnsignedByteType(120) ft = FloatType() conv = clazz.newInstance()
def makeCompositeToRealConverter(reducer_class=Math, reducer_method="max", reducer_method_signature="(DD)D", classloader=None): """ Takes a RealComposite as input and converts it into a RealType, by reducing the list of RealType in RealComposite using a specified function. reducer_class: e.g. Math reducer_method: e.g. "max", a method that takes two doubles and returns one. reducer_method_signature: e.g. "(DD)D", two double arguments, returning a double. """ class_name = "my/CompositeToRealConverterVia_" + reducer_class.getName( ).replace('.', '_') + '_' + reducer_method # Turn e.g. class Math into "java/lang/Math": reducer_class_string = reducer_class.getName().replace('.', '/') cw = ClassWriter(0) cw.visit( 52, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, class_name, "<S::Lnet/imglib2/type/numeric/RealType<TS;>;T::Lnet/imglib2/type/numeric/RealType<TT;>;>Ljava/lang/Object;Lnet/imglib2/converter/Converter<Lnet/imglib2/view/composite/RealComposite<TS;>;TT;>;", "java/lang/Object", ["net/imglib2/converter/Converter"]) mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", None, None) mv.visitCode() mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", False) mv.visitInsn(Opcodes.RETURN) mv.visitMaxs(1, 1) mv.visitEnd() mv = cw.visitMethod( Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL, "convert", "(Lnet/imglib2/view/composite/RealComposite;Lnet/imglib2/type/numeric/RealType;)V", "(Lnet/imglib2/view/composite/RealComposite<TS;>;TT;)V", None) mv.visitCode() mv.visitVarInsn(Opcodes.ALOAD, 2) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "net/imglib2/type/numeric/RealType", "setZero", "()V", True) mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/imglib2/view/composite/RealComposite", "iterator", "()Ljava/util/Iterator;", False) mv.visitVarInsn(Opcodes.ASTORE, 4) l0 = Label() mv.visitJumpInsn(Opcodes.GOTO, l0) l1 = Label() mv.visitLabel(l1) mv.visitFrame(Opcodes.F_FULL, 5, [ class_name, "net/imglib2/view/composite/RealComposite", "net/imglib2/type/numeric/RealType", Opcodes.TOP, "java/util/Iterator" ], 0, []) mv.visitVarInsn(Opcodes.ALOAD, 4) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;", True) mv.visitTypeInsn(Opcodes.CHECKCAST, "net/imglib2/type/numeric/RealType") mv.visitVarInsn(Opcodes.ASTORE, 3) mv.visitVarInsn(Opcodes.ALOAD, 2) mv.visitVarInsn(Opcodes.ALOAD, 3) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "net/imglib2/type/numeric/RealType", "getRealDouble", "()D", True) mv.visitVarInsn(Opcodes.ALOAD, 2) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "net/imglib2/type/numeric/RealType", "getRealDouble", "()D", True) mv.visitMethodInsn(Opcodes.INVOKESTATIC, reducer_class_string, reducer_method, reducer_method_signature, False) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "net/imglib2/type/numeric/RealType", "setReal", "(D)V", True) mv.visitLabel(l0) mv.visitFrame(Opcodes.F_SAME, 0, None, 0, None) mv.visitVarInsn(Opcodes.ALOAD, 4) mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z", True) mv.visitJumpInsn(Opcodes.IFNE, l1) mv.visitInsn(Opcodes.RETURN) mv.visitMaxs(5, 5) mv.visitEnd() mv = cw.visitMethod( Opcodes.ACC_PUBLIC + Opcodes.ACC_BRIDGE + Opcodes.ACC_SYNTHETIC, "convert", "(Ljava/lang/Object;Ljava/lang/Object;)V", None, None) mv.visitCode() mv.visitVarInsn(Opcodes.ALOAD, 0) mv.visitVarInsn(Opcodes.ALOAD, 1) mv.visitTypeInsn(Opcodes.CHECKCAST, "net/imglib2/view/composite/RealComposite") mv.visitVarInsn(Opcodes.ALOAD, 2) mv.visitTypeInsn(Opcodes.CHECKCAST, "net/imglib2/type/numeric/RealType") mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL, class_name, "convert", "(Lnet/imglib2/view/composite/RealComposite;Lnet/imglib2/type/numeric/RealType;)V", False) mv.visitInsn(Opcodes.RETURN) mv.visitMaxs(3, 3) mv.visitEnd() cw.visitEnd() if not classloader: classloader = CustomClassLoader() return classloader.defineClass(class_name, cw.toByteArray())
def defineConverter( fromType, toType, classname="", fromMethod="getRealFloat", fromMethodReturnType="F", # e.g. "F" for native float toMethod="setReal", toMethodArgType="F"): """ Create a new Converter fromType toType. fromType: the net.imglib2.Type to see as transformed into toType. toType: the net.imglib2.Type to see. classname: optional, will be made up if not defined. fromMethod: the method for reading the value from the fromType. Defaults to getRealFloat form the RealType interface. fromMethodReturnType: the return type of the method, e.g., "F" for native float or e.g., UnsignedByteType for class. toMethod: the method for setting the value to the toType. Defaults to setReal from the RealType interface. toMethodReturnType: like fromMethodReturnType. """ if "" == classname: classname = "asm/converters/%sTo%sConverter" % ( fromType.getSimpleName(), toType.getSimpleName()) class_object = Type.getInternalName(Object) # Type I for fromType # Type O for toType # Object for superclass # Converter<I, O> for interface class_signature = "<I:L%s;O:L%s;>L%s;L%s<TI;TO;>;" % \ tuple(imap(Type.getInternalName, (fromType, toType, Object, Converter))) # Two arguments, one parameter for each: one for I, and another for O # void return type: V method_signature = "(TI;TO;)V;" cw = ClassWriter(ClassWriter.COMPUTE_FRAMES) cw.visit( Opcodes.V1_8, # java version Opcodes.ACC_PUBLIC, # public class classname, # package and class name class_signature, # signature (None means not generic) class_object, # superclass [Type.getInternalName(Converter)]) # array of interfaces # Default constructor constructor = cw.visitMethod( Opcodes.ACC_PUBLIC, # public "<init>", # method name "()V", # descriptor None, # signature None) # Exceptions (array of String) # ... has to invoke the super() for Object constructor.visitCode() constructor.visitVarInsn( Opcodes.ALOAD, 0) # load "this" onto the stack: the first local variable is "this" constructor.visitMethodInsn( Opcodes.INVOKESPECIAL, # invoke an instance method (non-virtual) class_object, # class on which the method is defined "<init>", # name of the method (the default constructor of Object) "()V", # descriptor of the default constructor of Object False) # not an interface constructor.visitInsn(Opcodes.RETURN) # End the constructor method constructor.visitMaxs( 1, 1) # The maximum number of stack slots (1) and local vars (1: "this") # The convert(I, O) method from the Converter interface method = cw.visitMethod( Opcodes.ACC_PUBLIC, # public method "convert", # name of the interface method we are implementing "(L%s;L%s;)V" % tuple(imap(Type.getInternalName, (fromType, toType))), # descriptor "(TI;TO;)", # signature None) # Exceptions (array of String) method.visitCode() method.visitVarInsn(Opcodes.ALOAD, 2) # Load second argument onto stack: the FloatType method.visitVarInsn( Opcodes.ALOAD, 1) # Load first argument onto stack: the UnsignedByteType method.visitMethodInsn( Opcodes.INVOKEVIRTUAL, Type.getInternalName(fromType), fromMethod, # e.g. "getRealFloat" "()%s" % fromMethodReturnType, # descriptor: no arguments # e.g. "F" for native float False) method.visitMethodInsn( Opcodes.INVOKEVIRTUAL, Type.getInternalName(toType), toMethod, # e.g. "setReal" "(%s)V" % toMethodArgType, # e.g. "F" for native float False) method.visitInsn(Opcodes.RETURN) method.visitMaxs( 2, 3 ) # 2 stack slots: the two ALOAD calls. And 3 local variables: this, and two method arguments. method.visitEnd() # Now the public volatile bridge, because the above method uses generics. # Does not seem to be necessary to run the convert method. # This method takes an (Object, Object) as arguments and casts them to the expected types, # and then invokes the above typed version of the "convert" method. # The only reason I am adding it here is because I saw it when I printed the class byte code, # after writing the converter in java and using this command to see the asm code: # $ java -classpath /home/albert/Programming/fiji-new/Fiji.app/jars/imglib2-5.1.0.jar:/home/albert/Programming/fiji-new/Fiji.app/jars/asm-5.0.4.jar://home/albert/Programming/fiji-new/Fiji.app/jars/asm-util-4.0.jar org.objectweb.asm.util.Textifier my/UnsignedByteToFloatConverter.class bridge = cw.visitMethod( Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC | Opcodes.ACC_BRIDGE, "convert", "(L%s;L%s;)V" % tuple(repeat(class_object, 2)), "(L%s;L%s;)V" % tuple(repeat(class_object, 2)), None) bridge.visitCode() bridge.visitVarInsn(Opcodes.ALOAD, 0) bridge.visitVarInsn(Opcodes.ALOAD, 1) bridge.visitTypeInsn(Opcodes.CHECKCAST, Type.getInternalName(fromType)) bridge.visitVarInsn(Opcodes.ALOAD, 2) bridge.visitTypeInsn(Opcodes.CHECKCAST, Type.getInternalName(toType)) bridge.visitMethodInsn( Opcodes.INVOKEVIRTUAL, classname, "convert", "(L%s;L%s;)V" % tuple(imap(Type.getInternalName, (fromType, toType))), # descriptor False) bridge.visitInsn(Opcodes.RETURN) bridge.visitMaxs(3, 3) bridge.visitEnd() loader = CustomClassLoader() converterClass = loader.defineClass(classname, cw.toByteArray()) return converterClass