Class TreeCompiler

  • All Implemented Interfaces:
    org.objectweb.asm.Opcodes

    public final class TreeCompiler
    extends java.lang.Object
    implements org.objectweb.asm.Opcodes
    Compilation unit for the object tree structure of the DecisionTree. It uses the ASM framework to calculate bytecode from the object structure under the proxy of a AbstractTreeNode.
    Nodes are compiled in the following manner:
    • Nominal nodes are directly compiled into switch statements, default case is a return of -1.
    • Leaf nodes directly return their label.
    • Numerical nodes are compiled into a single branch that compares the value of the split with a reference.

    The data that needs to be stored in order to compare is put into the constant space of a class. Thus this is only limited to 2^16 entries on some JVMs. The created class is called "CompiledNode_{timestamp}_{random}" and it's AbstractTreeNode #compileAndLoad(AbstractTreeNode) method throws an unsupported operation exception.

    Author:
    thomas.jungblut
    • Field Summary

      • Fields inherited from interface org.objectweb.asm.Opcodes

        AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_MANDATED, ACC_MODULE, ACC_NATIVE, ACC_OPEN, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STATIC_PHASE, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_TRANSITIVE, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASM4, ASM5, ASM6, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, H_GETFIELD, H_GETSTATIC, H_INVOKEINTERFACE, H_INVOKESPECIAL, H_INVOKESTATIC, H_INVOKEVIRTUAL, H_NEWINVOKESPECIAL, H_PUTFIELD, H_PUTSTATIC, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INTEGER, INVOKEDYNAMIC, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7, V1_8, V1_9
    • Constructor Summary

      Constructors 
      Constructor Description
      TreeCompiler()  
    • Constructor Detail

      • TreeCompiler

        public TreeCompiler()
    • Method Detail

      • compileAndLoad

        public static AbstractTreeNode compileAndLoad​(java.lang.String name,
                                                      AbstractTreeNode node)
                                               throws java.lang.Exception
        Compiles the given node and directly loads it.
        Parameters:
        name - the name of the class. Possibly generated by generateClassName().
        Returns:
        a new compiled AbstractTreeNode.
        Throws:
        java.lang.Exception
      • load

        public static AbstractTreeNode load​(java.lang.String name,
                                            byte[] byteCode)
                                     throws java.lang.Exception
        Loads the given tree node via its name and bytecode.
        Parameters:
        name - the name of the class.
        byteCode - the byte code of the class.
        Returns:
        a new AbstractTreeNode.
        Throws:
        java.lang.Exception
      • compileNode

        public static byte[] compileNode​(java.lang.String name,
                                         AbstractTreeNode root)
                                  throws java.lang.Exception
        Compiles the given tree node and name into a class.
        Parameters:
        name - the name of the class.
        root - the treenode to compile.
        Returns:
        a byte[] representing the class contents.
        Throws:
        java.lang.Exception
      • generateClassName

        public static java.lang.String generateClassName()
        Returns:
        generate a pseudo-unique classname using the classname prefix and the timestamp in ms, because some collisions happened, a random string is appended as well.