📄 asmcontenthandler.java
字号:
if ( this.rules.containsKey( path ) ) {
return this.rules.get( path );
}
final int n = path.lastIndexOf( '/' );
for ( final Iterator it = this.lpatterns.iterator(); it.hasNext(); ) {
final String pattern = (String) it.next();
if ( path.substring( n ).endsWith( pattern ) ) {
return this.rules.get( pattern );
}
}
for ( final Iterator it = this.rpatterns.iterator(); it.hasNext(); ) {
final String pattern = (String) it.next();
if ( path.startsWith( pattern ) ) {
return this.rules.get( pattern );
}
}
return null;
}
}
/**
* Rule
*/
protected abstract class Rule {
public void begin(final String name,
final Attributes attrs) {
}
public void end(final String name) {
}
protected final Object getValue(final String desc,
final String val) {
Object value = null;
if ( val != null ) {
if ( desc.equals( "Ljava/lang/String;" ) ) {
value = decode( val );
} else if ( "Ljava/lang/Integer;".equals( desc ) || "I".equals( desc ) || "S".equals( desc ) || "B".equals( desc ) || "C".equals( desc ) || desc.equals( "Z" ) ) {
value = new Integer( val );
} else if ( "Ljava/lang/Short;".equals( desc ) ) {
value = new Short( val );
} else if ( "Ljava/lang/Byte;".equals( desc ) ) {
value = new Byte( val );
} else if ( "Ljava/lang/Character;".equals( desc ) ) {
value = new Character( decode( val ).charAt( 0 ) );
} else if ( "Ljava/lang/Boolean;".equals( desc ) ) {
value = Boolean.valueOf( val );
// } else if ("Ljava/lang/Integer;".equals(desc)
// || desc.equals("I"))
// {
// value = new Integer(val);
// } else if ("Ljava/lang/Character;".equals(desc)
// || desc.equals("C"))
// {
// value = new Character(decode(val).charAt(0));
// } else if ("Ljava/lang/Short;".equals(desc) ||
// desc.equals("S"))
// {
// value = Short.valueOf(val);
// } else if ("Ljava/lang/Byte;".equals(desc) ||
// desc.equals("B"))
// {
// value = Byte.valueOf(val);
} else if ( "Ljava/lang/Long;".equals( desc ) || desc.equals( "J" ) ) {
value = new Long( val );
} else if ( "Ljava/lang/Float;".equals( desc ) || desc.equals( "F" ) ) {
value = new Float( val );
} else if ( "Ljava/lang/Double;".equals( desc ) || desc.equals( "D" ) ) {
value = new Double( val );
} else if ( Type.getDescriptor( Type.class ).equals( desc ) ) {
value = Type.getType( val );
// } else if ("[I".equals(desc)) {
// value = new int[0]; // TODO
// } else if ("[C".equals(desc)) {
// value = new char[0]; // TODO
// } else if ("[Z".equals(desc)) {
// value = new boolean[0]; // TODO
// } else if ("[S".equals(desc)) {
// value = new short[0]; // TODO
// } else if ("[B".equals(desc)) {
// value = new byte[0]; // TODO
// } else if ("[J".equals(desc)) {
// value = new long[0]; // TODO
// } else if ("[F".equals(desc)) {
// value = new float[0]; // TODO
// } else if ("[D".equals(desc)) {
// value = new double[0]; // TODO
} else {
throw new RuntimeException( "Invalid value:" + val + " desc:" + desc + " ctx:" + this );
}
}
return value;
}
private final String decode(final String val) {
final StringBuffer sb = new StringBuffer( val.length() );
try {
int n = 0;
while ( n < val.length() ) {
char c = val.charAt( n );
if ( c == '\\' ) {
n++;
c = val.charAt( n );
if ( c == '\\' ) {
sb.append( '\\' );
} else {
n++; // skip 'u'
sb.append( (char) Integer.parseInt( val.substring( n,
n + 4 ),
16 ) );
n += 3;
}
} else {
sb.append( c );
}
n++;
}
} catch ( final RuntimeException ex ) {
System.err.println( val + "\n" + ex.toString() );
ex.printStackTrace();
throw ex;
}
return sb.toString();
}
protected final Label getLabel(final Object label) {
Label lbl = (Label) ASMContentHandler.this.labels.get( label );
if ( lbl == null ) {
lbl = new Label();
ASMContentHandler.this.labels.put( label,
lbl );
}
return lbl;
}
// TODO verify move to stack
protected final MethodVisitor getCodeVisitor() {
return (MethodVisitor) peek();
}
protected final int getAccess(final String s) {
int access = 0;
if ( s.indexOf( "public" ) != -1 ) {
access |= Opcodes.ACC_PUBLIC;
}
if ( s.indexOf( "private" ) != -1 ) {
access |= Opcodes.ACC_PRIVATE;
}
if ( s.indexOf( "protected" ) != -1 ) {
access |= Opcodes.ACC_PROTECTED;
}
if ( s.indexOf( "static" ) != -1 ) {
access |= Opcodes.ACC_STATIC;
}
if ( s.indexOf( "final" ) != -1 ) {
access |= Opcodes.ACC_FINAL;
}
if ( s.indexOf( "super" ) != -1 ) {
access |= Opcodes.ACC_SUPER;
}
if ( s.indexOf( "synchronized" ) != -1 ) {
access |= Opcodes.ACC_SYNCHRONIZED;
}
if ( s.indexOf( "volatile" ) != -1 ) {
access |= Opcodes.ACC_VOLATILE;
}
if ( s.indexOf( "bridge" ) != -1 ) {
access |= Opcodes.ACC_BRIDGE;
}
if ( s.indexOf( "varargs" ) != -1 ) {
access |= Opcodes.ACC_VARARGS;
}
if ( s.indexOf( "transient" ) != -1 ) {
access |= Opcodes.ACC_TRANSIENT;
}
if ( s.indexOf( "native" ) != -1 ) {
access |= Opcodes.ACC_NATIVE;
}
if ( s.indexOf( "interface" ) != -1 ) {
access |= Opcodes.ACC_INTERFACE;
}
if ( s.indexOf( "abstract" ) != -1 ) {
access |= Opcodes.ACC_ABSTRACT;
}
if ( s.indexOf( "strict" ) != -1 ) {
access |= Opcodes.ACC_STRICT;
}
if ( s.indexOf( "synthetic" ) != -1 ) {
access |= Opcodes.ACC_SYNTHETIC;
}
if ( s.indexOf( "annotation" ) != -1 ) {
access |= Opcodes.ACC_ANNOTATION;
}
if ( s.indexOf( "enum" ) != -1 ) {
access |= Opcodes.ACC_ENUM;
}
if ( s.indexOf( "deprecated" ) != -1 ) {
access |= Opcodes.ACC_DEPRECATED;
}
return access;
}
}
/**
* ClassRule
*/
private final class ClassRule extends Rule {
public final void begin(final String name,
final Attributes attrs) {
final int major = Integer.parseInt( attrs.getValue( "major" ) );
final int minor = Integer.parseInt( attrs.getValue( "minor" ) );
ASMContentHandler.this.cw = new ClassWriter( ASMContentHandler.this.computeMax );
final Map vals = new HashMap();
vals.put( "version",
new Integer( minor << 16 | major ) );
vals.put( "access",
attrs.getValue( "access" ) );
vals.put( "name",
attrs.getValue( "name" ) );
vals.put( "parent",
attrs.getValue( "parent" ) );
vals.put( "source",
attrs.getValue( "source" ) );
vals.put( "signature",
attrs.getValue( "signature" ) );
vals.put( "interfaces",
new ArrayList() );
push( vals );
// values will be extracted in InterfacesRule.end();
}
}
private final class SourceRule extends Rule {
public void begin(final String name,
final Attributes attrs) {
final String file = attrs.getValue( "file" );
final String debug = attrs.getValue( "debug" );
ASMContentHandler.this.cw.visitSource( file,
debug );
}
}
/**
* InterfaceRule
*/
private final class InterfaceRule extends Rule {
public final void begin(final String name,
final Attributes attrs) {
((List) ((Map) peek()).get( "interfaces" )).add( attrs.getValue( "name" ) );
}
}
/**
* InterfacesRule
*/
private final class InterfacesRule extends Rule {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -