ASMContentHandlerpublic class ASMContentHandler extends DefaultHandler implements ConstantsA {@link org.xml.sax.ContentHandler ContentHandler}
that transforms XML document into Java class file. This class can be feeded by any
kind of SAX 2.0 event producers, e.g. XML parser, XSLT or XPath engines, or custom code. |
Fields Summary |
---|
private List | stackStack of the intermediate processing contexts. | private String | matchComplete name of the current element. | protected boolean | computeMaxtrue if the maximum stack size and number of local variables must
be automatically computed. | protected OutputStream | osOutput stream to write result bytecode. | protected ClassWriter | cwCurrent instance of the {@link ClassWriter ClassWriter} used to write class bytecode. | protected CodeVisitor | mwCurrent instance of the {@link CodeVisitor CodeVisitor} used to write method bytecode | protected Map | labelsMap of the active {@link Label Label} instances for current method. | private static final String | BASE | private final Rule[] | RULES | static final Map | OPCODESMap of the opcode names to opcode and opcode group |
Constructors Summary |
---|
public ASMContentHandler(OutputStream os, boolean computeMax)Constructs a new {@link ASMContentHandler ASMContentHandler} object.
OPCODES.put( "NOP", new Opcode( NOP, OpcodeGroup.INSN));
OPCODES.put( "ACONST_NULL", new Opcode( ACONST_NULL, OpcodeGroup.INSN));
OPCODES.put( "ICONST_M1", new Opcode( ICONST_M1, OpcodeGroup.INSN));
OPCODES.put( "ICONST_0", new Opcode( ICONST_0, OpcodeGroup.INSN));
OPCODES.put( "ICONST_1", new Opcode( ICONST_1, OpcodeGroup.INSN));
OPCODES.put( "ICONST_2", new Opcode( ICONST_2, OpcodeGroup.INSN));
OPCODES.put( "ICONST_3", new Opcode( ICONST_3, OpcodeGroup.INSN));
OPCODES.put( "ICONST_4", new Opcode( ICONST_4, OpcodeGroup.INSN));
OPCODES.put( "ICONST_5", new Opcode( ICONST_5, OpcodeGroup.INSN));
OPCODES.put( "LCONST_0", new Opcode( LCONST_0, OpcodeGroup.INSN));
OPCODES.put( "LCONST_1", new Opcode( LCONST_1, OpcodeGroup.INSN));
OPCODES.put( "FCONST_0", new Opcode( FCONST_0, OpcodeGroup.INSN));
OPCODES.put( "FCONST_1", new Opcode( FCONST_1, OpcodeGroup.INSN));
OPCODES.put( "FCONST_2", new Opcode( FCONST_2, OpcodeGroup.INSN));
OPCODES.put( "DCONST_0", new Opcode( DCONST_0, OpcodeGroup.INSN));
OPCODES.put( "DCONST_1", new Opcode( DCONST_1, OpcodeGroup.INSN));
OPCODES.put( "BIPUSH", new Opcode( BIPUSH, OpcodeGroup.INSN_INT));
OPCODES.put( "SIPUSH", new Opcode( SIPUSH, OpcodeGroup.INSN_INT));
OPCODES.put( "LDC", new Opcode( LDC, OpcodeGroup.INSN_LDC));
OPCODES.put( "ILOAD", new Opcode( ILOAD, OpcodeGroup.INSN_VAR));
OPCODES.put( "LLOAD", new Opcode( LLOAD, OpcodeGroup.INSN_VAR));
OPCODES.put( "FLOAD", new Opcode( FLOAD, OpcodeGroup.INSN_VAR));
OPCODES.put( "DLOAD", new Opcode( DLOAD, OpcodeGroup.INSN_VAR));
OPCODES.put( "ALOAD", new Opcode( ALOAD, OpcodeGroup.INSN_VAR));
OPCODES.put( "IALOAD", new Opcode( IALOAD, OpcodeGroup.INSN));
OPCODES.put( "LALOAD", new Opcode( LALOAD, OpcodeGroup.INSN));
OPCODES.put( "FALOAD", new Opcode( FALOAD, OpcodeGroup.INSN));
OPCODES.put( "DALOAD", new Opcode( DALOAD, OpcodeGroup.INSN));
OPCODES.put( "AALOAD", new Opcode( AALOAD, OpcodeGroup.INSN));
OPCODES.put( "BALOAD", new Opcode( BALOAD, OpcodeGroup.INSN));
OPCODES.put( "CALOAD", new Opcode( CALOAD, OpcodeGroup.INSN));
OPCODES.put( "SALOAD", new Opcode( SALOAD, OpcodeGroup.INSN));
OPCODES.put( "ISTORE", new Opcode( ISTORE, OpcodeGroup.INSN_VAR));
OPCODES.put( "LSTORE", new Opcode( LSTORE, OpcodeGroup.INSN_VAR));
OPCODES.put( "FSTORE", new Opcode( FSTORE, OpcodeGroup.INSN_VAR));
OPCODES.put( "DSTORE", new Opcode( DSTORE, OpcodeGroup.INSN_VAR));
OPCODES.put( "ASTORE", new Opcode( ASTORE, OpcodeGroup.INSN_VAR));
OPCODES.put( "IASTORE", new Opcode( IASTORE, OpcodeGroup.INSN));
OPCODES.put( "LASTORE", new Opcode( LASTORE, OpcodeGroup.INSN));
OPCODES.put( "FASTORE", new Opcode( FASTORE, OpcodeGroup.INSN));
OPCODES.put( "DASTORE", new Opcode( DASTORE, OpcodeGroup.INSN));
OPCODES.put( "AASTORE", new Opcode( AASTORE, OpcodeGroup.INSN));
OPCODES.put( "BASTORE", new Opcode( BASTORE, OpcodeGroup.INSN));
OPCODES.put( "CASTORE", new Opcode( CASTORE, OpcodeGroup.INSN));
OPCODES.put( "SASTORE", new Opcode( SASTORE, OpcodeGroup.INSN));
OPCODES.put( "POP", new Opcode( POP, OpcodeGroup.INSN));
OPCODES.put( "POP2", new Opcode( POP2, OpcodeGroup.INSN));
OPCODES.put( "DUP", new Opcode( DUP, OpcodeGroup.INSN));
OPCODES.put( "DUP_X1", new Opcode( DUP_X1, OpcodeGroup.INSN));
OPCODES.put( "DUP_X2", new Opcode( DUP_X2, OpcodeGroup.INSN));
OPCODES.put( "DUP2", new Opcode( DUP2, OpcodeGroup.INSN));
OPCODES.put( "DUP2_X1", new Opcode( DUP2_X1, OpcodeGroup.INSN));
OPCODES.put( "DUP2_X2", new Opcode( DUP2_X2, OpcodeGroup.INSN));
OPCODES.put( "SWAP", new Opcode( SWAP, OpcodeGroup.INSN));
OPCODES.put( "IADD", new Opcode( IADD, OpcodeGroup.INSN));
OPCODES.put( "LADD", new Opcode( LADD, OpcodeGroup.INSN));
OPCODES.put( "FADD", new Opcode( FADD, OpcodeGroup.INSN));
OPCODES.put( "DADD", new Opcode( DADD, OpcodeGroup.INSN));
OPCODES.put( "ISUB", new Opcode( ISUB, OpcodeGroup.INSN));
OPCODES.put( "LSUB", new Opcode( LSUB, OpcodeGroup.INSN));
OPCODES.put( "FSUB", new Opcode( FSUB, OpcodeGroup.INSN));
OPCODES.put( "DSUB", new Opcode( DSUB, OpcodeGroup.INSN));
OPCODES.put( "IMUL", new Opcode( IMUL, OpcodeGroup.INSN));
OPCODES.put( "LMUL", new Opcode( LMUL, OpcodeGroup.INSN));
OPCODES.put( "FMUL", new Opcode( FMUL, OpcodeGroup.INSN));
OPCODES.put( "DMUL", new Opcode( DMUL, OpcodeGroup.INSN));
OPCODES.put( "IDIV", new Opcode( IDIV, OpcodeGroup.INSN));
OPCODES.put( "LDIV", new Opcode( LDIV, OpcodeGroup.INSN));
OPCODES.put( "FDIV", new Opcode( FDIV, OpcodeGroup.INSN));
OPCODES.put( "DDIV", new Opcode( DDIV, OpcodeGroup.INSN));
OPCODES.put( "IREM", new Opcode( IREM, OpcodeGroup.INSN));
OPCODES.put( "LREM", new Opcode( LREM, OpcodeGroup.INSN));
OPCODES.put( "FREM", new Opcode( FREM, OpcodeGroup.INSN));
OPCODES.put( "DREM", new Opcode( DREM, OpcodeGroup.INSN));
OPCODES.put( "INEG", new Opcode( INEG, OpcodeGroup.INSN));
OPCODES.put( "LNEG", new Opcode( LNEG, OpcodeGroup.INSN));
OPCODES.put( "FNEG", new Opcode( FNEG, OpcodeGroup.INSN));
OPCODES.put( "DNEG", new Opcode( DNEG, OpcodeGroup.INSN));
OPCODES.put( "ISHL", new Opcode( ISHL, OpcodeGroup.INSN));
OPCODES.put( "LSHL", new Opcode( LSHL, OpcodeGroup.INSN));
OPCODES.put( "ISHR", new Opcode( ISHR, OpcodeGroup.INSN));
OPCODES.put( "LSHR", new Opcode( LSHR, OpcodeGroup.INSN));
OPCODES.put( "IUSHR", new Opcode( IUSHR, OpcodeGroup.INSN));
OPCODES.put( "LUSHR", new Opcode( LUSHR, OpcodeGroup.INSN));
OPCODES.put( "IAND", new Opcode( IAND, OpcodeGroup.INSN));
OPCODES.put( "LAND", new Opcode( LAND, OpcodeGroup.INSN));
OPCODES.put( "IOR", new Opcode( IOR, OpcodeGroup.INSN));
OPCODES.put( "LOR", new Opcode( LOR, OpcodeGroup.INSN));
OPCODES.put( "IXOR", new Opcode( IXOR, OpcodeGroup.INSN));
OPCODES.put( "LXOR", new Opcode( LXOR, OpcodeGroup.INSN));
OPCODES.put( "IINC", new Opcode( IINC, OpcodeGroup.INSN_IINC));
OPCODES.put( "I2L", new Opcode( I2L, OpcodeGroup.INSN));
OPCODES.put( "I2F", new Opcode( I2F, OpcodeGroup.INSN));
OPCODES.put( "I2D", new Opcode( I2D, OpcodeGroup.INSN));
OPCODES.put( "L2I", new Opcode( L2I, OpcodeGroup.INSN));
OPCODES.put( "L2F", new Opcode( L2F, OpcodeGroup.INSN));
OPCODES.put( "L2D", new Opcode( L2D, OpcodeGroup.INSN));
OPCODES.put( "F2I", new Opcode( F2I, OpcodeGroup.INSN));
OPCODES.put( "F2L", new Opcode( F2L, OpcodeGroup.INSN));
OPCODES.put( "F2D", new Opcode( F2D, OpcodeGroup.INSN));
OPCODES.put( "D2I", new Opcode( D2I, OpcodeGroup.INSN));
OPCODES.put( "D2L", new Opcode( D2L, OpcodeGroup.INSN));
OPCODES.put( "D2F", new Opcode( D2F, OpcodeGroup.INSN));
OPCODES.put( "I2B", new Opcode( I2B, OpcodeGroup.INSN));
OPCODES.put( "I2C", new Opcode( I2C, OpcodeGroup.INSN));
OPCODES.put( "I2S", new Opcode( I2S, OpcodeGroup.INSN));
OPCODES.put( "LCMP", new Opcode( LCMP, OpcodeGroup.INSN));
OPCODES.put( "FCMPL", new Opcode( FCMPL, OpcodeGroup.INSN));
OPCODES.put( "FCMPG", new Opcode( FCMPG, OpcodeGroup.INSN));
OPCODES.put( "DCMPL", new Opcode( DCMPL, OpcodeGroup.INSN));
OPCODES.put( "DCMPG", new Opcode( DCMPG, OpcodeGroup.INSN));
OPCODES.put( "IFEQ", new Opcode( IFEQ, OpcodeGroup.INSN_JUMP));
OPCODES.put( "IFNE", new Opcode( IFNE, OpcodeGroup.INSN_JUMP));
OPCODES.put( "IFLT", new Opcode( IFLT, OpcodeGroup.INSN_JUMP));
OPCODES.put( "IFGE", new Opcode( IFGE, OpcodeGroup.INSN_JUMP));
OPCODES.put( "IFGT", new Opcode( IFGT, OpcodeGroup.INSN_JUMP));
OPCODES.put( "IFLE", new Opcode( IFLE, OpcodeGroup.INSN_JUMP));
OPCODES.put( "IF_ICMPEQ", new Opcode( IF_ICMPEQ, OpcodeGroup.INSN_JUMP));
OPCODES.put( "IF_ICMPNE", new Opcode( IF_ICMPNE, OpcodeGroup.INSN_JUMP));
OPCODES.put( "IF_ICMPLT", new Opcode( IF_ICMPLT, OpcodeGroup.INSN_JUMP));
OPCODES.put( "IF_ICMPGE", new Opcode( IF_ICMPGE, OpcodeGroup.INSN_JUMP));
OPCODES.put( "IF_ICMPGT", new Opcode( IF_ICMPGT, OpcodeGroup.INSN_JUMP));
OPCODES.put( "IF_ICMPLE", new Opcode( IF_ICMPLE, OpcodeGroup.INSN_JUMP));
OPCODES.put( "IF_ACMPEQ", new Opcode( IF_ACMPEQ, OpcodeGroup.INSN_JUMP));
OPCODES.put( "IF_ACMPNE", new Opcode( IF_ACMPNE, OpcodeGroup.INSN_JUMP));
OPCODES.put( "GOTO", new Opcode( GOTO, OpcodeGroup.INSN_JUMP));
OPCODES.put( "JSR", new Opcode( JSR, OpcodeGroup.INSN_JUMP));
OPCODES.put( "RET", new Opcode( RET, OpcodeGroup.INSN_VAR));
// OPCODES.put( "TABLESWITCH", new Opcode( TABLESWITCH, "visiTableSwitchInsn"));
// OPCODES.put( "LOOKUPSWITCH", new Opcode( LOOKUPSWITCH, "visitLookupSwitch"));
OPCODES.put( "IRETURN", new Opcode( IRETURN, OpcodeGroup.INSN));
OPCODES.put( "LRETURN", new Opcode( LRETURN, OpcodeGroup.INSN));
OPCODES.put( "FRETURN", new Opcode( FRETURN, OpcodeGroup.INSN));
OPCODES.put( "DRETURN", new Opcode( DRETURN, OpcodeGroup.INSN));
OPCODES.put( "ARETURN", new Opcode( ARETURN, OpcodeGroup.INSN));
OPCODES.put( "RETURN", new Opcode( RETURN, OpcodeGroup.INSN));
OPCODES.put( "GETSTATIC", new Opcode( GETSTATIC, OpcodeGroup.INSN_FIELD));
OPCODES.put( "PUTSTATIC", new Opcode( PUTSTATIC, OpcodeGroup.INSN_FIELD));
OPCODES.put( "GETFIELD", new Opcode( GETFIELD, OpcodeGroup.INSN_FIELD));
OPCODES.put( "PUTFIELD", new Opcode( PUTFIELD, OpcodeGroup.INSN_FIELD));
OPCODES.put( "INVOKEVIRTUAL", new Opcode( INVOKEVIRTUAL, OpcodeGroup.INSN_METHOD));
OPCODES.put( "INVOKESPECIAL", new Opcode( INVOKESPECIAL, OpcodeGroup.INSN_METHOD));
OPCODES.put( "INVOKESTATIC", new Opcode( INVOKESTATIC, OpcodeGroup.INSN_METHOD));
OPCODES.put( "INVOKEINTERFACE", new Opcode( INVOKEINTERFACE, OpcodeGroup.INSN_METHOD));
OPCODES.put( "NEW", new Opcode( NEW, OpcodeGroup.INSN_TYPE));
OPCODES.put( "NEWARRAY", new Opcode( NEWARRAY, OpcodeGroup.INSN_INT));
OPCODES.put( "ANEWARRAY", new Opcode( ANEWARRAY, OpcodeGroup.INSN_TYPE));
OPCODES.put( "ARRAYLENGTH", new Opcode( ARRAYLENGTH, OpcodeGroup.INSN));
OPCODES.put( "ATHROW", new Opcode( ATHROW, OpcodeGroup.INSN));
OPCODES.put( "CHECKCAST", new Opcode( CHECKCAST, OpcodeGroup.INSN_TYPE));
OPCODES.put( "INSTANCEOF", new Opcode( INSTANCEOF, OpcodeGroup.INSN_TYPE));
OPCODES.put( "MONITORENTER", new Opcode( MONITORENTER, OpcodeGroup.INSN));
OPCODES.put( "MONITOREXIT", new Opcode( MONITOREXIT, OpcodeGroup.INSN));
OPCODES.put( "MULTIANEWARRAY", new Opcode( MULTIANEWARRAY, OpcodeGroup.INSN_MULTIANEWARRAY));
OPCODES.put( "IFNULL", new Opcode( IFNULL, OpcodeGroup.INSN_JUMP));
OPCODES.put( "IFNONNULL", new Opcode( IFNONNULL, OpcodeGroup.INSN_JUMP));
this.os = os;
this.computeMax = computeMax;
|
Methods Summary |
---|
public final void | endDocument()Process notification of the end of a document and write generated bytecode
into output stream.
try {
os.write( cw.toByteArray());
} catch( IOException ex) {
throw new SAXException( ex.toString(), ex);
}
| public final void | endElement(java.lang.String ns, java.lang.String localName, java.lang.String qName)Process notification of the end of an XML element being reached.
// the actual element name is either in localName or qName, depending
// on whether the parser is namespace aware
String name = localName;
if( name == null || name.length() < 1) {
name = qName;
}
// Fire "end" events for all relevant rules in reverse order
for( int i = 0; i < RULES.length; i++) {
if( RULES[ i].match( match, name)) {
RULES[ i].end( name);
}
}
// Recover the previous match expression
int slash = match.lastIndexOf( '/");
if( slash >= 0) {
match = match.substring( 0, slash);
} else {
match = "";
}
| final java.lang.Object | peek()Return the top object on the stack without removing it. If there are no
objects on the stack, return null .
return stack.size()==0 ? null : stack.get( stack.size()-1);
| final java.lang.Object | peek(int n)Return the n'th object down the stack, where 0 is the top element
and [getCount()-1] is the bottom element. If the specified index
is out of range, return null .
return stack.size()<( n+1) ? null : stack.get( n);
| final java.lang.Object | pop()Pop the top object off of the stack, and return it. If there are
no objects on the stack, return null .
return stack.size()==0 ? null : stack.remove( stack.size()-1);
| final void | push(java.lang.Object object)Push a new object onto the top of the object stack.
stack.add( object);
| public final void | startElement(java.lang.String ns, java.lang.String localName, java.lang.String qName, org.xml.sax.Attributes list)Process notification of the start of an XML element being reached.
// the actual element name is either in localName or qName, depending
// on whether the parser is namespace aware
String name = localName;
if( name==null || name.length()<1) {
name = qName;
}
// Compute the current matching rule
StringBuffer sb = new StringBuffer( match);
if( match.length() > 0) {
sb.append( '/");
}
sb.append( name);
match = sb.toString();
// Fire "begin" events for all relevant rules
for( int i = 0; i < RULES.length; i++) {
if( RULES[ i].match( match, name)) {
RULES[ i].begin( name, list);
}
}
| public byte[] | toByteArray()Returns the bytecode of the class that was build with underneath class writer.
return cw==null ? null : cw.toByteArray();
|
|