Compare commits

...

88 Commits

Author SHA1 Message Date
CaiHQ
52aa2af997 update system var: BDW_SOCKET_TIMEOUT 2024-12-24 12:59:10 +08:00
CaiHQ
eff8d37278 update docker files 2024-12-23 16:16:07 +08:00
CaiHQ
2ef0e29890 update doip sdk 2024-05-15 21:44:10 +08:00
CaiHQ
8715fb8ea8 update dependencies 2024-03-11 15:36:05 +08:00
CaiHQ
c1f114a0fe update doip sdk 2023-12-15 15:50:42 +08:00
CaiHQ
0e37448269 prune code 2023-11-06 21:48:33 +08:00
CaiHQ
a33f8c43a7 update doip-version 2023-11-06 21:45:49 +08:00
CaiHQ
be4d25d260 feat: support fork annotation 2023-08-23 16:25:55 +08:00
CaiHQ
bb71895f6e feat: support fork annotation 2023-08-23 16:00:47 +08:00
CaiHQ
6d5f005f6e optimize dependent function parse
support merge importNodes
2023-07-24 12:31:48 +08:00
CaiHQ
374451dd5b optimize dependent function parse
support merge importNodes
2023-07-24 11:35:51 +08:00
CaiHQ
bc7a54e9ce fix relative path bugs 2023-07-03 17:57:52 +08:00
5598a2ba8c feat: sharable var integration 2023-06-25 16:42:54 +08:00
3bf508b088 feat: sharable var integration 2023-06-25 16:42:32 +08:00
0ae9339900 feat: yjs keyword sharable 2023-06-25 16:36:02 +08:00
72407d80a8 feat: yjs keyword sharable 2023-06-25 16:35:40 +08:00
CaiHQ
1459448ad4 update version
keep sync
2023-06-19 16:42:04 +08:00
haoeliu@foxmail.com
e1c628004f add a space to look the same 2023-06-15 20:38:58 +08:00
haoeliu@foxmail.com
192336d2b0 fix the wrong path 2023-06-15 17:56:34 +08:00
Frank.R.Wu
2f42539293 build: config spotless plugin and reformat code 2023-06-15 11:08:09 +08:00
Frank.R.Wu
281030a94c build: config spotless plugin 2023-06-12 23:09:34 +08:00
CaiHQ
32536e2c80 keep sync 2023-06-09 18:24:38 +08:00
CaiHQ
50921a8c71 update merge logic and update version 2023-06-06 17:57:10 +08:00
CaiHQ
5e2a8ca38c update merge logic 2023-06-06 17:54:26 +08:00
CaiHQ
9c77aed029 fix import node bugs 2023-06-06 15:08:29 +08:00
CaiHQ
7bb99d3da9 support importNode 2023-06-06 14:53:36 +08:00
CaiHQ
c65e459208 add interface declaration support 2023-06-06 11:38:02 +08:00
CaiHQ
c24242ab87 add interface support 2023-06-06 11:01:20 +08:00
CaiHQ
972070c6df add DigestUtil 2023-04-24 18:56:19 +08:00
CaiHQ
64f83c9d74 update doip-sdk version 2023-04-20 10:04:00 +08:00
CaiHQ
f5195c843a update doip-sdk 2023-04-05 14:32:40 +08:00
CaiHQ
f6e438176b prune doi 2023-03-31 17:12:18 +08:00
CaiHQ
469fa271d4 update doipPort 2023-03-31 11:50:43 +08:00
CaiHQ
6a4e1c830c fix hardwareinfo missing in docker 2023-03-30 23:55:31 +08:00
CaiHQ
02c1f9a815 add dbtable 2023-03-29 15:59:30 +08:00
CaiHQ
87de7cc105 fix doip dependency 2023-03-29 15:58:56 +08:00
CaiHQ
27b6d8a9aa refactor extract routerInfo and joinInfo 2023-03-28 12:00:20 +08:00
CaiHQ
fdd5848989 refactor extract routerInfo and joinInfo 2023-03-27 16:10:59 +08:00
CaiHQ
3fb7b5c7c2 remove sign and sign verify in Contract.java 2023-03-19 20:36:25 +08:00
CaiHQ
b670a6586a update version 2023-03-15 16:29:19 +08:00
CaiHQ
74fcf39094 update logger 2023-02-08 14:18:06 +08:00
haoeliu@foxmail.com
f6c2e9e445 delete useless updateFunctionMap 2023-01-25 17:44:21 +08:00
haoeliu@foxmail.com
3dc6a34770 finish the local version 2022-12-02 16:40:41 +08:00
haoeliu@foxmail.com
a4bc017a15 finish the draft version 2022-11-27 18:58:34 +08:00
haoeliu@foxmail.com
07c8f40059 remove doipOperationMap in ContractNode 2022-11-16 14:57:29 +08:00
haoeliu@foxmail.com
5fd1c684aa merge origin/master 2022-11-15 11:51:27 +08:00
haoeliu@foxmail.com
4dfca5a4a0 add DoipOperation relevant update 2022-11-15 11:50:13 +08:00
CaiHQ
4fec45d789 upgrade annotation hook type 2022-11-15 11:36:16 +08:00
haoeliu@foxmail.com
611d25a044 add doip-audit-tool dependency in build.gradle 2022-11-09 17:05:57 +08:00
haoeliu@foxmail.com
7813256444 gen new parser 2022-11-09 16:29:05 +08:00
CaiHQ
017c68fc60 update dependency 2022-10-25 09:59:02 +08:00
CaiHQ
321dba92aa connect function node with compiled function 2022-09-06 12:27:27 +08:00
CaiHQ
58950fbf8a Merge branch 'master' of https://gitee.com/BDWare/common 2022-09-02 21:17:05 +08:00
CaiHQ
b9cf6cfc3b sync version 2022-09-02 21:16:58 +08:00
CaiHQ
03329d338e sync version 2022-09-02 21:15:09 +08:00
CaiHQ
0da9d88173 add debug port for cp 2022-09-02 21:00:02 +08:00
CaiHQ
0aac9d16d9 fix too RejectedExecutionException of ServiceServer.executor 2022-07-14 22:23:31 +08:00
CaiHQ
e336865cc1 feat: more default router function 2022-07-09 09:31:26 +08:00
huaqian cai
4ef2806c20 upgrade rocksdb
publish cp-1.6.4
publish common-1.5.9
2022-06-29 09:19:56 +08:00
huaqian cai
c51224e24c upgrade rocksdb 2022-06-28 20:37:32 +08:00
CaiHQ
5265631022 Merge branch 'master' of https://gitee.com/BDWare/common 2022-06-27 14:32:05 +08:00
CaiHQ
f2f1bae2ba update routeInfo and joinInfo 2022-06-27 14:31:12 +08:00
CaiHQ
46e5644cf2 add ClusterUtil
update @Router arguments
add DOIPUtilTest
update log4j2.properties
2022-06-26 17:48:03 +08:00
CaiHQ
f74c4f040f add raft 2022-05-27 15:27:56 +08:00
dongrui
34cedb8a13
add write boolean to util 2022-05-26 13:07:08 +00:00
CaiHQ
488fbb4a63 Merge branch 'master' of https://gitee.com/BDWare/common 2022-05-23 17:07:29 +08:00
CaiHQ
6366b2fc1f doc: docker deploy
feat: support docker debug
2022-05-23 17:06:54 +08:00
CaiHQ
f292deae14 refactor: add bdledger dependencies
feat: IRPUtil
feat: support debug in docker
2022-05-20 22:50:13 +08:00
CaiHQ
f746ccb7dc prune: update modules for mvn repository 2022-05-13 23:51:46 +08:00
CaiHQ
6a7b355b18 keepsync 2022-05-05 13:29:02 +08:00
CaiHQ
8d15c15192 Merge branch 'master' of https://gitee.com/BDWare/common 2022-05-05 13:28:49 +08:00
CaiHQ
0df8ff0278 update docker configs 2022-05-05 13:28:29 +08:00
CaiHQ
b78c6a0c98 feat: support onCreateParams 2022-05-02 20:49:37 +08:00
WangXuxin
7a9ce393cd feat: support @RouteInfo byFunc 2022-04-27 10:23:33 +08:00
CaiHQ
8bf4b1c57d feat: support createParam
feat: docker script
2022-04-21 10:18:48 +08:00
CaiHQ
47661ad923 fix: null point exception 2022-04-12 16:30:24 +08:00
CaiHQ
1d3efbdb97 support serialzable json 2022-04-07 18:49:57 +08:00
CaiHQ
4047f03151 feat: support onCreateParams 2022-04-07 15:48:39 +08:00
2d6c0e4874 fix setGlobal 2022-03-16 14:38:04 +08:00
CaiHQ
9856f08003 fix: MultiPointCooperationExecutor 2022-02-18 11:14:11 +08:00
Frank.R.Wu
62533a0da1 feat: update event mechanism
add second centers for event topics
2022-01-20 20:55:49 +08:00
CaiHQ
f77305c0ef upgrade doipsdk 2022-01-08 23:43:21 +08:00
CaiHQ
2ce57c111e fix: binarySearch bugs in TimeSerialIndex
feat: support multi tag time index util
2022-01-06 20:33:46 +08:00
CaiHQ
7032dd3b28 prune: unused jarbackup 2022-01-04 10:46:01 +08:00
CaiHQ
7d543f1085 prune: use stable doip-sdk 2022-01-04 10:16:20 +08:00
yanghuanyu
f0c75d4b3c fix: unpackInternal bug 2021-12-31 15:05:30 +08:00
Frank.R.Wu
43282a3201 feat: remove txHash in REvent.getContentStr
remove txHash in REvent.getContentStr to suit EventRecorder
2021-12-29 20:24:03 +08:00
CaiHQ
94c9b867de optimize receive file 2021-12-29 11:52:24 +08:00
269 changed files with 32967 additions and 30212 deletions

1
.gitignore vendored
View File

@ -1,4 +1,5 @@
/build/
/testoutput/
*/build/*
# Compiled class file
*.class

View File

@ -1,6 +1,20 @@
plugins {
id 'java'
id 'java-library'
id 'maven-publish'
id 'signing'
id 'com.github.johnrengelman.shadow' version '4.0.2'
}
apply from: '../spotless.gradle'
shadowJar {
classifier = "jar"
dependencies {
include(dependency(fileTree(dir: 'lib', include: '*.jar')))
// exclude(dependency('com.google.code.gson:gson:2.8.6'))
// relocate 'com.google.code.gson', 'irs.com.google.code.gson'
}
}
sourceSets {
@ -24,24 +38,24 @@ sourceSets {
sourceCompatibility = 1.8
dependencies {
api project(":gmhelper")
api 'org.bdware.bdcontract:gmhelper:0.2.0'
api 'berkeleydb:je:3.2.76'
api 'com.fifesoft:rsyntaxtextarea:3.1.3'
api 'commons-io:commons-io:2.11.0'
api 'io.netty:netty-all:4.1.63.Final'
api 'io.netty:netty-all:4.1.86.Final'
api 'org.antlr:antlr4:4.9.2'
api 'commons-codec:commons-codec:1.5'
api 'org.apache.logging.log4j:log4j-core:2.17.0'
api 'org.apache.logging.log4j:log4j-api:2.17.0'
api 'commons-codec:commons-codec:1.13'
api 'org.apache.logging.log4j:log4j-core:2.17.2'
api 'org.apache.logging.log4j:log4j-api:2.17.2'
// api 'com.fifesoft:rsyntaxtextarea:3.1.3'
// api fileTree(dir: 'lib', include: '*.jar')
//api 'org.apache.velocity:velocity-engine-core:2.3'
api 'org.rocksdb:rocksdbjni:6.22.1'
api fileTree(dir: 'lib', include: '*.jar')
api 'org.rocksdb:rocksdbjni:7.3.1'
testImplementation 'junit:junit:4.13.2'
implementation 'org.bdware.doip:doip-sdk:1.5.6'
}
group = "org.bdware.sc"
version = "1.8.1"
tasks.processResources.setDuplicatesStrategy(DuplicatesStrategy.INCLUDE)
task copyLibs(type: Copy) {
@ -54,3 +68,87 @@ task copyJar(type: Copy) {
into "./build/output/"
rename { String fileName -> "yjs.jar" }
}
//task classJar(type: Jar, dependsOn: classes) {
// classifier = "jar"
//}
tasks.withType(Copy).all {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
tasks.withType(Jar).all {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
task sourceJar(type: Jar, dependsOn: classes) {
archiveClassifier = "sources"
classifier = "sources"
from sourceSets.main.allSource
}
tasks.withType(Javadoc) {
options.addStringOption('Xdoclint:none', '-quiet')
}
task javadocJar(type: Jar, dependsOn: javadoc) {
archiveClassifier = 'javadoc'
classifier = "javadoc"
exclude { details -> details.file.getAbsolutePath().contains("/gm/")
}
from javadoc.destinationDir
}
publishing {
publications {
mavenJava(MavenPublication) {
groupId project.group
artifactId "common"
version "${version}"
from components.java
artifact sourceJar
artifact javadocJar
artifact shadowJar
pom {
name = "bdware-common"
description = "common"
url = "https://gitee.com/BDWare/common"
licenses {
license {
name = "Mulan PSL v2"
url = "http://license.coscl.org.cn/MulanPSL2"
}
}
developers {
developer {
id = "dataware"
email = "caihq@pku.edu.cn"
}
}
scm {
connection = "scm:git:https://gitee.com/BDWare/common.git"
developerConnection = "scm:git:https://gitee.com/BDWare/common.git"
url = "https://gitee.com/BDWare/common"
}
}
}
}
repositories {
maven {
name 'bdwareSnapshotRepository'
url 'https://oss.sonatype.org/content/repositories/snapshots'
credentials {
username = "${NEXUS_USERNAME}"
password = "${NEXUS_PASSWORD}"
}
}
maven {
name 'bdwareRepository'
url 'https://oss.sonatype.org/service/local/staging/deploy/maven2'
credentials {
username = "${NEXUS_USERNAME}"
password = "${NEXUS_PASSWORD}"
}
}
}
}
signing {
sign publishing.publications.mavenJava
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -3,16 +3,15 @@ package org.bdware.analysis;
import org.objectweb.asm.tree.AbstractInsnNode;
public abstract class AnalysisResult {
public AnalysisResult() {
}
public AnalysisResult() {}
public abstract AnalysisResult merge(AbstractInsnNode insn);
public abstract AnalysisResult merge(AbstractInsnNode insn);
public abstract void printResult();
public abstract void printResult();
public abstract boolean covers(AnalysisResult result);
public abstract boolean covers(AnalysisResult result);
public abstract void mergeResult(AnalysisResult r);
public abstract void mergeResult(AnalysisResult r);
public abstract AnalysisResult clone();
}
public abstract AnalysisResult clone();
}

View File

@ -1,7 +1,7 @@
package org.bdware.analysis;
public interface AnalysisTarget {
public boolean inList();
public boolean inList();
public void setInList(boolean b);
public void setInList(boolean b);
}

View File

@ -6,44 +6,44 @@ import java.util.List;
import org.objectweb.asm.tree.AbstractInsnNode;
public class BasicBlock {
public List<AbstractInsnNode> list;
public int blockID;
public int lineNum = -1;
public List<AbstractInsnNode> list;
public int blockID;
public int lineNum = -1;
public int insnCount;
public BasicBlock(int id) {
list = new ArrayList<>();
blockID = id;
}
list = new ArrayList<>();
blockID = id;
}
public void add(AbstractInsnNode insn) {
list.add(insn);
}
public void add(AbstractInsnNode insn) {
list.add(insn);
}
public int size() {
public int size() {
return list.size();
}
return list.size();
}
public List<AbstractInsnNode> getInsn() {
return list;
}
public List<AbstractInsnNode> getInsn() {
return list;
}
boolean inList = false;
boolean inList = false;
public AbstractInsnNode lastInsn() {
return list.get(list.size() - 1);
}
public AbstractInsnNode lastInsn() {
return list.get(list.size() - 1);
}
public void setLineNum(int line) {
lineNum = line;
}
public void setLineNum(int line) {
lineNum = line;
}
public boolean inList() {
return inList;
}
public boolean inList() {
return inList;
}
public void setInList(boolean b) {
inList = b;
}
public void setInList(boolean b) {
inList = b;
}
}

View File

@ -6,53 +6,53 @@ import java.util.List;
import java.util.Map;
public abstract class BreadthFirstSearch<R extends AnalysisResult, T extends AnalysisTarget> {
public Map<T, AnalysisResult> results;
protected List<T> toAnalysis;
public Map<T, AnalysisResult> results;
protected List<T> toAnalysis;
public abstract R execute(T t);
public abstract R execute(T t);
public abstract Collection<T> getSuc(T t);
public abstract Collection<T> getSuc(T t);
public BreadthFirstSearch() {
results = new HashMap<T, AnalysisResult>();
}
public BreadthFirstSearch() {
results = new HashMap<T, AnalysisResult>();
}
public Map<T, AnalysisResult> analysis() {
results.clear();
T current = null;
for (int i = 0; i < toAnalysis.size(); i++) {
current = toAnalysis.get(i);
current.setInList(false);
AnalysisResult preResult = results.get(current);
AnalysisResult sucResult = execute(current);
public Map<T, AnalysisResult> analysis() {
results.clear();
T current = null;
for (int i = 0; i < toAnalysis.size(); i++) {
current = toAnalysis.get(i);
current.setInList(false);
AnalysisResult preResult = results.get(current);
AnalysisResult sucResult = execute(current);
if (preResult == null || !preResult.covers(sucResult)) {
AnalysisResult cloneResult = sucResult.clone();
if (cloneResult != null) {
results.put(current, cloneResult);
}
Collection<T> sucs = getSuc(current);
for (T next : sucs) {
if (preResult == null || !preResult.covers(sucResult)) {
AnalysisResult cloneResult = sucResult.clone();
if (cloneResult != null) {
results.put(current, cloneResult);
}
Collection<T> sucs = getSuc(current);
for (T next : sucs) {
if (toAnalysis.contains(next)) {
//results.remove(next);
//toAnalysis.remove(next);
}
if (!next.inList()) {
toAnalysis.add(next);
next.setInList(true);
}
}
}
}
return results;
}
if (toAnalysis.contains(next)) {
// results.remove(next);
// toAnalysis.remove(next);
}
if (!next.inList()) {
toAnalysis.add(next);
next.setInList(true);
}
}
}
}
return results;
}
public int getListLength() {
return toAnalysis.size();
}
public int getListLength() {
return toAnalysis.size();
}
public void setToAnalysis(List<T> l) {
toAnalysis = l;
}
public void setToAnalysis(List<T> l) {
toAnalysis = l;
}
}

View File

@ -19,7 +19,7 @@ public abstract class CFGraph {
// type2(canThrow) and catchLabels
// type3 and target labels
// type4 and catchLabels
// private List<TryCatchBlockNode> tryCacheList;
// private List<TryCatchBlockNode> tryCacheList;
// Pass1: build basic blocks
// create a new block when:
// 1.starts with Label(can jump)
@ -110,8 +110,8 @@ public abstract class CFGraph {
public void printSelf() {
InsnPrinter printer = new InsnPrinter(Opcodes.ASM4, System.out);
printer.setLabelOrder(getLabelOrder());
LOGGER.info("isStatic: " + ((methodNode.access & Opcodes.ACC_STATIC) > 0)
+ "\tMethod:" + methodNode.name + " " + methodNode.desc);
LOGGER.info("isStatic: " + ((methodNode.access & Opcodes.ACC_STATIC) > 0) + "\tMethod:"
+ methodNode.name + " " + methodNode.desc);
LOGGER.info(methodNode.maxLocals + " " + methodNode.maxStack);
StringBuilder log = new StringBuilder();
for (BasicBlock bb : basicBlocks) {
@ -171,21 +171,17 @@ public abstract class CFGraph {
/**
* Visits a zero operand instruction.
*
* @param opcode the opcode of the instruction to be visited. This opcode is
* either NOP, ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1,
* ICONST_2, ICONST_3, ICONST_4, ICONST_5, LCONST_0, LCONST_1,
* FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD,
* LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD,
* IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE,
* SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1,
* DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB,
* IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM,
* FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL, ISHR, LSHR,
* IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D,
* L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S,
* LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IRETURN, LRETURN, FRETURN,
* DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW, MONITORENTER, or
* MONITOREXIT.
* @param opcode the opcode of the instruction to be visited. This opcode is either NOP,
* ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4,
* ICONST_5, LCONST_0, LCONST_1, FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1,
* IALOAD, LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IASTORE, LASTORE,
* FASTORE, DASTORE, AASTORE, BASTORE, CASTORE, SASTORE, POP, POP2, DUP, DUP_X1,
* DUP_X2, DUP2, DUP2_X1, DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB,
* DSUB, IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM, FREM, DREM,
* INEG, LNEG, FNEG, DNEG, ISHL, LSHL, ISHR, LSHR, IUSHR, LUSHR, IAND, LAND, IOR,
* LOR, IXOR, LXOR, I2L, I2F, I2D, L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B,
* I2C, I2S, LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IRETURN, LRETURN, FRETURN, DRETURN,
* ARETURN, RETURN, ARRAYLENGTH, ATHROW, MONITORENTER, or MONITOREXIT.
*/
public void visitInsn(int opcode) {
currBlock.add(currInsn);
@ -199,77 +195,75 @@ public abstract class CFGraph {
/**
* Visits an instruction with a single int operand.
*
* @param opcode the opcode of the instruction to be visited. This opcode is
* either BIPUSH, SIPUSH or NEWARRAY.
* @param opcode the opcode of the instruction to be visited. This opcode is either BIPUSH,
* SIPUSH or NEWARRAY.
* @param operand the operand of the instruction to be visited.<br>
* When opcode is BIPUSH, operand value should be between
* Byte.MIN_VALUE and Byte.MAX_VALUE.<br>
* When opcode is SIPUSH, operand value should be between
* Short.MIN_VALUE and Short.MAX_VALUE.<br>
* When opcode is NEWARRAY, operand value should be one of
* {@link Opcodes#T_BOOLEAN}, {@link Opcodes#T_CHAR},
* {@link Opcodes#T_FLOAT}, {@link Opcodes#T_DOUBLE},
* {@link Opcodes#T_BYTE}, {@link Opcodes#T_SHORT},
* {@link Opcodes#T_INT} or {@link Opcodes#T_LONG}.
* When opcode is BIPUSH, operand value should be between Byte.MIN_VALUE and
* Byte.MAX_VALUE.<br>
* When opcode is SIPUSH, operand value should be between Short.MIN_VALUE and
* Short.MAX_VALUE.<br>
* When opcode is NEWARRAY, operand value should be one of {@link Opcodes#T_BOOLEAN},
* {@link Opcodes#T_CHAR}, {@link Opcodes#T_FLOAT}, {@link Opcodes#T_DOUBLE},
* {@link Opcodes#T_BYTE}, {@link Opcodes#T_SHORT}, {@link Opcodes#T_INT} or
* {@link Opcodes#T_LONG}.
*/
public void visitIntInsn(int opcode, int operand) {
currBlock.add(currInsn);
}
/**
* Visits a local variable instruction. A local variable instruction is an
* instruction that loads or stores the value of a local variable.
* Visits a local variable instruction. A local variable instruction is an instruction that
* loads or stores the value of a local variable.
*
* @param opcode the opcode of the local variable instruction to be visited.
* This opcode is either ILOAD, LLOAD, FLOAD, DLOAD, ALOAD,
* ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or RET.
* @param var the operand of the instruction to be visited. This operand is
* the index of a local variable.
* @param opcode the opcode of the local variable instruction to be visited. This opcode is
* either ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE
* or RET.
* @param var the operand of the instruction to be visited. This operand is the index of a
* local variable.
*/
public void visitVarInsn(int opcode, int var) {
currBlock.add(currInsn);
}
/**
* Visits a type instruction. A type instruction is an instruction that takes
* the internal name of a class as parameter.
* Visits a type instruction. A type instruction is an instruction that takes the internal
* name of a class as parameter.
*
* @param opcode the opcode of the type instruction to be visited. This opcode
* is either NEW, ANEWARRAY, CHECKCAST or INSTANCEOF.
* @param type the operand of the instruction to be visited. This operand must
* be the internal name of an object or array class (see
* {@link Type#getInternalName() getInternalName}).
* @param opcode the opcode of the type instruction to be visited. This opcode is either
* NEW, ANEWARRAY, CHECKCAST or INSTANCEOF.
* @param type the operand of the instruction to be visited. This operand must be the
* internal name of an object or array class (see {@link Type#getInternalName()
* getInternalName}).
*/
public void visitTypeInsn(int opcode, String type) {
currBlock.add(currInsn);
}
/**
* Visits a field instruction. A field instruction is an instruction that loads
* or stores the value of a field of an object.
* Visits a field instruction. A field instruction is an instruction that loads or stores
* the value of a field of an object.
*
* @param opcode the opcode of the type instruction to be visited. This opcode
* is either GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
* @param owner the internal name of the field's owner class (see
* {@link Type#getInternalName() getInternalName}).
* @param name the field's name.
* @param desc the field's descriptor (see {@link Type Type}).
* @param opcode the opcode of the type instruction to be visited. This opcode is either
* GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
* @param owner the internal name of the field's owner class (see
* {@link Type#getInternalName() getInternalName}).
* @param name the field's name.
* @param desc the field's descriptor (see {@link Type Type}).
*/
public void visitFieldInsn(int opcode, String owner, String name, String desc) {
currBlock.add(currInsn);
}
/**
* Visits a method instruction. A method instruction is an instruction that
* invokes a method.
* Visits a method instruction. A method instruction is an instruction that invokes a
* method.
*
* @param opcode the opcode of the type instruction to be visited. This opcode
* is either INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or
* INVOKEINTERFACE.
* @param owner the internal name of the method's owner class (see
* {@link Type#getInternalName() getInternalName}).
* @param name the method's name.
* @param desc the method's descriptor (see {@link Type Type}).
* @param opcode the opcode of the type instruction to be visited. This opcode is either
* INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or INVOKEINTERFACE.
* @param owner the internal name of the method's owner class (see
* {@link Type#getInternalName() getInternalName}).
* @param name the method's name.
* @param desc the method's descriptor (see {@link Type Type}).
*/
public void visitMethodInsn(int opcode, String owner, String name, String desc) {
currBlock.add(currInsn);
@ -288,16 +282,16 @@ public abstract class CFGraph {
/**
* Visits an invokedynamic instruction.
*
* @param name the method's name.
* @param desc the method's descriptor (see {@link Type Type}).
* @param bsm the bootstrap method.
* @param bsmArgs the bootstrap method constant arguments. Each argument must be
* an {@link Integer}, {@link Float}, {@link Long},
* {@link Double}, {@link String}, {@link Type} or {@link Handle}
* value. This method is allowed to modify the content of the
* array so a caller should expect that this array may change.
* @param name the method's name.
* @param desc the method's descriptor (see {@link Type Type}).
* @param bsm the bootstrap method.
* @param bsmArgs the bootstrap method constant arguments. Each argument must be an
* {@link Integer}, {@link Float}, {@link Long}, {@link Double}, {@link String},
* {@link Type} or {@link Handle} value. This method is allowed to modify the content
* of the array so a caller should expect that this array may change.
*/
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
Object... bsmArgs) {
// TODO add edges to try catch blocks!
currBlock.add(currInsn);
@ -309,16 +303,14 @@ public abstract class CFGraph {
}
/**
* Visits a jump instruction. A jump instruction is an instruction that may jump
* to another instruction.
* Visits a jump instruction. A jump instruction is an instruction that may jump to another
* instruction.
*
* @param opcode the opcode of the type instruction to be visited. This opcode
* is either IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ,
* IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE,
* IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
* @param label the operand of the instruction to be visited. This operand is a
* label that designates the instruction to which the jump
* instruction may jump.
* @param opcode the opcode of the type instruction to be visited. This opcode is either
* IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE,
* IF_ICMPGT, IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
* @param label the operand of the instruction to be visited. This operand is a label that
* designates the instruction to which the jump instruction may jump.
*/
public void visitJumpInsn(int opcode, Label label) {
currBlock.add(currInsn);
@ -331,8 +323,7 @@ public abstract class CFGraph {
}
/**
* Visits a label. A label designates the instruction that will be visited just
* after it.
* Visits a label. A label designates the instruction that will be visited just after it.
*
* @param label a {@link Label Label} object.
*/
@ -349,47 +340,45 @@ public abstract class CFGraph {
}
/**
* Visits a LDC instruction. Note that new constant types may be added in future
* versions of the Java Virtual Machine. To easily detect new constant types,
* implementations of this method should check for unexpected constant types,
* like this:
* Visits a LDC instruction. Note that new constant types may be added in future versions of
* the Java Virtual Machine. To easily detect new constant types, implementations of this
* method should check for unexpected constant types, like this:
*
* <pre>
* if (cst instanceof Integer) {
* // ...
* // ...
* } else if (cst instanceof Float) {
* // ...
* // ...
* } else if (cst instanceof Long) {
* // ...
* // ...
* } else if (cst instanceof Double) {
* // ...
* // ...
* } else if (cst instanceof String) {
* // ...
* // ...
* } else if (cst instanceof Type) {
* int sort = ((Type) cst).getSort();
* if (sort == Type.OBJECT) {
* // ...
* } else if (sort == Type.ARRAY) {
* // ...
* } else if (sort == Type.METHOD) {
* // ...
* } else {
* // throw an exception
* }
* int sort = ((Type) cst).getSort();
* if (sort == Type.OBJECT) {
* // ...
* } else if (sort == Type.ARRAY) {
* // ...
* } else if (sort == Type.METHOD) {
* // ...
* } else {
* // throw an exception
* }
* } else if (cst instanceof Handle) {
* // ...
* // ...
* } else {
* // throw an exception
* // throw an exception
* }
* </pre>
*
* @param cst the constant to be loaded on the stack. This parameter must be a
* non null {@link Integer}, a {@link Float}, a {@link Long}, a
* {@link Double}, a {@link String}, a {@link Type} of OBJECT or
* ARRAY sort for <tt>.class</tt> constants, for classes whose
* version is 49.0, a {@link Type} of METHOD sort or a {@link Handle}
* for MethodType and MethodHandle constants, for classes whose
* version is 51.0.
* @param cst the constant to be loaded on the stack. This parameter must be a non null
* {@link Integer}, a {@link Float}, a {@link Long}, a {@link Double}, a
* {@link String}, a {@link Type} of OBJECT or ARRAY sort for <tt>.class</tt>
* constants, for classes whose version is 49.0, a {@link Type} of METHOD sort or a
* {@link Handle} for MethodType and MethodHandle constants, for classes whose
* version is 51.0.
*/
public void visitLdcInsn(Object cst) {
currBlock.add(currInsn);
@ -398,7 +387,7 @@ public abstract class CFGraph {
/**
* Visits an IINC instruction.
*
* @param var index of the local variable to be incremented.
* @param var index of the local variable to be incremented.
* @param increment amount to increment the local variable by.
*/
public void visitIincInsn(int var, int increment) {
@ -411,11 +400,11 @@ public abstract class CFGraph {
/**
* Visits a TABLESWITCH instruction.
*
* @param min the minimum key value.
* @param max the maximum key value.
* @param dflt beginning of the default handler block.
* @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the
* beginning of the handler block for the <tt>min + i</tt> key.
* @param min the minimum key value.
* @param max the maximum key value.
* @param dflt beginning of the default handler block.
* @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the beginning of
* the handler block for the <tt>min + i</tt> key.
*/
public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) {
currBlock.add(currInsn);
@ -426,10 +415,10 @@ public abstract class CFGraph {
/**
* Visits a LOOKUPSWITCH instruction.
*
* @param dflt beginning of the default handler block.
* @param keys the values of the keys.
* @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the
* beginning of the handler block for the <tt>keys[i]</tt> key.
* @param dflt beginning of the default handler block.
* @param keys the values of the keys.
* @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the beginning of
* the handler block for the <tt>keys[i]</tt> key.
*/
public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
currBlock.add(currInsn);
@ -450,33 +439,31 @@ public abstract class CFGraph {
/**
* Visits a local variable declaration.
*
* @param name the name of a local variable.
* @param desc the type descriptor of this local variable.
* @param signature the type signature of this local variable. May be
* <tt>null</tt> if the local variable type does not use
* generic types.
* @param start the first instruction corresponding to the scope of this
* local variable (inclusive).
* @param end the last instruction corresponding to the scope of this
* local variable (exclusive).
* @param index the local variable's index.
* @throws IllegalArgumentException if one of the labels has not already been
* visited by this visitor (by the
* {@link #visitLabel visitLabel} method).
* @param name the name of a local variable.
* @param desc the type descriptor of this local variable.
* @param signature the type signature of this local variable. May be <tt>null</tt> if the
* local variable type does not use generic types.
* @param start the first instruction corresponding to the scope of this local variable
* (inclusive).
* @param end the last instruction corresponding to the scope of this local variable
* (exclusive).
* @param index the local variable's index.
* @throws IllegalArgumentException if one of the labels has not already been visited by
* this visitor (by the {@link #visitLabel visitLabel} method).
*/
public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) {
public void visitLocalVariable(String name, String desc, String signature, Label start,
Label end, int index) {
currBlock.add(currInsn);
}
/**
* Visits a line number declaration.
*
* @param line a line number. This number refers to the source file from which
* the class was compiled.
* @param line a line number. This number refers to the source file from which the class was
* compiled.
* @param start the first instruction corresponding to this line number.
* @throws IllegalArgumentException if <tt>start</tt> has not already been
* visited by this visitor (by the
* {@link #visitLabel visitLabel} method).
* @throws IllegalArgumentException if <tt>start</tt> has not already been visited by this
* visitor (by the {@link #visitLabel visitLabel} method).
*/
public void visitLineNumber(int line, Label start) {
currBlock.add(currInsn);
@ -557,7 +544,8 @@ public abstract class CFGraph {
}
@Override
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
Object... bsmArgs) {
addTryCatchNodes();
}

View File

@ -1,10 +1,10 @@
package org.bdware.analysis;
public interface CFType {
public static final int kInstrCanBranch = 1; // conditional or unconditional branch
public static final int kInstrCanContinue = 1 << 1; // flow can continue to next statement
public static final int kInstrCanSwitch = 1 << 2; // switch
public static final int kInstrCanThrow = 1 << 3; // could cause an exception to be thrown
public static final int kInstrCanReturn = 1 << 4; // returns, no additional statements
public static final int kInstrInvoke = 1 << 5; // a flavor of invoke
public static final int kInstrCanBranch = 1; // conditional or unconditional branch
public static final int kInstrCanContinue = 1 << 1; // flow can continue to next statement
public static final int kInstrCanSwitch = 1 << 2; // switch
public static final int kInstrCanThrow = 1 << 3; // could cause an exception to be thrown
public static final int kInstrCanReturn = 1 << 4; // returns, no additional statements
public static final int kInstrInvoke = 1 << 5; // a flavor of invoke
}

View File

@ -8,131 +8,127 @@ import java.util.List;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.bdware.analysis.BasicBlock;
import org.bdware.analysis.CFGraph;
import org.bdware.analysis.InsnPrinter;
import org.bdware.analysis.OpInfo;
import org.bdware.analysis.taint.TaintBB;
import org.bdware.analysis.taint.TaintCFG;
public class FrontCF {
String methodName;
public List<FrontBB> blocks;
public List<FrontEdge> edges;
public String ret;
public String finalRet;
transient InsnPrinter printer;
transient ArrayPs ps;
String methodName;
public List<FrontBB> blocks;
public List<FrontEdge> edges;
public String ret;
public String finalRet;
transient InsnPrinter printer;
transient ArrayPs ps;
static class ArrayPs extends PrintStream {
List<String> content;
static class ArrayPs extends PrintStream {
List<String> content;
public ArrayPs() throws FileNotFoundException {
super("/dev/null");
}
public ArrayPs() throws FileNotFoundException {
super("/dev/null");
}
public void println(String str) {
if (content != null)
content.add(str);
}
}
public void println(String str) {
if (content != null)
content.add(str);
}
}
public FrontCF(CFGraph graph) {
blocks = new ArrayList<>();
edges = new ArrayList<>();
try {
ps = new ArrayPs();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
printer = new InsnPrinter(Opcodes.ASM4, ps);
printer.setLabelOrder(graph.getLabelOrder());
}
public FrontCF(CFGraph graph) {
blocks = new ArrayList<>();
edges = new ArrayList<>();
try {
ps = new ArrayPs();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
printer = new InsnPrinter(Opcodes.ASM4, ps);
printer.setLabelOrder(graph.getLabelOrder());
}
public static class FrontBB {
String type;
String name; //BlockNumber
List<String> stmts; //BlockInstructions
String original;
String result; //preResult
String blockDep;
}
public static class FrontBB {
String type;
String name; // BlockNumber
List<String> stmts; // BlockInstructions
String original;
String result; // preResult
String blockDep;
}
public static class EdgeLabel {
String label;
}
public static class EdgeLabel {
String label;
}
public static class FrontEdge {
String from, to;
EdgeLabel label;
}
public static class FrontEdge {
String from, to;
EdgeLabel label;
}
public void addBB(BasicBlock bb, String original, List<Integer> ids, TaintCFG cfg) {
FrontBB fb = new FrontBB();
blocks.add(fb);
fb.name = "B" + bb.blockID;
List<AbstractInsnNode> insnList = bb.getInsn();
fb.type = "Continuous";
fb.original = original;
//added
TaintBB b = (TaintBB) bb;
//if(b.preResult != null)
//b.preResult.printResult();
fb.result = b.getResult();
if(ids == null)
fb.blockDep = "";
else{
StringBuilder sb = new StringBuilder();
//sb.append("Dependence: ");
for(Integer id : ids) {
//sb.append("B"+ id +" ");
TaintBB tb = (TaintBB) cfg.getBasicBlockAt(id);
sb.append(tb.preResult.frame.getStack(0).toReadableTaint());
}
fb.blockDep = sb.toString();
}
if (insnList != null && insnList.size() > 0) {
AbstractInsnNode lastStmt = insnList.get(insnList.size() - 1);
if (lastStmt.getOpcode() >= 0) {
OpInfo info = OpInfo.ops[lastStmt.getOpcode()];
if (info.canBranch() || info.canSwitch()) {
fb.type = "Branch";
}
}
fb.stmts = new ArrayList<String>();
ps.content = fb.stmts;
for (AbstractInsnNode node : insnList) {
node.accept(printer);
}
}
}
public void addBB(BasicBlock bb, String original, List<Integer> ids, TaintCFG cfg) {
FrontBB fb = new FrontBB();
blocks.add(fb);
fb.name = "B" + bb.blockID;
List<AbstractInsnNode> insnList = bb.getInsn();
fb.type = "Continuous";
fb.original = original;
public void addEdge(BasicBlock bb, BasicBlock suc) {
FrontEdge edge = new FrontEdge();
List<AbstractInsnNode> insnList = bb.getInsn();
edge.label = new EdgeLabel();
edge.label.label = "e";
AbstractInsnNode lastStmt = insnList.get(insnList.size() - 1);
boolean ignore = false;
if (lastStmt.getOpcode() >= 0) {
OpInfo info = OpInfo.ops[lastStmt.getOpcode()];
if (info.canBranch() && info.toString().startsWith("if")) {
if (suc.blockID == bb.blockID + 1)
edge.label.label = "false";
else
edge.label.label = "true";
}
if (info.canThrow() && info.toString().startsWith("invoke")) {
if (suc.blockID != bb.blockID + 1) {
ignore = true;
}
}
}
edge.from = "B" + bb.blockID;
edge.to = "B" + suc.blockID;
if (!ignore)
edges.add(edge);
// added
TaintBB b = (TaintBB) bb;
// if(b.preResult != null)
// b.preResult.printResult();
fb.result = b.getResult();
if (ids == null)
fb.blockDep = "";
else {
StringBuilder sb = new StringBuilder();
// sb.append("Dependence: ");
for (Integer id : ids) {
// sb.append("B"+ id +" ");
TaintBB tb = (TaintBB) cfg.getBasicBlockAt(id);
sb.append(tb.preResult.frame.getStack(0).toReadableTaint());
}
fb.blockDep = sb.toString();
}
if (insnList != null && insnList.size() > 0) {
AbstractInsnNode lastStmt = insnList.get(insnList.size() - 1);
if (lastStmt.getOpcode() >= 0) {
OpInfo info = OpInfo.ops[lastStmt.getOpcode()];
if (info.canBranch() || info.canSwitch()) {
fb.type = "Branch";
}
}
fb.stmts = new ArrayList<String>();
ps.content = fb.stmts;
for (AbstractInsnNode node : insnList) {
node.accept(printer);
}
}
}
}
public void addEdge(BasicBlock bb, BasicBlock suc) {
FrontEdge edge = new FrontEdge();
List<AbstractInsnNode> insnList = bb.getInsn();
edge.label = new EdgeLabel();
edge.label.label = "e";
AbstractInsnNode lastStmt = insnList.get(insnList.size() - 1);
boolean ignore = false;
if (lastStmt.getOpcode() >= 0) {
OpInfo info = OpInfo.ops[lastStmt.getOpcode()];
if (info.canBranch() && info.toString().startsWith("if")) {
if (suc.blockID == bb.blockID + 1)
edge.label.label = "false";
else
edge.label.label = "true";
}
if (info.canThrow() && info.toString().startsWith("invoke")) {
if (suc.blockID != bb.blockID + 1) {
ignore = true;
}
}
}
edge.from = "B" + bb.blockID;
edge.to = "B" + suc.blockID;
if (!ignore)
edges.add(edge);
}
}

View File

@ -10,288 +10,275 @@ import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
public class InsnPrinter extends MethodVisitor {
PrintStream ps;
private Map<Label, Integer> labelOrder;
PrintStream ps;
private Map<Label, Integer> labelOrder;
public InsnPrinter(int api, PrintStream ps) {
super(api);
this.ps = ps;
// TODO Auto-generated constructor stub
}
// -------------------------------------------------------------------------
// Normal instructions
// -------------------------------------------------------------------------
public InsnPrinter(int api, PrintStream ps) {
super(api);
this.ps = ps;
// TODO Auto-generated constructor stub
}
// -------------------------------------------------------------------------
// Normal instructions
// -------------------------------------------------------------------------
/**
* Visits a zero operand instruction.
*
* @param opcode the opcode of the instruction to be visited. This opcode is
* either NOP, ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1,
* ICONST_2, ICONST_3, ICONST_4, ICONST_5, LCONST_0, LCONST_1,
* FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD,
* LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD,
* IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE,
* SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1,
* DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB,
* IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM,
* FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL, ISHR, LSHR,
* IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D,
* L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S,
* LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IRETURN, LRETURN, FRETURN,
* DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW, MONITORENTER, or
* MONITOREXIT.
*/
public void visitInsn(int opcode) {
ps.println(OpInfo.ops[opcode].toString());
}
/**
* Visits a zero operand instruction.
*
* @param opcode the opcode of the instruction to be visited. This opcode is either NOP,
* ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5,
* LCONST_0, LCONST_1, FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD, LALOAD,
* FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IASTORE, LASTORE, FASTORE, DASTORE,
* AASTORE, BASTORE, CASTORE, SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1,
* DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL,
* IDIV, LDIV, FDIV, DDIV, IREM, LREM, FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL,
* ISHR, LSHR, IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D, L2I, L2F,
* L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S, LCMP, FCMPL, FCMPG, DCMPL, DCMPG,
* IRETURN, LRETURN, FRETURN, DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW,
* MONITORENTER, or MONITOREXIT.
*/
public void visitInsn(int opcode) {
ps.println(OpInfo.ops[opcode].toString());
}
/**
* Visits an instruction with a single int operand.
*
* @param opcode the opcode of the instruction to be visited. This opcode is
* either BIPUSH, SIPUSH or NEWARRAY.
* @param operand the operand of the instruction to be visited.<br>
* When opcode is BIPUSH, operand value should be between
* Byte.MIN_VALUE and Byte.MAX_VALUE.<br>
* When opcode is SIPUSH, operand value should be between
* Short.MIN_VALUE and Short.MAX_VALUE.<br>
* When opcode is NEWARRAY, operand value should be one of
* {@link Opcodes#T_BOOLEAN}, {@link Opcodes#T_CHAR},
* {@link Opcodes#T_FLOAT}, {@link Opcodes#T_DOUBLE},
* {@link Opcodes#T_BYTE}, {@link Opcodes#T_SHORT},
* {@link Opcodes#T_INT} or {@link Opcodes#T_LONG}.
*/
public void visitIntInsn(int opcode, int operand) {
ps.println(OpInfo.ops[opcode].toString() + " " + operand);
}
/**
* Visits an instruction with a single int operand.
*
* @param opcode the opcode of the instruction to be visited. This opcode is either BIPUSH,
* SIPUSH or NEWARRAY.
* @param operand the operand of the instruction to be visited.<br>
* When opcode is BIPUSH, operand value should be between Byte.MIN_VALUE and
* Byte.MAX_VALUE.<br>
* When opcode is SIPUSH, operand value should be between Short.MIN_VALUE and
* Short.MAX_VALUE.<br>
* When opcode is NEWARRAY, operand value should be one of {@link Opcodes#T_BOOLEAN},
* {@link Opcodes#T_CHAR}, {@link Opcodes#T_FLOAT}, {@link Opcodes#T_DOUBLE},
* {@link Opcodes#T_BYTE}, {@link Opcodes#T_SHORT}, {@link Opcodes#T_INT} or
* {@link Opcodes#T_LONG}.
*/
public void visitIntInsn(int opcode, int operand) {
ps.println(OpInfo.ops[opcode].toString() + " " + operand);
}
/**
* Visits a local variable instruction. A local variable instruction is an
* instruction that loads or stores the value of a local variable.
*
* @param opcode the opcode of the local variable instruction to be visited.
* This opcode is either ILOAD, LLOAD, FLOAD, DLOAD, ALOAD,
* ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or RET.
* @param var the operand of the instruction to be visited. This operand is
* the index of a local variable.
*/
public void visitVarInsn(int opcode, int var) {
ps.println(OpInfo.ops[opcode].toString() + " " + var);
/**
* Visits a local variable instruction. A local variable instruction is an instruction that
* loads or stores the value of a local variable.
*
* @param opcode the opcode of the local variable instruction to be visited. This opcode is
* either ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or
* RET.
* @param var the operand of the instruction to be visited. This operand is the index of a local
* variable.
*/
public void visitVarInsn(int opcode, int var) {
ps.println(OpInfo.ops[opcode].toString() + " " + var);
}
}
/**
* Visits a type instruction. A type instruction is an instruction that takes
* the internal name of a class as parameter.
*
* @param opcode the opcode of the type instruction to be visited. This opcode
* is either NEW, ANEWARRAY, CHECKCAST or INSTANCEOF.
* @param type the operand of the instruction to be visited. This operand must
* be the internal name of an object or array class (see
* {@link Type#getInternalName() getInternalName}).
*/
public void visitTypeInsn(int opcode, String type) {
ps.println(OpInfo.ops[opcode].toString() + " " + type);
/**
* Visits a type instruction. A type instruction is an instruction that takes the internal name
* of a class as parameter.
*
* @param opcode the opcode of the type instruction to be visited. This opcode is either NEW,
* ANEWARRAY, CHECKCAST or INSTANCEOF.
* @param type the operand of the instruction to be visited. This operand must be the internal
* name of an object or array class (see {@link Type#getInternalName() getInternalName}).
*/
public void visitTypeInsn(int opcode, String type) {
ps.println(OpInfo.ops[opcode].toString() + " " + type);
}
}
/**
* Visits a field instruction. A field instruction is an instruction that loads
* or stores the value of a field of an object.
*
* @param opcode the opcode of the type instruction to be visited. This opcode
* is either GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
* @param owner the internal name of the field's owner class (see
* {@link Type#getInternalName() getInternalName}).
* @param name the field's name.
* @param desc the field's descriptor (see {@link Type Type}).
*/
public void visitFieldInsn(int opcode, String owner, String name, String desc) {
ps.println(OpInfo.ops[opcode].toString() + " " + owner + " " + name + " " + desc);
/**
* Visits a field instruction. A field instruction is an instruction that loads or stores the
* value of a field of an object.
*
* @param opcode the opcode of the type instruction to be visited. This opcode is either
* GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
* @param owner the internal name of the field's owner class (see {@link Type#getInternalName()
* getInternalName}).
* @param name the field's name.
* @param desc the field's descriptor (see {@link Type Type}).
*/
public void visitFieldInsn(int opcode, String owner, String name, String desc) {
ps.println(OpInfo.ops[opcode].toString() + " " + owner + " " + name + " " + desc);
}
}
/**
* Visits a method instruction. A method instruction is an instruction that
* invokes a method.
*
* @param opcode the opcode of the type instruction to be visited. This opcode
* is either INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or
* INVOKEINTERFACE.
* @param owner the internal name of the method's owner class (see
* {@link Type#getInternalName() getInternalName}).
* @param name the method's name.
* @param desc the method's descriptor (see {@link Type Type}).
*/
public void visitMethodInsn(int opcode, String owner, String name, String desc) {
ps.println(OpInfo.ops[opcode].toString() + " " + owner + " " + name + " " + desc);
/**
* Visits a method instruction. A method instruction is an instruction that invokes a method.
*
* @param opcode the opcode of the type instruction to be visited. This opcode is either
* INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or INVOKEINTERFACE.
* @param owner the internal name of the method's owner class (see {@link Type#getInternalName()
* getInternalName}).
* @param name the method's name.
* @param desc the method's descriptor (see {@link Type Type}).
*/
public void visitMethodInsn(int opcode, String owner, String name, String desc) {
ps.println(OpInfo.ops[opcode].toString() + " " + owner + " " + name + " " + desc);
}
}
/**
* Visits an invokedynamic instruction.
*
* @param name the method's name.
* @param desc the method's descriptor (see {@link Type Type}).
* @param bsm the bootstrap method.
* @param bsmArgs the bootstrap method constant arguments. Each argument must be
* an {@link Integer}, {@link Float}, {@link Long},
* {@link Double}, {@link String}, {@link Type} or {@link Handle}
* value. This method is allowed to modify the content of the
* array so a caller should expect that this array may change.
*/
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
ps.println(OpInfo.INVOKEDYNAMIC.toString() + " " + name + " " + desc + " HANDLE:" + bsm.toString() + " "
+ objs2Str(bsmArgs));
/**
* Visits an invokedynamic instruction.
*
* @param name the method's name.
* @param desc the method's descriptor (see {@link Type Type}).
* @param bsm the bootstrap method.
* @param bsmArgs the bootstrap method constant arguments. Each argument must be an
* {@link Integer}, {@link Float}, {@link Long}, {@link Double}, {@link String},
* {@link Type} or {@link Handle} value. This method is allowed to modify the content of
* the array so a caller should expect that this array may change.
*/
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
ps.println(OpInfo.INVOKEDYNAMIC.toString() + " " + name + " " + desc + " HANDLE:"
+ bsm.toString() + " " + objs2Str(bsmArgs));
}
}
private String objs2Str(Object[] bsmArgs) {
StringBuilder sb = new StringBuilder();
for (Object obj : bsmArgs)
sb.append(obj.toString()).append(" ");
return sb.toString();
}
private String objs2Str(Object[] bsmArgs) {
StringBuilder sb = new StringBuilder();
for (Object obj : bsmArgs)
sb.append(obj.toString()).append(" ");
return sb.toString();
}
/**
* Visits a jump instruction. A jump instruction is an instruction that may jump
* to another instruction.
*
* @param opcode the opcode of the type instruction to be visited. This opcode
* is either IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ,
* IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE,
* IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
* @param label the operand of the instruction to be visited. This operand is a
* label that designates the instruction to which the jump
* instruction may jump.
*/
public void visitJumpInsn(int opcode, Label label) {
ps.println(OpInfo.ops[opcode].toString() + getLabelStr(label));
/**
* Visits a jump instruction. A jump instruction is an instruction that may jump to another
* instruction.
*
* @param opcode the opcode of the type instruction to be visited. This opcode is either IFEQ,
* IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT,
* IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
* @param label the operand of the instruction to be visited. This operand is a label that
* designates the instruction to which the jump instruction may jump.
*/
public void visitJumpInsn(int opcode, Label label) {
ps.println(OpInfo.ops[opcode].toString() + getLabelStr(label));
}
}
/**
* Visits a label. A label designates the instruction that will be visited just
* after it.
*
* @param label a {@link Label Label} object.
*/
private String getLabelStr(Label label) {
return "L" + labelOrder.get(label);
}
/**
* Visits a label. A label designates the instruction that will be visited just after it.
*
* @param label a {@link Label Label} object.
*/
private String getLabelStr(Label label) {
return "L" + labelOrder.get(label);
}
public void visitLabel(Label label) {
ps.println("=" + getLabelStr(label) + "=");
public void visitLabel(Label label) {
ps.println("=" + getLabelStr(label) + "=");
}
}
// -------------------------------------------------------------------------
// Special instructions
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
// Special instructions
// -------------------------------------------------------------------------
/**
* Visits a LDC instruction. Note that new constant types may be added in future
* versions of the Java Virtual Machine. To easily detect new constant types,
* implementations of this method should check for unexpected constant types,
* like this:
*
* <pre>
* if (cst instanceof Integer) {
* // ...
* } else if (cst instanceof Float) {
* // ...
* } else if (cst instanceof Long) {
* // ...
* } else if (cst instanceof Double) {
* // ...
* } else if (cst instanceof String) {
* // ...
* } else if (cst instanceof Type) {
* int sort = ((Type) cst).getSort();
* if (sort == Type.OBJECT) {
* // ...
* } else if (sort == Type.ARRAY) {
* // ...
* } else if (sort == Type.METHOD) {
* // ...
* } else {
* // throw an exception
* }
* } else if (cst instanceof Handle) {
* // ...
* } else {
* // throw an exception
* }
* </pre>
*
* @param cst the constant to be loaded on the stack. This parameter must be a
* non null {@link Integer}, a {@link Float}, a {@link Long}, a
* {@link Double}, a {@link String}, a {@link Type} of OBJECT or
* ARRAY sort for <tt>.class</tt> constants, for classes whose
* version is 49.0, a {@link Type} of METHOD sort or a {@link Handle}
* for MethodType and MethodHandle constants, for classes whose
* version is 51.0.
*/
public void visitLdcInsn(Object cst) {
ps.println("ldc " + cst);
}
/**
* Visits a LDC instruction. Note that new constant types may be added in future versions of the
* Java Virtual Machine. To easily detect new constant types, implementations of this method
* should check for unexpected constant types, like this:
*
* <pre>
* if (cst instanceof Integer) {
* // ...
* } else if (cst instanceof Float) {
* // ...
* } else if (cst instanceof Long) {
* // ...
* } else if (cst instanceof Double) {
* // ...
* } else if (cst instanceof String) {
* // ...
* } else if (cst instanceof Type) {
* int sort = ((Type) cst).getSort();
* if (sort == Type.OBJECT) {
* // ...
* } else if (sort == Type.ARRAY) {
* // ...
* } else if (sort == Type.METHOD) {
* // ...
* } else {
* // throw an exception
* }
* } else if (cst instanceof Handle) {
* // ...
* } else {
* // throw an exception
* }
* </pre>
*
* @param cst the constant to be loaded on the stack. This parameter must be a non null
* {@link Integer}, a {@link Float}, a {@link Long}, a {@link Double}, a {@link String},
* a {@link Type} of OBJECT or ARRAY sort for <tt>.class</tt> constants, for classes
* whose version is 49.0, a {@link Type} of METHOD sort or a {@link Handle} for
* MethodType and MethodHandle constants, for classes whose version is 51.0.
*/
public void visitLdcInsn(Object cst) {
ps.println("ldc " + cst);
}
/**
* Visits an IINC instruction.
*
* @param var index of the local variable to be incremented.
* @param increment amount to increment the local variable by.
*/
public void visitIincInsn(int var, int increment) {
ps.println("iinc " + var + " " + increment);
}
/**
* Visits an IINC instruction.
*
* @param var index of the local variable to be incremented.
* @param increment amount to increment the local variable by.
*/
public void visitIincInsn(int var, int increment) {
ps.println("iinc " + var + " " + increment);
}
/**
* Visits a TABLESWITCH instruction.
*
* @param min the minimum key value.
* @param max the maximum key value.
* @param dflt beginning of the default handler block.
* @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the
* beginning of the handler block for the <tt>min + i</tt> key.
*/
public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) {
ps.println(OpInfo.TABLESWITCH.toString() + " labels:" + getLabelStr(dflt) + " " + convertLabels(labels));
/**
* Visits a TABLESWITCH instruction.
*
* @param min the minimum key value.
* @param max the maximum key value.
* @param dflt beginning of the default handler block.
* @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the beginning of the
* handler block for the <tt>min + i</tt> key.
*/
public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) {
ps.println(OpInfo.TABLESWITCH.toString() + " labels:" + getLabelStr(dflt) + " "
+ convertLabels(labels));
}
}
private String convertLabels(Label[] labels) {
StringBuilder sb = new StringBuilder();
for (Label l : labels)
sb.append(getLabelStr(l)).append(" ");
return sb.toString();
}
private String convertLabels(Label[] labels) {
StringBuilder sb = new StringBuilder();
for (Label l : labels)
sb.append(getLabelStr(l)).append(" ");
return sb.toString();
}
/**
* Visits a LOOKUPSWITCH instruction.
*
* @param dflt beginning of the default handler block.
* @param keys the values of the keys.
* @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the
* beginning of the handler block for the <tt>keys[i]</tt> key.
*/
public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
ps.println(OpInfo.LOOKUPSWITCH.toString() + " labels:" + getLabelStr(dflt) + " " + convertLabels(labels));
/**
* Visits a LOOKUPSWITCH instruction.
*
* @param dflt beginning of the default handler block.
* @param keys the values of the keys.
* @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the beginning of the
* handler block for the <tt>keys[i]</tt> key.
*/
public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
ps.println(OpInfo.LOOKUPSWITCH.toString() + " labels:" + getLabelStr(dflt) + " "
+ convertLabels(labels));
}
}
/**
* Visits a MULTIANEWARRAY instruction.
*
* @param desc an array type descriptor (see {@link Type Type}).
* @param dims number of dimensions of the array to allocate.
*/
public void visitMultiANewArrayInsn(String desc, int dims) {
ps.println(OpInfo.MULTIANEWARRAY + " " + desc + " " + dims);
}
/**
* Visits a MULTIANEWARRAY instruction.
*
* @param desc an array type descriptor (see {@link Type Type}).
* @param dims number of dimensions of the array to allocate.
*/
public void visitMultiANewArrayInsn(String desc, int dims) {
ps.println(OpInfo.MULTIANEWARRAY + " " + desc + " " + dims);
}
public void setLabelOrder(Map<Label, Integer> labelOrder) {
this.labelOrder = labelOrder;
}
public void setLabelOrder(Map<Label, Integer> labelOrder) {
this.labelOrder = labelOrder;
}
}

View File

@ -1,256 +1,257 @@
package org.bdware.analysis;
public enum OpInfo implements CFType {
NOP(0x00, "nop", kInstrCanContinue, 0), // --
ACONST_NULL(0x01, "aconst_null", kInstrCanContinue, 1), // --
ICONST_M1(0x02, "iconst_m1", kInstrCanContinue, 1), // --
ICONST_0(0x03, "iconst_0", kInstrCanContinue, 1), // --
ICONST_1(0x04, "iconst_1", kInstrCanContinue, 1), // --
ICONST_2(0x05, "iconst_2", kInstrCanContinue, 1), // --
ICONST_3(0x06, "iconst_3", kInstrCanContinue, 1), // --
ICONST_4(0x07, "iconst_4", kInstrCanContinue, 1), // --
ICONST_5(0x08, "iconst_5", kInstrCanContinue, 1), // --
LCONST_0(0x09, "lconst_0", kInstrCanContinue, 2), // --
LCONST_1(0x0a, "lconst_1", kInstrCanContinue, 2), // --
FCONST_0(0x0b, "fconst_0", kInstrCanContinue, 1), // --
FCONST_1(0x0c, "fconst_1", kInstrCanContinue, 1), // --
FCONST_2(0x0d, "fconst_2", kInstrCanContinue, 1), // --
DCONST_0(0x0e, "dconst_0", kInstrCanContinue, 2), // --
DCONST_1(0x0f, "dconst_1", kInstrCanContinue, 2), // --
BIPUSH(0x10, "bipush", kInstrCanContinue, 1), // --
SIPUSH(0x11, "sipush", kInstrCanContinue, 1), // --
LDC(0x12, "ldc", kInstrCanContinue, 1), // --
LDC_W(0x13, "ldc_w", kInstrCanContinue, 1), // --
LDC2_W(0x14, "ldc2_w", kInstrCanContinue, 2), // --
ILOAD(0x15, "iload", kInstrCanContinue, 1), // --
LLOAD(0x16, "lload", kInstrCanContinue, 2), // --
FLOAD(0x17, "fload", kInstrCanContinue, 1), // --
DLOAD(0x18, "dload", kInstrCanContinue, 2), // --
ALOAD(0x19, "aload", kInstrCanContinue, 1), // --
ILOAD_0(0x1a, "iload_0", kInstrCanContinue, 1), // --
ILOAD_1(0x1b, "iload_1", kInstrCanContinue, 1), // --
ILOAD_2(0x1c, "iload_2", kInstrCanContinue, 1), // --
ILOAD_3(0x1d, "iload_3", kInstrCanContinue, 1), // --
LLOAD_0(0x1e, "lload_0", kInstrCanContinue, 2), // --
LLOAD_1(0x1f, "lload_1", kInstrCanContinue, 2), // --
LLOAD_2(0x20, "lload_2", kInstrCanContinue, 2), // --
LLOAD_3(0x21, "lload_3", kInstrCanContinue, 2), // --
FLOAD_0(0x22, "fload_0", kInstrCanContinue, 1), // --
FLOAD_1(0x23, "fload_1", kInstrCanContinue, 1), // --
FLOAD_2(0x24, "fload_2", kInstrCanContinue, 1), // --
FLOAD_3(0x25, "fload_3", kInstrCanContinue, 1), // --
DLOAD_0(0x26, "dload_0", kInstrCanContinue, 2), // --
DLOAD_1(0x27, "dload_1", kInstrCanContinue, 2), // --
DLOAD_2(0x28, "dload_2", kInstrCanContinue, 2), // --
DLOAD_3(0x29, "dload_3", kInstrCanContinue, 2), // --
ALOAD_0(0x2a, "aload_0", kInstrCanContinue, 1), // --
ALOAD_1(0x2b, "aload_1", kInstrCanContinue, 1), // --
ALOAD_2(0x2c, "aload_2", kInstrCanContinue, 1), // --
ALOAD_3(0x2d, "aload_3", kInstrCanContinue, 1), // --
IALOAD(0x2e, "iaload", kInstrCanContinue, -1), // --
LALOAD(0x2f, "laload", kInstrCanContinue, 0), // --
FALOAD(0x30, "faload", kInstrCanContinue, -1), // --
DALOAD(0x31, "daload", kInstrCanContinue, 0), // --
AALOAD(0x32, "aaload", kInstrCanContinue, -1), // --
BALOAD(0x33, "baload", kInstrCanContinue, -1), // --
CALOAD(0x34, "caload", kInstrCanContinue, -1), // --
SALOAD(0x35, "saload", kInstrCanContinue, -1), // --
ISTORE(0x36, "istore", kInstrCanContinue, -1), // --
LSTORE(0x37, "lstore", kInstrCanContinue, -2), // --
FSTORE(0x38, "fstore", kInstrCanContinue, -1), // --
DSTORE(0x39, "dstore", kInstrCanContinue, -2), // --
ASTORE(0x3a, "astore", kInstrCanContinue, -1), // --
ISTORE_0(0x3b, "istore_0", kInstrCanContinue, -1), // --
ISTORE_1(0x3c, "istore_1", kInstrCanContinue, -1), // --
ISTORE_2(0x3d, "istore_2", kInstrCanContinue, -1), // --
ISTORE_3(0x3e, "istore_3", kInstrCanContinue, -1), // --
LSTORE_0(0x3f, "lstore_0", kInstrCanContinue, -2), // --
LSTORE_1(0x40, "lstore_1", kInstrCanContinue, -2), // --
LSTORE_2(0x41, "lstore_2", kInstrCanContinue, -2), // --
LSTORE_3(0x42, "lstore_3", kInstrCanContinue, -2), // --
FSTORE_0(0x43, "fstore_0", kInstrCanContinue, -1), // --
FSTORE_1(0x44, "fstore_1", kInstrCanContinue, -1), // --
FSTORE_2(0x45, "fstore_2", kInstrCanContinue, -1), // --
FSTORE_3(0x46, "fstore_3", kInstrCanContinue, -1), // --
DSTORE_0(0x47, "dstore_0", kInstrCanContinue, -2), // --
DSTORE_1(0x48, "dstore_1", kInstrCanContinue, -2), // --
DSTORE_2(0x49, "dstore_2", kInstrCanContinue, -2), // --
DSTORE_3(0x4a, "dstore_3", kInstrCanContinue, -2), // --
ASTORE_0(0x4b, "astore_0", kInstrCanContinue, -1), // --
ASTORE_1(0x4c, "astore_1", kInstrCanContinue, -1), // --
ASTORE_2(0x4d, "astore_2", kInstrCanContinue, -1), // --
ASTORE_3(0x4e, "astore_3", kInstrCanContinue, -1), // --
IASTORE(0x4f, "iastore", kInstrCanContinue, -3), // --
LASTORE(0x50, "lastore", kInstrCanContinue, -4), // --
FASTORE(0x51, "fastore", kInstrCanContinue, -3), // --
DASTORE(0x52, "dastore", kInstrCanContinue, -4), // --
AASTORE(0x53, "aastore", kInstrCanContinue, -3), // --
BASTORE(0x54, "bastore", kInstrCanContinue, -3), // --
CASTORE(0x55, "castore", kInstrCanContinue, -3), // --
SASTORE(0x56, "sastore", kInstrCanContinue, -3), // --
POP(0x57, "pop", kInstrCanContinue, -1), // --
POP2(0x58, "pop2", kInstrCanContinue, -2), // --
DUP(0x59, "dup", kInstrCanContinue, 1), // --
DUP_X1(0x5a, "dup_x1", kInstrCanContinue, 1), // --
DUP_X2(0x5b, "dup_x2", kInstrCanContinue, 1), // --
DUP2(0x5c, "dup2", kInstrCanContinue, 2), // --
DUP2_X1(0x5d, "dup2_x1", kInstrCanContinue, 2), // --
DUP2_X2(0x5e, "dup2_x2", kInstrCanContinue, 2), // --
SWAP(0x5f, "swap", kInstrCanContinue, 0), // --
IADD(0x60, "iadd", kInstrCanContinue, -1), // --
LADD(0x61, "ladd", kInstrCanContinue, -2), // --
FADD(0x62, "fadd", kInstrCanContinue, -1), // --
DADD(0x63, "dadd", kInstrCanContinue, -2), // --
ISUB(0x64, "isub", kInstrCanContinue, -1), // --
LSUB(0x65, "lsub", kInstrCanContinue, -2), // --
FSUB(0x66, "fsub", kInstrCanContinue, -1), // --
DSUB(0x67, "dsub", kInstrCanContinue, -2), // --
IMUL(0x68, "imul", kInstrCanContinue, -1), // --
LMUL(0x69, "lmul", kInstrCanContinue, -2), // --
FMUL(0x6a, "fmul", kInstrCanContinue, -1), // --
DMUL(0x6b, "dmul", kInstrCanContinue, -2), // --
IDIV(0x6c, "idiv", kInstrCanContinue, -1), // --
LDIV(0x6d, "ldiv", kInstrCanContinue, -2), // --
FDIV(0x6e, "fdiv", kInstrCanContinue, -1), // --
DDIV(0x6f, "ddiv", kInstrCanContinue, -2), // --
IREM(0x70, "irem", kInstrCanContinue, -1), // --
LREM(0x71, "lrem", kInstrCanContinue, -2), // --
FREM(0x72, "frem", kInstrCanContinue, -1), // --
DREM(0x73, "drem", kInstrCanContinue, -2), // --
INEG(0x74, "ineg", kInstrCanContinue, 0), // --
LNEG(0x75, "lneg", kInstrCanContinue, 0), // --
FNEG(0x76, "fneg", kInstrCanContinue, 0), // --
DNEG(0x77, "dneg", kInstrCanContinue, 0), // --
ISHL(0x78, "ishl", kInstrCanContinue, -1), // --
LSHL(0x79, "lshl", kInstrCanContinue, -1), // --
ISHR(0x7a, "ishr", kInstrCanContinue, -1), // --
LSHR(0x7b, "lshr", kInstrCanContinue, -1), // --
IUSHR(0x7c, "iushr", kInstrCanContinue, -1), // --
LUSHR(0x7d, "lushr", kInstrCanContinue, -1), // --
IAND(0x7e, "iand", kInstrCanContinue, -1), // --
LAND(0x7f, "land", kInstrCanContinue, -2), // --
IOR(0x80, "ior", kInstrCanContinue, -1), // --
LOR(0x81, "lor", kInstrCanContinue, -2), // --
IXOR(0x82, "ixor", kInstrCanContinue, -1), // --
LXOR(0x83, "lxor", kInstrCanContinue, -2), // --
IINC(0x84, "iinc", kInstrCanContinue, 0), // --
I2L(0x85, "i2l", kInstrCanContinue, 1), // --
I2F(0x86, "i2f", kInstrCanContinue, 0), // --
I2D(0x87, "i2d", kInstrCanContinue, 1), // --
L2I(0x88, "l2i", kInstrCanContinue, -1), // --
L2F(0x89, "l2f", kInstrCanContinue, -1), // --
L2D(0x8a, "l2d", kInstrCanContinue, 0), // --
F2I(0x8b, "f2i", kInstrCanContinue, 0), // --
F2L(0x8c, "f2l", kInstrCanContinue, 1), // --
F2D(0x8d, "f2d", kInstrCanContinue, 1), // --
D2I(0x8e, "d2i", kInstrCanContinue, -1), // --
D2L(0x8f, "d2l", kInstrCanContinue, 0), // --
D2F(0x90, "d2f", kInstrCanContinue, -1), // --
I2B(0x91, "i2b", kInstrCanContinue, 0), // --
I2C(0x92, "i2c", kInstrCanContinue, 0), // --
I2S(0x93, "i2s", kInstrCanContinue, 0), // --
LCMP(0x94, "lcmp", kInstrCanContinue, -2), // --
FCMPL(0x95, "fcmpl", kInstrCanContinue, -1), // --
FCMPG(0x96, "fcmpg", kInstrCanContinue, -1), // --
DCMPL(0x97, "dcmpl", kInstrCanContinue, -3), // --
DCMPG(0x98, "dcmpg", kInstrCanContinue, -3), // --
IFEQ(0x99, "ifeq", kInstrCanBranch, -1), // --
IFNE(0x9a, "ifne", kInstrCanBranch, -1), // --
IFLT(0x9b, "iflt", kInstrCanBranch, -1), // --
IFGE(0x9c, "ifge", kInstrCanBranch, -1), // --
IFGT(0x9d, "ifgt", kInstrCanBranch, -1), // --
IFLE(0x9e, "ifle", kInstrCanBranch, -1), // --
IF_ICMPEQ(0x9f, "if_icmpeq", kInstrCanBranch, -2), // --
IF_ICMPNE(0xa0, "if_icmpne", kInstrCanBranch, -2), // --
IF_ICMPLT(0xa1, "if_icmplt", kInstrCanBranch, -2), // --
IF_ICMPGE(0xa2, "if_icmpge", kInstrCanBranch, -2), // --
IF_ICMPGT(0xa3, "if_icmpgt", kInstrCanBranch, -2), // --
IF_ICMPLE(0xa4, "if_icmple", kInstrCanBranch, -2), // --
IF_ACMPEQ(0xa5, "if_acmpeq", kInstrCanBranch, -2), // --
IF_ACMPNE(0xa6, "if_acmpne", kInstrCanBranch, -2), // --
GOTO(0xa7, "goto", kInstrCanBranch, 0), // --
JSR(0xa8, "jsr", kInstrCanContinue, 1), // ??--
RET(0xa9, "ret", kInstrCanContinue, -1), // ??--
TABLESWITCH(0xaa, "tableswitch", kInstrCanBranch, 1), // --
LOOKUPSWITCH(0xab, "lookupswitch", kInstrCanBranch, 0), // --
IRETURN(0xac, "ireturn", kInstrCanReturn, -1), // --
LRETURN(0xad, "lreturn", kInstrCanReturn, -2), // --
FRETURN(0xae, "freturn", kInstrCanReturn, -1), // --
DRETURN(0xaf, "dreturn", kInstrCanReturn, -2), // --
ARETURN(0xb0, "areturn", kInstrCanReturn, -1), // --
RETURN(0xb1, "return", kInstrCanReturn, 0), // --
GETSTATIC(0xb2, "getstatic", kInstrCanContinue, 0), // dynamic changing+ --
PUTSTATIC(0xb3, "putstatic", kInstrCanContinue, 0), // dynamic changing- --
GETFIELD(0xb4, "getfield", kInstrCanContinue, 0), // dynamic changing_+ --
PUTFIELD(0xb5, "putfield", kInstrCanContinue, 0), // dynamic changing-- --
INVOKEVIRTUAL(0xb6, "invokevirtual", kInstrInvoke | kInstrCanThrow, 0), // dynamic changing-- --
INVOKESPECIAL(0xb7, "invokespecial", kInstrInvoke | kInstrCanThrow, 0), // dynamic changing-- --
INVOKESTATIC(0xb8, "invokestatic", kInstrInvoke | kInstrCanThrow, 0), // dynamic changing-- --
INVOKEINTERFACE(0xb9, "invokeinterface", kInstrInvoke | kInstrCanThrow, 0), // dynamic changing-- --
INVOKEDYNAMIC(0xba, "invokedynamic", kInstrInvoke | kInstrCanThrow, 0), // dynamic changing-- --
NEW(0xbb, "new", kInstrCanContinue, 1), // --
NEWARRAY(0xbc, "newarray", kInstrCanContinue, 0), // --
ANEWARRAY(0xbd, "anewarray", kInstrCanContinue, 0), // --
ARRAYLENGTH(0xbe, "arraylength", kInstrCanContinue, 0), // --
ATHROW(0xbf, "athrow", kInstrCanReturn, 0), // --
CHECKCAST(0xc0, "checkcast", kInstrCanContinue, 0), // --
INSTANCEOF(0xc1, "instanceof", kInstrCanContinue, 0), // --
MONITORENTER(0xc2, "monitorenter", kInstrCanContinue, -1), // --
MONITOREXIT(0xc3, "monitorexit", kInstrCanContinue, -1), // --
WIDE(0xc4, "wide", kInstrCanContinue, 0), // --
MULTIANEWARRAY(0xc5, "multianewarray", kInstrCanContinue, 0), // dynamic changing--
IFNULL(0xc6, "ifnull", kInstrCanBranch, -1), // --
IFNONNULL(0xc7, "ifnonnull", kInstrCanBranch, -1), // --
GOTO_W(0xc8, "goto_w", kInstrCanBranch, 0), // --
JSR_W(0xc9, "jsr_w", kInstrCanContinue, 1);// ??--
public final static OpInfo ops[] = new OpInfo[256];
NOP(0x00, "nop", kInstrCanContinue, 0), // --
ACONST_NULL(0x01, "aconst_null", kInstrCanContinue, 1), // --
ICONST_M1(0x02, "iconst_m1", kInstrCanContinue, 1), // --
ICONST_0(0x03, "iconst_0", kInstrCanContinue, 1), // --
ICONST_1(0x04, "iconst_1", kInstrCanContinue, 1), // --
ICONST_2(0x05, "iconst_2", kInstrCanContinue, 1), // --
ICONST_3(0x06, "iconst_3", kInstrCanContinue, 1), // --
ICONST_4(0x07, "iconst_4", kInstrCanContinue, 1), // --
ICONST_5(0x08, "iconst_5", kInstrCanContinue, 1), // --
LCONST_0(0x09, "lconst_0", kInstrCanContinue, 2), // --
LCONST_1(0x0a, "lconst_1", kInstrCanContinue, 2), // --
FCONST_0(0x0b, "fconst_0", kInstrCanContinue, 1), // --
FCONST_1(0x0c, "fconst_1", kInstrCanContinue, 1), // --
FCONST_2(0x0d, "fconst_2", kInstrCanContinue, 1), // --
DCONST_0(0x0e, "dconst_0", kInstrCanContinue, 2), // --
DCONST_1(0x0f, "dconst_1", kInstrCanContinue, 2), // --
BIPUSH(0x10, "bipush", kInstrCanContinue, 1), // --
SIPUSH(0x11, "sipush", kInstrCanContinue, 1), // --
LDC(0x12, "ldc", kInstrCanContinue, 1), // --
LDC_W(0x13, "ldc_w", kInstrCanContinue, 1), // --
LDC2_W(0x14, "ldc2_w", kInstrCanContinue, 2), // --
ILOAD(0x15, "iload", kInstrCanContinue, 1), // --
LLOAD(0x16, "lload", kInstrCanContinue, 2), // --
FLOAD(0x17, "fload", kInstrCanContinue, 1), // --
DLOAD(0x18, "dload", kInstrCanContinue, 2), // --
ALOAD(0x19, "aload", kInstrCanContinue, 1), // --
ILOAD_0(0x1a, "iload_0", kInstrCanContinue, 1), // --
ILOAD_1(0x1b, "iload_1", kInstrCanContinue, 1), // --
ILOAD_2(0x1c, "iload_2", kInstrCanContinue, 1), // --
ILOAD_3(0x1d, "iload_3", kInstrCanContinue, 1), // --
LLOAD_0(0x1e, "lload_0", kInstrCanContinue, 2), // --
LLOAD_1(0x1f, "lload_1", kInstrCanContinue, 2), // --
LLOAD_2(0x20, "lload_2", kInstrCanContinue, 2), // --
LLOAD_3(0x21, "lload_3", kInstrCanContinue, 2), // --
FLOAD_0(0x22, "fload_0", kInstrCanContinue, 1), // --
FLOAD_1(0x23, "fload_1", kInstrCanContinue, 1), // --
FLOAD_2(0x24, "fload_2", kInstrCanContinue, 1), // --
FLOAD_3(0x25, "fload_3", kInstrCanContinue, 1), // --
DLOAD_0(0x26, "dload_0", kInstrCanContinue, 2), // --
DLOAD_1(0x27, "dload_1", kInstrCanContinue, 2), // --
DLOAD_2(0x28, "dload_2", kInstrCanContinue, 2), // --
DLOAD_3(0x29, "dload_3", kInstrCanContinue, 2), // --
ALOAD_0(0x2a, "aload_0", kInstrCanContinue, 1), // --
ALOAD_1(0x2b, "aload_1", kInstrCanContinue, 1), // --
ALOAD_2(0x2c, "aload_2", kInstrCanContinue, 1), // --
ALOAD_3(0x2d, "aload_3", kInstrCanContinue, 1), // --
IALOAD(0x2e, "iaload", kInstrCanContinue, -1), // --
LALOAD(0x2f, "laload", kInstrCanContinue, 0), // --
FALOAD(0x30, "faload", kInstrCanContinue, -1), // --
DALOAD(0x31, "daload", kInstrCanContinue, 0), // --
AALOAD(0x32, "aaload", kInstrCanContinue, -1), // --
BALOAD(0x33, "baload", kInstrCanContinue, -1), // --
CALOAD(0x34, "caload", kInstrCanContinue, -1), // --
SALOAD(0x35, "saload", kInstrCanContinue, -1), // --
ISTORE(0x36, "istore", kInstrCanContinue, -1), // --
LSTORE(0x37, "lstore", kInstrCanContinue, -2), // --
FSTORE(0x38, "fstore", kInstrCanContinue, -1), // --
DSTORE(0x39, "dstore", kInstrCanContinue, -2), // --
ASTORE(0x3a, "astore", kInstrCanContinue, -1), // --
ISTORE_0(0x3b, "istore_0", kInstrCanContinue, -1), // --
ISTORE_1(0x3c, "istore_1", kInstrCanContinue, -1), // --
ISTORE_2(0x3d, "istore_2", kInstrCanContinue, -1), // --
ISTORE_3(0x3e, "istore_3", kInstrCanContinue, -1), // --
LSTORE_0(0x3f, "lstore_0", kInstrCanContinue, -2), // --
LSTORE_1(0x40, "lstore_1", kInstrCanContinue, -2), // --
LSTORE_2(0x41, "lstore_2", kInstrCanContinue, -2), // --
LSTORE_3(0x42, "lstore_3", kInstrCanContinue, -2), // --
FSTORE_0(0x43, "fstore_0", kInstrCanContinue, -1), // --
FSTORE_1(0x44, "fstore_1", kInstrCanContinue, -1), // --
FSTORE_2(0x45, "fstore_2", kInstrCanContinue, -1), // --
FSTORE_3(0x46, "fstore_3", kInstrCanContinue, -1), // --
DSTORE_0(0x47, "dstore_0", kInstrCanContinue, -2), // --
DSTORE_1(0x48, "dstore_1", kInstrCanContinue, -2), // --
DSTORE_2(0x49, "dstore_2", kInstrCanContinue, -2), // --
DSTORE_3(0x4a, "dstore_3", kInstrCanContinue, -2), // --
ASTORE_0(0x4b, "astore_0", kInstrCanContinue, -1), // --
ASTORE_1(0x4c, "astore_1", kInstrCanContinue, -1), // --
ASTORE_2(0x4d, "astore_2", kInstrCanContinue, -1), // --
ASTORE_3(0x4e, "astore_3", kInstrCanContinue, -1), // --
IASTORE(0x4f, "iastore", kInstrCanContinue, -3), // --
LASTORE(0x50, "lastore", kInstrCanContinue, -4), // --
FASTORE(0x51, "fastore", kInstrCanContinue, -3), // --
DASTORE(0x52, "dastore", kInstrCanContinue, -4), // --
AASTORE(0x53, "aastore", kInstrCanContinue, -3), // --
BASTORE(0x54, "bastore", kInstrCanContinue, -3), // --
CASTORE(0x55, "castore", kInstrCanContinue, -3), // --
SASTORE(0x56, "sastore", kInstrCanContinue, -3), // --
POP(0x57, "pop", kInstrCanContinue, -1), // --
POP2(0x58, "pop2", kInstrCanContinue, -2), // --
DUP(0x59, "dup", kInstrCanContinue, 1), // --
DUP_X1(0x5a, "dup_x1", kInstrCanContinue, 1), // --
DUP_X2(0x5b, "dup_x2", kInstrCanContinue, 1), // --
DUP2(0x5c, "dup2", kInstrCanContinue, 2), // --
DUP2_X1(0x5d, "dup2_x1", kInstrCanContinue, 2), // --
DUP2_X2(0x5e, "dup2_x2", kInstrCanContinue, 2), // --
SWAP(0x5f, "swap", kInstrCanContinue, 0), // --
IADD(0x60, "iadd", kInstrCanContinue, -1), // --
LADD(0x61, "ladd", kInstrCanContinue, -2), // --
FADD(0x62, "fadd", kInstrCanContinue, -1), // --
DADD(0x63, "dadd", kInstrCanContinue, -2), // --
ISUB(0x64, "isub", kInstrCanContinue, -1), // --
LSUB(0x65, "lsub", kInstrCanContinue, -2), // --
FSUB(0x66, "fsub", kInstrCanContinue, -1), // --
DSUB(0x67, "dsub", kInstrCanContinue, -2), // --
IMUL(0x68, "imul", kInstrCanContinue, -1), // --
LMUL(0x69, "lmul", kInstrCanContinue, -2), // --
FMUL(0x6a, "fmul", kInstrCanContinue, -1), // --
DMUL(0x6b, "dmul", kInstrCanContinue, -2), // --
IDIV(0x6c, "idiv", kInstrCanContinue, -1), // --
LDIV(0x6d, "ldiv", kInstrCanContinue, -2), // --
FDIV(0x6e, "fdiv", kInstrCanContinue, -1), // --
DDIV(0x6f, "ddiv", kInstrCanContinue, -2), // --
IREM(0x70, "irem", kInstrCanContinue, -1), // --
LREM(0x71, "lrem", kInstrCanContinue, -2), // --
FREM(0x72, "frem", kInstrCanContinue, -1), // --
DREM(0x73, "drem", kInstrCanContinue, -2), // --
INEG(0x74, "ineg", kInstrCanContinue, 0), // --
LNEG(0x75, "lneg", kInstrCanContinue, 0), // --
FNEG(0x76, "fneg", kInstrCanContinue, 0), // --
DNEG(0x77, "dneg", kInstrCanContinue, 0), // --
ISHL(0x78, "ishl", kInstrCanContinue, -1), // --
LSHL(0x79, "lshl", kInstrCanContinue, -1), // --
ISHR(0x7a, "ishr", kInstrCanContinue, -1), // --
LSHR(0x7b, "lshr", kInstrCanContinue, -1), // --
IUSHR(0x7c, "iushr", kInstrCanContinue, -1), // --
LUSHR(0x7d, "lushr", kInstrCanContinue, -1), // --
IAND(0x7e, "iand", kInstrCanContinue, -1), // --
LAND(0x7f, "land", kInstrCanContinue, -2), // --
IOR(0x80, "ior", kInstrCanContinue, -1), // --
LOR(0x81, "lor", kInstrCanContinue, -2), // --
IXOR(0x82, "ixor", kInstrCanContinue, -1), // --
LXOR(0x83, "lxor", kInstrCanContinue, -2), // --
IINC(0x84, "iinc", kInstrCanContinue, 0), // --
I2L(0x85, "i2l", kInstrCanContinue, 1), // --
I2F(0x86, "i2f", kInstrCanContinue, 0), // --
I2D(0x87, "i2d", kInstrCanContinue, 1), // --
L2I(0x88, "l2i", kInstrCanContinue, -1), // --
L2F(0x89, "l2f", kInstrCanContinue, -1), // --
L2D(0x8a, "l2d", kInstrCanContinue, 0), // --
F2I(0x8b, "f2i", kInstrCanContinue, 0), // --
F2L(0x8c, "f2l", kInstrCanContinue, 1), // --
F2D(0x8d, "f2d", kInstrCanContinue, 1), // --
D2I(0x8e, "d2i", kInstrCanContinue, -1), // --
D2L(0x8f, "d2l", kInstrCanContinue, 0), // --
D2F(0x90, "d2f", kInstrCanContinue, -1), // --
I2B(0x91, "i2b", kInstrCanContinue, 0), // --
I2C(0x92, "i2c", kInstrCanContinue, 0), // --
I2S(0x93, "i2s", kInstrCanContinue, 0), // --
LCMP(0x94, "lcmp", kInstrCanContinue, -2), // --
FCMPL(0x95, "fcmpl", kInstrCanContinue, -1), // --
FCMPG(0x96, "fcmpg", kInstrCanContinue, -1), // --
DCMPL(0x97, "dcmpl", kInstrCanContinue, -3), // --
DCMPG(0x98, "dcmpg", kInstrCanContinue, -3), // --
IFEQ(0x99, "ifeq", kInstrCanBranch, -1), // --
IFNE(0x9a, "ifne", kInstrCanBranch, -1), // --
IFLT(0x9b, "iflt", kInstrCanBranch, -1), // --
IFGE(0x9c, "ifge", kInstrCanBranch, -1), // --
IFGT(0x9d, "ifgt", kInstrCanBranch, -1), // --
IFLE(0x9e, "ifle", kInstrCanBranch, -1), // --
IF_ICMPEQ(0x9f, "if_icmpeq", kInstrCanBranch, -2), // --
IF_ICMPNE(0xa0, "if_icmpne", kInstrCanBranch, -2), // --
IF_ICMPLT(0xa1, "if_icmplt", kInstrCanBranch, -2), // --
IF_ICMPGE(0xa2, "if_icmpge", kInstrCanBranch, -2), // --
IF_ICMPGT(0xa3, "if_icmpgt", kInstrCanBranch, -2), // --
IF_ICMPLE(0xa4, "if_icmple", kInstrCanBranch, -2), // --
IF_ACMPEQ(0xa5, "if_acmpeq", kInstrCanBranch, -2), // --
IF_ACMPNE(0xa6, "if_acmpne", kInstrCanBranch, -2), // --
GOTO(0xa7, "goto", kInstrCanBranch, 0), // --
JSR(0xa8, "jsr", kInstrCanContinue, 1), // ??--
RET(0xa9, "ret", kInstrCanContinue, -1), // ??--
TABLESWITCH(0xaa, "tableswitch", kInstrCanBranch, 1), // --
LOOKUPSWITCH(0xab, "lookupswitch", kInstrCanBranch, 0), // --
IRETURN(0xac, "ireturn", kInstrCanReturn, -1), // --
LRETURN(0xad, "lreturn", kInstrCanReturn, -2), // --
FRETURN(0xae, "freturn", kInstrCanReturn, -1), // --
DRETURN(0xaf, "dreturn", kInstrCanReturn, -2), // --
ARETURN(0xb0, "areturn", kInstrCanReturn, -1), // --
RETURN(0xb1, "return", kInstrCanReturn, 0), // --
GETSTATIC(0xb2, "getstatic", kInstrCanContinue, 0), // dynamic changing+ --
PUTSTATIC(0xb3, "putstatic", kInstrCanContinue, 0), // dynamic changing- --
GETFIELD(0xb4, "getfield", kInstrCanContinue, 0), // dynamic changing_+ --
PUTFIELD(0xb5, "putfield", kInstrCanContinue, 0), // dynamic changing-- --
INVOKEVIRTUAL(0xb6, "invokevirtual", kInstrInvoke | kInstrCanThrow, 0), // dynamic changing-- --
INVOKESPECIAL(0xb7, "invokespecial", kInstrInvoke | kInstrCanThrow, 0), // dynamic changing-- --
INVOKESTATIC(0xb8, "invokestatic", kInstrInvoke | kInstrCanThrow, 0), // dynamic changing-- --
INVOKEINTERFACE(0xb9, "invokeinterface", kInstrInvoke | kInstrCanThrow, 0), // dynamic
// changing-- --
INVOKEDYNAMIC(0xba, "invokedynamic", kInstrInvoke | kInstrCanThrow, 0), // dynamic changing-- --
NEW(0xbb, "new", kInstrCanContinue, 1), // --
NEWARRAY(0xbc, "newarray", kInstrCanContinue, 0), // --
ANEWARRAY(0xbd, "anewarray", kInstrCanContinue, 0), // --
ARRAYLENGTH(0xbe, "arraylength", kInstrCanContinue, 0), // --
ATHROW(0xbf, "athrow", kInstrCanReturn, 0), // --
CHECKCAST(0xc0, "checkcast", kInstrCanContinue, 0), // --
INSTANCEOF(0xc1, "instanceof", kInstrCanContinue, 0), // --
MONITORENTER(0xc2, "monitorenter", kInstrCanContinue, -1), // --
MONITOREXIT(0xc3, "monitorexit", kInstrCanContinue, -1), // --
WIDE(0xc4, "wide", kInstrCanContinue, 0), // --
MULTIANEWARRAY(0xc5, "multianewarray", kInstrCanContinue, 0), // dynamic changing--
IFNULL(0xc6, "ifnull", kInstrCanBranch, -1), // --
IFNONNULL(0xc7, "ifnonnull", kInstrCanBranch, -1), // --
GOTO_W(0xc8, "goto_w", kInstrCanBranch, 0), // --
JSR_W(0xc9, "jsr_w", kInstrCanContinue, 1);// ??--
static {
OpInfo[] ops = OpInfo.ops;
for (OpInfo op : OpInfo.values()) {
if (op.opcode >= 0) {
ops[op.opcode] = op;
}
}
}
public boolean changeFrame;
int changeStack;
private int flags;
private String displayName;
private int opcode;
public final static OpInfo ops[] = new OpInfo[256];
OpInfo() {
}
static {
OpInfo[] ops = OpInfo.ops;
for (OpInfo op : OpInfo.values()) {
if (op.opcode >= 0) {
ops[op.opcode] = op;
}
}
}
public boolean changeFrame;
int changeStack;
private int flags;
private String displayName;
private int opcode;
OpInfo(int opcode, String displayName, int branchType, int changStack) {
flags = branchType;
this.displayName = displayName;
this.opcode = opcode;
this.changeStack = changeStack;
}
OpInfo() {}
public boolean canBranch() {
return 0 != (flags & kInstrCanBranch);
}
OpInfo(int opcode, String displayName, int branchType, int changStack) {
flags = branchType;
this.displayName = displayName;
this.opcode = opcode;
this.changeStack = changeStack;
}
public boolean canContinue() {
return 0 != (flags & kInstrCanContinue);
}
public boolean canBranch() {
return 0 != (flags & kInstrCanBranch);
}
public boolean canReturn() {
return 0 != (flags & kInstrCanReturn);
}
public boolean canContinue() {
return 0 != (flags & kInstrCanContinue);
}
public boolean canSwitch() {
return 0 != (flags & kInstrCanSwitch);
}
public boolean canReturn() {
return 0 != (flags & kInstrCanReturn);
}
public boolean canThrow() {
return 0 != (flags & kInstrCanThrow);
}
public boolean canSwitch() {
return 0 != (flags & kInstrCanSwitch);
}
public String toString() {
return displayName;
}
public boolean canThrow() {
return 0 != (flags & kInstrCanThrow);
}
public String toString() {
return displayName;
}
}

View File

@ -18,7 +18,8 @@ import org.objectweb.asm.tree.MethodNode;
import java.util.*;
public class FieldSensitiveDynamicTaintAnalysis extends BreadthFirstSearch<TaintResult, TaintBB> {
private static final Logger LOGGER = LogManager.getLogger(FieldSensitiveDynamicTaintAnalysis.class);
private static final Logger LOGGER =
LogManager.getLogger(FieldSensitiveDynamicTaintAnalysis.class);
public static boolean isDebug = false;
TaintCFG cfg;
TracedFile tf;
@ -79,8 +80,8 @@ public class FieldSensitiveDynamicTaintAnalysis extends BreadthFirstSearch<Taint
// subBlock.clear();
subBlock.add(cfg.getBasicBlockAt(t.blockID + 1));
} else if (OpInfo.ops[insn.getOpcode()].canBranch()) {
// subBlock.clear();
// LOGGER.info("can branch " + t.blockID);
// subBlock.clear();
// LOGGER.info("can branch " + t.blockID);
int block = handleBranchCase(subBlock, insn, t);
subBlock.add(cfg.getBasicBlockAt(block));
} else if (OpInfo.ops[insn.getOpcode()].canSwitch()) {
@ -91,14 +92,14 @@ public class FieldSensitiveDynamicTaintAnalysis extends BreadthFirstSearch<Taint
}
}
Set<TaintBB> ret = new HashSet<>();
// StringBuilder log = new StringBuilder("nextBB:");
// StringBuilder log = new StringBuilder("nextBB:");
for (BasicBlock bb : subBlock) {
// log.append("\n\t").append(bb.blockID);
// log.append("\n\t").append(bb.blockID);
TaintBB ntbb = (TaintBB) bb;
ntbb.preResult.mergeResult(t.sucResult);
ret.add(ntbb);
}
// LOGGER.info(log.toString());
// LOGGER.info(log.toString());
return ret;
}

View File

@ -27,7 +27,8 @@ public class NaiveDynamicTaintAnalysis extends BreadthFirstSearch<TaintResult, T
String methodDesc = mn.desc;
methodDesc = methodDesc.replaceAll("\\).*$", ")");
int pos = 2;
if (methodDesc.split(";").length == 3) pos = 1;
if (methodDesc.split(";").length == 3)
pos = 1;
// TODO add inputBlock!
TaintBB b = (TaintBB) cfg.getBasicBlockAt(0);
b.preResult = new TaintResult();
@ -47,11 +48,8 @@ public class NaiveDynamicTaintAnalysis extends BreadthFirstSearch<TaintResult, T
setToAnalysis(toAnalysis);
if (isDebug) {
System.out.println("===Method:" + cfg.getMethodNode().name + cfg.getMethodNode().desc);
System.out.println(
"===Local:"
+ cfg.getMethodNode().maxLocals
+ " "
+ cfg.getMethodNode().maxStack);
System.out.println("===Local:" + cfg.getMethodNode().maxLocals + " "
+ cfg.getMethodNode().maxStack);
}
}
@ -68,7 +66,8 @@ public class NaiveDynamicTaintAnalysis extends BreadthFirstSearch<TaintResult, T
AbstractInsnNode insn = t.lastInsn();
if (insn != null) {
OpInfo info = null;
if (insn.getOpcode() >= 0) info = OpInfo.ops[insn.getOpcode()];
if (insn.getOpcode() >= 0)
info = OpInfo.ops[insn.getOpcode()];
if (info == null) {
subBlock.addAll(cfg.getSucBlocks(t));
} else if (info.canThrow()) {
@ -104,9 +103,8 @@ public class NaiveDynamicTaintAnalysis extends BreadthFirstSearch<TaintResult, T
if (functionName.contains("traceif")) {
traceIfNum = (int) invoke;
if (branchCount.get(functionGlobel).containsKey(traceIfNum)) {
branchCount
.get(functionGlobel)
.put(traceIfNum, branchCount.get(functionGlobel).get(traceIfNum) + 1);
branchCount.get(functionGlobel).put(traceIfNum,
branchCount.get(functionGlobel).get(traceIfNum) + 1);
} else {
branchCount.get(functionGlobel).put(traceIfNum, 1);
}

View File

@ -33,23 +33,23 @@ public class ProgramPoint {
System.out.println("[stringsss: ]" + strings[0]);
funcTx.insert(strings[0], "ENTER");
}
// if (string.contains("EXIT")) {
// String[] strings = string.split("_");
// strings=strings[1].split("-");
// System.out.println("[stringsss: ]" + strings[0]);
// functionMap.put(strings[1], "EXIT");
// }
// if (string.contains("EXIT")) {
// String[] strings = string.split("_");
// strings=strings[1].split("-");
// System.out.println("[stringsss: ]" + strings[0]);
// functionMap.put(strings[1], "EXIT");
// }
if (string.contains("traceMark")) {
JsonObject jo = JsonUtil.parseStringAsJsonObject(string);
if (jo.get("traceMark") != null) {
if (jo.get("lval") != null) {
transaction.insert(
jo.get("traceMark").getAsInt(), jo.get("lval").getAsInt());
transaction.insert(
jo.get("traceMark").getAsInt(), jo.get("rval").getAsInt());
transaction.insert(jo.get("traceMark").getAsInt(),
jo.get("lval").getAsInt());
transaction.insert(jo.get("traceMark").getAsInt(),
jo.get("rval").getAsInt());
} else {
transaction.insert(
jo.get("traceMark").getAsInt(), jo.get("val").getAsInt());
transaction.insert(jo.get("traceMark").getAsInt(),
jo.get("val").getAsInt());
}
}
}

View File

@ -21,16 +21,14 @@ public class FieldSensitiveTaintAnalysis extends BreadthFirstSearch<TaintResult,
this.cfg = cfg;
List<TaintBB> toAnalysis = new ArrayList<>();
/*
* NaiveTaintBB<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> boolean inList NaiveTaintResult preResult NaiveTaintResult
* sucResult
* NaiveTaintBB<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> boolean inList NaiveTaintResult preResult NaiveTaintResult sucResult
*/
TaintBB b = (TaintBB) cfg.getBasicBlockAt(0);
/*
* NaiveTaintResult<EFBFBD>еı<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Frame<TaintValue> frame TaintInterpreter interpreter
* TaintValue ret InsnPrinter printer int nLocals int nStack
* NaiveTaintResult<EFBFBD>е<EFBFBD><EFBFBD> TaintValue int size boolean isTainted
* TaintInterpreter() NaiveTaintResult currentResult Frame<EFBFBD>еı<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> V returnValue
* //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊvoid<EFBFBD><EFBFBD>Ϊnull V[] values //<EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> int locals
* NaiveTaintResult<EFBFBD>еı<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Frame<TaintValue> frame TaintInterpreter interpreter TaintValue
* ret InsnPrinter printer int nLocals int nStack NaiveTaintResult<EFBFBD>е<EFBFBD><EFBFBD> TaintValue int size
* boolean isTainted TaintInterpreter() NaiveTaintResult currentResult Frame<EFBFBD>еı<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> V
* returnValue //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊvoid<EFBFBD><EFBFBD>Ϊnull V[] values //<EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> int locals
* //<EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD> int top //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD>
*/
b.preResult = new TaintResult();
@ -40,10 +38,9 @@ public class FieldSensitiveTaintAnalysis extends BreadthFirstSearch<TaintResult,
TaintResult.interpreter.setTaintBits(cfg.taintBits);
b.preResult.frame.setLocal(arg, new TaintValue(1, cfg.taintBits.allocate("arg" + arg)));
/*
* if (NaiveTaintResult.nLocals > 2) { b.preResult.frame.setLocal(0, new
* TaintValue(1, cfg.taintBits.allocate("arg0"))); b.preResult.frame.setLocal(1,
* new TaintValue(1, cfg.taintBits.allocate("arg1")));
* b.preResult.frame.setLocal(2, new TaintValue(1,
* if (NaiveTaintResult.nLocals > 2) { b.preResult.frame.setLocal(0, new TaintValue(1,
* cfg.taintBits.allocate("arg0"))); b.preResult.frame.setLocal(1, new TaintValue(1,
* cfg.taintBits.allocate("arg1"))); b.preResult.frame.setLocal(2, new TaintValue(1,
* cfg.taintBits.allocate("arg2"))); }
*/
// .ret = TaintValue<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>size=1
@ -54,8 +51,7 @@ public class FieldSensitiveTaintAnalysis extends BreadthFirstSearch<TaintResult,
b.setInList(true);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>BreadthFirstSearch<EFBFBD><EFBFBD><EFBFBD>еĺ<EFBFBD><EFBFBD><EFBFBD>setToAnalysis<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱBreadthFirstSearch<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>toAnalysisΪ<EFBFBD><EFBFBD>ǰ<EFBFBD>Ŀ<EFBFBD><EFBFBD>б<EFBFBD>ֻ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>B0
/*
* BreadthFirstSearch<EFBFBD><EFBFBD><EFBFBD>еı<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Map<T, AnalysisResult> results; List<T>
* toAnalysis;
* BreadthFirstSearch<EFBFBD><EFBFBD><EFBFBD>еı<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Map<T, AnalysisResult> results; List<T> toAnalysis;
*/
setToAnalysis(toAnalysis);
if (isDebug) {

View File

@ -37,11 +37,8 @@ public class MultiSourceTaintAnalysis extends BreadthFirstSearch<TaintResult, Ta
setToAnalysis(toAnalysis);
if (TaintConfig.isDebug) {
System.out.println("===Method:" + cfg.getMethodNode().name + cfg.getMethodNode().desc);
System.out.println(
"===Local:"
+ cfg.getMethodNode().maxLocals
+ " "
+ cfg.getMethodNode().maxStack);
System.out.println("===Local:" + cfg.getMethodNode().maxLocals + " "
+ cfg.getMethodNode().maxStack);
}
}
@ -57,18 +54,12 @@ public class MultiSourceTaintAnalysis extends BreadthFirstSearch<TaintResult, Ta
for (BasicBlock bb : subBlock) {
TaintBB ntbb = (TaintBB) bb;
if (TaintConfig.isDebug)
System.out.println(
"[MultiSoruceTaintAnalysis] B"
+ ntbb.blockID
+ " beforeMerge:"
+ ntbb.preResult.frame2Str());
System.out.println("[MultiSoruceTaintAnalysis] B" + ntbb.blockID + " beforeMerge:"
+ ntbb.preResult.frame2Str());
ntbb.preResult.mergeResult(t.sucResult);
if (TaintConfig.isDebug)
System.out.println(
"[MultiSoruceTaintAnalysis] B"
+ ntbb.blockID
+ " afterMerge:"
+ ntbb.preResult.frame2Str());
System.out.println("[MultiSoruceTaintAnalysis] B" + ntbb.blockID + " afterMerge:"
+ ntbb.preResult.frame2Str());
ret.add(ntbb);
}
@ -95,9 +86,10 @@ public class MultiSourceTaintAnalysis extends BreadthFirstSearch<TaintResult, Ta
}
}
}
/*Step2: Traverse all the blocks, for each block, traverse all the depBlocks,
* for each depBlock, traverse all the sucBlocks,
* if all the sucBlocks are arrival from each block, then the block is dependency with the depBlock.
/*
* Step2: Traverse all the blocks, for each block, traverse all the depBlocks, for each
* depBlock, traverse all the sucBlocks, if all the sucBlocks are arrival from each block,
* then the block is dependency with the depBlock.
*/
List<BasicBlock> blocks = cfg.getBlocks();
Map<Integer, List<Integer>> map = new HashMap<>();
@ -108,9 +100,11 @@ public class MultiSourceTaintAnalysis extends BreadthFirstSearch<TaintResult, Ta
int sucSize = sucBlocks.size();
int count = 0;
for (BasicBlock sucBlock : sucBlocks) {
if (isArrival(cfg, sucBlock, bb)) count++;
if (isArrival(cfg, sucBlock, bb))
count++;
}
if (count > 0 && count != sucSize) list.add(id);
if (count > 0 && count != sucSize)
list.add(id);
}
map.put(bb.blockID, list);
}
@ -129,10 +123,8 @@ public class MultiSourceTaintAnalysis extends BreadthFirstSearch<TaintResult, Ta
}
}
/*
for(int i : entry.getValue())
System.out.print(i+ " ");
System.out.println();
*/
* for(int i : entry.getValue()) System.out.print(i+ " "); System.out.println();
*/
}
// add dependence to the last block
@ -141,7 +133,8 @@ public class MultiSourceTaintAnalysis extends BreadthFirstSearch<TaintResult, Ta
for (Map.Entry<Integer, List<Integer>> entry : returnMap.entrySet()) {
List<Integer> listID = entry.getValue();
for (Integer i : listID) {
if (!lastBlockDep.contains(i)) lastBlockDep.add(i);
if (!lastBlockDep.contains(i))
lastBlockDep.add(i);
}
}
returnMap.put(cfg.getBasicBlockSize() - 1, lastBlockDep);
@ -149,14 +142,10 @@ public class MultiSourceTaintAnalysis extends BreadthFirstSearch<TaintResult, Ta
// TODO get value from branch block
/*
List<Integer> list = returnMap.get(cfg.getBasicBlockSize()-1);
for(int i : list) {
System.out.println(i);
TaintBB tb = (TaintBB) cfg.getBasicBlockAt(i);
System.out.println("Test:");
tb.preResult.printResult();
}
*/
* List<Integer> list = returnMap.get(cfg.getBasicBlockSize()-1); for(int i : list) {
* System.out.println(i); TaintBB tb = (TaintBB) cfg.getBasicBlockAt(i);
* System.out.println("Test:"); tb.preResult.printResult(); }
*/
return returnMap;
}
@ -164,20 +153,14 @@ public class MultiSourceTaintAnalysis extends BreadthFirstSearch<TaintResult, Ta
public static boolean isArrival(TaintCFG cfg, BasicBlock suc, BasicBlock bb) {
// Test
/*
if(suc.blockID == bb.blockID)
return true;
if(suc.blockID == 7 && bb.blockID == 11)
return true;
if(suc.blockID == 9 && bb.blockID == 11)
return true;
if(suc.blockID == 7 && bb.blockID == 12)
return true;
if(suc.blockID == 9 && bb.blockID == 12)
return true;
return false;
*/
* if(suc.blockID == bb.blockID) return true; if(suc.blockID == 7 && bb.blockID == 11)
* return true; if(suc.blockID == 9 && bb.blockID == 11) return true; if(suc.blockID == 7 &&
* bb.blockID == 12) return true; if(suc.blockID == 9 && bb.blockID == 12) return true;
* return false;
*/
if (suc.blockID == bb.blockID) return true;
if (suc.blockID == bb.blockID)
return true;
DirectGraphDFS dgDFS = new DirectGraphDFS(cfg, suc);
return dgDFS.isArrival(bb);
}

View File

@ -33,11 +33,8 @@ public class NaiveTaintAnalysis extends BreadthFirstSearch<TaintResult, TaintBB>
setToAnalysis(toAnalysis);
if (TaintConfig.isDebug) {
System.out.println("===Method:" + cfg.getMethodNode().name + cfg.getMethodNode().desc);
System.out.println(
"===Local:"
+ cfg.getMethodNode().maxLocals
+ " "
+ cfg.getMethodNode().maxStack);
System.out.println("===Local:" + cfg.getMethodNode().maxLocals + " "
+ cfg.getMethodNode().maxStack);
}
}

View File

@ -6,26 +6,29 @@ import java.util.List;
import org.bdware.analysis.BasicBlock;
public abstract class BFS {
protected List<BasicBlock> toAnalysis;
public abstract Collection<BasicBlock> getSuc(BasicBlock BB);
public void analysis() {
BasicBlock current = null;
for (int i = 0; i < toAnalysis.size(); i++) {
current = toAnalysis.get(i);
//current.setInList(false);
if(current.inList()) {
Collection<BasicBlock> sucs = getSuc(current);
for (BasicBlock next : sucs) {
if (!next.inList()) {
toAnalysis.add(next);
next.setInList(true);
}
}
}
}
}
public void setToAnalysis(List<BasicBlock> l) {
toAnalysis = l;
}
protected List<BasicBlock> toAnalysis;
public abstract Collection<BasicBlock> getSuc(BasicBlock BB);
public void analysis() {
BasicBlock current = null;
for (int i = 0; i < toAnalysis.size(); i++) {
current = toAnalysis.get(i);
// current.setInList(false);
if (current.inList()) {
Collection<BasicBlock> sucs = getSuc(current);
for (BasicBlock next : sucs) {
if (!next.inList()) {
toAnalysis.add(next);
next.setInList(true);
}
}
}
}
}
public void setToAnalysis(List<BasicBlock> l) {
toAnalysis = l;
}
}

View File

@ -1 +1 @@
package org.bdware.analysis.gas;
package org.bdware.analysis.gas;

View File

@ -12,215 +12,215 @@ import org.objectweb.asm.tree.InvokeDynamicInsnNode;
import org.objectweb.asm.tree.JumpInsnNode;
public class CountProgramPoint {
public static HashMap<Integer, Map<String, Integer>> ppcount;
CFGraph actionCfg;
private String bdName;
HashMap<String, CFGraph> cfgraphMap;
String actionName;
int globalPC;
public static HashMap<Integer, Map<String, Integer>> ppcount;
CFGraph actionCfg;
private String bdName;
HashMap<String, CFGraph> cfgraphMap;
String actionName;
int globalPC;
public CountProgramPoint(HashMap<String, CFGraph> cfgMap, int startPc, int endPc, String aName,
HashMap<Integer, Map<String, Integer>> ppc) {
ppcount = ppc;
cfgraphMap = cfgMap;
actionName = aName;
typeCount(startPc, endPc);
}
public CountProgramPoint(HashMap<String, CFGraph> cfgMap, int startPc, int endPc, String aName,
HashMap<Integer, Map<String, Integer>> ppc) {
ppcount = ppc;
cfgraphMap = cfgMap;
actionName = aName;
typeCount(startPc, endPc);
}
private HashMap<Integer, Map<String, Integer>> callCount(AbstractInsnNode insn) {
if (insn instanceof InvokeDynamicInsnNode) {
invoke = ((InvokeDynamicInsnNode) insn).bsmArgs[0];
String functionName = ((InvokeDynamicInsnNode) insn).name;
dynCount(functionName);
} else {
normalCount(insn);
}
return ppcount;
}
private HashMap<Integer, Map<String, Integer>> callCount(AbstractInsnNode insn) {
if (insn instanceof InvokeDynamicInsnNode) {
invoke = ((InvokeDynamicInsnNode) insn).bsmArgs[0];
String functionName = ((InvokeDynamicInsnNode) insn).name;
dynCount(functionName);
} else {
normalCount(insn);
}
return ppcount;
}
Object invoke = 0;
Object invoke = 0;
public HashMap<Integer, Map<String, Integer>> typeCount(int startPc, int endPc) {
if (startPc == 0) {
ppcount.put(startPc, new HashMap<>());
globalPC = startPc;
} else {
ppcount.put(endPc, new HashMap<>());
globalPC = endPc;
}
actionCfg = cfgraphMap.get(actionName);
int blockStart = 0, blockend = 0;
if (startPc == 0) {
blockStart = 0;
} else {
OUT: for (int j = 0; j < actionCfg.getBasicBlockSize(); j++) {
BasicBlock bb = actionCfg.getBasicBlockAt(j);
AbstractInsnNode insnNode = bb.lastInsn();
if (insnNode instanceof InvokeDynamicInsnNode) {
invoke = ((InvokeDynamicInsnNode) insnNode).bsmArgs[0];
if ((int) invoke == startPc) {
blockStart = j;
break OUT;
}
}
}
}
OUT: for (int j = 0; j < actionCfg.getBasicBlockSize(); j++) {
BasicBlock bb = actionCfg.getBasicBlockAt(j);
AbstractInsnNode insnNode = bb.lastInsn();
if (insnNode instanceof InvokeDynamicInsnNode) {
invoke = ((InvokeDynamicInsnNode) insnNode).bsmArgs[0];
if ((int) invoke == endPc) {
blockend = j;
break OUT;
}
}
}
public HashMap<Integer, Map<String, Integer>> typeCount(int startPc, int endPc) {
if (startPc == 0) {
ppcount.put(startPc, new HashMap<>());
globalPC = startPc;
} else {
ppcount.put(endPc, new HashMap<>());
globalPC = endPc;
}
actionCfg = cfgraphMap.get(actionName);
int blockStart = 0, blockend = 0;
if (startPc == 0) {
blockStart = 0;
} else {
OUT: for (int j = 0; j < actionCfg.getBasicBlockSize(); j++) {
BasicBlock bb = actionCfg.getBasicBlockAt(j);
AbstractInsnNode insnNode = bb.lastInsn();
if (insnNode instanceof InvokeDynamicInsnNode) {
invoke = ((InvokeDynamicInsnNode) insnNode).bsmArgs[0];
if ((int) invoke == startPc) {
blockStart = j;
break OUT;
}
}
}
}
OUT: for (int j = 0; j < actionCfg.getBasicBlockSize(); j++) {
BasicBlock bb = actionCfg.getBasicBlockAt(j);
AbstractInsnNode insnNode = bb.lastInsn();
if (insnNode instanceof InvokeDynamicInsnNode) {
invoke = ((InvokeDynamicInsnNode) insnNode).bsmArgs[0];
if ((int) invoke == endPc) {
blockend = j;
break OUT;
}
}
}
return getInsn(blockStart, blockend);
return getInsn(blockStart, blockend);
}
}
private HashMap<Integer, Map<String, Integer>> getInsn(int blockStart, int blockend) {
BasicBlock t;
if (blockend == blockStart && blockStart != 0) {
System.out.println("blockend" + blockend);
t = actionCfg.getBasicBlockAt(blockend);
if (t.list.size() > 0) {
List<AbstractInsnNode> insnList = t.getInsn();
for (AbstractInsnNode insn : insnList) {
if (insn instanceof InvokeDynamicInsnNode) {
callCount(insn);
} else if (insn instanceof JumpInsnNode) {
jumpCount(insn);
} else {
normalCount(insn);
}
}
}
return ppcount;
} else if (blockend == 0) {
return ppcount;
} else if (blockend != blockStart && blockStart != 0) {
blockStart = blockStart + 1;
blockend = blockend + 1;
System.out.println(blockStart);
}
for (int i = blockStart; i < blockend; i++) {
t = actionCfg.getBasicBlockAt(i);
System.out.println("[t.blockID]" + t.blockID);
if (t.list.size() > 0) {
List<AbstractInsnNode> insnList = t.getInsn();
for (AbstractInsnNode insn : insnList) {
if (insn != null) {
OpInfo info = null;
if (insn.getOpcode() >= 0) {
info = OpInfo.ops[insn.getOpcode()];
System.out.println("[info.toString()]" + info.toString());
}
if (info == null) {
private HashMap<Integer, Map<String, Integer>> getInsn(int blockStart, int blockend) {
BasicBlock t;
if (blockend == blockStart && blockStart != 0) {
System.out.println("blockend" + blockend);
t = actionCfg.getBasicBlockAt(blockend);
if (t.list.size() > 0) {
List<AbstractInsnNode> insnList = t.getInsn();
for (AbstractInsnNode insn : insnList) {
if (insn instanceof InvokeDynamicInsnNode) {
callCount(insn);
} else if (insn instanceof JumpInsnNode) {
jumpCount(insn);
} else {
normalCount(insn);
}
}
}
return ppcount;
} else if (blockend == 0) {
return ppcount;
} else if (blockend != blockStart && blockStart != 0) {
blockStart = blockStart + 1;
blockend = blockend + 1;
System.out.println(blockStart);
}
for (int i = blockStart; i < blockend; i++) {
t = actionCfg.getBasicBlockAt(i);
System.out.println("[t.blockID]" + t.blockID);
if (t.list.size() > 0) {
List<AbstractInsnNode> insnList = t.getInsn();
for (AbstractInsnNode insn : insnList) {
if (insn != null) {
OpInfo info = null;
if (insn.getOpcode() >= 0) {
info = OpInfo.ops[insn.getOpcode()];
System.out.println("[info.toString()]" + info.toString());
}
if (info == null) {
} else if (info.canThrow()) {
callCount(insn);
} else if (info.canBranch()) {
jumpCount(insn);
} else if (info.canContinue()) {
normalCount(insn);
} else if (info.canReturn()) {
normalCount(insn);
} else if (info.canSwitch()) {
normalCount(insn);
} else {
System.out.println("[info:else]" + info);
normalCount(insn);
}
}
}
}
} else if (info.canThrow()) {
callCount(insn);
} else if (info.canBranch()) {
jumpCount(insn);
} else if (info.canContinue()) {
normalCount(insn);
} else if (info.canReturn()) {
normalCount(insn);
} else if (info.canSwitch()) {
normalCount(insn);
} else {
System.out.println("[info:else]" + info);
normalCount(insn);
}
}
}
}
}
return ppcount;
}
}
return ppcount;
}
private void normalCount(AbstractInsnNode insn) {
bdName = FeeSchedule.BDInsn.name();
if (ppcount.get(globalPC).containsKey(bdName)) {
ppcount.get(globalPC).put(bdName, ppcount.get(globalPC).get(bdName) + 1);
} else {
ppcount.get(globalPC).put(bdName, 1);
}
private void normalCount(AbstractInsnNode insn) {
bdName = FeeSchedule.BDInsn.name();
if (ppcount.get(globalPC).containsKey(bdName)) {
ppcount.get(globalPC).put(bdName, ppcount.get(globalPC).get(bdName) + 1);
} else {
ppcount.get(globalPC).put(bdName, 1);
}
}
}
private void jumpCount(AbstractInsnNode insn) {
bdName = FeeSchedule.BDjump.name();
if (ppcount.get(globalPC).containsKey(bdName)) {
ppcount.get(globalPC).put(bdName, ppcount.get(globalPC).get(bdName) + 1);
} else {
ppcount.get(globalPC).put(bdName, 1);
}
}
private void jumpCount(AbstractInsnNode insn) {
bdName = FeeSchedule.BDjump.name();
if (ppcount.get(globalPC).containsKey(bdName)) {
ppcount.get(globalPC).put(bdName, ppcount.get(globalPC).get(bdName) + 1);
} else {
ppcount.get(globalPC).put(bdName, 1);
}
}
private void dynCount(String functionName) {
if (functionName.contains("getProp")) {
bdName = FeeSchedule.BDgetMethod.name();
if (ppcount.get(globalPC).containsKey(bdName)) {
ppcount.get(globalPC).put(bdName, ppcount.get(globalPC).get(bdName) + 1);
System.out.println(" function " + functionName);
} else {
ppcount.get(globalPC).put(bdName, 1);
}
} else if (functionName.contains("setProp")) {
bdName = FeeSchedule.BDsetMethod.name();
if (ppcount.get(globalPC).containsKey(bdName)) {
ppcount.get(globalPC).put(bdName, ppcount.get(globalPC).get(bdName) + 1);
System.out.println(" function " + functionName);
} else {
ppcount.get(globalPC).put(bdName, 1);
}
} else if (functionName.contains("call") && functionName.contains("Util")) {
bdName = FeeSchedule.BDcallUtil.name();
if (ppcount.get(globalPC).containsKey(bdName)) {
ppcount.get(globalPC).put(bdName, ppcount.get(globalPC).get(bdName) + 1);
System.out.println(" function " + functionName);
} else {
ppcount.get(globalPC).put(bdName, 1);
}
} else if (functionName.contains("call") && isInnerfunction(functionName)) {
bdName = FeeSchedule.BDcallFuntion.name();
if (ppcount.get(globalPC).containsKey(bdName)) {
ppcount.get(globalPC).put(bdName, ppcount.get(globalPC).get(bdName) + 1);
System.out.println(" function " + functionName);
} else {
ppcount.get(globalPC).put(bdName, 1);
}
} else if (functionName.contains("call")) {
bdName = FeeSchedule.BDcallUtil.name();
if (ppcount.get(globalPC).containsKey(bdName)) {
ppcount.get(globalPC).put(bdName, ppcount.get(globalPC).get(bdName) + 1);
System.out.println(" function " + functionName);
} else {
ppcount.get(globalPC).put(bdName, 1);
}
private void dynCount(String functionName) {
if (functionName.contains("getProp")) {
bdName = FeeSchedule.BDgetMethod.name();
if (ppcount.get(globalPC).containsKey(bdName)) {
ppcount.get(globalPC).put(bdName, ppcount.get(globalPC).get(bdName) + 1);
System.out.println(" function " + functionName);
} else {
ppcount.get(globalPC).put(bdName, 1);
}
} else if (functionName.contains("setProp")) {
bdName = FeeSchedule.BDsetMethod.name();
if (ppcount.get(globalPC).containsKey(bdName)) {
ppcount.get(globalPC).put(bdName, ppcount.get(globalPC).get(bdName) + 1);
System.out.println(" function " + functionName);
} else {
ppcount.get(globalPC).put(bdName, 1);
}
} else if (functionName.contains("call") && functionName.contains("Util")) {
bdName = FeeSchedule.BDcallUtil.name();
if (ppcount.get(globalPC).containsKey(bdName)) {
ppcount.get(globalPC).put(bdName, ppcount.get(globalPC).get(bdName) + 1);
System.out.println(" function " + functionName);
} else {
ppcount.get(globalPC).put(bdName, 1);
}
} else if (functionName.contains("call") && isInnerfunction(functionName)) {
bdName = FeeSchedule.BDcallFuntion.name();
if (ppcount.get(globalPC).containsKey(bdName)) {
ppcount.get(globalPC).put(bdName, ppcount.get(globalPC).get(bdName) + 1);
System.out.println(" function " + functionName);
} else {
ppcount.get(globalPC).put(bdName, 1);
}
} else if (functionName.contains("call")) {
bdName = FeeSchedule.BDcallUtil.name();
if (ppcount.get(globalPC).containsKey(bdName)) {
ppcount.get(globalPC).put(bdName, ppcount.get(globalPC).get(bdName) + 1);
System.out.println(" function " + functionName);
} else {
ppcount.get(globalPC).put(bdName, 1);
}
} else {
bdName = FeeSchedule.BDInsn.name();
if (ppcount.get(globalPC).containsKey(bdName)) {
ppcount.get(globalPC).put(bdName, ppcount.get(globalPC).get(bdName) + 1);
} else {
ppcount.get(globalPC).put(bdName, 1);
}
}
} else {
bdName = FeeSchedule.BDInsn.name();
if (ppcount.get(globalPC).containsKey(bdName)) {
ppcount.get(globalPC).put(bdName, ppcount.get(globalPC).get(bdName) + 1);
} else {
ppcount.get(globalPC).put(bdName, 1);
}
}
}
}
private boolean isInnerfunction(String functionName) {
String string = functionName.split(":")[2];
if (cfgraphMap.containsKey(string)) {
return true;
} else {
return false;
}
}
private boolean isInnerfunction(String functionName) {
String string = functionName.split(":")[2];
if (cfgraphMap.containsKey(string)) {
return true;
} else {
return false;
}
}
}

View File

@ -15,7 +15,8 @@ public abstract class DFS {
// System.out.println("[start.blockID]" + start.blockID);
Set<BasicBlock> sucBlocks = getSuc(start);
for (BasicBlock bb : sucBlocks) {
if (!marked[bb.blockID]) dfs(cfg, bb);
if (!marked[bb.blockID])
dfs(cfg, bb);
}
}

View File

@ -20,7 +20,7 @@ public class Evaluates {
long fee = getValue(cmap.getKey());
value = fee * cmap.getValue() + value;
}
CountResult.put(cfrKey, value);
CountResult.put(cfrKey, value);
}
return CountResult;
}
@ -62,14 +62,14 @@ public class Evaluates {
Set<HashMap<String, Long>> set = new HashSet<>();
public void getGas(HashMap<String, Set<Map<Integer, HashMap<String, Integer>>>> branchCount) {
for (Entry<String, Set<Map<Integer, HashMap<String, Integer>>>> varInsn :
branchCount.entrySet()) {
sum = 0;
for (Map<Integer, HashMap<String, Integer>> m : varInsn.getValue()) {
blockGas(m);
}
map.put(varInsn.getKey(), sum);
for (Entry<String, Set<Map<Integer, HashMap<String, Integer>>>> varInsn : branchCount
.entrySet()) {
sum = 0;
for (Map<Integer, HashMap<String, Integer>> m : varInsn.getValue()) {
blockGas(m);
}
map.put(varInsn.getKey(), sum);
}
}
private void blockGas(Map<Integer, HashMap<String, Integer>> m) {
@ -84,13 +84,13 @@ public class Evaluates {
public static HashMap<String, Long> map = new HashMap<>();
public void getInsnGas(Map<Integer, Set<Map<Integer, HashMap<String, Integer>>>> ppMap) {
for (Entry<Integer, Set<Map<Integer, HashMap<String, Integer>>>> varInsn :
ppMap.entrySet()) {
for (Entry<Integer, Set<Map<Integer, HashMap<String, Integer>>>> varInsn : ppMap
.entrySet()) {
sum = 0;
for (Map<Integer, HashMap<String, Integer>> m : varInsn.getValue()) {
blockGas(m);
}
map.put(varInsn.getKey().toString(), sum);
}
}
}
}

View File

@ -1,51 +1,52 @@
package org.bdware.analysis.gas;
public enum FeeSchedule {
// BDaload(20L),BDstore(200L),
BDgetMethod(10L), BDsetMethod(20L), BDnew(20L),BDcallUtil(30L), BDcallFuntion(40L), BDcall(10L), BDjump(15L), BDInsn(1L);
// BDaload(20L),BDstore(200L),
BDgetMethod(10L), BDsetMethod(20L), BDnew(20L), BDcallUtil(30L), BDcallFuntion(40L), BDcall(
10L), BDjump(15L), BDInsn(1L);
long fee;
long fee;
FeeSchedule(long value) {
fee = value;
}
FeeSchedule(long value) {
fee = value;
}
public long getFee() {
return fee;
}
public long getFee() {
return fee;
}
public long getValue(String name) {
long value=0;
switch (name) {
case "BDgetMethod":
value=BDgetMethod.getFee();
break;
case "BDsetMethod":
value= BDsetMethod.getFee();
break;
case "BDcallUtil":
value= BDcallUtil.getFee();
break;
case "BDcallFuntion":
value= BDcallFuntion.getFee();
break;
case "BDcall":
value= BDcall.getFee();
break;
case "BDjump":
value= BDjump.getFee();
break;
case "BDInsn":
value= BDInsn.getFee();
break;
default:
break;
}
return value;
}
public long getValue(String name) {
long value = 0;
switch (name) {
case "BDgetMethod":
value = BDgetMethod.getFee();
break;
case "BDsetMethod":
value = BDsetMethod.getFee();
break;
case "BDcallUtil":
value = BDcallUtil.getFee();
break;
case "BDcallFuntion":
value = BDcallFuntion.getFee();
break;
case "BDcall":
value = BDcall.getFee();
break;
case "BDjump":
value = BDjump.getFee();
break;
case "BDInsn":
value = BDInsn.getFee();
break;
default:
break;
}
return value;
}
public String getString(FeeSchedule feeName) {
return feeName.toString();
public String getString(FeeSchedule feeName) {
return feeName.toString();
}
}
}

View File

@ -11,12 +11,8 @@ import java.util.Set;
import org.bdware.analysis.BasicBlock;
import org.bdware.analysis.CFGraph;
import org.bdware.analysis.OpInfo;
import org.bdware.analysis.gas.DFS;
import org.bdware.analysis.gas.FeeSchedule;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.InvokeDynamicInsnNode;
import org.objectweb.asm.tree.JumpInsnNode;
import org.objectweb.asm.tree.LabelNode;
@ -49,7 +45,7 @@ public class PPCount extends DFS {
BasicBlock b = cfg.getBasicBlockAt(0);
toAnalysis.add(b);
b.setInList(true);
// System.out.println("=========:"+cfg.getMethodNode().name);
// System.out.println("=========:"+cfg.getMethodNode().name);
functionList.add(cfg.getMethodNode().name);
isBranchBlock = new boolean[cfg.getBasicBlockSize()];
// setToAnalysis(toAnalysis);
@ -302,44 +298,42 @@ public class PPCount extends DFS {
if (function.contains("getProp")) {
bdName = FeeSchedule.BDgetMethod.name();
if (BlockInsn.get(globalBlockID).containsKey(bdName)) {
BlockInsn.get(globalBlockID)
.put(bdName, BlockInsn.get(globalBlockID).get(bdName) + 1);
BlockInsn.get(globalBlockID).put(bdName,
BlockInsn.get(globalBlockID).get(bdName) + 1);
} else {
BlockInsn.get(globalBlockID).put(bdName, 1);
}
} else if (function.contains("setProp")) {
bdName = FeeSchedule.BDsetMethod.name();
if (BlockInsn.get(globalBlockID).containsKey(bdName)) {
BlockInsn.get(globalBlockID)
.put(bdName, BlockInsn.get(globalBlockID).get(bdName) + 1);
BlockInsn.get(globalBlockID).put(bdName,
BlockInsn.get(globalBlockID).get(bdName) + 1);
} else {
BlockInsn.get(globalBlockID).put(bdName, 1);
}
} else if (function.contains("new")) {
bdName = FeeSchedule.BDnew.name();
if (BlockInsn.get(globalBlockID).containsKey(bdName)) {
BlockInsn.get(globalBlockID)
.put(bdName, BlockInsn.get(globalBlockID).get(bdName) + 1);
BlockInsn.get(globalBlockID).put(bdName,
BlockInsn.get(globalBlockID).get(bdName) + 1);
} else {
BlockInsn.get(globalBlockID).put(bdName, 1);
}
} else if (function.contains("call") && functionName.split(":")[2].contains("Util")) {
bdName = FeeSchedule.BDcallUtil.name();
if (BlockInsn.get(globalBlockID).containsKey(bdName)) {
BlockInsn.get(globalBlockID)
.put(bdName, BlockInsn.get(globalBlockID).get(bdName) + 1);
BlockInsn.get(globalBlockID).put(bdName,
BlockInsn.get(globalBlockID).get(bdName) + 1);
} else {
BlockInsn.get(globalBlockID).put(bdName, 1);
}
} else if (function.contains("call") && isInnerfunction(functionName)) {
// System.out.println("[call ]" + functionName);
// System.out.println("[call ]" + functionName);
String methName = functionName.split(":")[2];
bdName = FeeSchedule.BDcallFuntion.name();
if (BlockInsn.get(globalBlockID).containsKey(bdName)) {
BlockInsn.get(globalBlockID)
.put(
bdName + "," + methName,
BlockInsn.get(globalBlockID).get(bdName + "," + methName) + 1);
BlockInsn.get(globalBlockID).put(bdName + "," + methName,
BlockInsn.get(globalBlockID).get(bdName + "," + methName) + 1);
System.out.println(" function " + functionName);
} else {
BlockInsn.get(globalBlockID).put(bdName + "," + methName, 1);
@ -348,16 +342,16 @@ public class PPCount extends DFS {
} else if (function.contains("call")) {
bdName = FeeSchedule.BDcall.name();
if (BlockInsn.get(globalBlockID).containsKey(bdName)) {
BlockInsn.get(globalBlockID)
.put(bdName, BlockInsn.get(globalBlockID).get(bdName) + 1);
BlockInsn.get(globalBlockID).put(bdName,
BlockInsn.get(globalBlockID).get(bdName) + 1);
} else {
BlockInsn.get(globalBlockID).put(bdName, 1);
}
} else if (functionName.contains("traceif")) {
bdName = FeeSchedule.BDjump.name();
if (BlockInsn.get(globalBlockID).containsKey(bdName)) {
BlockInsn.get(globalBlockID)
.put(bdName, BlockInsn.get(globalBlockID).get(bdName) + 1);
BlockInsn.get(globalBlockID).put(bdName,
BlockInsn.get(globalBlockID).get(bdName) + 1);
} else {
BlockInsn.get(globalBlockID).put(bdName, 1);
}
@ -366,8 +360,8 @@ public class PPCount extends DFS {
private boolean isInnerfunction(String functionName) {
String string = functionName.split(":")[2];
// System.out.println("++++++++++++++" + functionName);
// System.out.println("【function】" + functionList);
// System.out.println("++++++++++++++" + functionName);
// System.out.println("【function】" + functionList);
if (functionList.contains(string)) {
return true;
} else {
@ -375,57 +369,57 @@ public class PPCount extends DFS {
}
}
// public static void main(String[] args) throws Exception {
// String path = "/Users/hulingxuan/git/SmartContract/output/main.yjs";
// ContractNode contractNode = null;
// YJSCompiler compiler = new YJSCompiler();
// contractNode = compiler.compile(new FileInputStream(path), null);
// engine = new DesktopEngine();
// engine.loadContract(contractNode, false);
// public static void main(String[] args) throws Exception {
// String path = "/Users/hulingxuan/git/SmartContract/output/main.yjs";
// ContractNode contractNode = null;
// YJSCompiler compiler = new YJSCompiler();
// contractNode = compiler.compile(new FileInputStream(path), null);
// engine = new DesktopEngine();
// engine.loadContract(contractNode, false);
//
// Map<String, byte[]> clzs = engine.dumpClass();
// Map<String, MethodNode> methods = new HashMap<>();
// for (byte[] clz : clzs.values()) {
// ClassNode classNode = new ClassNode();
// ClassReader cr = new ClassReader(clz);
// cr.accept(classNode, ClassReader.EXPAND_FRAMES);
// for (MethodNode mn : classNode.methods) {
// methods.put(mn.name, mn);
// }
// }
// int flag = 0;
// for (FunctionNode fn : contractNode.getFunctions()) {
// functionList.add(fn.functionName);
// MethodNode mn = methods.get(fn.functionName);
// if (mn != null) {
// CFGraph cfg = new CFGraph(mn) {
// @Override
// public BasicBlock getBasicBlock(int id) {
// return new BasicBlock(id);
// }
// };
// // cfg.getLabelOrder();
// PPCount countFee = new PPCount(cfg, flag);
// Map<String, byte[]> clzs = engine.dumpClass();
// Map<String, MethodNode> methods = new HashMap<>();
// for (byte[] clz : clzs.values()) {
// ClassNode classNode = new ClassNode();
// ClassReader cr = new ClassReader(clz);
// cr.accept(classNode, ClassReader.EXPAND_FRAMES);
// for (MethodNode mn : classNode.methods) {
// methods.put(mn.name, mn);
// }
// }
// int flag = 0;
// for (FunctionNode fn : contractNode.getFunctions()) {
// functionList.add(fn.functionName);
// MethodNode mn = methods.get(fn.functionName);
// if (mn != null) {
// CFGraph cfg = new CFGraph(mn) {
// @Override
// public BasicBlock getBasicBlock(int id) {
// return new BasicBlock(id);
// }
// };
// // cfg.getLabelOrder();
// PPCount countFee = new PPCount(cfg, flag);
//
// BasicBlock bb = cfg.getBasicBlockAt(0);
// countFee.dfs(cfg, bb);
// // cfg.printSelf();
// BasicBlock bb = cfg.getBasicBlockAt(0);
// countFee.dfs(cfg, bb);
// // cfg.printSelf();
//
// Evaluates feEvaluates = new Evaluates();
// feEvaluates.getGas(branchCount);
// feEvaluates.getInsnGas(ppMap);
// countFunction(fn.functionName, Evaluates.map);
// System.out.println("+++++++" + functionSumGas);
// System.out.println("========" + Evaluates.map);
// flag++;
// }
// }
// System.out.println(branchCount);
// System.out.println(BlockInsn);
// System.out.println(ppMap);
// Evaluates feEvaluates = new Evaluates();
// feEvaluates.getGas(branchCount);
// feEvaluates.getInsnGas(ppMap);
// countFunction(fn.functionName, Evaluates.map);
// System.out.println("+++++++" + functionSumGas);
// System.out.println("========" + Evaluates.map);
// flag++;
// }
// }
// System.out.println(branchCount);
// System.out.println(BlockInsn);
// System.out.println(ppMap);
//
// // System.out.println(feEvaluates.getCallFee());
// }
// // System.out.println(feEvaluates.getCallFee());
// }
public static HashMap<String, Long> functionSumGas = new HashMap<>();

View File

@ -5,24 +5,24 @@ import java.util.Set;
import org.bdware.analysis.BasicBlock;
public class DirectGraphDFS {
private boolean[] marked;
public DirectGraphDFS(TaintCFG cfg, BasicBlock start) {
marked = new boolean[cfg.getBlocks().size()];
dfs(cfg, start);
}
private void dfs(TaintCFG cfg, BasicBlock start) {
marked[start.blockID] = true;
Set<BasicBlock> sucBlocks = cfg.getSucBlocks(start);
for(BasicBlock bb : sucBlocks) {
if(!marked[bb.blockID])
dfs(cfg, bb);
}
}
public boolean isArrival(BasicBlock end) {
return marked[end.blockID];
}
private boolean[] marked;
public DirectGraphDFS(TaintCFG cfg, BasicBlock start) {
marked = new boolean[cfg.getBlocks().size()];
dfs(cfg, start);
}
private void dfs(TaintCFG cfg, BasicBlock start) {
marked[start.blockID] = true;
Set<BasicBlock> sucBlocks = cfg.getSucBlocks(start);
for (BasicBlock bb : sucBlocks) {
if (!marked[bb.blockID])
dfs(cfg, bb);
}
}
public boolean isArrival(BasicBlock end) {
return marked[end.blockID];
}
}

View File

@ -11,237 +11,240 @@ import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.InvokeDynamicInsnNode;
public class HeapObject extends TaintValue {
private Map<String, TaintValue> fields = new HashMap<String, TaintValue>();
static int allocatID = 0;
int id;
private Map<String, TaintValue> fields = new HashMap<String, TaintValue>();
static int allocatID = 0;
int id;
public HeapObject() {
super(1);
id = allocatID++;
}
public HeapObject() {
super(1);
id = allocatID++;
}
public HeapObject(TaintValue t) {
this();
if (t != null) {
merge(t);
size = t.size;
} else {
isTainted = 0;
size = 1;
}
}
public HeapObject(TaintValue t) {
this();
if (t != null) {
merge(t);
size = t.size;
} else {
isTainted = 0;
size = 1;
}
}
public static HeapObject getRootObject() {
HeapObject ret = new HeapObject();
ret.setProp("Global", new HeapObject());
ret.setProp("getScope", new HeapObject());
return ret;
}
public static HeapObject getRootObject() {
HeapObject ret = new HeapObject();
ret.setProp("Global", new HeapObject());
ret.setProp("getScope", new HeapObject());
return ret;
}
@Override
public String toString() {
return countSize() + "|" + super.toString();
}
@Override
public String toString() {
return countSize() + "|" + super.toString();
}
private String countSize() {
objSet = new HashSet<>();
return countSizeInternal();
}
private String countSize() {
objSet = new HashSet<>();
return countSizeInternal();
}
private String countSizeInternal() {
if (objSet.contains(this))
return "{H" + id + "}";
objSet.add(this);
String ret = "{H" + id + ",";
for (String field : fields.keySet()) {
TaintValue tv = fields.get(field);
if (tv instanceof HeapObject)
ret += field + ":" + ((HeapObject) tv).countSizeInternal() + ",";
else
ret += field + ":" + tv.isTainted;
}
ret += isTainted + "}";
return ret;
}
private String countSizeInternal() {
if (objSet.contains(this))
return "{H" + id + "}";
objSet.add(this);
String ret = "{H" + id + ",";
for (String field : fields.keySet()) {
TaintValue tv = fields.get(field);
if (tv instanceof HeapObject)
ret += field + ":" + ((HeapObject) tv).countSizeInternal() + ",";
else
ret += field + ":" + tv.isTainted;
}
ret += isTainted + "}";
return ret;
}
private static HashSet<HeapObject> objSet;
private static HashSet<HeapObject> objSet;
public static TaintValue operate(AbstractInsnNode insn, List<? extends TaintValue> values,
TaintValue calculatedVal) {
TaintValue retVal = null;
String desc;
switch (insn.getOpcode()) {
case Opcodes.INVOKEVIRTUAL:
desc = ((MethodInsnNode) insn).owner;
if (isGetScopeObject((MethodInsnNode) insn) && values.size() != 0) {
TaintValue tv = values.get(0);
if (tv instanceof HeapObject) {
HeapObject heapObject = (HeapObject) tv;
retVal = heapObject.getProp("getScope");
if (retVal == null) {
return calculatedVal;
} else
return retVal;
}
}
break;
case Opcodes.INVOKESPECIAL:
case Opcodes.INVOKESTATIC:
case Opcodes.INVOKEINTERFACE:
break;
case Opcodes.INVOKEDYNAMIC:
desc = ((InvokeDynamicInsnNode) insn).name;
desc = desc.replaceAll(".*:", "");
if (isDynGet((InvokeDynamicInsnNode) insn)) {
TaintValue tval = values.get(0);
if (tval instanceof HeapObject) {
HeapObject heapObject = (HeapObject) tval;
retVal = heapObject.getProp(desc);
if (retVal != null) {
if (TaintConfig.isDebug)
System.out.println("[HeapObject] get:" + desc + " taintVal:" + retVal);
return retVal;
} else {
if (TaintConfig.isDebug)
System.out.println("[HeapObject] get:" + desc + " taintVal: empty");
heapObject.setProp(desc, new HeapObject());
return heapObject.getProp(desc);
}
} else {
// TODO
}
} else if (isDynSet((InvokeDynamicInsnNode) insn)) {
// TaintValue tv = values.get(0);
if (TaintConfig.isDebug)
System.out.println("[HeapObject] set:" + desc + " taintVal:" + values.get(1));
TaintValue tval = values.get(0);
if (tval instanceof HeapObject) {
HeapObject heapObject = (HeapObject) tval;
// heapObject.merge(values.get(1));
heapObject.setProp(desc,
values.get(1) instanceof HeapObject ? values.get(1) : new HeapObject(values.get(1)));
} else {
HeapObject heapObject = new HeapObject(tval);
heapObject.merge(tval);
// heapObject.merge(values.get(1));
heapObject.setProp(desc, values.get(1));
}
} else {
for (TaintValue tv : values) {
if (tv instanceof HeapObject) {
calculatedVal.isTainted |= ((HeapObject) tv).wholeTaint();
}
}
}
break;
default:
}
return calculatedVal;
public static TaintValue operate(AbstractInsnNode insn, List<? extends TaintValue> values,
TaintValue calculatedVal) {
TaintValue retVal = null;
String desc;
switch (insn.getOpcode()) {
case Opcodes.INVOKEVIRTUAL:
desc = ((MethodInsnNode) insn).owner;
if (isGetScopeObject((MethodInsnNode) insn) && values.size() != 0) {
TaintValue tv = values.get(0);
if (tv instanceof HeapObject) {
HeapObject heapObject = (HeapObject) tv;
retVal = heapObject.getProp("getScope");
if (retVal == null) {
return calculatedVal;
} else
return retVal;
}
}
break;
case Opcodes.INVOKESPECIAL:
case Opcodes.INVOKESTATIC:
case Opcodes.INVOKEINTERFACE:
break;
case Opcodes.INVOKEDYNAMIC:
desc = ((InvokeDynamicInsnNode) insn).name;
desc = desc.replaceAll(".*:", "");
if (isDynGet((InvokeDynamicInsnNode) insn)) {
TaintValue tval = values.get(0);
if (tval instanceof HeapObject) {
HeapObject heapObject = (HeapObject) tval;
retVal = heapObject.getProp(desc);
if (retVal != null) {
if (TaintConfig.isDebug)
System.out.println(
"[HeapObject] get:" + desc + " taintVal:" + retVal);
return retVal;
} else {
if (TaintConfig.isDebug)
System.out.println("[HeapObject] get:" + desc + " taintVal: empty");
heapObject.setProp(desc, new HeapObject());
return heapObject.getProp(desc);
}
} else {
// TODO
}
} else if (isDynSet((InvokeDynamicInsnNode) insn)) {
// TaintValue tv = values.get(0);
if (TaintConfig.isDebug)
System.out
.println("[HeapObject] set:" + desc + " taintVal:" + values.get(1));
TaintValue tval = values.get(0);
if (tval instanceof HeapObject) {
HeapObject heapObject = (HeapObject) tval;
// heapObject.merge(values.get(1));
heapObject.setProp(desc, values.get(1) instanceof HeapObject ? values.get(1)
: new HeapObject(values.get(1)));
} else {
HeapObject heapObject = new HeapObject(tval);
heapObject.merge(tval);
// heapObject.merge(values.get(1));
heapObject.setProp(desc, values.get(1));
}
} else {
for (TaintValue tv : values) {
if (tv instanceof HeapObject) {
calculatedVal.isTainted |= ((HeapObject) tv).wholeTaint();
}
}
}
break;
default:
}
return calculatedVal;
}
}
private static boolean isDynGet(InvokeDynamicInsnNode insn) {
String desc = insn.name;
if (desc.contains("getProp") && desc.contains("getMethod") && desc.contains("getElem")) {
return true;
}
return false;
}
private static boolean isDynGet(InvokeDynamicInsnNode insn) {
String desc = insn.name;
if (desc.contains("getProp") && desc.contains("getMethod") && desc.contains("getElem")) {
return true;
}
return false;
}
private static boolean isDynSet(InvokeDynamicInsnNode insn) {
String desc = insn.name;
if (desc.contains("setProp") && desc.contains("setElem")) {
// System.out.println(desc);
return true;
}
return false;
}
private static boolean isDynSet(InvokeDynamicInsnNode insn) {
String desc = insn.name;
if (desc.contains("setProp") && desc.contains("setElem")) {
// System.out.println(desc);
return true;
}
return false;
}
private static boolean isGetScopeObject(MethodInsnNode insn) {
if (insn.owner.contains("wrp/jdk/nashorn/internal/runtime/ScriptFunction") && insn.name.equals("getScope"))
return true;
return false;
}
private static boolean isGetScopeObject(MethodInsnNode insn) {
if (insn.owner.contains("wrp/jdk/nashorn/internal/runtime/ScriptFunction")
&& insn.name.equals("getScope"))
return true;
return false;
}
public TaintValue getProp(String str) {
return fields.get(str);
}
public TaintValue getProp(String str) {
return fields.get(str);
}
public TaintValue setProp(String str, TaintValue val) {
return fields.put(str, val);
}
public TaintValue setProp(String str, TaintValue val) {
return fields.put(str, val);
}
@Override
public HeapObject clone() {
return this;
}
@Override
public HeapObject clone() {
return this;
}
public HeapObject actualClone() {
ccObj = new HashMap<>();
return cloneInternal();
}
public HeapObject actualClone() {
ccObj = new HashMap<>();
return cloneInternal();
}
static Map<HeapObject, HeapObject> ccObj;
static Map<HeapObject, HeapObject> ccObj;
private HeapObject cloneInternal() {
if (ccObj.containsKey(this))
return ccObj.get(this);
HeapObject ho = new HeapObject();
ccObj.put(this, ho);
ho.isTainted = isTainted;
for (String field : fields.keySet()) {
TaintValue target = fields.get(field);
if (target instanceof HeapObject)
ho.fields.put(field, ((HeapObject) target).cloneInternal());
else
ho.fields.put(field, target.clone());
}
return ho;
}
private HeapObject cloneInternal() {
if (ccObj.containsKey(this))
return ccObj.get(this);
HeapObject ho = new HeapObject();
ccObj.put(this, ho);
ho.isTainted = isTainted;
for (String field : fields.keySet()) {
TaintValue target = fields.get(field);
if (target instanceof HeapObject)
ho.fields.put(field, ((HeapObject) target).cloneInternal());
else
ho.fields.put(field, target.clone());
}
return ho;
}
// TODO consider the "Cite circle"
public void heapMerge(TaintValue target) {
merge(target);
if (target instanceof HeapObject) {
HeapObject targetObject = (HeapObject) target;
for (String field : targetObject.fields.keySet()) {
if (fields.containsKey(field)) {
TaintValue t2 = fields.get(field);
TaintValue target2 = targetObject.fields.get(field);
// System.out.println("[HeapObject heapMerge]:" + field);
if (t2 instanceof HeapObject) {
((HeapObject) t2).heapMerge(target2);
} else if (target2 instanceof HeapObject) {
HeapObject next = ((HeapObject) target2).clone();
next.merge(t2);
fields.put(field, next);
} else
t2.merge(target2);
// TODO consider the "Cite circle"
public void heapMerge(TaintValue target) {
merge(target);
if (target instanceof HeapObject) {
HeapObject targetObject = (HeapObject) target;
for (String field : targetObject.fields.keySet()) {
if (fields.containsKey(field)) {
TaintValue t2 = fields.get(field);
TaintValue target2 = targetObject.fields.get(field);
// System.out.println("[HeapObject heapMerge]:" + field);
if (t2 instanceof HeapObject) {
((HeapObject) t2).heapMerge(target2);
} else if (target2 instanceof HeapObject) {
HeapObject next = ((HeapObject) target2).clone();
next.merge(t2);
fields.put(field, next);
} else
t2.merge(target2);
} else
fields.put(field, targetObject.fields.get(field).clone());
} else
fields.put(field, targetObject.fields.get(field).clone());
}
}
}
}
}
}
public synchronized long wholeTaint() {
objSet = new HashSet<>();
return wholeTaintInternal();
}
public synchronized long wholeTaint() {
objSet = new HashSet<>();
return wholeTaintInternal();
}
private long wholeTaintInternal() {
if (objSet.contains(this))
return 0L;
objSet.add(this);
long ret = isTainted;
for (TaintValue tv : fields.values()) {
if (tv instanceof HeapObject)
ret |= ((HeapObject) tv).wholeTaintInternal();
else
ret |= tv.isTainted;
}
return ret;
}
private long wholeTaintInternal() {
if (objSet.contains(this))
return 0L;
objSet.add(this);
long ret = isTainted;
for (TaintValue tv : fields.values()) {
if (tv instanceof HeapObject)
ret |= ((HeapObject) tv).wholeTaintInternal();
else
ret |= tv.isTainted;
}
return ret;
}
}

View File

@ -7,64 +7,68 @@ import org.bdware.analysis.BasicBlock;
import org.objectweb.asm.tree.AbstractInsnNode;
public class TaintBB extends BasicBlock implements AnalysisTarget {
boolean inList = false;
boolean inList = false;
public TaintBB(int id) {
super(id);
preResult = new TaintResult();
sucResult = new TaintResult();
}
public TaintBB(int id) {
super(id);
preResult = new TaintResult();
sucResult = new TaintResult();
}
public TaintResult preResult;
public TaintResult sucResult;
public TaintResult preResult;
public TaintResult sucResult;
@Override
public boolean inList() {
return inList;
}
@Override
public boolean inList() {
return inList;
}
@Override
public void setInList(boolean b) {
inList = b;
}
public String getResult() {
return (sucResult.frame2Str() + " Ret:" + sucResult.ret.toString());
}
@Override
public void setInList(boolean b) {
inList = b;
}
public String getResultWithTaintBit() {
return "Ret:" + sucResult.ret.toReadableTaint();
}
public String getResult() {
return (sucResult.frame2Str() + " Ret:" + sucResult.ret.toString());
}
public TaintResult forwardAnalysis() {
TaintResult oldSuc = sucResult;
sucResult = (TaintResult) preResult.clone();
TaintResult currentResult = sucResult;
List<AbstractInsnNode> insns = getInsn();
if (TaintConfig.isDebug)
System.out.println("[TaintBB] Enter B" + blockID + ":" + getResult() + " size:" + insns.size());
public String getResultWithTaintBit() {
return "Ret:" + sucResult.ret.toReadableTaint();
}
for (int i = 0; i < insns.size(); i++) {
currentResult = (TaintResult) currentResult.merge(insns.get(i));
}
currentResult.mergeResult(oldSuc);
public TaintResult forwardAnalysis() {
TaintResult oldSuc = sucResult;
sucResult = (TaintResult) preResult.clone();
TaintResult currentResult = sucResult;
List<AbstractInsnNode> insns = getInsn();
if (TaintConfig.isDebug)
System.out.println(
"[TaintBB] Enter B" + blockID + ":" + getResult() + " size:" + insns.size());
if (TaintConfig.isDebug)
System.out.println("[TaintBB] Leave B" + blockID + ":" + getResult() + " size:" + insns.size());
// already done.
return currentResult;
}
for (int i = 0; i < insns.size(); i++) {
currentResult = (TaintResult) currentResult.merge(insns.get(i));
}
currentResult.mergeResult(oldSuc);
if (TaintConfig.isDebug)
System.out.println(
"[TaintBB] Leave B" + blockID + ":" + getResult() + " size:" + insns.size());
// already done.
return currentResult;
}
public AbstractInsnNode lastInsn() {
return list.get(list.size() - 1);
}
public AbstractInsnNode firstInsn() {
return list.get(0);
}
public List<AbstractInsnNode> AllInsn() {
return list;
}
public AbstractInsnNode lastInsn() {
return list.get(list.size() - 1);
}
public AbstractInsnNode firstInsn() {
return list.get(0);
}
public List<AbstractInsnNode> AllInsn() {
return list;
}
}

View File

@ -4,65 +4,65 @@ import java.util.HashMap;
import java.util.Map;
public class TaintBits {
Map<Long, String> data;
Map<String, Long> type2Taint;
long curr;
Map<String, String> reallocate;
int count = 0;
Map<Long, String> data;
Map<String, Long> type2Taint;
long curr;
Map<String, String> reallocate;
int count = 0;
public TaintBits() {
curr = 1L;
data = new HashMap<>();
type2Taint = new HashMap<>();
reallocate = new HashMap<>();
}
public TaintBits() {
curr = 1L;
data = new HashMap<>();
type2Taint = new HashMap<>();
reallocate = new HashMap<>();
}
public long allocate(String type) {
type = reallocateCall(type);
if (type2Taint.containsKey(type))
return type2Taint.get(type);
long ret = curr;
data.put(curr, type);
type2Taint.put(type, curr);
curr <<= 1;
return ret;
}
public long allocate(String type) {
type = reallocateCall(type);
if (type2Taint.containsKey(type))
return type2Taint.get(type);
long ret = curr;
data.put(curr, type);
type2Taint.put(type, curr);
curr <<= 1;
return ret;
}
private String reallocateCall(String type) {
if (reallocate.containsKey(type))
return reallocate.get(type);
if (type.contains("dyn:call:executeContract")) {
reallocate.put(type, "executeContract" + (count++));
return reallocate.get(type);
}
return type;
}
private String reallocateCall(String type) {
if (reallocate.containsKey(type))
return reallocate.get(type);
if (type.contains("dyn:call:executeContract")) {
reallocate.put(type, "executeContract" + (count++));
return reallocate.get(type);
}
return type;
}
public long getTaintValue(String type) {
type = reallocateCall(type);
if (type2Taint.containsKey(type))
return type2Taint.get(type);
return -1;
}
public long getTaintValue(String type) {
type = reallocateCall(type);
if (type2Taint.containsKey(type))
return type2Taint.get(type);
return -1;
}
public String taintInfo() {
String ret = "";
long curr = this.curr >> 1;
for (; curr >= 1L;) {
ret += data.get(curr) + ", ";
curr >>= 1;
}
return ret;
}
public String taintInfo() {
String ret = "";
long curr = this.curr >> 1;
for (; curr >= 1L;) {
ret += data.get(curr) + ", ";
curr >>= 1;
}
return ret;
}
public String parse(long isTainted) {
String ret = "";
long curr = this.curr >> 1;
for (; curr >= 1L;) {
if ((isTainted & curr) != 0)
ret += data.get(curr) + " ";
curr >>= 1;
}
return ret;
}
public String parse(long isTainted) {
String ret = "";
long curr = this.curr >> 1;
for (; curr >= 1L;) {
if ((isTainted & curr) != 0)
ret += data.get(curr) + " ";
curr >>= 1;
}
return ret;
}
}

View File

@ -11,74 +11,75 @@ import org.objectweb.asm.tree.InvokeDynamicInsnNode;
import org.objectweb.asm.tree.MethodNode;
public class TaintCFG extends CFGraph {
public TaintBits taintBits;
public TaintBits taintBits;
public TaintCFG(MethodNode mn) {
super(mn);
taintBits = new TaintBits();
}
public TaintCFG(MethodNode mn) {
super(mn);
taintBits = new TaintBits();
}
@Override
public BasicBlock getBasicBlock(int id) {
return new TaintBB(id);
}
@Override
public BasicBlock getBasicBlock(int id) {
return new TaintBB(id);
}
public int argsLocal() {
String desc = getMethodNode().desc;
String[] parameters = desc.split("[)]");
String parameter = parameters[0];
String[] args = parameter.split("[;]");
return args.length - 1;
}
public int argsLocal() {
String desc = getMethodNode().desc;
String[] parameters = desc.split("[)]");
String parameter = parameters[0];
String[] args = parameter.split("[;]");
return args.length - 1;
}
public void executeLocal() {
for (BasicBlock bb : basicBlocks) {
for (AbstractInsnNode an : bb.getInsn()) {
if (an instanceof InvokeDynamicInsnNode) {
InvokeDynamicInsnNode inDy = (InvokeDynamicInsnNode) an;
if (inDy.name.contains("dyn:call:executeContract")) {
taintBits.allocate(inDy.name + inDy.hashCode());
}
}
}
}
return;
}
public void executeLocal() {
for (BasicBlock bb : basicBlocks) {
for (AbstractInsnNode an : bb.getInsn()) {
if (an instanceof InvokeDynamicInsnNode) {
InvokeDynamicInsnNode inDy = (InvokeDynamicInsnNode) an;
if (inDy.name.contains("dyn:call:executeContract")) {
taintBits.allocate(inDy.name + inDy.hashCode());
}
}
}
}
return;
}
public void printSelf() {
InsnPrinter printer = new InsnPrinter(Opcodes.ASM4, System.out);
printer.setLabelOrder(getLabelOrder());
System.out.println("======Method:" + getMethodNode().name + getMethodNode().desc + "=======");
System.out.println("=====TaintInfo: " + taintBits.taintInfo() + "===========");
for (BasicBlock bb : basicBlocks) {
System.out.print("==B" + bb.blockID);
if (getSucBlocks(bb).size() > 0)
System.out.print("-->");
for (BasicBlock suc : getSucBlocks(bb))
System.out.print(" B" + suc.blockID);
System.out.println("==");
TaintBB b = (TaintBB) bb;
if (b.preResult != null) {
System.out.print("前序分析结果:");
b.preResult.printResult();
//System.out.println("test:"+b.getResultWithTaintBit());
}
public void printSelf() {
InsnPrinter printer = new InsnPrinter(Opcodes.ASM4, System.out);
printer.setLabelOrder(getLabelOrder());
System.out
.println("======Method:" + getMethodNode().name + getMethodNode().desc + "=======");
System.out.println("=====TaintInfo: " + taintBits.taintInfo() + "===========");
for (BasicBlock bb : basicBlocks) {
System.out.print("==B" + bb.blockID);
if (getSucBlocks(bb).size() > 0)
System.out.print("-->");
for (BasicBlock suc : getSucBlocks(bb))
System.out.print(" B" + suc.blockID);
System.out.println("==");
TaintBB b = (TaintBB) bb;
if (b.preResult != null) {
System.out.print("前序分析结果:");
b.preResult.printResult();
// System.out.println("test:"+b.getResultWithTaintBit());
}
for (AbstractInsnNode an : bb.getInsn()) {
an.accept(printer);
}
}
for (AbstractInsnNode an : bb.getInsn()) {
an.accept(printer);
}
}
}
}
public TaintBB getLastBlock() {
if (basicBlocks != null && basicBlocks.size() > 0)
return (TaintBB) basicBlocks.get(basicBlocks.size() - 1);
return null;
}
public List<BasicBlock> getBlocks() {
return basicBlocks;
}
public TaintBB getLastBlock() {
if (basicBlocks != null && basicBlocks.size() > 0)
return (TaintBB) basicBlocks.get(basicBlocks.size() - 1);
return null;
}
public List<BasicBlock> getBlocks() {
return basicBlocks;
}
}

View File

@ -1,5 +1,5 @@
package org.bdware.analysis.taint;
public class TaintConfig {
public static boolean isDebug = false;
public static boolean isDebug = false;
}

View File

@ -12,166 +12,172 @@ import org.objectweb.asm.tree.analysis.AnalyzerException;
import org.objectweb.asm.tree.analysis.Interpreter;
public class TaintInterpreter extends Interpreter<TaintValue> {
TaintResult currentResult;
TaintBits taintBits;
TaintResult currentResult;
TaintBits taintBits;
public TaintInterpreter(int api) {
super(api);
public TaintInterpreter(int api) {
super(api);
}
}
@Override
public TaintValue newValue(Type type) {
if (type != null)
return new TaintValue(type.getSize());
return new TaintValue(1);
}
@Override
public TaintValue newValue(Type type) {
if (type != null)
return new TaintValue(type.getSize());
return new TaintValue(1);
}
@Override
public TaintValue newOperation(AbstractInsnNode insn) throws AnalyzerException {
TaintValue ret;
switch (insn.getOpcode()) {
case Opcodes.LCONST_0:
case Opcodes.LCONST_1:
case Opcodes.DCONST_0:
case Opcodes.DCONST_1:
ret = new TaintValue(2);
break;
case Opcodes.NEW:
TypeInsnNode typeNode = (TypeInsnNode) insn;
if (typeNode.desc.startsWith("wrp/jdk/nashorn/internal/scripts/JO")) {
ret = new HeapObject();
} else {
ret = new TaintValue(1);
}
break;
default:
ret = new TaintValue(1);
}
return ret;
}
@Override
public TaintValue newOperation(AbstractInsnNode insn) throws AnalyzerException {
TaintValue ret;
switch (insn.getOpcode()) {
case Opcodes.LCONST_0:
case Opcodes.LCONST_1:
case Opcodes.DCONST_0:
case Opcodes.DCONST_1:
ret = new TaintValue(2);
break;
case Opcodes.NEW:
TypeInsnNode typeNode = (TypeInsnNode) insn;
if (typeNode.desc.startsWith("wrp/jdk/nashorn/internal/scripts/JO")) {
ret = new HeapObject();
} else {
ret = new TaintValue(1);
}
break;
default:
ret = new TaintValue(1);
}
return ret;
}
@Override
public TaintValue copyOperation(AbstractInsnNode insn, TaintValue value) throws AnalyzerException {
return value;
}
@Override
public TaintValue copyOperation(AbstractInsnNode insn, TaintValue value)
throws AnalyzerException {
return value;
}
@Override
public TaintValue unaryOperation(AbstractInsnNode insn, TaintValue value) throws AnalyzerException {
return value;
}
@Override
public TaintValue unaryOperation(AbstractInsnNode insn, TaintValue value)
throws AnalyzerException {
return value;
}
@Override
public TaintValue binaryOperation(AbstractInsnNode insn, TaintValue value1, TaintValue value2)
throws AnalyzerException {
/*
* IALOAD, LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IADD, LADD,
* FADD, DADD, ISUB, LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV,
* DDIV, IREM, LREM, FREM, DREM, ISHL, LSHL, ISHR, LSHR, IUSHR, LUSHR, IAND,
* LAND, IOR, LOR, IXOR, LXOR, LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IF_ICMPEQ,
* IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE,
* PUTFIELD
*/
TaintValue ret = new TaintValue(1);
ret.isTainted = value1.isTainted | value2.isTainted;
switch (insn.getOpcode()) {
case Opcodes.DALOAD:
case Opcodes.DADD:
case Opcodes.DSUB:
case Opcodes.DMUL:
case Opcodes.DDIV:
case Opcodes.DREM:
case Opcodes.LALOAD:
case Opcodes.LADD:
case Opcodes.LSUB:
case Opcodes.LMUL:
case Opcodes.LDIV:
case Opcodes.LREM:
case Opcodes.LSHL:
case Opcodes.LSHR:
case Opcodes.LUSHR:
case Opcodes.LAND:
case Opcodes.LXOR:
case Opcodes.LOR:
ret.size = 2;
default:
}
return ret;
}
@Override
public TaintValue binaryOperation(AbstractInsnNode insn, TaintValue value1, TaintValue value2)
throws AnalyzerException {
/*
* IALOAD, LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IADD, LADD, FADD, DADD,
* ISUB, LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM, FREM,
* DREM, ISHL, LSHL, ISHR, LSHR, IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, LCMP,
* FCMPL, FCMPG, DCMPL, DCMPG, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT,
* IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE, PUTFIELD
*/
TaintValue ret = new TaintValue(1);
ret.isTainted = value1.isTainted | value2.isTainted;
switch (insn.getOpcode()) {
case Opcodes.DALOAD:
case Opcodes.DADD:
case Opcodes.DSUB:
case Opcodes.DMUL:
case Opcodes.DDIV:
case Opcodes.DREM:
case Opcodes.LALOAD:
case Opcodes.LADD:
case Opcodes.LSUB:
case Opcodes.LMUL:
case Opcodes.LDIV:
case Opcodes.LREM:
case Opcodes.LSHL:
case Opcodes.LSHR:
case Opcodes.LUSHR:
case Opcodes.LAND:
case Opcodes.LXOR:
case Opcodes.LOR:
ret.size = 2;
default:
}
return ret;
}
@Override
public TaintValue ternaryOperation(AbstractInsnNode insn, TaintValue value1, TaintValue value2, TaintValue value3)
throws AnalyzerException {
// TODO
value1.isTainted |= value3.isTainted;
return value1;
}
@Override
public TaintValue ternaryOperation(AbstractInsnNode insn, TaintValue value1, TaintValue value2,
TaintValue value3) throws AnalyzerException {
// TODO
value1.isTainted |= value3.isTainted;
return value1;
}
@Override
public TaintValue naryOperation(AbstractInsnNode insn, List<? extends TaintValue> values) throws AnalyzerException {
int size = 1;
/*
* INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC, INVOKEINTERFACE, MULTIANEWARRAY
* and INVOKEDYNAMIC
*/
String desc;
switch (insn.getOpcode()) {
case Opcodes.INVOKEVIRTUAL:
case Opcodes.INVOKESPECIAL:
case Opcodes.INVOKESTATIC:
case Opcodes.INVOKEINTERFACE:
desc = ((MethodInsnNode) insn).desc;
if (desc != null && (desc.charAt(desc.length() - 1) == 'D' || desc.charAt(desc.length() - 1) == 'J'))
size = 2;
break;
case Opcodes.INVOKEDYNAMIC:
desc = ((InvokeDynamicInsnNode) insn).desc;
if (desc != null && (desc.charAt(desc.length() - 1) == 'D' || desc.charAt(desc.length() - 1) == 'J'))
size = 2;
@Override
public TaintValue naryOperation(AbstractInsnNode insn, List<? extends TaintValue> values)
throws AnalyzerException {
int size = 1;
/*
* INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC, INVOKEINTERFACE, MULTIANEWARRAY and
* INVOKEDYNAMIC
*/
String desc;
switch (insn.getOpcode()) {
case Opcodes.INVOKEVIRTUAL:
case Opcodes.INVOKESPECIAL:
case Opcodes.INVOKESTATIC:
case Opcodes.INVOKEINTERFACE:
desc = ((MethodInsnNode) insn).desc;
if (desc != null && (desc.charAt(desc.length() - 1) == 'D'
|| desc.charAt(desc.length() - 1) == 'J'))
size = 2;
break;
case Opcodes.INVOKEDYNAMIC:
desc = ((InvokeDynamicInsnNode) insn).desc;
if (desc != null && (desc.charAt(desc.length() - 1) == 'D'
|| desc.charAt(desc.length() - 1) == 'J'))
size = 2;
// Extra..Judgeffff x
if (((InvokeDynamicInsnNode) insn).name.startsWith("dyn:setElem|setProp:")) {
if (values.size() == 2) {
values.get(0).isTainted |= values.get(1).isTainted;
}
}
break;
default:
}
TaintValue ret = new TaintValue(size);
for (TaintValue v : values)
if (v != null)
ret.isTainted |= v.isTainted;
if (insn instanceof InvokeDynamicInsnNode) {
long taint = (taintBits.getTaintValue(((InvokeDynamicInsnNode) insn).name + insn.hashCode()));
// Extra..Judgeffff x
if (((InvokeDynamicInsnNode) insn).name.startsWith("dyn:setElem|setProp:")) {
if (values.size() == 2) {
values.get(0).isTainted |= values.get(1).isTainted;
}
}
break;
default:
}
TaintValue ret = new TaintValue(size);
for (TaintValue v : values)
if (v != null)
ret.isTainted |= v.isTainted;
if (insn instanceof InvokeDynamicInsnNode) {
long taint = (taintBits
.getTaintValue(((InvokeDynamicInsnNode) insn).name + insn.hashCode()));
if (taint > 0L)
ret.isTainted |= taint;
}
return HeapObject.operate(insn, values, ret);
}
if (taint > 0L)
ret.isTainted |= taint;
}
return HeapObject.operate(insn, values, ret);
}
@Override
public void returnOperation(AbstractInsnNode insn, TaintValue value, TaintValue expected) throws AnalyzerException {
if (value instanceof HeapObject) {
currentResult.ret.isTainted |= ((HeapObject) value).wholeTaint();
} else if (value!=null)
currentResult.ret.isTainted |= value.isTainted;
}
@Override
public void returnOperation(AbstractInsnNode insn, TaintValue value, TaintValue expected)
throws AnalyzerException {
if (value instanceof HeapObject) {
currentResult.ret.isTainted |= ((HeapObject) value).wholeTaint();
} else if (value != null)
currentResult.ret.isTainted |= value.isTainted;
}
@Override
public TaintValue merge(TaintValue v, TaintValue w) {
TaintValue ret = new TaintValue(v.getSize());
ret.isTainted |= v.isTainted;
ret.isTainted |= w.isTainted;
return ret;
}
@Override
public TaintValue merge(TaintValue v, TaintValue w) {
TaintValue ret = new TaintValue(v.getSize());
ret.isTainted |= v.isTainted;
ret.isTainted |= w.isTainted;
return ret;
}
public void setCurrentResult(TaintResult naiveTaintResult) {
currentResult = naiveTaintResult;
}
public void setCurrentResult(TaintResult naiveTaintResult) {
currentResult = naiveTaintResult;
}
public void setTaintBits(TaintBits tb) {
taintBits = tb;
}
}
public void setTaintBits(TaintBits tb) {
taintBits = tb;
}
}

View File

@ -8,183 +8,183 @@ import org.objectweb.asm.tree.analysis.AnalyzerException;
import org.objectweb.asm.tree.analysis.Frame;
public class TaintResult extends AnalysisResult {
// public HeapObject heapObejct;
public Frame<TaintValue> frame;
public TaintValue ret;
public static int nLocals = 0;
public static int nStack = 0;
public static InsnPrinter printer = new InsnPrinter(Opcodes.ASM4, System.out);
public static TaintInterpreter interpreter = new TaintInterpreter(Opcodes.ASM4);
// public HeapObject heapObejct;
public Frame<TaintValue> frame;
public TaintValue ret;
public static int nLocals = 0;
public static int nStack = 0;
public static InsnPrinter printer = new InsnPrinter(Opcodes.ASM4, System.out);
public static TaintInterpreter interpreter = new TaintInterpreter(Opcodes.ASM4);
public TaintResult() {
frame = new Frame<>(nLocals, nStack);
ret = new TaintValue(1);
ret.isTainted = 0L;
}
public TaintResult() {
frame = new Frame<>(nLocals, nStack);
ret = new TaintValue(1);
ret.isTainted = 0L;
}
@Override
public AnalysisResult merge(AbstractInsnNode insn) {
interpreter.setCurrentResult(this);
try {
if (TaintConfig.isDebug && insn.getOpcode() >= 0) {
System.out.println("[TaintResult] frameStatus:" + frame2Str());
insn.accept(printer);
}
if (insn.getOpcode() < 0) {
// System.out.println("[TaintResult] MetLabel:" +
// insn.getClass().getCanonicalName());
} else
frame.execute(insn, interpreter);
if (TaintConfig.isDebug && insn.getOpcode() >= 0) {
System.out.println("[TaintResult] frameStatus:" + frame2Str());
@Override
public AnalysisResult merge(AbstractInsnNode insn) {
interpreter.setCurrentResult(this);
try {
if (TaintConfig.isDebug && insn.getOpcode() >= 0) {
System.out.println("[TaintResult] frameStatus:" + frame2Str());
insn.accept(printer);
}
if (insn.getOpcode() < 0) {
// System.out.println("[TaintResult] MetLabel:" +
// insn.getClass().getCanonicalName());
} else
frame.execute(insn, interpreter);
if (TaintConfig.isDebug && insn.getOpcode() >= 0) {
System.out.println("[TaintResult] frameStatus:" + frame2Str());
}
}
} catch (AnalyzerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// we use suc instead,so we don't create new object here.
return this;
}
} catch (AnalyzerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// we use suc instead,so we don't create new object here.
return this;
}
@Override
public void printResult() {
System.out.println("====" + frame2Str() + " Ret:" + ret.toString() + "====");
}
public String frame2Str() {
StringBuilder sb = new StringBuilder();
sb.append("Local:");
for (int i = 0; i < frame.getLocals(); i++) { // getLocals<EFBFBD><EFBFBD><EFBFBD><EFBFBD>local<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>size
TaintValue t = frame.getLocal(i);
if (t != null)
sb.append(t.toString());
else
sb.append("0--");
}
sb.append(" Stack:");
for (int i = 0; i < frame.getStackSize(); i++) { // getStackSize<EFBFBD><EFBFBD><EFBFBD><EFBFBD>stack<EFBFBD>ĵ<EFBFBD>ǰsize
TaintValue t = frame.getStack(i);
if (t != null)
sb.append(t.toString());
else
sb.append("0--");
}
return sb.toString();
}
@Override
public void printResult() {
System.out.println("====" + frame2Str() + " Ret:" + ret.toString() + "====");
}
private static boolean cover(TaintValue t1, TaintValue t2) {
// if (t2 == null || t2.isTainted == 0)
// return true;
// TODO whether is cover?
if (t1 != null && t1.isTainted != 0) {
if (t2 == null || t1.isTainted != t2.isTainted)
return true;
}
return false;
}
public String frame2Str() {
StringBuilder sb = new StringBuilder();
sb.append("Local:");
for (int i = 0; i < frame.getLocals(); i++) { // getLocals<EFBFBD><EFBFBD><EFBFBD><EFBFBD>local<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>size
TaintValue t = frame.getLocal(i);
if (t != null)
sb.append(t.toString());
else
sb.append("0--");
}
sb.append(" Stack:");
for (int i = 0; i < frame.getStackSize(); i++) { // getStackSize<EFBFBD><EFBFBD><EFBFBD><EFBFBD>stack<EFBFBD>ĵ<EFBFBD>ǰsize
TaintValue t = frame.getStack(i);
if (t != null)
sb.append(t.toString());
else
sb.append("0--");
}
return sb.toString();
}
/*
* private static boolean isTainted(TaintValue t1) { if (t1 != null &&
* t1.isTainted) { return true; } return false; }
*/
private static boolean isTainted(TaintValue t1) {
if (t1 != null && t1.isTainted != 0) {
return true;
}
return false;
}
private static boolean cover(TaintValue t1, TaintValue t2) {
// if (t2 == null || t2.isTainted == 0)
// return true;
// TODO whether is cover?
if (t1 != null && t1.isTainted != 0) {
if (t2 == null || t1.isTainted != t2.isTainted)
return true;
}
return false;
}
@Override
public boolean covers(AnalysisResult result) {
TaintResult tr = (TaintResult) result;
boolean ret = coversInternal(tr);
return ret;
// System.out.println("[NaiveTaintResult] Cover:" + ret);
// System.out.println("[NaiveTaintResult] " + frame.toString());
// System.out.println("[NaiveTaintResult] " + tr.frame.toString());
}
/*
* private static boolean isTainted(TaintValue t1) { if (t1 != null && t1.isTainted) { return
* true; } return false; }
*/
private static boolean isTainted(TaintValue t1) {
if (t1 != null && t1.isTainted != 0) {
return true;
}
return false;
}
// preResult cover sucResult means
// preResult's taint is large or equals sucResult.
public boolean coversInternal(TaintResult tr) {
for (int i = 0; i < frame.getLocals() && i < tr.frame.getLocals(); i++)
if (cover(tr.frame.getLocal(i), frame.getLocal(i)))
return false;
// TODO why locals is not equal??
for (int i = frame.getLocals(); i < tr.frame.getLocals(); i++)
if (isTainted(tr.frame.getLocal(i)))
return false;
for (int i = 0; i < frame.getStackSize() && i < tr.frame.getStackSize(); i++)
if (cover(tr.frame.getStack(i), frame.getStack(i)))
return false;
for (int i = frame.getStackSize(); i < tr.frame.getStackSize(); i++)
if (isTainted(tr.frame.getStack(i)))
return false;
return true;
}
@Override
public boolean covers(AnalysisResult result) {
TaintResult tr = (TaintResult) result;
boolean ret = coversInternal(tr);
return ret;
// System.out.println("[NaiveTaintResult] Cover:" + ret);
// System.out.println("[NaiveTaintResult] " + frame.toString());
// System.out.println("[NaiveTaintResult] " + tr.frame.toString());
}
@Override
public void mergeResult(AnalysisResult r) {
TaintResult from = (TaintResult) r;
for (int i = 0; i < from.frame.getLocals(); i++) {
TaintValue target = from.frame.getLocal(i);
if (frame.getLocals() > i) {
TaintValue t1 = frame.getLocal(i);
if (target != null) {
if (t1 == null) {
t1 = target.clone();
frame.setLocal(i, t1);
} else {
t1.merge(target);
}
}
} else {
frame.setLocal(i, target.clone());
}
}
// preResult cover sucResult means
// preResult's taint is large or equals sucResult.
public boolean coversInternal(TaintResult tr) {
for (int i = 0; i < frame.getLocals() && i < tr.frame.getLocals(); i++)
if (cover(tr.frame.getLocal(i), frame.getLocal(i)))
return false;
// TODO why locals is not equal??
for (int i = frame.getLocals(); i < tr.frame.getLocals(); i++)
if (isTainted(tr.frame.getLocal(i)))
return false;
for (int i = 0; i < frame.getStackSize() && i < tr.frame.getStackSize(); i++)
if (cover(tr.frame.getStack(i), frame.getStack(i)))
return false;
for (int i = frame.getStackSize(); i < tr.frame.getStackSize(); i++)
if (isTainted(tr.frame.getStack(i)))
return false;
return true;
}
for (int i = 0; i < from.frame.getStackSize(); i++) {
TaintValue target = from.frame.getStack(i);
if (frame.getStackSize() > i) {
TaintValue t1 = frame.getStack(i);
if (target != null) {
if (t1 == null) {
t1 = target.clone();
frame.setStack(i, t1);
} else {
t1.merge(target);
}
}
@Override
public void mergeResult(AnalysisResult r) {
TaintResult from = (TaintResult) r;
for (int i = 0; i < from.frame.getLocals(); i++) {
TaintValue target = from.frame.getLocal(i);
if (frame.getLocals() > i) {
TaintValue t1 = frame.getLocal(i);
if (target != null) {
if (t1 == null) {
t1 = target.clone();
frame.setLocal(i, t1);
} else {
t1.merge(target);
}
}
} else {
frame.setLocal(i, target.clone());
}
}
t1.merge(from.frame.getStack(i));
} else {
if (target != null)
frame.push(target.clone());
else
frame.push(new TaintValue(1,0));
}
}
ret.merge(from.ret);
}
for (int i = 0; i < from.frame.getStackSize(); i++) {
TaintValue target = from.frame.getStack(i);
if (frame.getStackSize() > i) {
TaintValue t1 = frame.getStack(i);
if (target != null) {
if (t1 == null) {
t1 = target.clone();
frame.setStack(i, t1);
} else {
t1.merge(target);
}
}
@Override
public AnalysisResult clone() {
TaintResult ret = new TaintResult();
ret.frame = new Frame<>(frame);
for (int i = 0; i < ret.frame.getLocals(); i++) {
TaintValue t = ret.frame.getLocal(i);
if (t != null)
ret.frame.setLocal(i, t.clone());
}
for (int i = 0; i < ret.frame.getStackSize(); i++) {
TaintValue t = ret.frame.getStack(i);
if (t != null)
ret.frame.setStack(i, t.clone());
}
ret.ret = this.ret.clone();
return ret;
}
t1.merge(from.frame.getStack(i));
} else {
if (target != null)
frame.push(target.clone());
else
frame.push(new TaintValue(1, 0));
}
}
ret.merge(from.ret);
}
@Override
public AnalysisResult clone() {
TaintResult ret = new TaintResult();
ret.frame = new Frame<>(frame);
for (int i = 0; i < ret.frame.getLocals(); i++) {
TaintValue t = ret.frame.getLocal(i);
if (t != null)
ret.frame.setLocal(i, t.clone());
}
for (int i = 0; i < ret.frame.getStackSize(); i++) {
TaintValue t = ret.frame.getStack(i);
if (t != null)
ret.frame.setStack(i, t.clone());
}
ret.ret = this.ret.clone();
return ret;
}
}

View File

@ -3,52 +3,52 @@ package org.bdware.analysis.taint;
import org.objectweb.asm.tree.analysis.Value;
public class TaintValue implements Value {
public int size;
// public boolean isTainted;
public long isTainted;
public int size;
// public boolean isTainted;
public long isTainted;
public TaintValue(int size) {
this.size = size;
isTainted = 0L;
}
public TaintValue(int size) {
this.size = size;
isTainted = 0L;
}
public TaintValue(int size, long isTainted) {
this.size = size;
this.isTainted = isTainted;
}
public TaintValue(int size, long isTainted) {
this.size = size;
this.isTainted = isTainted;
}
@Override
public int getSize() {
return size;
}
@Override
public int getSize() {
return size;
}
@Override
public String toString() {
String s = Long.toBinaryString(isTainted);
char[] c = s.toCharArray();
StringBuffer buf = new StringBuffer();
for (int i = 0; i < c.length; i++) {
if (c[i] == '1')
buf.append("1/");
else
buf.append("0/");
}
buf.append("--");
return buf.toString();
}
@Override
public String toString() {
String s = Long.toBinaryString(isTainted);
char[] c = s.toCharArray();
StringBuffer buf = new StringBuffer();
for (int i = 0; i < c.length; i++) {
if (c[i] == '1')
buf.append("1/");
else
buf.append("0/");
}
buf.append("--");
return buf.toString();
}
public TaintValue clone() {
TaintValue ret = new TaintValue(size);
ret.isTainted = isTainted;
return ret;
}
public TaintValue clone() {
TaintValue ret = new TaintValue(size);
ret.isTainted = isTainted;
return ret;
}
public String toReadableTaint() {
return TaintResult.interpreter.taintBits.parse(isTainted);
}
public String toReadableTaint() {
return TaintResult.interpreter.taintBits.parse(isTainted);
}
public void merge(TaintValue target) {
if (target != null)
isTainted |= target.isTainted;
}
public void merge(TaintValue target) {
if (target != null)
isTainted |= target.isTainted;
}
}

View File

@ -1,38 +1,30 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm;
/**
* A visitor to visit a Java annotation. The methods of this class must be
* called in the following order: ( <tt>visit</tt> | <tt>visitEnum</tt> |
* <tt>visitAnnotation</tt> | <tt>visitArray</tt> )* <tt>visitEnd</tt>.
* A visitor to visit a Java annotation. The methods of this class must be called in the following
* order: ( <tt>visit</tt> | <tt>visitEnum</tt> | <tt>visitAnnotation</tt> | <tt>visitArray</tt> )*
* <tt>visitEnd</tt>.
*
* @author Eric Bruneton
* @author Eugene Kuleshov
@ -40,23 +32,21 @@ package org.objectweb.asm;
public abstract class AnnotationVisitor {
/**
* The ASM API version implemented by this visitor. The value of this field
* must be one of {@link Opcodes#ASM4}.
* The ASM API version implemented by this visitor. The value of this field must be one of
* {@link Opcodes#ASM4}.
*/
protected final int api;
/**
* The annotation visitor to which this visitor must delegate method calls.
* May be null.
* The annotation visitor to which this visitor must delegate method calls. May be null.
*/
protected AnnotationVisitor av;
/**
* Constructs a new {@link AnnotationVisitor}.
*
* @param api
* the ASM API version implemented by this visitor. Must be one
* of {@link Opcodes#ASM4}.
* @param api the ASM API version implemented by this visitor. Must be one of
* {@link Opcodes#ASM4}.
*/
public AnnotationVisitor(final int api) {
this(api, null);
@ -65,12 +55,10 @@ public abstract class AnnotationVisitor {
/**
* Constructs a new {@link AnnotationVisitor}.
*
* @param api
* the ASM API version implemented by this visitor. Must be one
* of {@link Opcodes#ASM4}.
* @param av
* the annotation visitor to which this visitor must delegate
* method calls. May be null.
* @param api the ASM API version implemented by this visitor. Must be one of
* {@link Opcodes#ASM4}.
* @param av the annotation visitor to which this visitor must delegate method calls. May be
* null.
*/
public AnnotationVisitor(final int api, final AnnotationVisitor av) {
if (api != Opcodes.ASM4) {
@ -83,17 +71,13 @@ public abstract class AnnotationVisitor {
/**
* Visits a primitive value of the annotation.
*
* @param name
* the value name.
* @param value
* the actual value, whose type must be {@link Byte},
* {@link Boolean}, {@link Character}, {@link Short},
* {@link Integer} , {@link Long}, {@link Float}, {@link Double},
* {@link String} or {@link Type} or OBJECT or ARRAY sort. This
* value can also be an array of byte, boolean, short, char, int,
* long, float or double values (this is equivalent to using
* {@link #visitArray visitArray} and visiting each array element
* in turn, but is more convenient).
* @param name the value name.
* @param value the actual value, whose type must be {@link Byte}, {@link Boolean},
* {@link Character}, {@link Short}, {@link Integer} , {@link Long}, {@link Float},
* {@link Double}, {@link String} or {@link Type} or OBJECT or ARRAY sort. This value can
* also be an array of byte, boolean, short, char, int, long, float or double values
* (this is equivalent to using {@link #visitArray visitArray} and visiting each array
* element in turn, but is more convenient).
*/
public void visit(String name, Object value) {
if (av != null) {
@ -104,12 +88,9 @@ public abstract class AnnotationVisitor {
/**
* Visits an enumeration value of the annotation.
*
* @param name
* the value name.
* @param desc
* the class descriptor of the enumeration class.
* @param value
* the actual enumeration value.
* @param name the value name.
* @param desc the class descriptor of the enumeration class.
* @param value the actual enumeration value.
*/
public void visitEnum(String name, String desc, String value) {
if (av != null) {
@ -120,15 +101,12 @@ public abstract class AnnotationVisitor {
/**
* Visits a nested annotation value of the annotation.
*
* @param name
* the value name.
* @param desc
* the class descriptor of the nested annotation class.
* @return a visitor to visit the actual nested annotation value, or
* <tt>null</tt> if this visitor is not interested in visiting this
* nested annotation. <i>The nested annotation value must be fully
* visited before calling other methods on this annotation
* visitor</i>.
* @param name the value name.
* @param desc the class descriptor of the nested annotation class.
* @return a visitor to visit the actual nested annotation value, or <tt>null</tt> if this
* visitor is not interested in visiting this nested annotation. <i>The nested
* annotation value must be fully visited before calling other methods on this
* annotation visitor</i>.
*/
public AnnotationVisitor visitAnnotation(String name, String desc) {
if (av != null) {
@ -138,18 +116,15 @@ public abstract class AnnotationVisitor {
}
/**
* Visits an array value of the annotation. Note that arrays of primitive
* types (such as byte, boolean, short, char, int, long, float or double)
* can be passed as value to {@link #visit visit}. This is what
* {@link ClassReader} does.
* Visits an array value of the annotation. Note that arrays of primitive types (such as byte,
* boolean, short, char, int, long, float or double) can be passed as value to {@link #visit
* visit}. This is what {@link ClassReader} does.
*
* @param name
* the value name.
* @return a visitor to visit the actual array value elements, or
* <tt>null</tt> if this visitor is not interested in visiting these
* values. The 'name' parameters passed to the methods of this
* visitor are ignored. <i>All the array values must be visited
* before calling other methods on this annotation visitor</i>.
* @param name the value name.
* @return a visitor to visit the actual array value elements, or <tt>null</tt> if this visitor
* is not interested in visiting these values. The 'name' parameters passed to the
* methods of this visitor are ignored. <i>All the array values must be visited before
* calling other methods on this annotation visitor</i>.
*/
public AnnotationVisitor visitArray(String name) {
if (av != null) {

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm;
@ -35,344 +27,267 @@ package org.objectweb.asm;
* @author Eric Bruneton
* @author Eugene Kuleshov
*/
final class AnnotationWriter extends AnnotationVisitor
{
final class AnnotationWriter extends AnnotationVisitor {
/**
* The class writer to which this annotation must be added.
*/
private final ClassWriter cw;
/**
* The class writer to which this annotation must be added.
*/
private final ClassWriter cw;
/**
* The number of values in this annotation.
*/
private int size;
/**
* The number of values in this annotation.
*/
private int size;
/**
* <tt>true<tt> if values are named, <tt>false</tt> otherwise. Annotation
* writers used for annotation default and annotation arrays use unnamed
* values.
*/
private final boolean named;
/**
* <tt>true<tt> if values are named, <tt>false</tt> otherwise. Annotation writers used for
* annotation default and annotation arrays use unnamed values.
*/
private final boolean named;
/**
* The annotation values in bytecode form. This byte vector only contains
* the values themselves, i.e. the number of values must be stored as a
* unsigned short just before these bytes.
*/
private final ByteVector bv;
/**
* The annotation values in bytecode form. This byte vector only contains the values themselves,
* i.e. the number of values must be stored as a unsigned short just before these bytes.
*/
private final ByteVector bv;
/**
* The byte vector to be used to store the number of values of this
* annotation. See {@link #bv}.
*/
private final ByteVector parent;
/**
* The byte vector to be used to store the number of values of this annotation. See {@link #bv}.
*/
private final ByteVector parent;
/**
* Where the number of values of this annotation must be stored in
* {@link #parent}.
*/
private final int offset;
/**
* Where the number of values of this annotation must be stored in {@link #parent}.
*/
private final int offset;
/**
* Next annotation writer. This field is used to store annotation lists.
*/
AnnotationWriter next;
/**
* Next annotation writer. This field is used to store annotation lists.
*/
AnnotationWriter next;
/**
* Previous annotation writer. This field is used to store annotation lists.
*/
AnnotationWriter prev;
/**
* Previous annotation writer. This field is used to store annotation lists.
*/
AnnotationWriter prev;
// ------------------------------------------------------------------------
// Constructor
// ------------------------------------------------------------------------
// ------------------------------------------------------------------------
// Constructor
// ------------------------------------------------------------------------
/**
* Constructs a new {@link AnnotationWriter}.
*
* @param cw
* the class writer to which this annotation must be added.
* @param named
* <tt>true<tt> if values are named, <tt>false</tt> otherwise.
* @param bv
* where the annotation values must be stored.
* @param parent
* where the number of annotation values must be stored.
* @param offset
* where in <tt>parent</tt> the number of annotation values must
* be stored.
*/
AnnotationWriter(final ClassWriter cw, final boolean named,
final ByteVector bv, final ByteVector parent, final int offset)
{
super(Opcodes.ASM4);
this.cw = cw;
this.named = named;
this.bv = bv;
this.parent = parent;
this.offset = offset;
}
/**
* Constructs a new {@link AnnotationWriter}.
*
* @param cw the class writer to which this annotation must be added.
* @param named <tt>true<tt> if values are named, <tt>false</tt> otherwise.
* @param bv where the annotation values must be stored.
* @param parent where the number of annotation values must be stored.
* @param offset where in <tt>parent</tt> the number of annotation values must be stored.
*/
AnnotationWriter(final ClassWriter cw, final boolean named, final ByteVector bv,
final ByteVector parent, final int offset) {
super(Opcodes.ASM4);
this.cw = cw;
this.named = named;
this.bv = bv;
this.parent = parent;
this.offset = offset;
}
// ------------------------------------------------------------------------
// Implementation of the AnnotationVisitor abstract class
// ------------------------------------------------------------------------
// ------------------------------------------------------------------------
// Implementation of the AnnotationVisitor abstract class
// ------------------------------------------------------------------------
@Override
public void visit(final String name, final Object value)
{
++size;
if (named)
{
bv.putShort(cw.newUTF8(name));
}
if (value instanceof String)
{
bv.put12('s', cw.newUTF8((String) value));
}
else if (value instanceof Byte)
{
bv.put12('B', cw.newInteger(((Byte) value).byteValue()).index);
}
else if (value instanceof Boolean)
{
int v = ((Boolean) value).booleanValue() ? 1 : 0;
bv.put12('Z', cw.newInteger(v).index);
}
else if (value instanceof Character)
{
bv.put12('C', cw.newInteger(((Character) value).charValue()).index);
}
else if (value instanceof Short)
{
bv.put12('S', cw.newInteger(((Short) value).shortValue()).index);
}
else if (value instanceof Type)
{
bv.put12('c', cw.newUTF8(((Type) value).getDescriptor()));
}
else if (value instanceof byte[])
{
byte[] v = (byte[]) value;
bv.put12('[', v.length);
for (int i = 0; i < v.length; i++)
{
bv.put12('B', cw.newInteger(v[i]).index);
}
}
else if (value instanceof boolean[])
{
boolean[] v = (boolean[]) value;
bv.put12('[', v.length);
for (int i = 0; i < v.length; i++)
{
bv.put12('Z', cw.newInteger(v[i] ? 1 : 0).index);
}
}
else if (value instanceof short[])
{
short[] v = (short[]) value;
bv.put12('[', v.length);
for (int i = 0; i < v.length; i++)
{
bv.put12('S', cw.newInteger(v[i]).index);
}
}
else if (value instanceof char[])
{
char[] v = (char[]) value;
bv.put12('[', v.length);
for (int i = 0; i < v.length; i++)
{
bv.put12('C', cw.newInteger(v[i]).index);
}
}
else if (value instanceof int[])
{
int[] v = (int[]) value;
bv.put12('[', v.length);
for (int i = 0; i < v.length; i++)
{
bv.put12('I', cw.newInteger(v[i]).index);
}
}
else if (value instanceof long[])
{
long[] v = (long[]) value;
bv.put12('[', v.length);
for (int i = 0; i < v.length; i++)
{
bv.put12('J', cw.newLong(v[i]).index);
}
}
else if (value instanceof float[])
{
float[] v = (float[]) value;
bv.put12('[', v.length);
for (int i = 0; i < v.length; i++)
{
bv.put12('F', cw.newFloat(v[i]).index);
}
}
else if (value instanceof double[])
{
double[] v = (double[]) value;
bv.put12('[', v.length);
for (int i = 0; i < v.length; i++)
{
bv.put12('D', cw.newDouble(v[i]).index);
}
}
else
{
Item i = cw.newConstItem(value);
bv.put12(".s.IFJDCS".charAt(i.type), i.index);
}
}
@Override
public void visit(final String name, final Object value) {
++size;
if (named) {
bv.putShort(cw.newUTF8(name));
}
if (value instanceof String) {
bv.put12('s', cw.newUTF8((String) value));
} else if (value instanceof Byte) {
bv.put12('B', cw.newInteger(((Byte) value).byteValue()).index);
} else if (value instanceof Boolean) {
int v = ((Boolean) value).booleanValue() ? 1 : 0;
bv.put12('Z', cw.newInteger(v).index);
} else if (value instanceof Character) {
bv.put12('C', cw.newInteger(((Character) value).charValue()).index);
} else if (value instanceof Short) {
bv.put12('S', cw.newInteger(((Short) value).shortValue()).index);
} else if (value instanceof Type) {
bv.put12('c', cw.newUTF8(((Type) value).getDescriptor()));
} else if (value instanceof byte[]) {
byte[] v = (byte[]) value;
bv.put12('[', v.length);
for (int i = 0; i < v.length; i++) {
bv.put12('B', cw.newInteger(v[i]).index);
}
} else if (value instanceof boolean[]) {
boolean[] v = (boolean[]) value;
bv.put12('[', v.length);
for (int i = 0; i < v.length; i++) {
bv.put12('Z', cw.newInteger(v[i] ? 1 : 0).index);
}
} else if (value instanceof short[]) {
short[] v = (short[]) value;
bv.put12('[', v.length);
for (int i = 0; i < v.length; i++) {
bv.put12('S', cw.newInteger(v[i]).index);
}
} else if (value instanceof char[]) {
char[] v = (char[]) value;
bv.put12('[', v.length);
for (int i = 0; i < v.length; i++) {
bv.put12('C', cw.newInteger(v[i]).index);
}
} else if (value instanceof int[]) {
int[] v = (int[]) value;
bv.put12('[', v.length);
for (int i = 0; i < v.length; i++) {
bv.put12('I', cw.newInteger(v[i]).index);
}
} else if (value instanceof long[]) {
long[] v = (long[]) value;
bv.put12('[', v.length);
for (int i = 0; i < v.length; i++) {
bv.put12('J', cw.newLong(v[i]).index);
}
} else if (value instanceof float[]) {
float[] v = (float[]) value;
bv.put12('[', v.length);
for (int i = 0; i < v.length; i++) {
bv.put12('F', cw.newFloat(v[i]).index);
}
} else if (value instanceof double[]) {
double[] v = (double[]) value;
bv.put12('[', v.length);
for (int i = 0; i < v.length; i++) {
bv.put12('D', cw.newDouble(v[i]).index);
}
} else {
Item i = cw.newConstItem(value);
bv.put12(".s.IFJDCS".charAt(i.type), i.index);
}
}
@Override
public void visitEnum(final String name, final String desc,
final String value)
{
++size;
// TODO add by chq! &&name!=null;
if (named && name != null)
{
bv.putShort(cw.newUTF8(name));
}
bv.put12('e', cw.newUTF8(desc)).putShort(cw.newUTF8(value));
}
@Override
public void visitEnum(final String name, final String desc, final String value) {
++size;
// TODO add by chq! &&name!=null;
if (named && name != null) {
bv.putShort(cw.newUTF8(name));
}
bv.put12('e', cw.newUTF8(desc)).putShort(cw.newUTF8(value));
}
@Override
public AnnotationVisitor visitAnnotation(final String name,
final String desc)
{
++size;
if (named)
{
bv.putShort(cw.newUTF8(name));
}
// write tag and type, and reserve space for values count
bv.put12('@', cw.newUTF8(desc)).putShort(0);
return new AnnotationWriter(cw, true, bv, bv, bv.length - 2);
}
@Override
public AnnotationVisitor visitAnnotation(final String name, final String desc) {
++size;
if (named) {
bv.putShort(cw.newUTF8(name));
}
// write tag and type, and reserve space for values count
bv.put12('@', cw.newUTF8(desc)).putShort(0);
return new AnnotationWriter(cw, true, bv, bv, bv.length - 2);
}
@Override
public AnnotationVisitor visitArray(final String name)
{
++size;
if (named)
{
bv.putShort(cw.newUTF8(name));
}
// write tag, and reserve space for array size
bv.put12('[', 0);
return new AnnotationWriter(cw, false, bv, bv, bv.length - 2);
}
@Override
public AnnotationVisitor visitArray(final String name) {
++size;
if (named) {
bv.putShort(cw.newUTF8(name));
}
// write tag, and reserve space for array size
bv.put12('[', 0);
return new AnnotationWriter(cw, false, bv, bv, bv.length - 2);
}
@Override
public void visitEnd()
{
if (parent != null)
{
byte[] data = parent.data;
data[offset] = (byte) (size >>> 8);
data[offset + 1] = (byte) size;
}
}
@Override
public void visitEnd() {
if (parent != null) {
byte[] data = parent.data;
data[offset] = (byte) (size >>> 8);
data[offset + 1] = (byte) size;
}
}
// ------------------------------------------------------------------------
// Utility methods
// ------------------------------------------------------------------------
// ------------------------------------------------------------------------
// Utility methods
// ------------------------------------------------------------------------
/**
* Returns the size of this annotation writer list.
*
* @return the size of this annotation writer list.
*/
int getSize()
{
int size = 0;
AnnotationWriter aw = this;
while (aw != null)
{
size += aw.bv.length;
aw = aw.next;
}
return size;
}
/**
* Returns the size of this annotation writer list.
*
* @return the size of this annotation writer list.
*/
int getSize() {
int size = 0;
AnnotationWriter aw = this;
while (aw != null) {
size += aw.bv.length;
aw = aw.next;
}
return size;
}
/**
* Puts the annotations of this annotation writer list into the given byte
* vector.
*
* @param out
* where the annotations must be put.
*/
void put(final ByteVector out)
{
int n = 0;
int size = 2;
AnnotationWriter aw = this;
AnnotationWriter last = null;
while (aw != null)
{
++n;
size += aw.bv.length;
aw.visitEnd(); // in case user forgot to call visitEnd
aw.prev = last;
last = aw;
aw = aw.next;
}
out.putInt(size);
out.putShort(n);
aw = last;
while (aw != null)
{
out.putByteArray(aw.bv.data, 0, aw.bv.length);
aw = aw.prev;
}
}
/**
* Puts the annotations of this annotation writer list into the given byte vector.
*
* @param out where the annotations must be put.
*/
void put(final ByteVector out) {
int n = 0;
int size = 2;
AnnotationWriter aw = this;
AnnotationWriter last = null;
while (aw != null) {
++n;
size += aw.bv.length;
aw.visitEnd(); // in case user forgot to call visitEnd
aw.prev = last;
last = aw;
aw = aw.next;
}
out.putInt(size);
out.putShort(n);
aw = last;
while (aw != null) {
out.putByteArray(aw.bv.data, 0, aw.bv.length);
aw = aw.prev;
}
}
/**
* Puts the given annotation lists into the given byte vector.
*
* @param panns
* an array of annotation writer lists.
* @param off
* index of the first annotation to be written.
* @param out
* where the annotations must be put.
*/
static void put(final AnnotationWriter[] panns, final int off,
final ByteVector out)
{
int size = 1 + 2 * (panns.length - off);
for (int i = off; i < panns.length; ++i)
{
size += panns[i] == null ? 0 : panns[i].getSize();
}
out.putInt(size).putByte(panns.length - off);
for (int i = off; i < panns.length; ++i)
{
AnnotationWriter aw = panns[i];
AnnotationWriter last = null;
int n = 0;
while (aw != null)
{
++n;
aw.visitEnd(); // in case user forgot to call visitEnd
aw.prev = last;
last = aw;
aw = aw.next;
}
out.putShort(n);
aw = last;
while (aw != null)
{
out.putByteArray(aw.bv.data, 0, aw.bv.length);
aw = aw.prev;
}
}
}
/**
* Puts the given annotation lists into the given byte vector.
*
* @param panns an array of annotation writer lists.
* @param off index of the first annotation to be written.
* @param out where the annotations must be put.
*/
static void put(final AnnotationWriter[] panns, final int off, final ByteVector out) {
int size = 1 + 2 * (panns.length - off);
for (int i = off; i < panns.length; ++i) {
size += panns[i] == null ? 0 : panns[i].getSize();
}
out.putInt(size).putByte(panns.length - off);
for (int i = off; i < panns.length; ++i) {
AnnotationWriter aw = panns[i];
AnnotationWriter last = null;
int n = 0;
while (aw != null) {
++n;
aw.visitEnd(); // in case user forgot to call visitEnd
aw.prev = last;
last = aw;
aw = aw.next;
}
out.putShort(n);
aw = last;
while (aw != null) {
out.putByteArray(aw.bv.data, 0, aw.bv.length);
aw = aw.prev;
}
}
}
}

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm;
@ -55,16 +47,15 @@ public class Attribute {
/**
* Constructs a new empty attribute.
*
* @param type
* the type of the attribute.
* @param type the type of the attribute.
*/
protected Attribute(final String type) {
this.type = type;
}
/**
* Returns <tt>true</tt> if this type of attribute is unknown. The default
* implementation of this method always returns <tt>true</tt>.
* Returns <tt>true</tt> if this type of attribute is unknown. The default implementation of
* this method always returns <tt>true</tt>.
*
* @return <tt>true</tt> if this type of attribute is unknown.
*/
@ -84,47 +75,36 @@ public class Attribute {
/**
* Returns the labels corresponding to this attribute.
*
* @return the labels corresponding to this attribute, or <tt>null</tt> if
* this attribute is not a code attribute that contains labels.
* @return the labels corresponding to this attribute, or <tt>null</tt> if this attribute is not
* a code attribute that contains labels.
*/
protected Label[] getLabels() {
return null;
}
/**
* Reads a {@link #type type} attribute. This method must return a
* <i>new</i> {@link Attribute} object, of type {@link #type type},
* corresponding to the <tt>len</tt> bytes starting at the given offset, in
* the given class reader.
* Reads a {@link #type type} attribute. This method must return a <i>new</i> {@link Attribute}
* object, of type {@link #type type}, corresponding to the <tt>len</tt> bytes starting at the
* given offset, in the given class reader.
*
* @param cr
* the class that contains the attribute to be read.
* @param off
* index of the first byte of the attribute's content in
* {@link ClassReader#b cr.b}. The 6 attribute header bytes,
* containing the type and the length of the attribute, are not
* taken into account here.
* @param len
* the length of the attribute's content.
* @param buf
* buffer to be used to call {@link ClassReader#readUTF8
* readUTF8}, {@link ClassReader#readClass(int,char[]) readClass}
* or {@link ClassReader#readConst readConst}.
* @param codeOff
* index of the first byte of code's attribute content in
* {@link ClassReader#b cr.b}, or -1 if the attribute to be read
* is not a code attribute. The 6 attribute header bytes,
* containing the type and the length of the attribute, are not
* taken into account here.
* @param labels
* the labels of the method's code, or <tt>null</tt> if the
* attribute to be read is not a code attribute.
* @return a <i>new</i> {@link Attribute} object corresponding to the given
* bytes.
* @param cr the class that contains the attribute to be read.
* @param off index of the first byte of the attribute's content in {@link ClassReader#b cr.b}.
* The 6 attribute header bytes, containing the type and the length of the attribute, are
* not taken into account here.
* @param len the length of the attribute's content.
* @param buf buffer to be used to call {@link ClassReader#readUTF8 readUTF8},
* {@link ClassReader#readClass(int,char[]) readClass} or {@link ClassReader#readConst
* readConst}.
* @param codeOff index of the first byte of code's attribute content in {@link ClassReader#b
* cr.b}, or -1 if the attribute to be read is not a code attribute. The 6 attribute
* header bytes, containing the type and the length of the attribute, are not taken into
* account here.
* @param labels the labels of the method's code, or <tt>null</tt> if the attribute to be read
* is not a code attribute.
* @return a <i>new</i> {@link Attribute} object corresponding to the given bytes.
*/
protected Attribute read(final ClassReader cr, final int off,
final int len, final char[] buf, final int codeOff,
final Label[] labels) {
protected Attribute read(final ClassReader cr, final int off, final int len, final char[] buf,
final int codeOff, final Label[] labels) {
Attribute attr = new Attribute(type);
attr.value = new byte[len];
System.arraycopy(cr.b, off, attr.value, 0, len);
@ -134,30 +114,20 @@ public class Attribute {
/**
* Returns the byte array form of this attribute.
*
* @param cw
* the class to which this attribute must be added. This
* parameter can be used to add to the constant pool of this
* class the items that corresponds to this attribute.
* @param code
* the bytecode of the method corresponding to this code
* attribute, or <tt>null</tt> if this attribute is not a code
* attributes.
* @param len
* the length of the bytecode of the method corresponding to this
* code attribute, or <tt>null</tt> if this attribute is not a
* code attribute.
* @param maxStack
* the maximum stack size of the method corresponding to this
* code attribute, or -1 if this attribute is not a code
* attribute.
* @param maxLocals
* the maximum number of local variables of the method
* corresponding to this code attribute, or -1 if this attribute
* is not a code attribute.
* @param cw the class to which this attribute must be added. This parameter can be used to add
* to the constant pool of this class the items that corresponds to this attribute.
* @param code the bytecode of the method corresponding to this code attribute, or <tt>null</tt>
* if this attribute is not a code attributes.
* @param len the length of the bytecode of the method corresponding to this code attribute, or
* <tt>null</tt> if this attribute is not a code attribute.
* @param maxStack the maximum stack size of the method corresponding to this code attribute, or
* -1 if this attribute is not a code attribute.
* @param maxLocals the maximum number of local variables of the method corresponding to this
* code attribute, or -1 if this attribute is not a code attribute.
* @return the byte array form of this attribute.
*/
protected ByteVector write(final ClassWriter cw, final byte[] code,
final int len, final int maxStack, final int maxLocals) {
protected ByteVector write(final ClassWriter cw, final byte[] code, final int len,
final int maxStack, final int maxLocals) {
ByteVector v = new ByteVector();
v.data = value;
v.length = value.length;
@ -182,30 +152,21 @@ public class Attribute {
/**
* Returns the size of all the attributes in this attribute list.
*
* @param cw
* the class writer to be used to convert the attributes into
* byte arrays, with the {@link #write write} method.
* @param code
* the bytecode of the method corresponding to these code
* attributes, or <tt>null</tt> if these attributes are not code
* attributes.
* @param len
* the length of the bytecode of the method corresponding to
* these code attributes, or <tt>null</tt> if these attributes
* are not code attributes.
* @param maxStack
* the maximum stack size of the method corresponding to these
* code attributes, or -1 if these attributes are not code
* attributes.
* @param maxLocals
* the maximum number of local variables of the method
* corresponding to these code attributes, or -1 if these
* attributes are not code attributes.
* @return the size of all the attributes in this attribute list. This size
* includes the size of the attribute headers.
* @param cw the class writer to be used to convert the attributes into byte arrays, with the
* {@link #write write} method.
* @param code the bytecode of the method corresponding to these code attributes, or
* <tt>null</tt> if these attributes are not code attributes.
* @param len the length of the bytecode of the method corresponding to these code attributes,
* or <tt>null</tt> if these attributes are not code attributes.
* @param maxStack the maximum stack size of the method corresponding to these code attributes,
* or -1 if these attributes are not code attributes.
* @param maxLocals the maximum number of local variables of the method corresponding to these
* code attributes, or -1 if these attributes are not code attributes.
* @return the size of all the attributes in this attribute list. This size includes the size of
* the attribute headers.
*/
final int getSize(final ClassWriter cw, final byte[] code, final int len,
final int maxStack, final int maxLocals) {
final int getSize(final ClassWriter cw, final byte[] code, final int len, final int maxStack,
final int maxLocals) {
Attribute attr = this;
int size = 0;
while (attr != null) {
@ -217,33 +178,22 @@ public class Attribute {
}
/**
* Writes all the attributes of this attribute list in the given byte
* vector.
* Writes all the attributes of this attribute list in the given byte vector.
*
* @param cw
* the class writer to be used to convert the attributes into
* byte arrays, with the {@link #write write} method.
* @param code
* the bytecode of the method corresponding to these code
* attributes, or <tt>null</tt> if these attributes are not code
* attributes.
* @param len
* the length of the bytecode of the method corresponding to
* these code attributes, or <tt>null</tt> if these attributes
* are not code attributes.
* @param maxStack
* the maximum stack size of the method corresponding to these
* code attributes, or -1 if these attributes are not code
* attributes.
* @param maxLocals
* the maximum number of local variables of the method
* corresponding to these code attributes, or -1 if these
* attributes are not code attributes.
* @param out
* where the attributes must be written.
* @param cw the class writer to be used to convert the attributes into byte arrays, with the
* {@link #write write} method.
* @param code the bytecode of the method corresponding to these code attributes, or
* <tt>null</tt> if these attributes are not code attributes.
* @param len the length of the bytecode of the method corresponding to these code attributes,
* or <tt>null</tt> if these attributes are not code attributes.
* @param maxStack the maximum stack size of the method corresponding to these code attributes,
* or -1 if these attributes are not code attributes.
* @param maxLocals the maximum number of local variables of the method corresponding to these
* code attributes, or -1 if these attributes are not code attributes.
* @param out where the attributes must be written.
*/
final void put(final ClassWriter cw, final byte[] code, final int len,
final int maxStack, final int maxLocals, final ByteVector out) {
final void put(final ClassWriter cw, final byte[] code, final int len, final int maxStack,
final int maxLocals, final ByteVector out) {
Attribute attr = this;
while (attr != null) {
ByteVector b = attr.write(cw, code, len, maxStack, maxLocals);

View File

@ -1,37 +1,29 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm;
/**
* A dynamically extensible vector of bytes. This class is roughly equivalent to
* a DataOutputStream on top of a ByteArrayOutputStream, but is more efficient.
* A dynamically extensible vector of bytes. This class is roughly equivalent to a DataOutputStream
* on top of a ByteArrayOutputStream, but is more efficient.
*
* @author Eric Bruneton
*/
@ -48,30 +40,25 @@ public class ByteVector {
int length;
/**
* Constructs a new {@link ByteVector ByteVector} with a default initial
* size.
* Constructs a new {@link ByteVector ByteVector} with a default initial size.
*/
public ByteVector() {
data = new byte[64];
}
/**
* Constructs a new {@link ByteVector ByteVector} with the given initial
* size.
* Constructs a new {@link ByteVector ByteVector} with the given initial size.
*
* @param initialSize
* the initial size of the byte vector to be constructed.
* @param initialSize the initial size of the byte vector to be constructed.
*/
public ByteVector(final int initialSize) {
data = new byte[initialSize];
}
/**
* Puts a byte into this byte vector. The byte vector is automatically
* enlarged if necessary.
* Puts a byte into this byte vector. The byte vector is automatically enlarged if necessary.
*
* @param b
* a byte.
* @param b a byte.
* @return this byte vector.
*/
public ByteVector putByte(final int b) {
@ -85,13 +72,10 @@ public class ByteVector {
}
/**
* Puts two bytes into this byte vector. The byte vector is automatically
* enlarged if necessary.
* Puts two bytes into this byte vector. The byte vector is automatically enlarged if necessary.
*
* @param b1
* a byte.
* @param b2
* another byte.
* @param b1 a byte.
* @param b2 another byte.
* @return this byte vector.
*/
ByteVector put11(final int b1, final int b2) {
@ -107,11 +91,9 @@ public class ByteVector {
}
/**
* Puts a short into this byte vector. The byte vector is automatically
* enlarged if necessary.
* Puts a short into this byte vector. The byte vector is automatically enlarged if necessary.
*
* @param s
* a short.
* @param s a short.
* @return this byte vector.
*/
public ByteVector putShort(final int s) {
@ -127,13 +109,11 @@ public class ByteVector {
}
/**
* Puts a byte and a short into this byte vector. The byte vector is
* automatically enlarged if necessary.
* Puts a byte and a short into this byte vector. The byte vector is automatically enlarged if
* necessary.
*
* @param b
* a byte.
* @param s
* a short.
* @param b a byte.
* @param s a short.
* @return this byte vector.
*/
ByteVector put12(final int b, final int s) {
@ -150,11 +130,9 @@ public class ByteVector {
}
/**
* Puts an int into this byte vector. The byte vector is automatically
* enlarged if necessary.
* Puts an int into this byte vector. The byte vector is automatically enlarged if necessary.
*
* @param i
* an int.
* @param i an int.
* @return this byte vector.
*/
public ByteVector putInt(final int i) {
@ -172,11 +150,9 @@ public class ByteVector {
}
/**
* Puts a long into this byte vector. The byte vector is automatically
* enlarged if necessary.
* Puts a long into this byte vector. The byte vector is automatically enlarged if necessary.
*
* @param l
* a long.
* @param l a long.
* @return this byte vector.
*/
public ByteVector putLong(final long l) {
@ -200,11 +176,10 @@ public class ByteVector {
}
/**
* Puts an UTF8 string into this byte vector. The byte vector is
* automatically enlarged if necessary.
* Puts an UTF8 string into this byte vector. The byte vector is automatically enlarged if
* necessary.
*
* @param s
* a String whose UTF8 encoded length must be less than 65536.
* @param s a String whose UTF8 encoded length must be less than 65536.
* @return this byte vector.
*/
public ByteVector putUTF8(final String s) {
@ -272,16 +247,13 @@ public class ByteVector {
}
/**
* Puts an array of bytes into this byte vector. The byte vector is
* automatically enlarged if necessary.
* Puts an array of bytes into this byte vector. The byte vector is automatically enlarged if
* necessary.
*
* @param b
* an array of bytes. May be <tt>null</tt> to put <tt>len</tt>
* null bytes into this byte vector.
* @param off
* index of the fist byte of b that must be copied.
* @param len
* number of bytes of b that must be copied.
* @param b an array of bytes. May be <tt>null</tt> to put <tt>len</tt> null bytes into this
* byte vector.
* @param off index of the fist byte of b that must be copied.
* @param len number of bytes of b that must be copied.
* @return this byte vector.
*/
public ByteVector putByteArray(final byte[] b, final int off, final int len) {
@ -298,9 +270,7 @@ public class ByteVector {
/**
* Enlarge this byte vector so that it can receive n more bytes.
*
* @param size
* number of additional bytes that this byte vector should be
* able to receive.
* @param size number of additional bytes that this byte vector should be able to receive.
*/
private void enlarge(final int size) {
int length1 = 2 * data.length;

File diff suppressed because it is too large Load Diff

View File

@ -1,38 +1,29 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm;
/**
* A visitor to visit a Java class. The methods of this class must be called in
* the following order: <tt>visit</tt> [ <tt>visitSource</tt> ] [
* <tt>visitOuterClass</tt> ] ( <tt>visitAnnotation</tt> |
* A visitor to visit a Java class. The methods of this class must be called in the following order:
* <tt>visit</tt> [ <tt>visitSource</tt> ] [ <tt>visitOuterClass</tt> ] ( <tt>visitAnnotation</tt> |
* <tt>visitAttribute</tt> )* ( <tt>visitInnerClass</tt> | <tt>visitField</tt> |
* <tt>visitMethod</tt> )* <tt>visitEnd</tt>.
*
@ -41,23 +32,21 @@ package org.objectweb.asm;
public abstract class ClassVisitor {
/**
* The ASM API version implemented by this visitor. The value of this field
* must be one of {@link Opcodes#ASM4}.
* The ASM API version implemented by this visitor. The value of this field must be one of
* {@link Opcodes#ASM4}.
*/
protected final int api;
/**
* The class visitor to which this visitor must delegate method calls. May
* be null.
* The class visitor to which this visitor must delegate method calls. May be null.
*/
protected ClassVisitor cv;
/**
* Constructs a new {@link ClassVisitor}.
*
* @param api
* the ASM API version implemented by this visitor. Must be one
* of {@link Opcodes#ASM4}.
* @param api the ASM API version implemented by this visitor. Must be one of
* {@link Opcodes#ASM4}.
*/
public ClassVisitor(final int api) {
this(api, null);
@ -66,12 +55,9 @@ public abstract class ClassVisitor {
/**
* Constructs a new {@link ClassVisitor}.
*
* @param api
* the ASM API version implemented by this visitor. Must be one
* of {@link Opcodes#ASM4}.
* @param cv
* the class visitor to which this visitor must delegate method
* calls. May be null.
* @param api the ASM API version implemented by this visitor. Must be one of
* {@link Opcodes#ASM4}.
* @param cv the class visitor to which this visitor must delegate method calls. May be null.
*/
public ClassVisitor(final int api, final ClassVisitor cv) {
if (api != Opcodes.ASM4) {
@ -84,30 +70,21 @@ public abstract class ClassVisitor {
/**
* Visits the header of the class.
*
* @param version
* the class version.
* @param access
* the class's access flags (see {@link Opcodes}). This parameter
* also indicates if the class is deprecated.
* @param name
* the internal name of the class (see
* {@link Type#getInternalName() getInternalName}).
* @param signature
* the signature of this class. May be <tt>null</tt> if the class
* is not a generic one, and does not extend or implement generic
* classes or interfaces.
* @param superName
* the internal of name of the super class (see
* {@link Type#getInternalName() getInternalName}). For
* interfaces, the super class is {@link Object}. May be
* <tt>null</tt>, but only for the {@link Object} class.
* @param interfaces
* the internal names of the class's interfaces (see
* {@link Type#getInternalName() getInternalName}). May be
* <tt>null</tt>.
* @param version the class version.
* @param access the class's access flags (see {@link Opcodes}). This parameter also indicates
* if the class is deprecated.
* @param name the internal name of the class (see {@link Type#getInternalName()
* getInternalName}).
* @param signature the signature of this class. May be <tt>null</tt> if the class is not a
* generic one, and does not extend or implement generic classes or interfaces.
* @param superName the internal of name of the super class (see {@link Type#getInternalName()
* getInternalName}). For interfaces, the super class is {@link Object}. May be
* <tt>null</tt>, but only for the {@link Object} class.
* @param interfaces the internal names of the class's interfaces (see
* {@link Type#getInternalName() getInternalName}). May be <tt>null</tt>.
*/
public void visit(int version, int access, String name, String signature,
String superName, String[] interfaces) {
public void visit(int version, int access, String name, String signature, String superName,
String[] interfaces) {
if (cv != null) {
cv.visit(version, access, name, signature, superName, interfaces);
}
@ -116,13 +93,10 @@ public abstract class ClassVisitor {
/**
* Visits the source of the class.
*
* @param source
* the name of the source file from which the class was compiled.
* May be <tt>null</tt>.
* @param debug
* additional debug information to compute the correspondance
* between source and compiled elements of the class. May be
* <tt>null</tt>.
* @param source the name of the source file from which the class was compiled. May be
* <tt>null</tt>.
* @param debug additional debug information to compute the correspondance between source and
* compiled elements of the class. May be <tt>null</tt>.
*/
public void visitSource(String source, String debug) {
if (cv != null) {
@ -131,19 +105,14 @@ public abstract class ClassVisitor {
}
/**
* Visits the enclosing class of the class. This method must be called only
* if the class has an enclosing class.
* Visits the enclosing class of the class. This method must be called only if the class has an
* enclosing class.
*
* @param owner
* internal name of the enclosing class of the class.
* @param name
* the name of the method that contains the class, or
* <tt>null</tt> if the class is not enclosed in a method of its
* enclosing class.
* @param desc
* the descriptor of the method that contains the class, or
* <tt>null</tt> if the class is not enclosed in a method of its
* enclosing class.
* @param owner internal name of the enclosing class of the class.
* @param name the name of the method that contains the class, or <tt>null</tt> if the class is
* not enclosed in a method of its enclosing class.
* @param desc the descriptor of the method that contains the class, or <tt>null</tt> if the
* class is not enclosed in a method of its enclosing class.
*/
public void visitOuterClass(String owner, String name, String desc) {
if (cv != null) {
@ -154,12 +123,10 @@ public abstract class ClassVisitor {
/**
* Visits an annotation of the class.
*
* @param desc
* the class descriptor of the annotation class.
* @param visible
* <tt>true</tt> if the annotation is visible at runtime.
* @return a visitor to visit the annotation values, or <tt>null</tt> if
* this visitor is not interested in visiting this annotation.
* @param desc the class descriptor of the annotation class.
* @param visible <tt>true</tt> if the annotation is visible at runtime.
* @return a visitor to visit the annotation values, or <tt>null</tt> if this visitor is not
* interested in visiting this annotation.
*/
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
if (cv != null) {
@ -171,8 +138,7 @@ public abstract class ClassVisitor {
/**
* Visits a non standard attribute of the class.
*
* @param attr
* an attribute.
* @param attr an attribute.
*/
public void visitAttribute(Attribute attr) {
if (cv != null) {
@ -181,25 +147,20 @@ public abstract class ClassVisitor {
}
/**
* Visits information about an inner class. This inner class is not
* necessarily a member of the class being visited.
* Visits information about an inner class. This inner class is not necessarily a member of the
* class being visited.
*
* @param name
* the internal name of an inner class (see
* {@link Type#getInternalName() getInternalName}).
* @param outerName
* the internal name of the class to which the inner class
* belongs (see {@link Type#getInternalName() getInternalName}).
* May be <tt>null</tt> for not member classes.
* @param innerName
* the (simple) name of the inner class inside its enclosing
* class. May be <tt>null</tt> for anonymous inner classes.
* @param access
* the access flags of the inner class as originally declared in
* the enclosing class.
* @param name the internal name of an inner class (see {@link Type#getInternalName()
* getInternalName}).
* @param outerName the internal name of the class to which the inner class belongs (see
* {@link Type#getInternalName() getInternalName}). May be <tt>null</tt> for not member
* classes.
* @param innerName the (simple) name of the inner class inside its enclosing class. May be
* <tt>null</tt> for anonymous inner classes.
* @param access the access flags of the inner class as originally declared in the enclosing
* class.
*/
public void visitInnerClass(String name, String outerName,
String innerName, int access) {
public void visitInnerClass(String name, String outerName, String innerName, int access) {
if (cv != null) {
cv.visitInnerClass(name, outerName, innerName, access);
}
@ -208,32 +169,23 @@ public abstract class ClassVisitor {
/**
* Visits a field of the class.
*
* @param access
* the field's access flags (see {@link Opcodes}). This parameter
* also indicates if the field is synthetic and/or deprecated.
* @param name
* the field's name.
* @param desc
* the field's descriptor (see {@link Type Type}).
* @param signature
* the field's signature. May be <tt>null</tt> if the field's
* type does not use generic types.
* @param value
* the field's initial value. This parameter, which may be
* <tt>null</tt> if the field does not have an initial value,
* must be an {@link Integer}, a {@link Float}, a {@link Long}, a
* {@link Double} or a {@link String} (for <tt>int</tt>,
* <tt>float</tt>, <tt>long</tt> or <tt>String</tt> fields
* respectively). <i>This parameter is only used for static
* fields</i>. Its value is ignored for non static fields, which
* must be initialized through bytecode instructions in
* constructors or methods.
* @return a visitor to visit field annotations and attributes, or
* <tt>null</tt> if this class visitor is not interested in visiting
* these annotations and attributes.
* @param access the field's access flags (see {@link Opcodes}). This parameter also indicates
* if the field is synthetic and/or deprecated.
* @param name the field's name.
* @param desc the field's descriptor (see {@link Type Type}).
* @param signature the field's signature. May be <tt>null</tt> if the field's type does not use
* generic types.
* @param value the field's initial value. This parameter, which may be <tt>null</tt> if the
* field does not have an initial value, must be an {@link Integer}, a {@link Float}, a
* {@link Long}, a {@link Double} or a {@link String} (for <tt>int</tt>, <tt>float</tt>,
* <tt>long</tt> or <tt>String</tt> fields respectively). <i>This parameter is only used
* for static fields</i>. Its value is ignored for non static fields, which must be
* initialized through bytecode instructions in constructors or methods.
* @return a visitor to visit field annotations and attributes, or <tt>null</tt> if this class
* visitor is not interested in visiting these annotations and attributes.
*/
public FieldVisitor visitField(int access, String name, String desc,
String signature, Object value) {
public FieldVisitor visitField(int access, String name, String desc, String signature,
Object value) {
if (cv != null) {
return cv.visitField(access, name, desc, signature, value);
}
@ -241,32 +193,23 @@ public abstract class ClassVisitor {
}
/**
* Visits a method of the class. This method <i>must</i> return a new
* {@link MethodVisitor} instance (or <tt>null</tt>) each time it is called,
* i.e., it should not return a previously returned visitor.
* Visits a method of the class. This method <i>must</i> return a new {@link MethodVisitor}
* instance (or <tt>null</tt>) each time it is called, i.e., it should not return a previously
* returned visitor.
*
* @param access
* the method's access flags (see {@link Opcodes}). This
* parameter also indicates if the method is synthetic and/or
* deprecated.
* @param name
* the method's name.
* @param desc
* the method's descriptor (see {@link Type Type}).
* @param signature
* the method's signature. May be <tt>null</tt> if the method
* parameters, return type and exceptions do not use generic
* types.
* @param exceptions
* the internal names of the method's exception classes (see
* {@link Type#getInternalName() getInternalName}). May be
* <tt>null</tt>.
* @return an object to visit the byte code of the method, or <tt>null</tt>
* if this class visitor is not interested in visiting the code of
* this method.
* @param access the method's access flags (see {@link Opcodes}). This parameter also indicates
* if the method is synthetic and/or deprecated.
* @param name the method's name.
* @param desc the method's descriptor (see {@link Type Type}).
* @param signature the method's signature. May be <tt>null</tt> if the method parameters,
* return type and exceptions do not use generic types.
* @param exceptions the internal names of the method's exception classes (see
* {@link Type#getInternalName() getInternalName}). May be <tt>null</tt>.
* @return an object to visit the byte code of the method, or <tt>null</tt> if this class
* visitor is not interested in visiting the code of this method.
*/
public MethodVisitor visitMethod(int access, String name, String desc,
String signature, String[] exceptions) {
public MethodVisitor visitMethod(int access, String name, String desc, String signature,
String[] exceptions) {
if (cv != null) {
return cv.visitMethod(access, name, desc, signature, exceptions);
}
@ -274,9 +217,8 @@ public abstract class ClassVisitor {
}
/**
* Visits the end of the class. This method, which is the last one to be
* called, is used to inform the visitor that all the fields and methods of
* the class have been visited.
* Visits the end of the class. This method, which is the last one to be called, is used to
* inform the visitor that all the fields and methods of the class have been visited.
*/
public void visitEnd() {
if (cv != null) {

File diff suppressed because it is too large Load Diff

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm;
@ -88,8 +80,8 @@ class Context {
int localCount;
/**
* The number locals in the latest stack map frame that has been parsed,
* minus the number of locals in the previous frame.
* The number locals in the latest stack map frame that has been parsed, minus the number of
* locals in the previous frame.
*/
int localDiff;
@ -107,4 +99,4 @@ class Context {
* The stack values of the latest stack map frame that has been parsed.
*/
Object[] stack;
}
}

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm;
@ -42,23 +34,20 @@ class Edge {
static final int NORMAL = 0;
/**
* Denotes a control flow graph edge corresponding to an exception handler.
* More precisely any {@link Edge} whose {@link #info} is strictly positive
* corresponds to an exception handler. The actual value of {@link #info} is
* the index, in the {@link ClassWriter} type table, of the exception that
* is catched.
* Denotes a control flow graph edge corresponding to an exception handler. More precisely any
* {@link Edge} whose {@link #info} is strictly positive corresponds to an exception handler.
* The actual value of {@link #info} is the index, in the {@link ClassWriter} type table, of the
* exception that is catched.
*/
static final int EXCEPTION = 0x7FFFFFFF;
/**
* Information about this control flow graph edge. If
* {@link ClassWriter#COMPUTE_MAXS} is used this field is the (relative)
* stack size in the basic block from which this edge originates. This size
* is equal to the stack size at the "jump" instruction to which this edge
* corresponds, relatively to the stack size at the beginning of the
* originating basic block. If {@link ClassWriter#COMPUTE_FRAMES} is used,
* this field is the kind of this control flow graph edge (i.e. NORMAL or
* EXCEPTION).
* Information about this control flow graph edge. If {@link ClassWriter#COMPUTE_MAXS} is used
* this field is the (relative) stack size in the basic block from which this edge originates.
* This size is equal to the stack size at the "jump" instruction to which this edge
* corresponds, relatively to the stack size at the beginning of the originating basic block. If
* {@link ClassWriter#COMPUTE_FRAMES} is used, this field is the kind of this control flow graph
* edge (i.e. NORMAL or EXCEPTION).
*/
int info;
@ -68,8 +57,8 @@ class Edge {
Label successor;
/**
* The next edge in the list of successors of the originating basic block.
* See {@link Label#successors successors}.
* The next edge in the list of successors of the originating basic block. See
* {@link Label#successors successors}.
*/
Edge next;
}

View File

@ -1,61 +1,50 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm;
/**
* A visitor to visit a Java field. The methods of this class must be called in
* the following order: ( <tt>visitAnnotation</tt> | <tt>visitAttribute</tt> )*
* <tt>visitEnd</tt>.
* A visitor to visit a Java field. The methods of this class must be called in the following order:
* ( <tt>visitAnnotation</tt> | <tt>visitAttribute</tt> )* <tt>visitEnd</tt>.
*
* @author Eric Bruneton
*/
public abstract class FieldVisitor {
/**
* The ASM API version implemented by this visitor. The value of this field
* must be one of {@link Opcodes#ASM4}.
* The ASM API version implemented by this visitor. The value of this field must be one of
* {@link Opcodes#ASM4}.
*/
protected final int api;
/**
* The field visitor to which this visitor must delegate method calls. May
* be null.
* The field visitor to which this visitor must delegate method calls. May be null.
*/
protected FieldVisitor fv;
/**
* Constructs a new {@link FieldVisitor}.
*
* @param api
* the ASM API version implemented by this visitor. Must be one
* of {@link Opcodes#ASM4}.
* @param api the ASM API version implemented by this visitor. Must be one of
* {@link Opcodes#ASM4}.
*/
public FieldVisitor(final int api) {
this(api, null);
@ -64,12 +53,9 @@ public abstract class FieldVisitor {
/**
* Constructs a new {@link FieldVisitor}.
*
* @param api
* the ASM API version implemented by this visitor. Must be one
* of {@link Opcodes#ASM4}.
* @param fv
* the field visitor to which this visitor must delegate method
* calls. May be null.
* @param api the ASM API version implemented by this visitor. Must be one of
* {@link Opcodes#ASM4}.
* @param fv the field visitor to which this visitor must delegate method calls. May be null.
*/
public FieldVisitor(final int api, final FieldVisitor fv) {
if (api != Opcodes.ASM4) {
@ -82,12 +68,10 @@ public abstract class FieldVisitor {
/**
* Visits an annotation of the field.
*
* @param desc
* the class descriptor of the annotation class.
* @param visible
* <tt>true</tt> if the annotation is visible at runtime.
* @return a visitor to visit the annotation values, or <tt>null</tt> if
* this visitor is not interested in visiting this annotation.
* @param desc the class descriptor of the annotation class.
* @param visible <tt>true</tt> if the annotation is visible at runtime.
* @return a visitor to visit the annotation values, or <tt>null</tt> if this visitor is not
* interested in visiting this annotation.
*/
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
if (fv != null) {
@ -99,8 +83,7 @@ public abstract class FieldVisitor {
/**
* Visits a non standard attribute of the field.
*
* @param attr
* an attribute.
* @param attr an attribute.
*/
public void visitAttribute(Attribute attr) {
if (fv != null) {
@ -109,9 +92,8 @@ public abstract class FieldVisitor {
}
/**
* Visits the end of the field. This method, which is the last one to be
* called, is used to inform the visitor that all the annotations and
* attributes of the field have been visited.
* Visits the end of the field. This method, which is the last one to be called, is used to
* inform the visitor that all the annotations and attributes of the field have been visited.
*/
public void visitEnd() {
if (fv != null) {

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm;
@ -47,26 +39,22 @@ final class FieldWriter extends FieldVisitor {
private final int access;
/**
* The index of the constant pool item that contains the name of this
* method.
* The index of the constant pool item that contains the name of this method.
*/
private final int name;
/**
* The index of the constant pool item that contains the descriptor of this
* field.
* The index of the constant pool item that contains the descriptor of this field.
*/
private final int desc;
/**
* The index of the constant pool item that contains the signature of this
* field.
* The index of the constant pool item that contains the signature of this field.
*/
private int signature;
/**
* The index of the constant pool item that contains the constant value of
* this field.
* The index of the constant pool item that contains the constant value of this field.
*/
private int value;
@ -92,21 +80,15 @@ final class FieldWriter extends FieldVisitor {
/**
* Constructs a new {@link FieldWriter}.
*
* @param cw
* the class writer to which this field must be added.
* @param access
* the field's access flags (see {@link Opcodes}).
* @param name
* the field's name.
* @param desc
* the field's descriptor (see {@link Type}).
* @param signature
* the field's signature. May be <tt>null</tt>.
* @param value
* the field's constant value. May be <tt>null</tt>.
* @param cw the class writer to which this field must be added.
* @param access the field's access flags (see {@link Opcodes}).
* @param name the field's name.
* @param desc the field's descriptor (see {@link Type}).
* @param signature the field's signature. May be <tt>null</tt>.
* @param value the field's constant value. May be <tt>null</tt>.
*/
FieldWriter(final ClassWriter cw, final int access, final String name,
final String desc, final String signature, final Object value) {
FieldWriter(final ClassWriter cw, final int access, final String name, final String desc,
final String signature, final Object value) {
super(Opcodes.ASM4);
if (cw.firstField == null) {
cw.firstField = this;
@ -131,8 +113,7 @@ final class FieldWriter extends FieldVisitor {
// ------------------------------------------------------------------------
@Override
public AnnotationVisitor visitAnnotation(final String desc,
final boolean visible) {
public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
if (!ClassReader.ANNOTATIONS) {
return null;
}
@ -157,8 +138,7 @@ final class FieldWriter extends FieldVisitor {
}
@Override
public void visitEnd() {
}
public void visitEnd() {}
// ------------------------------------------------------------------------
// Utility methods
@ -207,8 +187,7 @@ final class FieldWriter extends FieldVisitor {
/**
* Puts the content of this field into the given byte vector.
*
* @param out
* where the content of this field must be put.
* @param out where the content of this field must be put.
*/
void put(final ByteVector out) {
final int FACTOR = ClassWriter.TO_ACC_SYNTHETIC;

File diff suppressed because it is too large Load Diff

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm;
@ -39,9 +31,8 @@ package org.objectweb.asm;
public final class Handle {
/**
* The kind of field or method designated by this Handle. Should be
* {@link Opcodes#H_GETFIELD}, {@link Opcodes#H_GETSTATIC},
* {@link Opcodes#H_PUTFIELD}, {@link Opcodes#H_PUTSTATIC},
* The kind of field or method designated by this Handle. Should be {@link Opcodes#H_GETFIELD},
* {@link Opcodes#H_GETSTATIC}, {@link Opcodes#H_PUTFIELD}, {@link Opcodes#H_PUTSTATIC},
* {@link Opcodes#H_INVOKEVIRTUAL}, {@link Opcodes#H_INVOKESTATIC},
* {@link Opcodes#H_INVOKESPECIAL}, {@link Opcodes#H_NEWINVOKESPECIAL} or
* {@link Opcodes#H_INVOKEINTERFACE}.
@ -49,8 +40,7 @@ public final class Handle {
final int tag;
/**
* The internal name of the class that owns the field or method designated
* by this handle.
* The internal name of the class that owns the field or method designated by this handle.
*/
final String owner;
@ -67,23 +57,15 @@ public final class Handle {
/**
* Constructs a new field or method handle.
*
* @param tag
* the kind of field or method designated by this Handle. Must be
* {@link Opcodes#H_GETFIELD}, {@link Opcodes#H_GETSTATIC},
* {@link Opcodes#H_PUTFIELD}, {@link Opcodes#H_PUTSTATIC},
* {@link Opcodes#H_INVOKEVIRTUAL},
* {@link Opcodes#H_INVOKESTATIC},
* {@link Opcodes#H_INVOKESPECIAL},
* {@link Opcodes#H_NEWINVOKESPECIAL} or
* {@link Opcodes#H_INVOKEINTERFACE}.
* @param owner
* the internal name of the class that owns the field or method
* designated by this handle.
* @param name
* the name of the field or method designated by this handle.
* @param desc
* the descriptor of the field or method designated by this
* handle.
* @param tag the kind of field or method designated by this Handle. Must be
* {@link Opcodes#H_GETFIELD}, {@link Opcodes#H_GETSTATIC}, {@link Opcodes#H_PUTFIELD},
* {@link Opcodes#H_PUTSTATIC}, {@link Opcodes#H_INVOKEVIRTUAL},
* {@link Opcodes#H_INVOKESTATIC}, {@link Opcodes#H_INVOKESPECIAL},
* {@link Opcodes#H_NEWINVOKESPECIAL} or {@link Opcodes#H_INVOKEINTERFACE}.
* @param owner the internal name of the class that owns the field or method designated by this
* handle.
* @param name the name of the field or method designated by this handle.
* @param desc the descriptor of the field or method designated by this handle.
*/
public Handle(int tag, String owner, String name, String desc) {
this.tag = tag;
@ -95,23 +77,21 @@ public final class Handle {
/**
* Returns the kind of field or method designated by this handle.
*
* @return {@link Opcodes#H_GETFIELD}, {@link Opcodes#H_GETSTATIC},
* {@link Opcodes#H_PUTFIELD}, {@link Opcodes#H_PUTSTATIC},
* {@link Opcodes#H_INVOKEVIRTUAL}, {@link Opcodes#H_INVOKESTATIC},
* {@link Opcodes#H_INVOKESPECIAL},
* {@link Opcodes#H_NEWINVOKESPECIAL} or
* {@link Opcodes#H_INVOKEINTERFACE}.
* @return {@link Opcodes#H_GETFIELD}, {@link Opcodes#H_GETSTATIC}, {@link Opcodes#H_PUTFIELD},
* {@link Opcodes#H_PUTSTATIC}, {@link Opcodes#H_INVOKEVIRTUAL},
* {@link Opcodes#H_INVOKESTATIC}, {@link Opcodes#H_INVOKESPECIAL},
* {@link Opcodes#H_NEWINVOKESPECIAL} or {@link Opcodes#H_INVOKEINTERFACE}.
*/
public int getTag() {
return tag;
}
/**
* Returns the internal name of the class that owns the field or method
* designated by this handle.
* Returns the internal name of the class that owns the field or method designated by this
* handle.
*
* @return the internal name of the class that owns the field or method
* designated by this handle.
* @return the internal name of the class that owns the field or method designated by this
* handle.
*/
public String getOwner() {
return owner;
@ -144,8 +124,7 @@ public final class Handle {
return false;
}
Handle h = (Handle) obj;
return tag == h.tag && owner.equals(h.owner) && name.equals(h.name)
&& desc.equals(h.desc);
return tag == h.tag && owner.equals(h.owner) && name.equals(h.name) && desc.equals(h.desc);
}
@Override
@ -154,8 +133,7 @@ public final class Handle {
}
/**
* Returns the textual representation of this handle. The textual
* representation is:
* Returns the textual representation of this handle. The textual representation is:
*
* <pre>
* owner '.' name desc ' ' '(' tag ')'

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm;
@ -52,14 +44,14 @@ class Handler {
Label handler;
/**
* Internal name of the type of exceptions handled by this handler, or
* <tt>null</tt> to catch any exceptions.
* Internal name of the type of exceptions handled by this handler, or <tt>null</tt> to catch
* any exceptions.
*/
String desc;
/**
* Constant pool index of the internal name of the type of exceptions
* handled by this handler, or 0 to catch any exceptions.
* Constant pool index of the internal name of the type of exceptions handled by this handler,
* or 0 to catch any exceptions.
*/
int type;
@ -69,15 +61,11 @@ class Handler {
Handler next;
/**
* Removes the range between start and end from the given exception
* handlers.
* Removes the range between start and end from the given exception handlers.
*
* @param h
* an exception handler list.
* @param start
* the start of the range to be removed.
* @param end
* the end of the range to be removed. Maybe null.
* @param h an exception handler list.
* @param start the start of the range to be removed.
* @param end the end of the range to be removed. Maybe null.
* @return the exception handler list with the start-end range removed.
*/
static Handler remove(Handler h, Label start, Label end) {

View File

@ -1,37 +1,29 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm;
/**
* A constant pool item. Constant pool items can be created with the 'newXXX'
* methods in the {@link ClassWriter} class.
* A constant pool item. Constant pool items can be created with the 'newXXX' methods in the
* {@link ClassWriter} class.
*
* @author Eric Bruneton
*/
@ -43,25 +35,21 @@ final class Item {
int index;
/**
* Type of this constant pool item. A single class is used to represent all
* constant pool item types, in order to minimize the bytecode size of this
* package. The value of this field is one of {@link ClassWriter#INT},
* {@link ClassWriter#LONG}, {@link ClassWriter#FLOAT},
* {@link ClassWriter#DOUBLE}, {@link ClassWriter#UTF8},
* {@link ClassWriter#STR}, {@link ClassWriter#CLASS},
* {@link ClassWriter#NAME_TYPE}, {@link ClassWriter#FIELD},
* {@link ClassWriter#METH}, {@link ClassWriter#IMETH},
* {@link ClassWriter#MTYPE}, {@link ClassWriter#INDY}.
* Type of this constant pool item. A single class is used to represent all constant pool item
* types, in order to minimize the bytecode size of this package. The value of this field is one
* of {@link ClassWriter#INT}, {@link ClassWriter#LONG}, {@link ClassWriter#FLOAT},
* {@link ClassWriter#DOUBLE}, {@link ClassWriter#UTF8}, {@link ClassWriter#STR},
* {@link ClassWriter#CLASS}, {@link ClassWriter#NAME_TYPE}, {@link ClassWriter#FIELD},
* {@link ClassWriter#METH}, {@link ClassWriter#IMETH}, {@link ClassWriter#MTYPE},
* {@link ClassWriter#INDY}.
*
* MethodHandle constant 9 variations are stored using a range of 9 values
* from {@link ClassWriter#HANDLE_BASE} + 1 to
* {@link ClassWriter#HANDLE_BASE} + 9.
* MethodHandle constant 9 variations are stored using a range of 9 values from
* {@link ClassWriter#HANDLE_BASE} + 1 to {@link ClassWriter#HANDLE_BASE} + 9.
*
* Special Item types are used for Items that are stored in the ClassWriter
* {@link ClassWriter#typeTable}, instead of the constant pool, in order to
* avoid clashes with normal constant pool items in the ClassWriter constant
* pool's hash table. These special item types are
* {@link ClassWriter#TYPE_NORMAL}, {@link ClassWriter#TYPE_UNINIT} and
* {@link ClassWriter#typeTable}, instead of the constant pool, in order to avoid clashes with
* normal constant pool items in the ClassWriter constant pool's hash table. These special item
* types are {@link ClassWriter#TYPE_NORMAL}, {@link ClassWriter#TYPE_UNINIT} and
* {@link ClassWriter#TYPE_MERGED}.
*/
int type;
@ -77,20 +65,17 @@ final class Item {
long longVal;
/**
* First part of the value of this item, for items that do not hold a
* primitive value.
* First part of the value of this item, for items that do not hold a primitive value.
*/
String strVal1;
/**
* Second part of the value of this item, for items that do not hold a
* primitive value.
* Second part of the value of this item, for items that do not hold a primitive value.
*/
String strVal2;
/**
* Third part of the value of this item, for items that do not hold a
* primitive value.
* Third part of the value of this item, for items that do not hold a primitive value.
*/
String strVal3;
@ -100,23 +85,20 @@ final class Item {
int hashCode;
/**
* Link to another constant pool item, used for collision lists in the
* constant pool's hash table.
* Link to another constant pool item, used for collision lists in the constant pool's hash
* table.
*/
Item next;
/**
* Constructs an uninitialized {@link Item}.
*/
Item() {
}
Item() {}
/**
* Constructs an uninitialized {@link Item} for constant pool element at
* given position.
* Constructs an uninitialized {@link Item} for constant pool element at given position.
*
* @param index
* index of the item to be constructed.
* @param index index of the item to be constructed.
*/
Item(final int index) {
this.index = index;
@ -125,10 +107,8 @@ final class Item {
/**
* Constructs a copy of the given item.
*
* @param index
* index of the item to be constructed.
* @param i
* the item that must be copied into the item to be constructed.
* @param index index of the item to be constructed.
* @param i the item that must be copied into the item to be constructed.
*/
Item(final int index, final Item i) {
this.index = index;
@ -144,8 +124,7 @@ final class Item {
/**
* Sets this item to an integer item.
*
* @param intVal
* the value of this item.
* @param intVal the value of this item.
*/
void set(final int intVal) {
this.type = ClassWriter.INT;
@ -156,8 +135,7 @@ final class Item {
/**
* Sets this item to a long item.
*
* @param longVal
* the value of this item.
* @param longVal the value of this item.
*/
void set(final long longVal) {
this.type = ClassWriter.LONG;
@ -168,8 +146,7 @@ final class Item {
/**
* Sets this item to a float item.
*
* @param floatVal
* the value of this item.
* @param floatVal the value of this item.
*/
void set(final float floatVal) {
this.type = ClassWriter.FLOAT;
@ -180,8 +157,7 @@ final class Item {
/**
* Sets this item to a double item.
*
* @param doubleVal
* the value of this item.
* @param doubleVal the value of this item.
*/
void set(final double doubleVal) {
this.type = ClassWriter.DOUBLE;
@ -192,72 +168,60 @@ final class Item {
/**
* Sets this item to an item that do not hold a primitive value.
*
* @param type
* the type of this item.
* @param strVal1
* first part of the value of this item.
* @param strVal2
* second part of the value of this item.
* @param strVal3
* third part of the value of this item.
* @param type the type of this item.
* @param strVal1 first part of the value of this item.
* @param strVal2 second part of the value of this item.
* @param strVal3 third part of the value of this item.
*/
void set(final int type, final String strVal1, final String strVal2,
final String strVal3) {
void set(final int type, final String strVal1, final String strVal2, final String strVal3) {
this.type = type;
this.strVal1 = strVal1;
this.strVal2 = strVal2;
this.strVal3 = strVal3;
switch (type) {
case ClassWriter.UTF8:
case ClassWriter.STR:
case ClassWriter.CLASS:
case ClassWriter.MTYPE:
case ClassWriter.TYPE_NORMAL:
hashCode = 0x7FFFFFFF & (type + strVal1.hashCode());
return;
case ClassWriter.NAME_TYPE: {
hashCode = 0x7FFFFFFF & (type + strVal1.hashCode()
* strVal2.hashCode());
return;
}
// ClassWriter.FIELD:
// ClassWriter.METH:
// ClassWriter.IMETH:
// ClassWriter.HANDLE_BASE + 1..9
default:
hashCode = 0x7FFFFFFF & (type + strVal1.hashCode()
* strVal2.hashCode() * strVal3.hashCode());
case ClassWriter.UTF8:
case ClassWriter.STR:
case ClassWriter.CLASS:
case ClassWriter.MTYPE:
case ClassWriter.TYPE_NORMAL:
hashCode = 0x7FFFFFFF & (type + strVal1.hashCode());
return;
case ClassWriter.NAME_TYPE: {
hashCode = 0x7FFFFFFF & (type + strVal1.hashCode() * strVal2.hashCode());
return;
}
// ClassWriter.FIELD:
// ClassWriter.METH:
// ClassWriter.IMETH:
// ClassWriter.HANDLE_BASE + 1..9
default:
hashCode = 0x7FFFFFFF
& (type + strVal1.hashCode() * strVal2.hashCode() * strVal3.hashCode());
}
}
/**
* Sets the item to an InvokeDynamic item.
*
* @param name
* invokedynamic's name.
* @param desc
* invokedynamic's desc.
* @param bsmIndex
* zero based index into the class attribute BootrapMethods.
* @param name invokedynamic's name.
* @param desc invokedynamic's desc.
* @param bsmIndex zero based index into the class attribute BootrapMethods.
*/
void set(String name, String desc, int bsmIndex) {
this.type = ClassWriter.INDY;
this.longVal = bsmIndex;
this.strVal1 = name;
this.strVal2 = desc;
this.hashCode = 0x7FFFFFFF & (ClassWriter.INDY + bsmIndex
* strVal1.hashCode() * strVal2.hashCode());
this.hashCode = 0x7FFFFFFF
& (ClassWriter.INDY + bsmIndex * strVal1.hashCode() * strVal2.hashCode());
}
/**
* Sets the item to a BootstrapMethod item.
*
* @param position
* position in byte in the class attribute BootrapMethods.
* @param hashCode
* hashcode of the item. This hashcode is processed from the
* hashcode of the bootstrap method and the hashcode of all
* bootstrap arguments.
* @param position position in byte in the class attribute BootrapMethods.
* @param hashCode hashcode of the item. This hashcode is processed from the hashcode of the
* bootstrap method and the hashcode of all bootstrap arguments.
*/
void set(int position, int hashCode) {
this.type = ClassWriter.BSM;
@ -266,45 +230,42 @@ final class Item {
}
/**
* Indicates if the given item is equal to this one. <i>This method assumes
* that the two items have the same {@link #type}</i>.
* Indicates if the given item is equal to this one. <i>This method assumes that the two items
* have the same {@link #type}</i>.
*
* @param i
* the item to be compared to this one. Both items must have the
* same {@link #type}.
* @return <tt>true</tt> if the given item if equal to this one,
* <tt>false</tt> otherwise.
* @param i the item to be compared to this one. Both items must have the same {@link #type}.
* @return <tt>true</tt> if the given item if equal to this one, <tt>false</tt> otherwise.
*/
boolean isEqualTo(final Item i) {
switch (type) {
case ClassWriter.UTF8:
case ClassWriter.STR:
case ClassWriter.CLASS:
case ClassWriter.MTYPE:
case ClassWriter.TYPE_NORMAL:
return i.strVal1.equals(strVal1);
case ClassWriter.TYPE_MERGED:
case ClassWriter.LONG:
case ClassWriter.DOUBLE:
return i.longVal == longVal;
case ClassWriter.INT:
case ClassWriter.FLOAT:
return i.intVal == intVal;
case ClassWriter.TYPE_UNINIT:
return i.intVal == intVal && i.strVal1.equals(strVal1);
case ClassWriter.NAME_TYPE:
return i.strVal1.equals(strVal1) && i.strVal2.equals(strVal2);
case ClassWriter.INDY: {
return i.longVal == longVal && i.strVal1.equals(strVal1)
&& i.strVal2.equals(strVal2);
}
// case ClassWriter.FIELD:
// case ClassWriter.METH:
// case ClassWriter.IMETH:
// case ClassWriter.HANDLE_BASE + 1..9
default:
return i.strVal1.equals(strVal1) && i.strVal2.equals(strVal2)
&& i.strVal3.equals(strVal3);
case ClassWriter.UTF8:
case ClassWriter.STR:
case ClassWriter.CLASS:
case ClassWriter.MTYPE:
case ClassWriter.TYPE_NORMAL:
return i.strVal1.equals(strVal1);
case ClassWriter.TYPE_MERGED:
case ClassWriter.LONG:
case ClassWriter.DOUBLE:
return i.longVal == longVal;
case ClassWriter.INT:
case ClassWriter.FLOAT:
return i.intVal == intVal;
case ClassWriter.TYPE_UNINIT:
return i.intVal == intVal && i.strVal1.equals(strVal1);
case ClassWriter.NAME_TYPE:
return i.strVal1.equals(strVal1) && i.strVal2.equals(strVal2);
case ClassWriter.INDY: {
return i.longVal == longVal && i.strVal1.equals(strVal1)
&& i.strVal2.equals(strVal2);
}
// case ClassWriter.FIELD:
// case ClassWriter.METH:
// case ClassWriter.IMETH:
// case ClassWriter.HANDLE_BASE + 1..9
default:
return i.strVal1.equals(strVal1) && i.strVal2.equals(strVal2)
&& i.strVal3.equals(strVal3);
}
}

View File

@ -1,50 +1,40 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm;
/**
* A label represents a position in the bytecode of a method. Labels are used
* for jump, goto, and switch instructions, and for try catch blocks. A label
* designates the <i>instruction</i> that is just after. Note however that there
* can be other elements between a label and the instruction it designates (such
* as other labels, stack map frames, line numbers, etc.).
* A label represents a position in the bytecode of a method. Labels are used for jump, goto, and
* switch instructions, and for try catch blocks. A label designates the <i>instruction</i> that is
* just after. Note however that there can be other elements between a label and the instruction it
* designates (such as other labels, stack map frames, line numbers, etc.).
*
* @author Eric Bruneton
*/
public class Label {
/**
* Indicates if this label is only used for debug attributes. Such a label
* is not the start of a basic block, the target of a jump instruction, or
* an exception handler. It can be safely ignored in control flow graph
* analysis algorithms (for optimization purposes).
* Indicates if this label is only used for debug attributes. Such a label is not the start of a
* basic block, the target of a jump instruction, or an exception handler. It can be safely
* ignored in control flow graph analysis algorithms (for optimization purposes).
*/
static final int DEBUG = 1;
@ -59,14 +49,14 @@ public class Label {
static final int RESIZED = 4;
/**
* Indicates if this basic block has been pushed in the basic block stack.
* See {@link MethodWriter#visitMaxs visitMaxs}.
* Indicates if this basic block has been pushed in the basic block stack. See
* {@link MethodWriter#visitMaxs visitMaxs}.
*/
static final int PUSHED = 8;
/**
* Indicates if this label is the target of a jump instruction, or the start
* of an exception handler.
* Indicates if this label is the target of a jump instruction, or the start of an exception
* handler.
*/
static final int TARGET = 16;
@ -96,21 +86,20 @@ public class Label {
static final int SUBROUTINE = 512;
/**
* Indicates if this subroutine basic block has been visited by a
* visitSubroutine(null, ...) call.
* Indicates if this subroutine basic block has been visited by a visitSubroutine(null, ...)
* call.
*/
static final int VISITED = 1024;
/**
* Indicates if this subroutine basic block has been visited by a
* visitSubroutine(!null, ...) call.
* Indicates if this subroutine basic block has been visited by a visitSubroutine(!null, ...)
* call.
*/
static final int VISITED2 = 2048;
/**
* Field used to associate user information to a label. Warning: this field
* is used by the ASM tree package. In order to use it with the ASM tree
* package you must override the
* Field used to associate user information to a label. Warning: this field is used by the ASM
* tree package. In order to use it with the ASM tree package you must override the
* {@link org.objectweb.asm.tree.MethodNode#getLabelNode} method.
*/
public Object info;
@ -146,100 +135,89 @@ public class Label {
private int referenceCount;
/**
* Informations about forward references. Each forward reference is
* described by two consecutive integers in this array: the first one is the
* position of the first byte of the bytecode instruction that contains the
* forward reference, while the second is the position of the first byte of
* the forward reference itself. In fact the sign of the first integer
* indicates if this reference uses 2 or 4 bytes, and its absolute value
* gives the position of the bytecode instruction. This array is also used
* as a bitset to store the subroutines to which a basic block belongs. This
* information is needed in {@linked MethodWriter#visitMaxs}, after all
* forward references have been resolved. Hence the same array can be used
* for both purposes without problems.
* Informations about forward references. Each forward reference is described by two consecutive
* integers in this array: the first one is the position of the first byte of the bytecode
* instruction that contains the forward reference, while the second is the position of the
* first byte of the forward reference itself. In fact the sign of the first integer indicates
* if this reference uses 2 or 4 bytes, and its absolute value gives the position of the
* bytecode instruction. This array is also used as a bitset to store the subroutines to which a
* basic block belongs. This information is needed in {@linked MethodWriter#visitMaxs}, after
* all forward references have been resolved. Hence the same array can be used for both purposes
* without problems.
*/
private int[] srcAndRefPositions;
// ------------------------------------------------------------------------
/*
* Fields for the control flow and data flow graph analysis algorithms (used
* to compute the maximum stack size or the stack map frames). A control
* flow graph contains one node per "basic block", and one edge per "jump"
* from one basic block to another. Each node (i.e., each basic block) is
* represented by the Label object that corresponds to the first instruction
* of this basic block. Each node also stores the list of its successors in
* the graph, as a linked list of Edge objects.
* Fields for the control flow and data flow graph analysis algorithms (used to compute the
* maximum stack size or the stack map frames). A control flow graph contains one node per
* "basic block", and one edge per "jump" from one basic block to another. Each node (i.e., each
* basic block) is represented by the Label object that corresponds to the first instruction of
* this basic block. Each node also stores the list of its successors in the graph, as a linked
* list of Edge objects.
*
* The control flow analysis algorithms used to compute the maximum stack
* size or the stack map frames are similar and use two steps. The first
* step, during the visit of each instruction, builds information about the
* state of the local variables and the operand stack at the end of each
* basic block, called the "output frame", <i>relatively</i> to the frame
* state at the beginning of the basic block, which is called the "input
* frame", and which is <i>unknown</i> during this step. The second step, in
* {@link MethodWriter#visitMaxs}, is a fix point algorithm that computes
* information about the input frame of each basic block, from the input
* state of the first basic block (known from the method signature), and by
* the using the previously computed relative output frames.
* The control flow analysis algorithms used to compute the maximum stack size or the stack map
* frames are similar and use two steps. The first step, during the visit of each instruction,
* builds information about the state of the local variables and the operand stack at the end of
* each basic block, called the "output frame", <i>relatively</i> to the frame state at the
* beginning of the basic block, which is called the "input frame", and which is <i>unknown</i>
* during this step. The second step, in {@link MethodWriter#visitMaxs}, is a fix point
* algorithm that computes information about the input frame of each basic block, from the input
* state of the first basic block (known from the method signature), and by the using the
* previously computed relative output frames.
*
* The algorithm used to compute the maximum stack size only computes the
* relative output and absolute input stack heights, while the algorithm
* used to compute stack map frames computes relative output frames and
* absolute input frames.
* The algorithm used to compute the maximum stack size only computes the relative output and
* absolute input stack heights, while the algorithm used to compute stack map frames computes
* relative output frames and absolute input frames.
*/
/**
* Start of the output stack relatively to the input stack. The exact
* semantics of this field depends on the algorithm that is used.
* Start of the output stack relatively to the input stack. The exact semantics of this field
* depends on the algorithm that is used.
*
* When only the maximum stack size is computed, this field is the number of
* elements in the input stack.
* When only the maximum stack size is computed, this field is the number of elements in the
* input stack.
*
* When the stack map frames are completely computed, this field is the
* offset of the first output stack element relatively to the top of the
* input stack. This offset is always negative or null. A null offset means
* that the output stack must be appended to the input stack. A -n offset
* means that the first n output stack elements must replace the top n input
* stack elements, and that the other elements must be appended to the input
* stack.
* When the stack map frames are completely computed, this field is the offset of the first
* output stack element relatively to the top of the input stack. This offset is always negative
* or null. A null offset means that the output stack must be appended to the input stack. A -n
* offset means that the first n output stack elements must replace the top n input stack
* elements, and that the other elements must be appended to the input stack.
*/
int inputStackTop;
/**
* Maximum height reached by the output stack, relatively to the top of the
* input stack. This maximum is always positive or null.
* Maximum height reached by the output stack, relatively to the top of the input stack. This
* maximum is always positive or null.
*/
int outputStackMax;
/**
* Information about the input and output stack map frames of this basic
* block. This field is only used when {@link ClassWriter#COMPUTE_FRAMES}
* option is used.
* Information about the input and output stack map frames of this basic block. This field is
* only used when {@link ClassWriter#COMPUTE_FRAMES} option is used.
*/
Frame frame;
/**
* The successor of this label, in the order they are visited. This linked
* list does not include labels used for debug info only. If
* {@link ClassWriter#COMPUTE_FRAMES} option is used then, in addition, it
* does not contain successive labels that denote the same bytecode position
* (in this case only the first label appears in this list).
* The successor of this label, in the order they are visited. This linked list does not include
* labels used for debug info only. If {@link ClassWriter#COMPUTE_FRAMES} option is used then,
* in addition, it does not contain successive labels that denote the same bytecode position (in
* this case only the first label appears in this list).
*/
Label successor;
/**
* The successors of this node in the control flow graph. These successors
* are stored in a linked list of {@link Edge Edge} objects, linked to each
* other by their {@link Edge#next} field.
* The successors of this node in the control flow graph. These successors are stored in a
* linked list of {@link Edge Edge} objects, linked to each other by their {@link Edge#next}
* field.
*/
Edge successors;
/**
* The next basic block in the basic block stack. This stack is used in the
* main loop of the fix point algorithm used in the second step of the
* control flow analysis algorithms. It is also used in
* {@link #visitSubroutine} to avoid using a recursive method.
* The next basic block in the basic block stack. This stack is used in the main loop of the fix
* point algorithm used in the second step of the control flow analysis algorithms. It is also
* used in {@link #visitSubroutine} to avoid using a recursive method.
*
* @see MethodWriter#visitMaxs
*/
@ -252,49 +230,39 @@ public class Label {
/**
* Constructs a new label.
*/
public Label() {
}
public Label() {}
// ------------------------------------------------------------------------
// Methods to compute offsets and to manage forward references
// ------------------------------------------------------------------------
/**
* Returns the offset corresponding to this label. This offset is computed
* from the start of the method's bytecode. <i>This method is intended for
* {@link Attribute} sub classes, and is normally not needed by class
* generators or adapters.</i>
* Returns the offset corresponding to this label. This offset is computed from the start of the
* method's bytecode. <i>This method is intended for {@link Attribute} sub classes, and is
* normally not needed by class generators or adapters.</i>
*
* @return the offset corresponding to this label.
* @throws IllegalStateException
* if this label is not resolved yet.
* @throws IllegalStateException if this label is not resolved yet.
*/
public int getOffset() {
if ((status & RESOLVED) == 0) {
throw new IllegalStateException(
"Label offset position has not been resolved yet");
throw new IllegalStateException("Label offset position has not been resolved yet");
}
return position;
}
/**
* Puts a reference to this label in the bytecode of a method. If the
* position of the label is known, the offset is computed and written
* directly. Otherwise, a null offset is written and a new forward reference
* is declared for this label.
* Puts a reference to this label in the bytecode of a method. If the position of the label is
* known, the offset is computed and written directly. Otherwise, a null offset is written and a
* new forward reference is declared for this label.
*
* @param owner
* the code writer that calls this method.
* @param out
* the bytecode of the method.
* @param source
* the position of first byte of the bytecode instruction that
* contains this label.
* @param wideOffset
* <tt>true</tt> if the reference must be stored in 4 bytes, or
* <tt>false</tt> if it must be stored with 2 bytes.
* @throws IllegalArgumentException
* if this label has not been created by the given code writer.
* @param owner the code writer that calls this method.
* @param out the bytecode of the method.
* @param source the position of first byte of the bytecode instruction that contains this
* label.
* @param wideOffset <tt>true</tt> if the reference must be stored in 4 bytes, or <tt>false</tt>
* if it must be stored with 2 bytes.
* @throws IllegalArgumentException if this label has not been created by the given code writer.
*/
void put(final MethodWriter owner, final ByteVector out, final int source,
final boolean wideOffset) {
@ -316,27 +284,22 @@ public class Label {
}
/**
* Adds a forward reference to this label. This method must be called only
* for a true forward reference, i.e. only if this label is not resolved
* yet. For backward references, the offset of the reference can be, and
* must be, computed and stored directly.
* Adds a forward reference to this label. This method must be called only for a true forward
* reference, i.e. only if this label is not resolved yet. For backward references, the offset
* of the reference can be, and must be, computed and stored directly.
*
* @param sourcePosition
* the position of the referencing instruction. This position
* will be used to compute the offset of this forward reference.
* @param referencePosition
* the position where the offset for this forward reference must
* be stored.
* @param sourcePosition the position of the referencing instruction. This position will be used
* to compute the offset of this forward reference.
* @param referencePosition the position where the offset for this forward reference must be
* stored.
*/
private void addReference(final int sourcePosition,
final int referencePosition) {
private void addReference(final int sourcePosition, final int referencePosition) {
if (srcAndRefPositions == null) {
srcAndRefPositions = new int[6];
}
if (referenceCount >= srcAndRefPositions.length) {
int[] a = new int[srcAndRefPositions.length + 6];
System.arraycopy(srcAndRefPositions, 0, a, 0,
srcAndRefPositions.length);
System.arraycopy(srcAndRefPositions, 0, a, 0, srcAndRefPositions.length);
srcAndRefPositions = a;
}
srcAndRefPositions[referenceCount++] = sourcePosition;
@ -344,30 +307,23 @@ public class Label {
}
/**
* Resolves all forward references to this label. This method must be called
* when this label is added to the bytecode of the method, i.e. when its
* position becomes known. This method fills in the blanks that where left
* in the bytecode by each forward reference previously added to this label.
* Resolves all forward references to this label. This method must be called when this label is
* added to the bytecode of the method, i.e. when its position becomes known. This method fills
* in the blanks that where left in the bytecode by each forward reference previously added to
* this label.
*
* @param owner
* the code writer that calls this method.
* @param position
* the position of this label in the bytecode.
* @param data
* the bytecode of the method.
* @return <tt>true</tt> if a blank that was left for this label was to
* small to store the offset. In such a case the corresponding jump
* instruction is replaced with a pseudo instruction (using unused
* opcodes) using an unsigned two bytes offset. These pseudo
* instructions will need to be replaced with true instructions with
* wider offsets (4 bytes instead of 2). This is done in
* {@link MethodWriter#resizeInstructions}.
* @throws IllegalArgumentException
* if this label has already been resolved, or if it has not
* been created by the given code writer.
* @param owner the code writer that calls this method.
* @param position the position of this label in the bytecode.
* @param data the bytecode of the method.
* @return <tt>true</tt> if a blank that was left for this label was to small to store the
* offset. In such a case the corresponding jump instruction is replaced with a pseudo
* instruction (using unused opcodes) using an unsigned two bytes offset. These pseudo
* instructions will need to be replaced with true instructions with wider offsets (4
* bytes instead of 2). This is done in {@link MethodWriter#resizeInstructions}.
* @throws IllegalArgumentException if this label has already been resolved, or if it has not
* been created by the given code writer.
*/
boolean resolve(final MethodWriter owner, final int position,
final byte[] data) {
boolean resolve(final MethodWriter owner, final int position, final byte[] data) {
boolean needUpdate = false;
this.status |= RESOLVED;
this.position = position;
@ -380,13 +336,11 @@ public class Label {
offset = position - source;
if (offset < Short.MIN_VALUE || offset > Short.MAX_VALUE) {
/*
* changes the opcode of the jump instruction, in order to
* be able to find it later (see resizeInstructions in
* MethodWriter). These temporary opcodes are similar to
* jump instruction opcodes, except that the 2 bytes offset
* is unsigned (and can therefore represent values from 0 to
* 65535, which is sufficient since the size of a method is
* limited to 65535 bytes).
* changes the opcode of the jump instruction, in order to be able to find it
* later (see resizeInstructions in MethodWriter). These temporary opcodes are
* similar to jump instruction opcodes, except that the 2 bytes offset is
* unsigned (and can therefore represent values from 0 to 65535, which is
* sufficient since the size of a method is limited to 65535 bytes).
*/
int opcode = data[reference - 1] & 0xFF;
if (opcode <= Opcodes.JSR) {
@ -412,10 +366,9 @@ public class Label {
}
/**
* Returns the first label of the series to which this label belongs. For an
* isolated label or for the first label in a series of successive labels,
* this method returns the label itself. For other labels it returns the
* first label of the series.
* Returns the first label of the series to which this label belongs. For an isolated label or
* for the first label in a series of successive labels, this method returns the label itself.
* For other labels it returns the first label of the series.
*
* @return the first label of the series to which this label belongs.
*/
@ -430,8 +383,7 @@ public class Label {
/**
* Returns true is this basic block belongs to the given subroutine.
*
* @param id
* a subroutine id.
* @param id a subroutine id.
* @return true is this basic block belongs to the given subroutine.
*/
boolean inSubroutine(final long id) {
@ -442,13 +394,10 @@ public class Label {
}
/**
* Returns true if this basic block and the given one belong to a common
* subroutine.
* Returns true if this basic block and the given one belong to a common subroutine.
*
* @param block
* another basic block.
* @return true if this basic block and the given one belong to a common
* subroutine.
* @param block another basic block.
* @return true if this basic block and the given one belong to a common subroutine.
*/
boolean inSameSubroutine(final Label block) {
if ((status & VISITED) == 0 || (block.status & VISITED) == 0) {
@ -465,10 +414,8 @@ public class Label {
/**
* Marks this basic block as belonging to the given subroutine.
*
* @param id
* a subroutine id.
* @param nbSubroutines
* the total number of subroutines in the method.
* @param id a subroutine id.
* @param nbSubroutines the total number of subroutines in the method.
*/
void addToSubroutine(final long id, final int nbSubroutines) {
if ((status & VISITED) == 0) {
@ -479,19 +426,14 @@ public class Label {
}
/**
* Finds the basic blocks that belong to a given subroutine, and marks these
* blocks as belonging to this subroutine. This method follows the control
* flow graph to find all the blocks that are reachable from the current
* block WITHOUT following any JSR target.
* Finds the basic blocks that belong to a given subroutine, and marks these blocks as belonging
* to this subroutine. This method follows the control flow graph to find all the blocks that
* are reachable from the current block WITHOUT following any JSR target.
*
* @param JSR
* a JSR block that jumps to this subroutine. If this JSR is not
* null it is added to the successor of the RET blocks found in
* the subroutine.
* @param id
* the id of this subroutine.
* @param nbSubroutines
* the total number of subroutines in the method.
* @param JSR a JSR block that jumps to this subroutine. If this JSR is not null it is added to
* the successor of the RET blocks found in the subroutine.
* @param id the id of this subroutine.
* @param nbSubroutines the total number of subroutines in the method.
*/
void visitSubroutine(final Label JSR, final long id, final int nbSubroutines) {
// user managed stack of labels, to avoid using a recursive method

View File

@ -1,71 +1,58 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm;
/**
* A visitor to visit a Java method. The methods of this class must be called in
* the following order: [ <tt>visitAnnotationDefault</tt> ] (
* <tt>visitAnnotation</tt> | <tt>visitParameterAnnotation</tt> |
* <tt>visitAttribute</tt> )* [ <tt>visitCode</tt> ( <tt>visitFrame</tt> |
* <tt>visit</tt><i>X</i>Insn</tt> | <tt>visitLabel</tt> |
* <tt>visitTryCatchBlock</tt> | <tt>visitLocalVariable</tt> |
* <tt>visitLineNumber</tt> )* <tt>visitMaxs</tt> ] <tt>visitEnd</tt>. In
* addition, the <tt>visit</tt><i>X</i>Insn</tt> and <tt>visitLabel</tt> methods
* must be called in the sequential order of the bytecode instructions of the
* visited code, <tt>visitTryCatchBlock</tt> must be called <i>before</i> the
* labels passed as arguments have been visited, and the
* <tt>visitLocalVariable</tt> and <tt>visitLineNumber</tt> methods must be
* called <i>after</i> the labels passed as arguments have been visited.
* A visitor to visit a Java method. The methods of this class must be called in the following
* order: [ <tt>visitAnnotationDefault</tt> ] ( <tt>visitAnnotation</tt> |
* <tt>visitParameterAnnotation</tt> | <tt>visitAttribute</tt> )* [ <tt>visitCode</tt> (
* <tt>visitFrame</tt> | <tt>visit</tt><i>X</i>Insn</tt> | <tt>visitLabel</tt> |
* <tt>visitTryCatchBlock</tt> | <tt>visitLocalVariable</tt> | <tt>visitLineNumber</tt> )*
* <tt>visitMaxs</tt> ] <tt>visitEnd</tt>. In addition, the <tt>visit</tt><i>X</i>Insn</tt> and
* <tt>visitLabel</tt> methods must be called in the sequential order of the bytecode instructions
* of the visited code, <tt>visitTryCatchBlock</tt> must be called <i>before</i> the labels passed
* as arguments have been visited, and the <tt>visitLocalVariable</tt> and <tt>visitLineNumber</tt>
* methods must be called <i>after</i> the labels passed as arguments have been visited.
*
* @author Eric Bruneton
*/
public abstract class MethodVisitor {
/**
* The ASM API version implemented by this visitor. The value of this field
* must be one of {@link Opcodes#ASM4}.
* The ASM API version implemented by this visitor. The value of this field must be one of
* {@link Opcodes#ASM4}.
*/
protected final int api;
/**
* The method visitor to which this visitor must delegate method calls. May
* be null.
* The method visitor to which this visitor must delegate method calls. May be null.
*/
protected MethodVisitor mv;
/**
* Constructs a new {@link MethodVisitor}.
*
* @param api
* the ASM API version implemented by this visitor. Must be one
* of {@link Opcodes#ASM4}.
* @param api the ASM API version implemented by this visitor. Must be one of
* {@link Opcodes#ASM4}.
*/
public MethodVisitor(final int api) {
this(api, null);
@ -74,12 +61,9 @@ public abstract class MethodVisitor {
/**
* Constructs a new {@link MethodVisitor}.
*
* @param api
* the ASM API version implemented by this visitor. Must be one
* of {@link Opcodes#ASM4}.
* @param mv
* the method visitor to which this visitor must delegate method
* calls. May be null.
* @param api the ASM API version implemented by this visitor. Must be one of
* {@link Opcodes#ASM4}.
* @param mv the method visitor to which this visitor must delegate method calls. May be null.
*/
public MethodVisitor(final int api, final MethodVisitor mv) {
if (api != Opcodes.ASM4) {
@ -96,12 +80,11 @@ public abstract class MethodVisitor {
/**
* Visits the default value of this annotation interface method.
*
* @return a visitor to the visit the actual default value of this
* annotation interface method, or <tt>null</tt> if this visitor is
* not interested in visiting this default value. The 'name'
* parameters passed to the methods of this annotation visitor are
* ignored. Moreover, exacly one visit method must be called on this
* annotation visitor, followed by visitEnd.
* @return a visitor to the visit the actual default value of this annotation interface method,
* or <tt>null</tt> if this visitor is not interested in visiting this default value.
* The 'name' parameters passed to the methods of this annotation visitor are ignored.
* Moreover, exacly one visit method must be called on this annotation visitor, followed
* by visitEnd.
*/
public AnnotationVisitor visitAnnotationDefault() {
if (mv != null) {
@ -113,12 +96,10 @@ public abstract class MethodVisitor {
/**
* Visits an annotation of this method.
*
* @param desc
* the class descriptor of the annotation class.
* @param visible
* <tt>true</tt> if the annotation is visible at runtime.
* @return a visitor to visit the annotation values, or <tt>null</tt> if
* this visitor is not interested in visiting this annotation.
* @param desc the class descriptor of the annotation class.
* @param visible <tt>true</tt> if the annotation is visible at runtime.
* @return a visitor to visit the annotation values, or <tt>null</tt> if this visitor is not
* interested in visiting this annotation.
*/
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
if (mv != null) {
@ -130,17 +111,13 @@ public abstract class MethodVisitor {
/**
* Visits an annotation of a parameter this method.
*
* @param parameter
* the parameter index.
* @param desc
* the class descriptor of the annotation class.
* @param visible
* <tt>true</tt> if the annotation is visible at runtime.
* @return a visitor to visit the annotation values, or <tt>null</tt> if
* this visitor is not interested in visiting this annotation.
* @param parameter the parameter index.
* @param desc the class descriptor of the annotation class.
* @param visible <tt>true</tt> if the annotation is visible at runtime.
* @return a visitor to visit the annotation values, or <tt>null</tt> if this visitor is not
* interested in visiting this annotation.
*/
public AnnotationVisitor visitParameterAnnotation(int parameter,
String desc, boolean visible) {
public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) {
if (mv != null) {
return mv.visitParameterAnnotation(parameter, desc, visible);
}
@ -150,8 +127,7 @@ public abstract class MethodVisitor {
/**
* Visits a non standard attribute of this method.
*
* @param attr
* an attribute.
* @param attr an attribute.
*/
public void visitAttribute(Attribute attr) {
if (mv != null) {
@ -169,80 +145,63 @@ public abstract class MethodVisitor {
}
/**
* Visits the current state of the local variables and operand stack
* elements. This method must(*) be called <i>just before</i> any
* instruction <b>i</b> that follows an unconditional branch instruction
* such as GOTO or THROW, that is the target of a jump instruction, or that
* starts an exception handler block. The visited types must describe the
* values of the local variables and of the operand stack elements <i>just
* before</i> <b>i</b> is executed.<br>
* Visits the current state of the local variables and operand stack elements. This method
* must(*) be called <i>just before</i> any instruction <b>i</b> that follows an unconditional
* branch instruction such as GOTO or THROW, that is the target of a jump instruction, or that
* starts an exception handler block. The visited types must describe the values of the local
* variables and of the operand stack elements <i>just before</i> <b>i</b> is executed.<br>
* <br>
* (*) this is mandatory only for classes whose version is greater than or
* equal to {@link Opcodes#V1_6 V1_6}. <br>
* (*) this is mandatory only for classes whose version is greater than or equal to
* {@link Opcodes#V1_6 V1_6}. <br>
* <br>
* The frames of a method must be given either in expanded form, or in
* compressed form (all frames must use the same format, i.e. you must not
* mix expanded and compressed frames within a single method):
* The frames of a method must be given either in expanded form, or in compressed form (all
* frames must use the same format, i.e. you must not mix expanded and compressed frames within
* a single method):
* <ul>
* <li>In expanded form, all frames must have the F_NEW type.</li>
* <li>In compressed form, frames are basically "deltas" from the state of
* the previous frame:
* <li>In compressed form, frames are basically "deltas" from the state of the previous frame:
* <ul>
* <li>{@link Opcodes#F_SAME} representing frame with exactly the same
* locals as the previous frame and with the empty stack.</li>
* <li>{@link Opcodes#F_SAME1} representing frame with exactly the same
* locals as the previous frame and with single value on the stack (
* <code>nStack</code> is 1 and <code>stack[0]</code> contains value for the
* type of the stack item).</li>
* <li>{@link Opcodes#F_APPEND} representing frame with current locals are
* the same as the locals in the previous frame, except that additional
* locals are defined (<code>nLocal</code> is 1, 2 or 3 and
* <code>local</code> elements contains values representing added types).</li>
* <li>{@link Opcodes#F_CHOP} representing frame with current locals are the
* same as the locals in the previous frame, except that the last 1-3 locals
* are absent and with the empty stack (<code>nLocals</code> is 1, 2 or 3).</li>
* <li>{@link Opcodes#F_SAME} representing frame with exactly the same locals as the previous
* frame and with the empty stack.</li>
* <li>{@link Opcodes#F_SAME1} representing frame with exactly the same locals as the previous
* frame and with single value on the stack ( <code>nStack</code> is 1 and <code>stack[0]</code>
* contains value for the type of the stack item).</li>
* <li>{@link Opcodes#F_APPEND} representing frame with current locals are the same as the
* locals in the previous frame, except that additional locals are defined (<code>nLocal</code>
* is 1, 2 or 3 and <code>local</code> elements contains values representing added types).</li>
* <li>{@link Opcodes#F_CHOP} representing frame with current locals are the same as the locals
* in the previous frame, except that the last 1-3 locals are absent and with the empty stack
* (<code>nLocals</code> is 1, 2 or 3).</li>
* <li>{@link Opcodes#F_FULL} representing complete frame data.</li></li>
* </ul>
* </ul> <br>
* In both cases the first frame, corresponding to the method's parameters
* and access flags, is implicit and must not be visited. Also, it is
* illegal to visit two or more frames for the same code location (i.e., at
* least one instruction must be visited between two calls to visitFrame).
* </ul>
* <br>
* In both cases the first frame, corresponding to the method's parameters and access flags, is
* implicit and must not be visited. Also, it is illegal to visit two or more frames for the
* same code location (i.e., at least one instruction must be visited between two calls to
* visitFrame).
*
* @param type
* the type of this stack map frame. Must be
* {@link Opcodes#F_NEW} for expanded frames, or
* {@link Opcodes#F_FULL}, {@link Opcodes#F_APPEND},
* {@link Opcodes#F_CHOP}, {@link Opcodes#F_SAME} or
* {@link Opcodes#F_APPEND}, {@link Opcodes#F_SAME1} for
* compressed frames.
* @param nLocal
* the number of local variables in the visited frame.
* @param local
* the local variable types in this frame. This array must not be
* modified. Primitive types are represented by
* {@link Opcodes#TOP}, {@link Opcodes#INTEGER},
* {@link Opcodes#FLOAT}, {@link Opcodes#LONG},
* {@link Opcodes#DOUBLE},{@link Opcodes#NULL} or
* {@link Opcodes#UNINITIALIZED_THIS} (long and double are
* represented by a single element). Reference types are
* represented by String objects (representing internal names),
* and uninitialized types by Label objects (this label
* designates the NEW instruction that created this uninitialized
* value).
* @param nStack
* the number of operand stack elements in the visited frame.
* @param stack
* the operand stack types in this frame. This array must not be
* modified. Its content has the same format as the "local"
* array.
* @throws IllegalStateException
* if a frame is visited just after another one, without any
* instruction between the two (unless this frame is a
* Opcodes#F_SAME frame, in which case it is silently ignored).
* @param type the type of this stack map frame. Must be {@link Opcodes#F_NEW} for expanded
* frames, or {@link Opcodes#F_FULL}, {@link Opcodes#F_APPEND}, {@link Opcodes#F_CHOP},
* {@link Opcodes#F_SAME} or {@link Opcodes#F_APPEND}, {@link Opcodes#F_SAME1} for
* compressed frames.
* @param nLocal the number of local variables in the visited frame.
* @param local the local variable types in this frame. This array must not be modified.
* Primitive types are represented by {@link Opcodes#TOP}, {@link Opcodes#INTEGER},
* {@link Opcodes#FLOAT}, {@link Opcodes#LONG},
* {@link Opcodes#DOUBLE},{@link Opcodes#NULL} or {@link Opcodes#UNINITIALIZED_THIS}
* (long and double are represented by a single element). Reference types are represented
* by String objects (representing internal names), and uninitialized types by Label
* objects (this label designates the NEW instruction that created this uninitialized
* value).
* @param nStack the number of operand stack elements in the visited frame.
* @param stack the operand stack types in this frame. This array must not be modified. Its
* content has the same format as the "local" array.
* @throws IllegalStateException if a frame is visited just after another one, without any
* instruction between the two (unless this frame is a Opcodes#F_SAME frame, in which
* case it is silently ignored).
*/
public void visitFrame(int type, int nLocal, Object[] local, int nStack,
Object[] stack) {
public void visitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack) {
if (mv != null) {
mv.visitFrame(type, nLocal, local, nStack, stack);
}
@ -255,22 +214,17 @@ public abstract class MethodVisitor {
/**
* Visits a zero operand instruction.
*
* @param opcode
* the opcode of the instruction to be visited. This opcode is
* either NOP, ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1,
* ICONST_2, ICONST_3, ICONST_4, ICONST_5, LCONST_0, LCONST_1,
* FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD,
* LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD,
* IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE,
* SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1,
* DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB,
* IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM,
* FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL, ISHR, LSHR,
* IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D,
* L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S,
* LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IRETURN, LRETURN, FRETURN,
* DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW, MONITORENTER,
* or MONITOREXIT.
* @param opcode the opcode of the instruction to be visited. This opcode is either NOP,
* ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5,
* LCONST_0, LCONST_1, FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD, LALOAD,
* FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IASTORE, LASTORE, FASTORE, DASTORE,
* AASTORE, BASTORE, CASTORE, SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1,
* DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL,
* IDIV, LDIV, FDIV, DDIV, IREM, LREM, FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL,
* ISHR, LSHR, IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D, L2I, L2F,
* L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S, LCMP, FCMPL, FCMPG, DCMPL, DCMPG,
* IRETURN, LRETURN, FRETURN, DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW,
* MONITORENTER, or MONITOREXIT.
*/
public void visitInsn(int opcode) {
if (mv != null) {
@ -281,20 +235,17 @@ public abstract class MethodVisitor {
/**
* Visits an instruction with a single int operand.
*
* @param opcode
* the opcode of the instruction to be visited. This opcode is
* either BIPUSH, SIPUSH or NEWARRAY.
* @param operand
* the operand of the instruction to be visited.<br>
* When opcode is BIPUSH, operand value should be between
* Byte.MIN_VALUE and Byte.MAX_VALUE.<br>
* When opcode is SIPUSH, operand value should be between
* Short.MIN_VALUE and Short.MAX_VALUE.<br>
* When opcode is NEWARRAY, operand value should be one of
* {@link Opcodes#T_BOOLEAN}, {@link Opcodes#T_CHAR},
* {@link Opcodes#T_FLOAT}, {@link Opcodes#T_DOUBLE},
* {@link Opcodes#T_BYTE}, {@link Opcodes#T_SHORT},
* {@link Opcodes#T_INT} or {@link Opcodes#T_LONG}.
* @param opcode the opcode of the instruction to be visited. This opcode is either BIPUSH,
* SIPUSH or NEWARRAY.
* @param operand the operand of the instruction to be visited.<br>
* When opcode is BIPUSH, operand value should be between Byte.MIN_VALUE and
* Byte.MAX_VALUE.<br>
* When opcode is SIPUSH, operand value should be between Short.MIN_VALUE and
* Short.MAX_VALUE.<br>
* When opcode is NEWARRAY, operand value should be one of {@link Opcodes#T_BOOLEAN},
* {@link Opcodes#T_CHAR}, {@link Opcodes#T_FLOAT}, {@link Opcodes#T_DOUBLE},
* {@link Opcodes#T_BYTE}, {@link Opcodes#T_SHORT}, {@link Opcodes#T_INT} or
* {@link Opcodes#T_LONG}.
*/
public void visitIntInsn(int opcode, int operand) {
if (mv != null) {
@ -303,16 +254,14 @@ public abstract class MethodVisitor {
}
/**
* Visits a local variable instruction. A local variable instruction is an
* instruction that loads or stores the value of a local variable.
* Visits a local variable instruction. A local variable instruction is an instruction that
* loads or stores the value of a local variable.
*
* @param opcode
* the opcode of the local variable instruction to be visited.
* This opcode is either ILOAD, LLOAD, FLOAD, DLOAD, ALOAD,
* ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or RET.
* @param var
* the operand of the instruction to be visited. This operand is
* the index of a local variable.
* @param opcode the opcode of the local variable instruction to be visited. This opcode is
* either ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or
* RET.
* @param var the operand of the instruction to be visited. This operand is the index of a local
* variable.
*/
public void visitVarInsn(int opcode, int var) {
if (mv != null) {
@ -321,16 +270,13 @@ public abstract class MethodVisitor {
}
/**
* Visits a type instruction. A type instruction is an instruction that
* takes the internal name of a class as parameter.
* Visits a type instruction. A type instruction is an instruction that takes the internal name
* of a class as parameter.
*
* @param opcode
* the opcode of the type instruction to be visited. This opcode
* is either NEW, ANEWARRAY, CHECKCAST or INSTANCEOF.
* @param type
* the operand of the instruction to be visited. This operand
* must be the internal name of an object or array class (see
* {@link Type#getInternalName() getInternalName}).
* @param opcode the opcode of the type instruction to be visited. This opcode is either NEW,
* ANEWARRAY, CHECKCAST or INSTANCEOF.
* @param type the operand of the instruction to be visited. This operand must be the internal
* name of an object or array class (see {@link Type#getInternalName() getInternalName}).
*/
public void visitTypeInsn(int opcode, String type) {
if (mv != null) {
@ -339,45 +285,33 @@ public abstract class MethodVisitor {
}
/**
* Visits a field instruction. A field instruction is an instruction that
* loads or stores the value of a field of an object.
* Visits a field instruction. A field instruction is an instruction that loads or stores the
* value of a field of an object.
*
* @param opcode
* the opcode of the type instruction to be visited. This opcode
* is either GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
* @param owner
* the internal name of the field's owner class (see
* {@link Type#getInternalName() getInternalName}).
* @param name
* the field's name.
* @param desc
* the field's descriptor (see {@link Type Type}).
* @param opcode the opcode of the type instruction to be visited. This opcode is either
* GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
* @param owner the internal name of the field's owner class (see {@link Type#getInternalName()
* getInternalName}).
* @param name the field's name.
* @param desc the field's descriptor (see {@link Type Type}).
*/
public void visitFieldInsn(int opcode, String owner, String name,
String desc) {
public void visitFieldInsn(int opcode, String owner, String name, String desc) {
if (mv != null) {
mv.visitFieldInsn(opcode, owner, name, desc);
}
}
/**
* Visits a method instruction. A method instruction is an instruction that
* invokes a method.
* Visits a method instruction. A method instruction is an instruction that invokes a method.
*
* @param opcode
* the opcode of the type instruction to be visited. This opcode
* is either INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or
* INVOKEINTERFACE.
* @param owner
* the internal name of the method's owner class (see
* {@link Type#getInternalName() getInternalName}).
* @param name
* the method's name.
* @param desc
* the method's descriptor (see {@link Type Type}).
* @param opcode the opcode of the type instruction to be visited. This opcode is either
* INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or INVOKEINTERFACE.
* @param owner the internal name of the method's owner class (see {@link Type#getInternalName()
* getInternalName}).
* @param name the method's name.
* @param desc the method's descriptor (see {@link Type Type}).
*/
public void visitMethodInsn(int opcode, String owner, String name,
String desc) {
public void visitMethodInsn(int opcode, String owner, String name, String desc) {
if (mv != null) {
mv.visitMethodInsn(opcode, owner, name, desc);
}
@ -386,39 +320,29 @@ public abstract class MethodVisitor {
/**
* Visits an invokedynamic instruction.
*
* @param name
* the method's name.
* @param desc
* the method's descriptor (see {@link Type Type}).
* @param bsm
* the bootstrap method.
* @param bsmArgs
* the bootstrap method constant arguments. Each argument must be
* an {@link Integer}, {@link Float}, {@link Long},
* {@link Double}, {@link String}, {@link Type} or {@link Handle}
* value. This method is allowed to modify the content of the
* array so a caller should expect that this array may change.
* @param name the method's name.
* @param desc the method's descriptor (see {@link Type Type}).
* @param bsm the bootstrap method.
* @param bsmArgs the bootstrap method constant arguments. Each argument must be an
* {@link Integer}, {@link Float}, {@link Long}, {@link Double}, {@link String},
* {@link Type} or {@link Handle} value. This method is allowed to modify the content of
* the array so a caller should expect that this array may change.
*/
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
Object... bsmArgs) {
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
if (mv != null) {
mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
}
}
/**
* Visits a jump instruction. A jump instruction is an instruction that may
* jump to another instruction.
* Visits a jump instruction. A jump instruction is an instruction that may jump to another
* instruction.
*
* @param opcode
* the opcode of the type instruction to be visited. This opcode
* is either IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ,
* IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE,
* IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
* @param label
* the operand of the instruction to be visited. This operand is
* a label that designates the instruction to which the jump
* instruction may jump.
* @param opcode the opcode of the type instruction to be visited. This opcode is either IFEQ,
* IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT,
* IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
* @param label the operand of the instruction to be visited. This operand is a label that
* designates the instruction to which the jump instruction may jump.
*/
public void visitJumpInsn(int opcode, Label label) {
if (mv != null) {
@ -427,11 +351,9 @@ public abstract class MethodVisitor {
}
/**
* Visits a label. A label designates the instruction that will be visited
* just after it.
* Visits a label. A label designates the instruction that will be visited just after it.
*
* @param label
* a {@link Label Label} object.
* @param label a {@link Label Label} object.
*/
public void visitLabel(Label label) {
if (mv != null) {
@ -444,10 +366,9 @@ public abstract class MethodVisitor {
// -------------------------------------------------------------------------
/**
* Visits a LDC instruction. Note that new constant types may be added in
* future versions of the Java Virtual Machine. To easily detect new
* constant types, implementations of this method should check for
* unexpected constant types, like this:
* Visits a LDC instruction. Note that new constant types may be added in future versions of the
* Java Virtual Machine. To easily detect new constant types, implementations of this method
* should check for unexpected constant types, like this:
*
* <pre>
* if (cst instanceof Integer) {
@ -478,14 +399,11 @@ public abstract class MethodVisitor {
* }
* </pre>
*
* @param cst
* the constant to be loaded on the stack. This parameter must be
* a non null {@link Integer}, a {@link Float}, a {@link Long}, a
* {@link Double}, a {@link String}, a {@link Type} of OBJECT or
* ARRAY sort for <tt>.class</tt> constants, for classes whose
* version is 49.0, a {@link Type} of METHOD sort or a
* {@link Handle} for MethodType and MethodHandle constants, for
* classes whose version is 51.0.
* @param cst the constant to be loaded on the stack. This parameter must be a non null
* {@link Integer}, a {@link Float}, a {@link Long}, a {@link Double}, a {@link String},
* a {@link Type} of OBJECT or ARRAY sort for <tt>.class</tt> constants, for classes
* whose version is 49.0, a {@link Type} of METHOD sort or a {@link Handle} for
* MethodType and MethodHandle constants, for classes whose version is 51.0.
*/
public void visitLdcInsn(Object cst) {
if (mv != null) {
@ -496,10 +414,8 @@ public abstract class MethodVisitor {
/**
* Visits an IINC instruction.
*
* @param var
* index of the local variable to be incremented.
* @param increment
* amount to increment the local variable by.
* @param var index of the local variable to be incremented.
* @param increment amount to increment the local variable by.
*/
public void visitIincInsn(int var, int increment) {
if (mv != null) {
@ -510,18 +426,13 @@ public abstract class MethodVisitor {
/**
* Visits a TABLESWITCH instruction.
*
* @param min
* the minimum key value.
* @param max
* the maximum key value.
* @param dflt
* beginning of the default handler block.
* @param labels
* beginnings of the handler blocks. <tt>labels[i]</tt> is the
* beginning of the handler block for the <tt>min + i</tt> key.
* @param min the minimum key value.
* @param max the maximum key value.
* @param dflt beginning of the default handler block.
* @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the beginning of the
* handler block for the <tt>min + i</tt> key.
*/
public void visitTableSwitchInsn(int min, int max, Label dflt,
Label... labels) {
public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) {
if (mv != null) {
mv.visitTableSwitchInsn(min, max, dflt, labels);
}
@ -530,13 +441,10 @@ public abstract class MethodVisitor {
/**
* Visits a LOOKUPSWITCH instruction.
*
* @param dflt
* beginning of the default handler block.
* @param keys
* the values of the keys.
* @param labels
* beginnings of the handler blocks. <tt>labels[i]</tt> is the
* beginning of the handler block for the <tt>keys[i]</tt> key.
* @param dflt beginning of the default handler block.
* @param keys the values of the keys.
* @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the beginning of the
* handler block for the <tt>keys[i]</tt> key.
*/
public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
if (mv != null) {
@ -547,10 +455,8 @@ public abstract class MethodVisitor {
/**
* Visits a MULTIANEWARRAY instruction.
*
* @param desc
* an array type descriptor (see {@link Type Type}).
* @param dims
* number of dimensions of the array to allocate.
* @param desc an array type descriptor (see {@link Type Type}).
* @param dims number of dimensions of the array to allocate.
*/
public void visitMultiANewArrayInsn(String desc, int dims) {
if (mv != null) {
@ -565,22 +471,15 @@ public abstract class MethodVisitor {
/**
* Visits a try catch block.
*
* @param start
* beginning of the exception handler's scope (inclusive).
* @param end
* end of the exception handler's scope (exclusive).
* @param handler
* beginning of the exception handler's code.
* @param type
* internal name of the type of exceptions handled by the
* handler, or <tt>null</tt> to catch any exceptions (for
* "finally" blocks).
* @throws IllegalArgumentException
* if one of the labels has already been visited by this visitor
* (by the {@link #visitLabel visitLabel} method).
* @param start beginning of the exception handler's scope (inclusive).
* @param end end of the exception handler's scope (exclusive).
* @param handler beginning of the exception handler's code.
* @param type internal name of the type of exceptions handled by the handler, or <tt>null</tt>
* to catch any exceptions (for "finally" blocks).
* @throws IllegalArgumentException if one of the labels has already been visited by this
* visitor (by the {@link #visitLabel visitLabel} method).
*/
public void visitTryCatchBlock(Label start, Label end, Label handler,
String type) {
public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
if (mv != null) {
mv.visitTryCatchBlock(start, end, handler, type);
}
@ -589,28 +488,20 @@ public abstract class MethodVisitor {
/**
* Visits a local variable declaration.
*
* @param name
* the name of a local variable.
* @param desc
* the type descriptor of this local variable.
* @param signature
* the type signature of this local variable. May be
* <tt>null</tt> if the local variable type does not use generic
* types.
* @param start
* the first instruction corresponding to the scope of this local
* variable (inclusive).
* @param end
* the last instruction corresponding to the scope of this local
* variable (exclusive).
* @param index
* the local variable's index.
* @throws IllegalArgumentException
* if one of the labels has not already been visited by this
* visitor (by the {@link #visitLabel visitLabel} method).
* @param name the name of a local variable.
* @param desc the type descriptor of this local variable.
* @param signature the type signature of this local variable. May be <tt>null</tt> if the local
* variable type does not use generic types.
* @param start the first instruction corresponding to the scope of this local variable
* (inclusive).
* @param end the last instruction corresponding to the scope of this local variable
* (exclusive).
* @param index the local variable's index.
* @throws IllegalArgumentException if one of the labels has not already been visited by this
* visitor (by the {@link #visitLabel visitLabel} method).
*/
public void visitLocalVariable(String name, String desc, String signature,
Label start, Label end, int index) {
public void visitLocalVariable(String name, String desc, String signature, Label start,
Label end, int index) {
if (mv != null) {
mv.visitLocalVariable(name, desc, signature, start, end, index);
}
@ -619,14 +510,11 @@ public abstract class MethodVisitor {
/**
* Visits a line number declaration.
*
* @param line
* a line number. This number refers to the source file from
* which the class was compiled.
* @param start
* the first instruction corresponding to this line number.
* @throws IllegalArgumentException
* if <tt>start</tt> has not already been visited by this
* visitor (by the {@link #visitLabel visitLabel} method).
* @param line a line number. This number refers to the source file from which the class was
* compiled.
* @param start the first instruction corresponding to this line number.
* @throws IllegalArgumentException if <tt>start</tt> has not already been visited by this
* visitor (by the {@link #visitLabel visitLabel} method).
*/
public void visitLineNumber(int line, Label start) {
if (mv != null) {
@ -635,13 +523,10 @@ public abstract class MethodVisitor {
}
/**
* Visits the maximum stack size and the maximum number of local variables
* of the method.
* Visits the maximum stack size and the maximum number of local variables of the method.
*
* @param maxStack
* maximum stack size of the method.
* @param maxLocals
* maximum number of local variables for the method.
* @param maxStack maximum stack size of the method.
* @param maxLocals maximum number of local variables for the method.
*/
public void visitMaxs(int maxStack, int maxLocals) {
if (mv != null) {
@ -650,9 +535,8 @@ public abstract class MethodVisitor {
}
/**
* Visits the end of the method. This method, which is the last one to be
* called, is used to inform the visitor that all the annotations and
* attributes of the method have been visited.
* Visits the end of the method. This method, which is the last one to be called, is used to
* inform the visitor that all the annotations and attributes of the method have been visited.
*/
public void visitEnd() {
if (mv != null) {

File diff suppressed because it is too large Load Diff

View File

@ -1,42 +1,32 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm;
/**
* Defines the JVM opcodes, access flags and array type codes. This interface
* does not define all the JVM opcodes because some opcodes are automatically
* handled. For example, the xLOAD and xSTORE opcodes are automatically replaced
* by xLOAD_n and xSTORE_n opcodes when possible. The xLOAD_n and xSTORE_n
* opcodes are therefore not defined in this interface. Likewise for LDC,
* automatically replaced by LDC_W or LDC2_W when necessary, WIDE, GOTO_W and
* JSR_W.
* Defines the JVM opcodes, access flags and array type codes. This interface does not define all
* the JVM opcodes because some opcodes are automatically handled. For example, the xLOAD and xSTORE
* opcodes are automatically replaced by xLOAD_n and xSTORE_n opcodes when possible. The xLOAD_n and
* xSTORE_n opcodes are therefore not defined in this interface. Likewise for LDC, automatically
* replaced by LDC_W or LDC2_W when necessary, WIDE, GOTO_W and JSR_W.
*
* @author Eric Bruneton
* @author Eugene Kuleshov
@ -120,28 +110,26 @@ public interface Opcodes {
int F_FULL = 0;
/**
* Represents a compressed frame where locals are the same as the locals in
* the previous frame, except that additional 1-3 locals are defined, and
* with an empty stack.
* Represents a compressed frame where locals are the same as the locals in the previous frame,
* except that additional 1-3 locals are defined, and with an empty stack.
*/
int F_APPEND = 1;
/**
* Represents a compressed frame where locals are the same as the locals in
* the previous frame, except that the last 1-3 locals are absent and with
* an empty stack.
* Represents a compressed frame where locals are the same as the locals in the previous frame,
* except that the last 1-3 locals are absent and with an empty stack.
*/
int F_CHOP = 2;
/**
* Represents a compressed frame with exactly the same locals as the
* previous frame and with an empty stack.
* Represents a compressed frame with exactly the same locals as the previous frame and with an
* empty stack.
*/
int F_SAME = 3;
/**
* Represents a compressed frame with exactly the same locals as the
* previous frame and with a single value on the stack.
* Represents a compressed frame with exactly the same locals as the previous frame and with a
* single value on the stack.
*/
int F_SAME1 = 4;

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm;
@ -33,8 +25,8 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
/**
* A Java field or method type. This class can be used to make it easier to
* manipulate type and method descriptors.
* A Java field or method type. This class can be used to make it easier to manipulate type and
* method descriptors.
*
* @author Eric Bruneton
* @author Chris Nokleberg
@ -104,56 +96,56 @@ public class Type {
/**
* The <tt>void</tt> type.
*/
public static final Type VOID_TYPE = new Type(VOID, null, ('V' << 24)
| (5 << 16) | (0 << 8) | 0, 1);
public static final Type VOID_TYPE =
new Type(VOID, null, ('V' << 24) | (5 << 16) | (0 << 8) | 0, 1);
/**
* The <tt>boolean</tt> type.
*/
public static final Type BOOLEAN_TYPE = new Type(BOOLEAN, null, ('Z' << 24)
| (0 << 16) | (5 << 8) | 1, 1);
public static final Type BOOLEAN_TYPE =
new Type(BOOLEAN, null, ('Z' << 24) | (0 << 16) | (5 << 8) | 1, 1);
/**
* The <tt>char</tt> type.
*/
public static final Type CHAR_TYPE = new Type(CHAR, null, ('C' << 24)
| (0 << 16) | (6 << 8) | 1, 1);
public static final Type CHAR_TYPE =
new Type(CHAR, null, ('C' << 24) | (0 << 16) | (6 << 8) | 1, 1);
/**
* The <tt>byte</tt> type.
*/
public static final Type BYTE_TYPE = new Type(BYTE, null, ('B' << 24)
| (0 << 16) | (5 << 8) | 1, 1);
public static final Type BYTE_TYPE =
new Type(BYTE, null, ('B' << 24) | (0 << 16) | (5 << 8) | 1, 1);
/**
* The <tt>short</tt> type.
*/
public static final Type SHORT_TYPE = new Type(SHORT, null, ('S' << 24)
| (0 << 16) | (7 << 8) | 1, 1);
public static final Type SHORT_TYPE =
new Type(SHORT, null, ('S' << 24) | (0 << 16) | (7 << 8) | 1, 1);
/**
* The <tt>int</tt> type.
*/
public static final Type INT_TYPE = new Type(INT, null, ('I' << 24)
| (0 << 16) | (0 << 8) | 1, 1);
public static final Type INT_TYPE =
new Type(INT, null, ('I' << 24) | (0 << 16) | (0 << 8) | 1, 1);
/**
* The <tt>float</tt> type.
*/
public static final Type FLOAT_TYPE = new Type(FLOAT, null, ('F' << 24)
| (2 << 16) | (2 << 8) | 1, 1);
public static final Type FLOAT_TYPE =
new Type(FLOAT, null, ('F' << 24) | (2 << 16) | (2 << 8) | 1, 1);
/**
* The <tt>long</tt> type.
*/
public static final Type LONG_TYPE = new Type(LONG, null, ('J' << 24)
| (1 << 16) | (1 << 8) | 2, 1);
public static final Type LONG_TYPE =
new Type(LONG, null, ('J' << 24) | (1 << 16) | (1 << 8) | 2, 1);
/**
* The <tt>double</tt> type.
*/
public static final Type DOUBLE_TYPE = new Type(DOUBLE, null, ('D' << 24)
| (3 << 16) | (3 << 8) | 2, 1);
public static final Type DOUBLE_TYPE =
new Type(DOUBLE, null, ('D' << 24) | (3 << 16) | (3 << 8) | 2, 1);
// ------------------------------------------------------------------------
// Fields
@ -165,16 +157,16 @@ public class Type {
private final int sort;
/**
* A buffer containing the internal name of this Java type. This field is
* only used for reference types.
* A buffer containing the internal name of this Java type. This field is only used for
* reference types.
*/
private final char[] buf;
/**
* The offset of the internal name of this Java type in {@link #buf buf} or,
* for primitive types, the size, descriptor and getOpcode offsets for this
* type (byte 0 contains the size, byte 1 the descriptor, byte 2 the offset
* for IALOAD or IASTORE, byte 3 the offset for all other instructions).
* The offset of the internal name of this Java type in {@link #buf buf} or, for primitive
* types, the size, descriptor and getOpcode offsets for this type (byte 0 contains the size,
* byte 1 the descriptor, byte 2 the offset for IALOAD or IASTORE, byte 3 the offset for all
* other instructions).
*/
private final int off;
@ -190,14 +182,10 @@ public class Type {
/**
* Constructs a reference type.
*
* @param sort
* the sort of the reference type to be constructed.
* @param buf
* a buffer containing the descriptor of the previous type.
* @param off
* the offset of this descriptor in the previous buffer.
* @param len
* the length of this descriptor.
* @param sort the sort of the reference type to be constructed.
* @param buf a buffer containing the descriptor of the previous type.
* @param off the offset of this descriptor in the previous buffer.
* @param len the length of this descriptor.
*/
private Type(final int sort, final char[] buf, final int off, final int len) {
this.sort = sort;
@ -209,8 +197,7 @@ public class Type {
/**
* Returns the Java type corresponding to the given type descriptor.
*
* @param typeDescriptor
* a field or method type descriptor.
* @param typeDescriptor a field or method type descriptor.
* @return the Java type corresponding to the given type descriptor.
*/
public static Type getType(final String typeDescriptor) {
@ -220,8 +207,7 @@ public class Type {
/**
* Returns the Java type corresponding to the given internal name.
*
* @param internalName
* an internal name.
* @param internalName an internal name.
* @return the Java type corresponding to the given internal name.
*/
public static Type getObjectType(final String internalName) {
@ -230,11 +216,10 @@ public class Type {
}
/**
* Returns the Java type corresponding to the given method descriptor.
* Equivalent to <code>Type.getType(methodDescriptor)</code>.
* Returns the Java type corresponding to the given method descriptor. Equivalent to
* <code>Type.getType(methodDescriptor)</code>.
*
* @param methodDescriptor
* a method descriptor.
* @param methodDescriptor a method descriptor.
* @return the Java type corresponding to the given method descriptor.
*/
public static Type getMethodType(final String methodDescriptor) {
@ -242,26 +227,20 @@ public class Type {
}
/**
* Returns the Java method type corresponding to the given argument and
* return types.
* Returns the Java method type corresponding to the given argument and return types.
*
* @param returnType
* the return type of the method.
* @param argumentTypes
* the argument types of the method.
* @return the Java type corresponding to the given argument and return
* types.
* @param returnType the return type of the method.
* @param argumentTypes the argument types of the method.
* @return the Java type corresponding to the given argument and return types.
*/
public static Type getMethodType(final Type returnType,
final Type... argumentTypes) {
public static Type getMethodType(final Type returnType, final Type... argumentTypes) {
return getType(getMethodDescriptor(returnType, argumentTypes));
}
/**
* Returns the Java type corresponding to the given class.
*
* @param c
* a class.
* @param c a class.
* @return the Java type corresponding to the given class.
*/
public static Type getType(final Class<?> c) {
@ -282,7 +261,7 @@ public class Type {
return DOUBLE_TYPE;
} else if (c == Float.TYPE) {
return FLOAT_TYPE;
} else /* if (c == Long.TYPE) */{
} else /* if (c == Long.TYPE) */ {
return LONG_TYPE;
}
} else {
@ -293,8 +272,7 @@ public class Type {
/**
* Returns the Java method type corresponding to the given constructor.
*
* @param c
* a {@link Constructor Constructor} object.
* @param c a {@link Constructor Constructor} object.
* @return the Java method type corresponding to the given constructor.
*/
public static Type getType(final Constructor<?> c) {
@ -304,8 +282,7 @@ public class Type {
/**
* Returns the Java method type corresponding to the given method.
*
* @param m
* a {@link Method Method} object.
* @param m a {@link Method Method} object.
* @return the Java method type corresponding to the given method.
*/
public static Type getType(final Method m) {
@ -313,13 +290,10 @@ public class Type {
}
/**
* Returns the Java types corresponding to the argument types of the given
* method descriptor.
* Returns the Java types corresponding to the argument types of the given method descriptor.
*
* @param methodDescriptor
* a method descriptor.
* @return the Java types corresponding to the argument types of the given
* method descriptor.
* @param methodDescriptor a method descriptor.
* @return the Java types corresponding to the argument types of the given method descriptor.
*/
public static Type[] getArgumentTypes(final String methodDescriptor) {
char[] buf = methodDescriptor.toCharArray();
@ -349,13 +323,10 @@ public class Type {
}
/**
* Returns the Java types corresponding to the argument types of the given
* method.
* Returns the Java types corresponding to the argument types of the given method.
*
* @param method
* a method.
* @return the Java types corresponding to the argument types of the given
* method.
* @param method a method.
* @return the Java types corresponding to the argument types of the given method.
*/
public static Type[] getArgumentTypes(final Method method) {
Class<?>[] classes = method.getParameterTypes();
@ -367,13 +338,10 @@ public class Type {
}
/**
* Returns the Java type corresponding to the return type of the given
* method descriptor.
* Returns the Java type corresponding to the return type of the given method descriptor.
*
* @param methodDescriptor
* a method descriptor.
* @return the Java type corresponding to the return type of the given
* method descriptor.
* @param methodDescriptor a method descriptor.
* @return the Java type corresponding to the return type of the given method descriptor.
*/
public static Type getReturnType(final String methodDescriptor) {
char[] buf = methodDescriptor.toCharArray();
@ -381,13 +349,10 @@ public class Type {
}
/**
* Returns the Java type corresponding to the return type of the given
* method.
* Returns the Java type corresponding to the return type of the given method.
*
* @param method
* a method.
* @return the Java type corresponding to the return type of the given
* method.
* @param method a method.
* @return the Java type corresponding to the return type of the given method.
*/
public static Type getReturnType(final Method method) {
return getType(method.getReturnType());
@ -396,13 +361,11 @@ public class Type {
/**
* Computes the size of the arguments and of the return value of a method.
*
* @param desc
* the descriptor of a method.
* @return the size of the arguments of the method (plus one for the
* implicit this argument), argSize, and the size of its return
* value, retSize, packed into a single int i =
* <tt>(argSize << 2) | retSize</tt> (argSize is therefore equal to
* <tt>i >> 2</tt>, and retSize to <tt>i & 0x03</tt>).
* @param desc the descriptor of a method.
* @return the size of the arguments of the method (plus one for the implicit this argument),
* argSize, and the size of its return value, retSize, packed into a single int i =
* <tt>(argSize << 2) | retSize</tt> (argSize is therefore equal to <tt>i >> 2</tt>, and
* retSize to <tt>i & 0x03</tt>).
*/
public static int getArgumentsAndReturnSizes(final String desc) {
int n = 1;
@ -411,8 +374,7 @@ public class Type {
char car = desc.charAt(c++);
if (car == ')') {
car = desc.charAt(c);
return n << 2
| (car == 'V' ? 0 : (car == 'D' || car == 'J' ? 2 : 1));
return n << 2 | (car == 'V' ? 0 : (car == 'D' || car == 'J' ? 2 : 1));
} else if (car == 'L') {
while (desc.charAt(c++) != ';') {
}
@ -433,58 +395,55 @@ public class Type {
}
/**
* Returns the Java type corresponding to the given type descriptor. For
* method descriptors, buf is supposed to contain nothing more than the
* descriptor itself.
* Returns the Java type corresponding to the given type descriptor. For method descriptors, buf
* is supposed to contain nothing more than the descriptor itself.
*
* @param buf
* a buffer containing a type descriptor.
* @param off
* the offset of this descriptor in the previous buffer.
* @param buf a buffer containing a type descriptor.
* @param off the offset of this descriptor in the previous buffer.
* @return the Java type corresponding to the given type descriptor.
*/
private static Type getType(final char[] buf, final int off) {
int len;
switch (buf[off]) {
case 'V':
return VOID_TYPE;
case 'Z':
return BOOLEAN_TYPE;
case 'C':
return CHAR_TYPE;
case 'B':
return BYTE_TYPE;
case 'S':
return SHORT_TYPE;
case 'I':
return INT_TYPE;
case 'F':
return FLOAT_TYPE;
case 'J':
return LONG_TYPE;
case 'D':
return DOUBLE_TYPE;
case '[':
len = 1;
while (buf[off + len] == '[') {
++len;
}
if (buf[off + len] == 'L') {
++len;
case 'V':
return VOID_TYPE;
case 'Z':
return BOOLEAN_TYPE;
case 'C':
return CHAR_TYPE;
case 'B':
return BYTE_TYPE;
case 'S':
return SHORT_TYPE;
case 'I':
return INT_TYPE;
case 'F':
return FLOAT_TYPE;
case 'J':
return LONG_TYPE;
case 'D':
return DOUBLE_TYPE;
case '[':
len = 1;
while (buf[off + len] == '[') {
++len;
}
if (buf[off + len] == 'L') {
++len;
while (buf[off + len] != ';') {
++len;
}
}
return new Type(ARRAY, buf, off, len + 1);
case 'L':
len = 1;
while (buf[off + len] != ';') {
++len;
}
}
return new Type(ARRAY, buf, off, len + 1);
case 'L':
len = 1;
while (buf[off + len] != ';') {
++len;
}
return new Type(OBJECT, buf, off + 1, len - 1);
return new Type(OBJECT, buf, off + 1, len - 1);
// case '(':
default:
return new Type(METHOD, buf, off, buf.length - off);
default:
return new Type(METHOD, buf, off, buf.length - off);
}
}
@ -495,19 +454,18 @@ public class Type {
/**
* Returns the sort of this Java type.
*
* @return {@link #VOID VOID}, {@link #BOOLEAN BOOLEAN}, {@link #CHAR CHAR},
* {@link #BYTE BYTE}, {@link #SHORT SHORT}, {@link #INT INT},
* {@link #FLOAT FLOAT}, {@link #LONG LONG}, {@link #DOUBLE DOUBLE},
* {@link #ARRAY ARRAY}, {@link #OBJECT OBJECT} or {@link #METHOD
* METHOD}.
* @return {@link #VOID VOID}, {@link #BOOLEAN BOOLEAN}, {@link #CHAR CHAR}, {@link #BYTE BYTE},
* {@link #SHORT SHORT}, {@link #INT INT}, {@link #FLOAT FLOAT}, {@link #LONG LONG},
* {@link #DOUBLE DOUBLE}, {@link #ARRAY ARRAY}, {@link #OBJECT OBJECT} or
* {@link #METHOD METHOD}.
*/
public int getSort() {
return sort;
}
/**
* Returns the number of dimensions of this array type. This method should
* only be used for an array type.
* Returns the number of dimensions of this array type. This method should only be used for an
* array type.
*
* @return the number of dimensions of this array type.
*/
@ -520,8 +478,8 @@ public class Type {
}
/**
* Returns the type of the elements of this array type. This method should
* only be used for an array type.
* Returns the type of the elements of this array type. This method should only be used for an
* array type.
*
* @return Returns the type of the elements of this array type.
*/
@ -530,49 +488,48 @@ public class Type {
}
/**
* Returns the binary name of the class corresponding to this type. This
* method must not be used on method types.
* Returns the binary name of the class corresponding to this type. This method must not be used
* on method types.
*
* @return the binary name of the class corresponding to this type.
*/
public String getClassName() {
switch (sort) {
case VOID:
return "void";
case BOOLEAN:
return "boolean";
case CHAR:
return "char";
case BYTE:
return "byte";
case SHORT:
return "short";
case INT:
return "int";
case FLOAT:
return "float";
case LONG:
return "long";
case DOUBLE:
return "double";
case ARRAY:
StringBuffer b = new StringBuffer(getElementType().getClassName());
for (int i = getDimensions(); i > 0; --i) {
b.append("[]");
}
return b.toString();
case OBJECT:
return new String(buf, off, len).replace('/', '.');
default:
return null;
case VOID:
return "void";
case BOOLEAN:
return "boolean";
case CHAR:
return "char";
case BYTE:
return "byte";
case SHORT:
return "short";
case INT:
return "int";
case FLOAT:
return "float";
case LONG:
return "long";
case DOUBLE:
return "double";
case ARRAY:
StringBuffer b = new StringBuffer(getElementType().getClassName());
for (int i = getDimensions(); i > 0; --i) {
b.append("[]");
}
return b.toString();
case OBJECT:
return new String(buf, off, len).replace('/', '.');
default:
return null;
}
}
/**
* Returns the internal name of the class corresponding to this object or
* array type. The internal name of a class is its fully qualified name (as
* returned by Class.getName(), where '.' are replaced by '/'. This method
* should only be used for an object or array type.
* Returns the internal name of the class corresponding to this object or array type. The
* internal name of a class is its fully qualified name (as returned by Class.getName(), where
* '.' are replaced by '/'. This method should only be used for an object or array type.
*
* @return the internal name of the class corresponding to this object type.
*/
@ -581,8 +538,8 @@ public class Type {
}
/**
* Returns the argument types of methods of this type. This method should
* only be used for method types.
* Returns the argument types of methods of this type. This method should only be used for
* method types.
*
* @return the argument types of methods of this type.
*/
@ -591,8 +548,8 @@ public class Type {
}
/**
* Returns the return type of methods of this type. This method should only
* be used for method types.
* Returns the return type of methods of this type. This method should only be used for method
* types.
*
* @return the return type of methods of this type.
*/
@ -601,14 +558,13 @@ public class Type {
}
/**
* Returns the size of the arguments and of the return value of methods of
* this type. This method should only be used for method types.
* Returns the size of the arguments and of the return value of methods of this type. This
* method should only be used for method types.
*
* @return the size of the arguments (plus one for the implicit this
* argument), argSize, and the size of the return value, retSize,
* packed into a single int i = <tt>(argSize << 2) | retSize</tt>
* (argSize is therefore equal to <tt>i >> 2</tt>, and retSize to
* <tt>i & 0x03</tt>).
* @return the size of the arguments (plus one for the implicit this argument), argSize, and the
* size of the return value, retSize, packed into a single int i =
* <tt>(argSize << 2) | retSize</tt> (argSize is therefore equal to <tt>i >> 2</tt>, and
* retSize to <tt>i & 0x03</tt>).
*/
public int getArgumentsAndReturnSizes() {
return getArgumentsAndReturnSizes(getDescriptor());
@ -630,18 +586,13 @@ public class Type {
}
/**
* Returns the descriptor corresponding to the given argument and return
* types.
* Returns the descriptor corresponding to the given argument and return types.
*
* @param returnType
* the return type of the method.
* @param argumentTypes
* the argument types of the method.
* @return the descriptor corresponding to the given argument and return
* types.
* @param returnType the return type of the method.
* @param argumentTypes the argument types of the method.
* @return the descriptor corresponding to the given argument and return types.
*/
public static String getMethodDescriptor(final Type returnType,
final Type... argumentTypes) {
public static String getMethodDescriptor(final Type returnType, final Type... argumentTypes) {
StringBuffer buf = new StringBuffer();
buf.append('(');
for (int i = 0; i < argumentTypes.length; ++i) {
@ -653,11 +604,9 @@ public class Type {
}
/**
* Appends the descriptor corresponding to this Java type to the given
* string buffer.
* Appends the descriptor corresponding to this Java type to the given string buffer.
*
* @param buf
* the string buffer to which the descriptor must be appended.
* @param buf the string buffer to which the descriptor must be appended.
*/
private void getDescriptor(final StringBuffer buf) {
if (this.buf == null) {
@ -679,12 +628,10 @@ public class Type {
// ------------------------------------------------------------------------
/**
* Returns the internal name of the given class. The internal name of a
* class is its fully qualified name, as returned by Class.getName(), where
* '.' are replaced by '/'.
* Returns the internal name of the given class. The internal name of a class is its fully
* qualified name, as returned by Class.getName(), where '.' are replaced by '/'.
*
* @param c
* an object or array class.
* @param c an object or array class.
* @return the internal name of the given class.
*/
public static String getInternalName(final Class<?> c) {
@ -694,8 +641,7 @@ public class Type {
/**
* Returns the descriptor corresponding to the given Java type.
*
* @param c
* an object class, a primitive class or an array class.
* @param c an object class, a primitive class or an array class.
* @return the descriptor corresponding to the given class.
*/
public static String getDescriptor(final Class<?> c) {
@ -707,8 +653,7 @@ public class Type {
/**
* Returns the descriptor corresponding to the given constructor.
*
* @param c
* a {@link Constructor Constructor} object.
* @param c a {@link Constructor Constructor} object.
* @return the descriptor of the given constructor.
*/
public static String getConstructorDescriptor(final Constructor<?> c) {
@ -724,8 +669,7 @@ public class Type {
/**
* Returns the descriptor corresponding to the given method.
*
* @param m
* a {@link Method Method} object.
* @param m a {@link Method Method} object.
* @return the descriptor of the given method.
*/
public static String getMethodDescriptor(final Method m) {
@ -743,10 +687,8 @@ public class Type {
/**
* Appends the descriptor of the given class to the given string buffer.
*
* @param buf
* the string buffer to which the descriptor must be appended.
* @param c
* the class whose descriptor must be computed.
* @param buf the string buffer to which the descriptor must be appended.
* @param c the class whose descriptor must be computed.
*/
private static void getDescriptor(final StringBuffer buf, final Class<?> c) {
Class<?> d = c;
@ -769,7 +711,7 @@ public class Type {
car = 'D';
} else if (d == Float.TYPE) {
car = 'F';
} else /* if (d == Long.TYPE) */{
} else /* if (d == Long.TYPE) */ {
car = 'J';
}
buf.append(car);
@ -796,11 +738,10 @@ public class Type {
// ------------------------------------------------------------------------
/**
* Returns the size of values of this type. This method must not be used for
* method types.
* Returns the size of values of this type. This method must not be used for method types.
*
* @return the size of values of this type, i.e., 2 for <tt>long</tt> and
* <tt>double</tt>, 0 for <tt>void</tt> and 1 otherwise.
* @return the size of values of this type, i.e., 2 for <tt>long</tt> and <tt>double</tt>, 0 for
* <tt>void</tt> and 1 otherwise.
*/
public int getSize() {
// the size is in byte 0 of 'off' for primitive types (buf == null)
@ -808,16 +749,15 @@ public class Type {
}
/**
* Returns a JVM instruction opcode adapted to this Java type. This method
* must not be used for method types.
* Returns a JVM instruction opcode adapted to this Java type. This method must not be used for
* method types.
*
* @param opcode
* a JVM instruction opcode. This opcode must be one of ILOAD,
* ISTORE, IALOAD, IASTORE, IADD, ISUB, IMUL, IDIV, IREM, INEG,
* ISHL, ISHR, IUSHR, IAND, IOR, IXOR and IRETURN.
* @return an opcode that is similar to the given opcode, but adapted to
* this Java type. For example, if this type is <tt>float</tt> and
* <tt>opcode</tt> is IRETURN, this method returns FRETURN.
* @param opcode a JVM instruction opcode. This opcode must be one of ILOAD, ISTORE, IALOAD,
* IASTORE, IADD, ISUB, IMUL, IDIV, IREM, INEG, ISHL, ISHR, IUSHR, IAND, IOR, IXOR and
* IRETURN.
* @return an opcode that is similar to the given opcode, but adapted to this Java type. For
* example, if this type is <tt>float</tt> and <tt>opcode</tt> is IRETURN, this method
* returns FRETURN.
*/
public int getOpcode(final int opcode) {
if (opcode == Opcodes.IALOAD || opcode == Opcodes.IASTORE) {
@ -838,8 +778,7 @@ public class Type {
/**
* Tests if the given object is equal to this type.
*
* @param o
* the object to be compared to this type.
* @param o the object to be compared to this type.
* @return <tt>true</tt> if the given object is equal to this type.
*/
@Override

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.commons;
@ -41,17 +33,17 @@ import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
/**
* A {@link org.objectweb.asm.MethodVisitor} to insert before, after and around
* advices in methods and constructors.
* A {@link org.objectweb.asm.MethodVisitor} to insert before, after and around advices in methods
* and constructors.
* <p>
* The behavior for constructors is like this:
* <ol>
*
* <li>as long as the INVOKESPECIAL for the object initialization has not been
* reached, every bytecode instruction is dispatched in the ctor code visitor</li>
* <li>as long as the INVOKESPECIAL for the object initialization has not been reached, every
* bytecode instruction is dispatched in the ctor code visitor</li>
*
* <li>when this one is reached, it is only added in the ctor code visitor and a
* JP invoke is added</li>
* <li>when this one is reached, it is only added in the ctor code visitor and a JP invoke is
* added</li>
*
* <li>after that, only the other code visitor receives the instructions</li>
*
@ -81,20 +73,15 @@ public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes
/**
* Creates a new {@link AdviceAdapter}.
*
* @param api
* the ASM API version implemented by this visitor. Must be one
* of {@link Opcodes#ASM4}.
* @param mv
* the method visitor to which this adapter delegates calls.
* @param access
* the method's access flags (see {@link Opcodes}).
* @param name
* the method's name.
* @param desc
* the method's descriptor (see {@link Type Type}).
* @param api the ASM API version implemented by this visitor. Must be one of
* {@link Opcodes#ASM4}.
* @param mv the method visitor to which this adapter delegates calls.
* @param access the method's access flags (see {@link Opcodes}).
* @param name the method's name.
* @param desc the method's descriptor (see {@link Type Type}).
*/
protected AdviceAdapter(final int api, final MethodVisitor mv,
final int access, final String name, final String desc) {
protected AdviceAdapter(final int api, final MethodVisitor mv, final int access,
final String name, final String desc) {
super(api, mv, access, name, desc);
methodAccess = access;
methodDesc = desc;
@ -130,178 +117,178 @@ public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes
if (constructor) {
int s;
switch (opcode) {
case RETURN: // empty stack
onMethodExit(opcode);
break;
case IRETURN: // 1 before n/a after
case FRETURN: // 1 before n/a after
case ARETURN: // 1 before n/a after
case ATHROW: // 1 before n/a after
popValue();
onMethodExit(opcode);
break;
case LRETURN: // 2 before n/a after
case DRETURN: // 2 before n/a after
popValue();
popValue();
onMethodExit(opcode);
break;
case NOP:
case LALOAD: // remove 2 add 2
case DALOAD: // remove 2 add 2
case LNEG:
case DNEG:
case FNEG:
case INEG:
case L2D:
case D2L:
case F2I:
case I2B:
case I2C:
case I2S:
case I2F:
case ARRAYLENGTH:
break;
case ACONST_NULL:
case ICONST_M1:
case ICONST_0:
case ICONST_1:
case ICONST_2:
case ICONST_3:
case ICONST_4:
case ICONST_5:
case FCONST_0:
case FCONST_1:
case FCONST_2:
case F2L: // 1 before 2 after
case F2D:
case I2L:
case I2D:
pushValue(OTHER);
break;
case LCONST_0:
case LCONST_1:
case DCONST_0:
case DCONST_1:
pushValue(OTHER);
pushValue(OTHER);
break;
case IALOAD: // remove 2 add 1
case FALOAD: // remove 2 add 1
case AALOAD: // remove 2 add 1
case BALOAD: // remove 2 add 1
case CALOAD: // remove 2 add 1
case SALOAD: // remove 2 add 1
case POP:
case IADD:
case FADD:
case ISUB:
case LSHL: // 3 before 2 after
case LSHR: // 3 before 2 after
case LUSHR: // 3 before 2 after
case L2I: // 2 before 1 after
case L2F: // 2 before 1 after
case D2I: // 2 before 1 after
case D2F: // 2 before 1 after
case FSUB:
case FMUL:
case FDIV:
case FREM:
case FCMPL: // 2 before 1 after
case FCMPG: // 2 before 1 after
case IMUL:
case IDIV:
case IREM:
case ISHL:
case ISHR:
case IUSHR:
case IAND:
case IOR:
case IXOR:
case MONITORENTER:
case MONITOREXIT:
popValue();
break;
case POP2:
case LSUB:
case LMUL:
case LDIV:
case LREM:
case LADD:
case LAND:
case LOR:
case LXOR:
case DADD:
case DMUL:
case DSUB:
case DDIV:
case DREM:
popValue();
popValue();
break;
case IASTORE:
case FASTORE:
case AASTORE:
case BASTORE:
case CASTORE:
case SASTORE:
case LCMP: // 4 before 1 after
case DCMPL:
case DCMPG:
popValue();
popValue();
popValue();
break;
case LASTORE:
case DASTORE:
popValue();
popValue();
popValue();
popValue();
break;
case DUP:
pushValue(peekValue());
break;
case DUP_X1:
s = stackFrame.size();
stackFrame.add(s - 2, stackFrame.get(s - 1));
break;
case DUP_X2:
s = stackFrame.size();
stackFrame.add(s - 3, stackFrame.get(s - 1));
break;
case DUP2:
s = stackFrame.size();
stackFrame.add(s - 2, stackFrame.get(s - 1));
stackFrame.add(s - 2, stackFrame.get(s - 1));
break;
case DUP2_X1:
s = stackFrame.size();
stackFrame.add(s - 3, stackFrame.get(s - 1));
stackFrame.add(s - 3, stackFrame.get(s - 1));
break;
case DUP2_X2:
s = stackFrame.size();
stackFrame.add(s - 4, stackFrame.get(s - 1));
stackFrame.add(s - 4, stackFrame.get(s - 1));
break;
case SWAP:
s = stackFrame.size();
stackFrame.add(s - 2, stackFrame.get(s - 1));
stackFrame.remove(s);
break;
case RETURN: // empty stack
onMethodExit(opcode);
break;
case IRETURN: // 1 before n/a after
case FRETURN: // 1 before n/a after
case ARETURN: // 1 before n/a after
case ATHROW: // 1 before n/a after
popValue();
onMethodExit(opcode);
break;
case LRETURN: // 2 before n/a after
case DRETURN: // 2 before n/a after
popValue();
popValue();
onMethodExit(opcode);
break;
case NOP:
case LALOAD: // remove 2 add 2
case DALOAD: // remove 2 add 2
case LNEG:
case DNEG:
case FNEG:
case INEG:
case L2D:
case D2L:
case F2I:
case I2B:
case I2C:
case I2S:
case I2F:
case ARRAYLENGTH:
break;
case ACONST_NULL:
case ICONST_M1:
case ICONST_0:
case ICONST_1:
case ICONST_2:
case ICONST_3:
case ICONST_4:
case ICONST_5:
case FCONST_0:
case FCONST_1:
case FCONST_2:
case F2L: // 1 before 2 after
case F2D:
case I2L:
case I2D:
pushValue(OTHER);
break;
case LCONST_0:
case LCONST_1:
case DCONST_0:
case DCONST_1:
pushValue(OTHER);
pushValue(OTHER);
break;
case IALOAD: // remove 2 add 1
case FALOAD: // remove 2 add 1
case AALOAD: // remove 2 add 1
case BALOAD: // remove 2 add 1
case CALOAD: // remove 2 add 1
case SALOAD: // remove 2 add 1
case POP:
case IADD:
case FADD:
case ISUB:
case LSHL: // 3 before 2 after
case LSHR: // 3 before 2 after
case LUSHR: // 3 before 2 after
case L2I: // 2 before 1 after
case L2F: // 2 before 1 after
case D2I: // 2 before 1 after
case D2F: // 2 before 1 after
case FSUB:
case FMUL:
case FDIV:
case FREM:
case FCMPL: // 2 before 1 after
case FCMPG: // 2 before 1 after
case IMUL:
case IDIV:
case IREM:
case ISHL:
case ISHR:
case IUSHR:
case IAND:
case IOR:
case IXOR:
case MONITORENTER:
case MONITOREXIT:
popValue();
break;
case POP2:
case LSUB:
case LMUL:
case LDIV:
case LREM:
case LADD:
case LAND:
case LOR:
case LXOR:
case DADD:
case DMUL:
case DSUB:
case DDIV:
case DREM:
popValue();
popValue();
break;
case IASTORE:
case FASTORE:
case AASTORE:
case BASTORE:
case CASTORE:
case SASTORE:
case LCMP: // 4 before 1 after
case DCMPL:
case DCMPG:
popValue();
popValue();
popValue();
break;
case LASTORE:
case DASTORE:
popValue();
popValue();
popValue();
popValue();
break;
case DUP:
pushValue(peekValue());
break;
case DUP_X1:
s = stackFrame.size();
stackFrame.add(s - 2, stackFrame.get(s - 1));
break;
case DUP_X2:
s = stackFrame.size();
stackFrame.add(s - 3, stackFrame.get(s - 1));
break;
case DUP2:
s = stackFrame.size();
stackFrame.add(s - 2, stackFrame.get(s - 1));
stackFrame.add(s - 2, stackFrame.get(s - 1));
break;
case DUP2_X1:
s = stackFrame.size();
stackFrame.add(s - 3, stackFrame.get(s - 1));
stackFrame.add(s - 3, stackFrame.get(s - 1));
break;
case DUP2_X2:
s = stackFrame.size();
stackFrame.add(s - 4, stackFrame.get(s - 1));
stackFrame.add(s - 4, stackFrame.get(s - 1));
break;
case SWAP:
s = stackFrame.size();
stackFrame.add(s - 2, stackFrame.get(s - 1));
stackFrame.remove(s);
break;
}
} else {
switch (opcode) {
case RETURN:
case IRETURN:
case FRETURN:
case ARETURN:
case LRETURN:
case DRETURN:
case ATHROW:
onMethodExit(opcode);
break;
case RETURN:
case IRETURN:
case FRETURN:
case ARETURN:
case LRETURN:
case DRETURN:
case ATHROW:
onMethodExit(opcode);
break;
}
}
mv.visitInsn(opcode);
@ -312,64 +299,64 @@ public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes
super.visitVarInsn(opcode, var);
if (constructor) {
switch (opcode) {
case ILOAD:
case FLOAD:
pushValue(OTHER);
break;
case LLOAD:
case DLOAD:
pushValue(OTHER);
pushValue(OTHER);
break;
case ALOAD:
pushValue(var == 0 ? THIS : OTHER);
break;
case ASTORE:
case ISTORE:
case FSTORE:
popValue();
break;
case LSTORE:
case DSTORE:
popValue();
popValue();
break;
case ILOAD:
case FLOAD:
pushValue(OTHER);
break;
case LLOAD:
case DLOAD:
pushValue(OTHER);
pushValue(OTHER);
break;
case ALOAD:
pushValue(var == 0 ? THIS : OTHER);
break;
case ASTORE:
case ISTORE:
case FSTORE:
popValue();
break;
case LSTORE:
case DSTORE:
popValue();
popValue();
break;
}
}
}
@Override
public void visitFieldInsn(final int opcode, final String owner,
final String name, final String desc) {
public void visitFieldInsn(final int opcode, final String owner, final String name,
final String desc) {
mv.visitFieldInsn(opcode, owner, name, desc);
if (constructor) {
char c = desc.charAt(0);
boolean longOrDouble = c == 'J' || c == 'D';
switch (opcode) {
case GETSTATIC:
pushValue(OTHER);
if (longOrDouble) {
case GETSTATIC:
pushValue(OTHER);
}
break;
case PUTSTATIC:
popValue();
if (longOrDouble) {
if (longOrDouble) {
pushValue(OTHER);
}
break;
case PUTSTATIC:
popValue();
}
break;
case PUTFIELD:
popValue();
if (longOrDouble) {
if (longOrDouble) {
popValue();
}
break;
case PUTFIELD:
popValue();
popValue();
}
break;
// case GETFIELD:
default:
if (longOrDouble) {
pushValue(OTHER);
}
if (longOrDouble) {
popValue();
popValue();
}
break;
// case GETFIELD:
default:
if (longOrDouble) {
pushValue(OTHER);
}
}
}
}
@ -414,8 +401,8 @@ public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes
}
@Override
public void visitMethodInsn(final int opcode, final String owner,
final String name, final String desc) {
public void visitMethodInsn(final int opcode, final String owner, final String name,
final String desc) {
mv.visitMethodInsn(opcode, owner, name, desc);
if (constructor) {
Type[] types = Type.getArgumentTypes(desc);
@ -426,22 +413,22 @@ public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes
}
}
switch (opcode) {
// case INVOKESTATIC:
// break;
case INVOKEINTERFACE:
case INVOKEVIRTUAL:
popValue(); // objectref
break;
case INVOKESPECIAL:
Object type = popValue(); // objectref
if (type == THIS && !superInitialized) {
onMethodEnter();
superInitialized = true;
// once super has been initialized it is no longer
// necessary to keep track of stack state
constructor = false;
}
break;
// case INVOKESTATIC:
// break;
case INVOKEINTERFACE:
case INVOKEVIRTUAL:
popValue(); // objectref
break;
case INVOKESPECIAL:
Object type = popValue(); // objectref
if (type == THIS && !superInitialized) {
onMethodEnter();
superInitialized = true;
// once super has been initialized it is no longer
// necessary to keep track of stack state
constructor = false;
}
break;
}
Type returnType = Type.getReturnType(desc);
@ -455,8 +442,7 @@ public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes
}
@Override
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
Object... bsmArgs) {
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
if (constructor) {
Type[] types = Type.getArgumentTypes(desc);
@ -482,38 +468,37 @@ public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes
mv.visitJumpInsn(opcode, label);
if (constructor) {
switch (opcode) {
case IFEQ:
case IFNE:
case IFLT:
case IFGE:
case IFGT:
case IFLE:
case IFNULL:
case IFNONNULL:
popValue();
break;
case IF_ICMPEQ:
case IF_ICMPNE:
case IF_ICMPLT:
case IF_ICMPGE:
case IF_ICMPGT:
case IF_ICMPLE:
case IF_ACMPEQ:
case IF_ACMPNE:
popValue();
popValue();
break;
case JSR:
pushValue(OTHER);
break;
case IFEQ:
case IFNE:
case IFLT:
case IFGE:
case IFGT:
case IFLE:
case IFNULL:
case IFNONNULL:
popValue();
break;
case IF_ICMPEQ:
case IF_ICMPNE:
case IF_ICMPLT:
case IF_ICMPGE:
case IF_ICMPGT:
case IF_ICMPLE:
case IF_ACMPEQ:
case IF_ACMPNE:
popValue();
popValue();
break;
case JSR:
pushValue(OTHER);
break;
}
addBranch(label);
}
}
@Override
public void visitLookupSwitchInsn(final Label dflt, final int[] keys,
final Label[] labels) {
public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Label[] labels) {
mv.visitLookupSwitchInsn(dflt, keys, labels);
if (constructor) {
popValue();
@ -522,8 +507,8 @@ public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes
}
@Override
public void visitTableSwitchInsn(final int min, final int max,
final Label dflt, final Label... labels) {
public void visitTableSwitchInsn(final int min, final int max, final Label dflt,
final Label... labels) {
mv.visitTableSwitchInsn(min, max, dflt, labels);
if (constructor) {
popValue();
@ -532,8 +517,7 @@ public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes
}
@Override
public void visitTryCatchBlock(Label start, Label end, Label handler,
String type) {
public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
super.visitTryCatchBlock(start, end, handler, type);
if (constructor && !branches.containsKey(handler)) {
List<Object> stackFrame = new ArrayList<Object>();
@ -569,20 +553,18 @@ public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes
}
/**
* Called at the beginning of the method or after super class class call in
* the constructor. <br>
* Called at the beginning of the method or after super class class call in the constructor.
* <br>
* <br>
*
* <i>Custom code can use or change all the local variables, but should not
* change state of the stack.</i>
* <i>Custom code can use or change all the local variables, but should not change state of the
* stack.</i>
*/
protected void onMethodEnter() {
}
protected void onMethodEnter() {}
/**
* Called before explicit exit from the method using either return or throw.
* Top element on the stack contains the return value or exception instance.
* For example:
* Called before explicit exit from the method using either return or throw. Top element on the
* stack contains the return value or exception instance. For example:
*
* <pre>
* public void onMethodExit(int opcode) {
@ -610,16 +592,13 @@ public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes
* <br>
* <br>
*
* <i>Custom code can use or change all the local variables, but should not
* change state of the stack.</i>
* <i>Custom code can use or change all the local variables, but should not change state of the
* stack.</i>
*
* @param opcode
* one of the RETURN, IRETURN, FRETURN, ARETURN, LRETURN, DRETURN
* or ATHROW
* @param opcode one of the RETURN, IRETURN, FRETURN, ARETURN, LRETURN, DRETURN or ATHROW
*
*/
protected void onMethodExit(int opcode) {
}
protected void onMethodExit(int opcode) {}
// TODO onException, onMethodCall
}

File diff suppressed because it is too large Load Diff

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.commons;
@ -111,8 +103,8 @@ public class CodeSizeEvaluator extends MethodVisitor implements Opcodes {
}
@Override
public void visitFieldInsn(final int opcode, final String owner,
final String name, final String desc) {
public void visitFieldInsn(final int opcode, final String owner, final String name,
final String desc) {
minSize += 3;
maxSize += 3;
if (mv != null) {
@ -121,8 +113,8 @@ public class CodeSizeEvaluator extends MethodVisitor implements Opcodes {
}
@Override
public void visitMethodInsn(final int opcode, final String owner,
final String name, final String desc) {
public void visitMethodInsn(final int opcode, final String owner, final String name,
final String desc) {
if (opcode == INVOKEINTERFACE) {
minSize += 5;
maxSize += 5;
@ -136,8 +128,7 @@ public class CodeSizeEvaluator extends MethodVisitor implements Opcodes {
}
@Override
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
Object... bsmArgs) {
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
minSize += 5;
maxSize += 5;
if (mv != null) {
@ -187,8 +178,8 @@ public class CodeSizeEvaluator extends MethodVisitor implements Opcodes {
}
@Override
public void visitTableSwitchInsn(final int min, final int max,
final Label dflt, final Label... labels) {
public void visitTableSwitchInsn(final int min, final int max, final Label dflt,
final Label... labels) {
minSize += 13 + labels.length * 4;
maxSize += 16 + labels.length * 4;
if (mv != null) {
@ -197,8 +188,7 @@ public class CodeSizeEvaluator extends MethodVisitor implements Opcodes {
}
@Override
public void visitLookupSwitchInsn(final Label dflt, final int[] keys,
final Label[] labels) {
public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Label[] labels) {
minSize += 9 + keys.length * 8;
maxSize += 12 + keys.length * 8;
if (mv != null) {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.commons;
@ -55,8 +47,8 @@ import org.objectweb.asm.tree.TableSwitchInsnNode;
import org.objectweb.asm.tree.TryCatchBlockNode;
/**
* A {@link org.objectweb.asm.MethodVisitor} that removes JSR instructions and
* inlines the referenced subroutines.
* A {@link org.objectweb.asm.MethodVisitor} that removes JSR instructions and inlines the
* referenced subroutines.
*
* <b>Explanation of how it works</b> TODO
*
@ -72,82 +64,61 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
private final Map<LabelNode, BitSet> subroutineHeads = new HashMap<LabelNode, BitSet>();
/**
* This subroutine instance denotes the line of execution that is not
* contained within any subroutine; i.e., the "subroutine" that is executing
* when a method first begins.
* This subroutine instance denotes the line of execution that is not contained within any
* subroutine; i.e., the "subroutine" that is executing when a method first begins.
*/
private final BitSet mainSubroutine = new BitSet();
/**
* This BitSet contains the index of every instruction that belongs to more
* than one subroutine. This should not happen often.
* This BitSet contains the index of every instruction that belongs to more than one subroutine.
* This should not happen often.
*/
final BitSet dualCitizens = new BitSet();
/**
* Creates a new JSRInliner. <i>Subclasses must not use this
* constructor</i>. Instead, they must use the
* {@link #JSRInlinerAdapter(int, MethodVisitor, int, String, String, String, String[])}
* Creates a new JSRInliner. <i>Subclasses must not use this constructor</i>. Instead, they must
* use the {@link #JSRInlinerAdapter(int, MethodVisitor, int, String, String, String, String[])}
* version.
*
* @param mv
* the <code>MethodVisitor</code> to send the resulting inlined
* method code to (use <code>null</code> for none).
* @param access
* the method's access flags (see {@link Opcodes}). This
* parameter also indicates if the method is synthetic and/or
* deprecated.
* @param name
* the method's name.
* @param desc
* the method's descriptor (see {@link Type}).
* @param signature
* the method's signature. May be <tt>null</tt>.
* @param exceptions
* the internal names of the method's exception classes (see
* {@link Type#getInternalName() getInternalName}). May be
* <tt>null</tt>.
* @param mv the <code>MethodVisitor</code> to send the resulting inlined method code to (use
* <code>null</code> for none).
* @param access the method's access flags (see {@link Opcodes}). This parameter also indicates
* if the method is synthetic and/or deprecated.
* @param name the method's name.
* @param desc the method's descriptor (see {@link Type}).
* @param signature the method's signature. May be <tt>null</tt>.
* @param exceptions the internal names of the method's exception classes (see
* {@link Type#getInternalName() getInternalName}). May be <tt>null</tt>.
*/
public JSRInlinerAdapter(final MethodVisitor mv, final int access,
final String name, final String desc, final String signature,
final String[] exceptions) {
public JSRInlinerAdapter(final MethodVisitor mv, final int access, final String name,
final String desc, final String signature, final String[] exceptions) {
this(Opcodes.ASM4, mv, access, name, desc, signature, exceptions);
}
/**
* Creates a new JSRInliner.
*
* @param api
* the ASM API version implemented by this visitor. Must be one
* of {@link Opcodes#ASM4}.
* @param mv
* the <code>MethodVisitor</code> to send the resulting inlined
* method code to (use <code>null</code> for none).
* @param access
* the method's access flags (see {@link Opcodes}). This
* parameter also indicates if the method is synthetic and/or
* deprecated.
* @param name
* the method's name.
* @param desc
* the method's descriptor (see {@link Type}).
* @param signature
* the method's signature. May be <tt>null</tt>.
* @param exceptions
* the internal names of the method's exception classes (see
* {@link Type#getInternalName() getInternalName}). May be
* <tt>null</tt>.
* @param api the ASM API version implemented by this visitor. Must be one of
* {@link Opcodes#ASM4}.
* @param mv the <code>MethodVisitor</code> to send the resulting inlined method code to (use
* <code>null</code> for none).
* @param access the method's access flags (see {@link Opcodes}). This parameter also indicates
* if the method is synthetic and/or deprecated.
* @param name the method's name.
* @param desc the method's descriptor (see {@link Type}).
* @param signature the method's signature. May be <tt>null</tt>.
* @param exceptions the internal names of the method's exception classes (see
* {@link Type#getInternalName() getInternalName}). May be <tt>null</tt>.
*/
protected JSRInlinerAdapter(final int api, final MethodVisitor mv,
final int access, final String name, final String desc,
final String signature, final String[] exceptions) {
protected JSRInlinerAdapter(final int api, final MethodVisitor mv, final int access,
final String name, final String desc, final String signature,
final String[] exceptions) {
super(api, access, name, desc, signature, exceptions);
this.mv = mv;
}
/**
* Detects a JSR instruction and sets a flag to indicate we will need to do
* inlining.
* Detects a JSR instruction and sets a flag to indicate we will need to do inlining.
*/
@Override
public void visitJumpInsn(final int opcode, final Label lbl) {
@ -159,8 +130,8 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
}
/**
* If any JSRs were seen, triggers the inlining process. Otherwise, forwards
* the byte codes untouched.
* If any JSRs were seen, triggers the inlining process. Otherwise, forwards the byte codes
* untouched.
*/
@Override
public void visitEnd() {
@ -184,8 +155,8 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
}
/**
* Walks the method and determines which internal subroutine(s), if any,
* each instruction is a method of.
* Walks the method and determines which internal subroutine(s), if any, each instruction is a
* method of.
*/
private void markSubroutines() {
BitSet anyvisited = new BitSet();
@ -196,8 +167,8 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
// Go through the head of each subroutine and find any nodes reachable
// to that subroutine without following any JSR links.
for (Iterator<Map.Entry<LabelNode, BitSet>> it = subroutineHeads
.entrySet().iterator(); it.hasNext();) {
for (Iterator<Map.Entry<LabelNode, BitSet>> it = subroutineHeads.entrySet().iterator(); it
.hasNext();) {
Map.Entry<LabelNode, BitSet> entry = it.next();
LabelNode lab = entry.getKey();
BitSet sub = entry.getValue();
@ -207,23 +178,18 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
}
/**
* Performs a depth first search walking the normal byte code path starting
* at <code>index</code>, and adding each instruction encountered into the
* subroutine <code>sub</code>. After this walk is complete, iterates over
* the exception handlers to ensure that we also include those byte codes
* which are reachable through an exception that may be thrown during the
* execution of the subroutine. Invoked from <code>markSubroutines()</code>.
* Performs a depth first search walking the normal byte code path starting at
* <code>index</code>, and adding each instruction encountered into the subroutine
* <code>sub</code>. After this walk is complete, iterates over the exception handlers to ensure
* that we also include those byte codes which are reachable through an exception that may be
* thrown during the execution of the subroutine. Invoked from <code>markSubroutines()</code>.
*
* @param sub
* the subroutine whose instructions must be computed.
* @param index
* an instruction of this subroutine.
* @param anyvisited
* indexes of the already visited instructions, i.e. marked as
* part of this subroutine or any previously computed subroutine.
* @param sub the subroutine whose instructions must be computed.
* @param index an instruction of this subroutine.
* @param anyvisited indexes of the already visited instructions, i.e. marked as part of this
* subroutine or any previously computed subroutine.
*/
private void markSubroutineWalk(final BitSet sub, final int index,
final BitSet anyvisited) {
private void markSubroutineWalk(final BitSet sub, final int index, final BitSet anyvisited) {
if (LOGGING) {
log("markSubroutineWalk: sub=" + sub + " index=" + index);
}
@ -235,8 +201,7 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
boolean loop = true;
while (loop) {
loop = false;
for (Iterator<TryCatchBlockNode> it = tryCatchBlocks.iterator(); it
.hasNext();) {
for (Iterator<TryCatchBlockNode> it = tryCatchBlocks.iterator(); it.hasNext();) {
TryCatchBlockNode trycatch = it.next();
if (LOGGING) {
@ -255,9 +220,8 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
int nextbit = sub.nextSetBit(startindex);
if (nextbit != -1 && nextbit < endindex) {
if (LOGGING) {
log("Adding exception handler: " + startindex + '-'
+ endindex + " due to " + nextbit + " handler "
+ handlerindex);
log("Adding exception handler: " + startindex + '-' + endindex + " due to "
+ nextbit + " handler " + handlerindex);
}
markSubroutineWalkDFS(sub, handlerindex, anyvisited);
loop = true;
@ -267,20 +231,15 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
}
/**
* Performs a simple DFS of the instructions, assigning each to the
* subroutine <code>sub</code>. Starts from <code>index</code>. Invoked only
* by <code>markSubroutineWalk()</code>.
* Performs a simple DFS of the instructions, assigning each to the subroutine <code>sub</code>.
* Starts from <code>index</code>. Invoked only by <code>markSubroutineWalk()</code>.
*
* @param sub
* the subroutine whose instructions must be computed.
* @param index
* an instruction of this subroutine.
* @param anyvisited
* indexes of the already visited instructions, i.e. marked as
* part of this subroutine or any previously computed subroutine.
* @param sub the subroutine whose instructions must be computed.
* @param index an instruction of this subroutine.
* @param anyvisited indexes of the already visited instructions, i.e. marked as part of this
* subroutine or any previously computed subroutine.
*/
private void markSubroutineWalkDFS(final BitSet sub, int index,
final BitSet anyvisited) {
private void markSubroutineWalkDFS(final BitSet sub, int index, final BitSet anyvisited) {
while (true) {
AbstractInsnNode node = instructions.get(index);
@ -299,8 +258,7 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
}
anyvisited.set(index);
if (node.getType() == AbstractInsnNode.JUMP_INSN
&& node.getOpcode() != JSR) {
if (node.getType() == AbstractInsnNode.JUMP_INSN && node.getOpcode() != JSR) {
// we do not follow recursively called subroutines here; but any
// other sort of branch we do follow
JumpInsnNode jnode = (JumpInsnNode) node;
@ -331,22 +289,22 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
// check to see if this opcode falls through to the next instruction
// or not; if not, return.
switch (instructions.get(index).getOpcode()) {
case GOTO:
case RET:
case TABLESWITCH:
case LOOKUPSWITCH:
case IRETURN:
case LRETURN:
case FRETURN:
case DRETURN:
case ARETURN:
case RETURN:
case ATHROW:
/*
* note: this either returns from this subroutine, or a parent
* subroutine which invoked it
*/
return;
case GOTO:
case RET:
case TABLESWITCH:
case LOOKUPSWITCH:
case IRETURN:
case LRETURN:
case FRETURN:
case DRETURN:
case ARETURN:
case RETURN:
case ATHROW:
/*
* note: this either returns from this subroutine, or a parent subroutine which
* invoked it
*/
return;
}
// Use tail recursion here in the form of an outer while loop to
@ -367,8 +325,8 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
}
/**
* Creates the new instructions, inlining each instantiation of each
* subroutine until the code is fully elaborated.
* Creates the new instructions, inlining each instantiation of each subroutine until the code
* is fully elaborated.
*/
private void emitCode() {
LinkedList<Instantiation> worklist = new LinkedList<Instantiation>();
@ -383,8 +341,7 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
List<LocalVariableNode> newLocalVariables = new ArrayList<LocalVariableNode>();
while (!worklist.isEmpty()) {
Instantiation inst = worklist.removeFirst();
emitSubroutine(inst, worklist, newInstructions, newTryCatchBlocks,
newLocalVariables);
emitSubroutine(inst, worklist, newInstructions, newTryCatchBlocks, newLocalVariables);
}
instructions = newInstructions;
tryCatchBlocks = newTryCatchBlocks;
@ -392,25 +349,18 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
}
/**
* Emits one instantiation of one subroutine, specified by
* <code>instant</code>. May add new instantiations that are invoked by this
* one to the <code>worklist</code> parameter, and new try/catch blocks to
* <code>newTryCatchBlocks</code>.
* Emits one instantiation of one subroutine, specified by <code>instant</code>. May add new
* instantiations that are invoked by this one to the <code>worklist</code> parameter, and new
* try/catch blocks to <code>newTryCatchBlocks</code>.
*
* @param instant
* the instantiation that must be performed.
* @param worklist
* list of the instantiations that remain to be done.
* @param newInstructions
* the instruction list to which the instantiated code must be
* appended.
* @param newTryCatchBlocks
* the exception handler list to which the instantiated handlers
* must be appended.
* @param instant the instantiation that must be performed.
* @param worklist list of the instantiations that remain to be done.
* @param newInstructions the instruction list to which the instantiated code must be appended.
* @param newTryCatchBlocks the exception handler list to which the instantiated handlers must
* be appended.
*/
private void emitSubroutine(final Instantiation instant,
final List<Instantiation> worklist, final InsnList newInstructions,
final List<TryCatchBlockNode> newTryCatchBlocks,
private void emitSubroutine(final Instantiation instant, final List<Instantiation> worklist,
final InsnList newInstructions, final List<TryCatchBlockNode> newTryCatchBlocks,
final List<LocalVariableNode> newLocalVariables) {
LabelNode duplbl = null;
@ -476,8 +426,8 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
// This is only possible if the mainSubroutine owns a RET
// instruction, which should never happen for verifiable
// code.
throw new RuntimeException("Instruction #" + i
+ " is a RET not owned by any subroutine");
throw new RuntimeException(
"Instruction #" + i + " is a RET not owned by any subroutine");
}
newInstructions.add(new JumpInsnNode(GOTO, retlabel));
} else if (insn.getOpcode() == JSR) {
@ -508,14 +458,13 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
}
// Emit try/catch blocks that are relevant to this method.
for (Iterator<TryCatchBlockNode> it = tryCatchBlocks.iterator(); it
.hasNext();) {
for (Iterator<TryCatchBlockNode> it = tryCatchBlocks.iterator(); it.hasNext();) {
TryCatchBlockNode trycatch = it.next();
if (LOGGING) {
// TODO use of default toString().
log("try catch block original labels=" + trycatch.start + '-'
+ trycatch.end + "->" + trycatch.handler);
log("try catch block original labels=" + trycatch.start + '-' + trycatch.end + "->"
+ trycatch.handler);
}
final LabelNode start = instant.rangeLabel(trycatch.start);
@ -533,20 +482,17 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
if (LOGGING) {
// TODO use of default toString().
log(" try catch block new labels=" + start + '-' + end + "->"
+ handler);
log(" try catch block new labels=" + start + '-' + end + "->" + handler);
}
if (start == null || end == null || handler == null) {
throw new RuntimeException("Internal error!");
}
newTryCatchBlocks.add(new TryCatchBlockNode(start, end, handler,
trycatch.type));
newTryCatchBlocks.add(new TryCatchBlockNode(start, end, handler, trycatch.type));
}
for (Iterator<LocalVariableNode> it = localVariables.iterator(); it
.hasNext();) {
for (Iterator<LocalVariableNode> it = localVariables.iterator(); it.hasNext();) {
LocalVariableNode lvnode = it.next();
if (LOGGING) {
log("local var " + lvnode.name);
@ -559,8 +505,8 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
}
continue;
}
newLocalVariables.add(new LocalVariableNode(lvnode.name,
lvnode.desc, lvnode.signature, start, end, lvnode.index));
newLocalVariables.add(new LocalVariableNode(lvnode.name, lvnode.desc, lvnode.signature,
start, end, lvnode.index));
}
}
@ -569,18 +515,16 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
}
/**
* A class that represents an instantiation of a subroutine. Each
* instantiation has an associate "stack" --- which is a listing of those
* instantiations that were active when this particular instance of this
* subroutine was invoked. Each instantiation also has a map from the
* original labels of the program to the labels appropriate for this
* instantiation, and finally a label to return to.
* A class that represents an instantiation of a subroutine. Each instantiation has an associate
* "stack" --- which is a listing of those instantiations that were active when this particular
* instance of this subroutine was invoked. Each instantiation also has a map from the original
* labels of the program to the labels appropriate for this instantiation, and finally a label
* to return to.
*/
private class Instantiation extends AbstractMap<LabelNode, LabelNode> {
/**
* Previous instantiations; the stack must be statically predictable to
* be inlinable.
* Previous instantiations; the stack must be statically predictable to be inlinable.
*/
final Instantiation previous;
@ -590,15 +534,13 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
public final BitSet subroutine;
/**
* This table maps Labels from the original source to Labels pointing at
* code specific to this instantiation, for use in remapping try/catch
* blocks,as well as gotos.
* This table maps Labels from the original source to Labels pointing at code specific to
* this instantiation, for use in remapping try/catch blocks,as well as gotos.
*
* Note that in the presence of dual citizens instructions, that is,
* instructions which belong to more than one subroutine due to the
* merging of control flow without a RET instruction, we will map the
* target label of a GOTO to the label used by the instantiation lowest
* on the stack. This avoids code duplication during inlining in most
* Note that in the presence of dual citizens instructions, that is, instructions which
* belong to more than one subroutine due to the merging of control flow without a RET
* instruction, we will map the target label of a GOTO to the label used by the
* instantiation lowest on the stack. This avoids code duplication during inlining in most
* cases.
*
* @see #findOwner(int)
@ -660,27 +602,23 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
}
/**
* Returns the "owner" of a particular instruction relative to this
* instantiation: the owner referes to the Instantiation which will emit
* the version of this instruction that we will execute.
* Returns the "owner" of a particular instruction relative to this instantiation: the owner
* referes to the Instantiation which will emit the version of this instruction that we will
* execute.
*
* Typically, the return value is either <code>this</code> or
* <code>null</code>. <code>this</code> indicates that this
* instantiation will generate the version of this instruction that we
* will execute, and <code>null</code> indicates that this instantiation
* Typically, the return value is either <code>this</code> or <code>null</code>.
* <code>this</code> indicates that this instantiation will generate the version of this
* instruction that we will execute, and <code>null</code> indicates that this instantiation
* never executes the given instruction.
*
* Sometimes, however, an instruction can belong to multiple
* subroutines; this is called a "dual citizen" instruction (though it
* may belong to more than 2 subroutines), and occurs when multiple
* subroutines branch to common points of control. In this case, the
* owner is the subroutine that appears lowest on the stack, and which
* also owns the instruction in question.
* Sometimes, however, an instruction can belong to multiple subroutines; this is called a
* "dual citizen" instruction (though it may belong to more than 2 subroutines), and occurs
* when multiple subroutines branch to common points of control. In this case, the owner is
* the subroutine that appears lowest on the stack, and which also owns the instruction in
* question.
*
* @param i
* the index of the instruction in the original code
* @return the "owner" of a particular instruction relative to this
* instantiation.
* @param i the index of the instruction in the original code
* @return the "owner" of a particular instruction relative to this instantiation.
*/
public Instantiation findOwner(final int i) {
if (!subroutine.get(i)) {
@ -699,13 +637,11 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
}
/**
* Looks up the label <code>l</code> in the <code>gotoTable</code>, thus
* translating it from a Label in the original code, to a Label in the
* inlined code that is appropriate for use by an instruction that
* branched to the original label.
* Looks up the label <code>l</code> in the <code>gotoTable</code>, thus translating it from
* a Label in the original code, to a Label in the inlined code that is appropriate for use
* by an instruction that branched to the original label.
*
* @param l
* The label we will be translating
* @param l The label we will be translating
* @return a label for use by a branch instruction in the inlined code
* @see #rangeLabel
*/
@ -717,15 +653,12 @@ public class JSRInlinerAdapter extends MethodNode implements Opcodes {
}
/**
* Looks up the label <code>l</code> in the <code>rangeTable</code>,
* thus translating it from a Label in the original code, to a Label in
* the inlined code that is appropriate for use by an try/catch or
* variable use annotation.
* Looks up the label <code>l</code> in the <code>rangeTable</code>, thus translating it
* from a Label in the original code, to a Label in the inlined code that is appropriate for
* use by an try/catch or variable use annotation.
*
* @param l
* The label we will be translating
* @return a label for use by a try/catch or variable annotation in the
* original code
* @param l The label we will be translating
* @return a label for use by a try/catch or variable annotation in the original code
* @see #rangeTable
*/
public LabelNode rangeLabel(final LabelNode l) {

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.commons;
@ -35,12 +27,11 @@ import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
/**
* A {@link MethodVisitor} that renumbers local variables in their order of
* appearance. This adapter allows one to easily add new local variables to a
* method. It may be used by inheriting from this class, but the preferred way
* of using it is via delegation: the next visitor in the chain can indeed add
* new locals when needed by calling {@link #newLocal} on this adapter (this
* requires a reference back to this {@link LocalVariablesSorter}).
* A {@link MethodVisitor} that renumbers local variables in their order of appearance. This adapter
* allows one to easily add new local variables to a method. It may be used by inheriting from this
* class, but the preferred way of using it is via delegation: the next visitor in the chain can
* indeed add new locals when needed by calling {@link #newLocal} on this adapter (this requires a
* reference back to this {@link LocalVariablesSorter}).
*
* @author Chris Nokleberg
* @author Eugene Kuleshov
@ -48,13 +39,12 @@ import org.objectweb.asm.Type;
*/
public class LocalVariablesSorter extends MethodVisitor {
private static final Type OBJECT_TYPE = Type
.getObjectType("java/lang/Object");
private static final Type OBJECT_TYPE = Type.getObjectType("java/lang/Object");
/**
* Mapping from old to new local variable indexes. A local variable at index
* i of size 1 is remapped to 'mapping[2*i]', while a local variable at
* index i of size 2 is remapped to 'mapping[2*i+1]'.
* Mapping from old to new local variable indexes. A local variable at index i of size 1 is
* remapped to 'mapping[2*i]', while a local variable at index i of size 2 is remapped to
* 'mapping[2*i+1]'.
*/
private int[] mapping = new int[40];
@ -79,37 +69,29 @@ public class LocalVariablesSorter extends MethodVisitor {
private boolean changed;
/**
* Creates a new {@link LocalVariablesSorter}. <i>Subclasses must not use
* this constructor</i>. Instead, they must use the
* {@link #LocalVariablesSorter(int, int, String, MethodVisitor)} version.
* Creates a new {@link LocalVariablesSorter}. <i>Subclasses must not use this constructor</i>.
* Instead, they must use the {@link #LocalVariablesSorter(int, int, String, MethodVisitor)}
* version.
*
* @param access
* access flags of the adapted method.
* @param desc
* the method's descriptor (see {@link Type Type}).
* @param mv
* the method visitor to which this adapter delegates calls.
* @param access access flags of the adapted method.
* @param desc the method's descriptor (see {@link Type Type}).
* @param mv the method visitor to which this adapter delegates calls.
*/
public LocalVariablesSorter(final int access, final String desc,
final MethodVisitor mv) {
public LocalVariablesSorter(final int access, final String desc, final MethodVisitor mv) {
this(Opcodes.ASM4, access, desc, mv);
}
/**
* Creates a new {@link LocalVariablesSorter}.
*
* @param api
* the ASM API version implemented by this visitor. Must be one
* of {@link Opcodes#ASM4}.
* @param access
* access flags of the adapted method.
* @param desc
* the method's descriptor (see {@link Type Type}).
* @param mv
* the method visitor to which this adapter delegates calls.
* @param api the ASM API version implemented by this visitor. Must be one of
* {@link Opcodes#ASM4}.
* @param access access flags of the adapted method.
* @param desc the method's descriptor (see {@link Type Type}).
* @param mv the method visitor to which this adapter delegates calls.
*/
protected LocalVariablesSorter(final int api, final int access,
final String desc, final MethodVisitor mv) {
protected LocalVariablesSorter(final int api, final int access, final String desc,
final MethodVisitor mv) {
super(api, mv);
Type[] args = Type.getArgumentTypes(desc);
nextLocal = (Opcodes.ACC_STATIC & access) == 0 ? 1 : 0;
@ -123,32 +105,32 @@ public class LocalVariablesSorter extends MethodVisitor {
public void visitVarInsn(final int opcode, final int var) {
Type type;
switch (opcode) {
case Opcodes.LLOAD:
case Opcodes.LSTORE:
type = Type.LONG_TYPE;
break;
case Opcodes.LLOAD:
case Opcodes.LSTORE:
type = Type.LONG_TYPE;
break;
case Opcodes.DLOAD:
case Opcodes.DSTORE:
type = Type.DOUBLE_TYPE;
break;
case Opcodes.DLOAD:
case Opcodes.DSTORE:
type = Type.DOUBLE_TYPE;
break;
case Opcodes.FLOAD:
case Opcodes.FSTORE:
type = Type.FLOAT_TYPE;
break;
case Opcodes.FLOAD:
case Opcodes.FSTORE:
type = Type.FLOAT_TYPE;
break;
case Opcodes.ILOAD:
case Opcodes.ISTORE:
type = Type.INT_TYPE;
break;
case Opcodes.ILOAD:
case Opcodes.ISTORE:
type = Type.INT_TYPE;
break;
default:
// case Opcodes.ALOAD:
// case Opcodes.ASTORE:
// case RET:
type = OBJECT_TYPE;
break;
default:
// case Opcodes.ALOAD:
// case Opcodes.ASTORE:
// case RET:
type = OBJECT_TYPE;
break;
}
mv.visitVarInsn(opcode, remap(var, type));
}
@ -164,16 +146,15 @@ public class LocalVariablesSorter extends MethodVisitor {
}
@Override
public void visitLocalVariable(final String name, final String desc,
final String signature, final Label start, final Label end,
final int index) {
public void visitLocalVariable(final String name, final String desc, final String signature,
final Label start, final Label end, final int index) {
int newIndex = remap(index, Type.getType(desc));
mv.visitLocalVariable(name, desc, signature, start, end, newIndex);
}
@Override
public void visitFrame(final int type, final int nLocal,
final Object[] local, final int nStack, final Object[] stack) {
public void visitFrame(final int type, final int nLocal, final Object[] local, final int nStack,
final Object[] stack) {
if (type != Opcodes.F_NEW) { // uncompressed frame
throw new IllegalStateException(
"ClassReader.accept() should be called with EXPAND_FRAMES flag");
@ -245,36 +226,35 @@ public class LocalVariablesSorter extends MethodVisitor {
/**
* Creates a new local variable of the given type.
*
* @param type
* the type of the local variable to be created.
* @param type the type of the local variable to be created.
* @return the identifier of the newly created local variable.
*/
public int newLocal(final Type type) {
Object t;
switch (type.getSort()) {
case Type.BOOLEAN:
case Type.CHAR:
case Type.BYTE:
case Type.SHORT:
case Type.INT:
t = Opcodes.INTEGER;
break;
case Type.FLOAT:
t = Opcodes.FLOAT;
break;
case Type.LONG:
t = Opcodes.LONG;
break;
case Type.DOUBLE:
t = Opcodes.DOUBLE;
break;
case Type.ARRAY:
t = type.getDescriptor();
break;
// case Type.OBJECT:
default:
t = type.getInternalName();
break;
case Type.BOOLEAN:
case Type.CHAR:
case Type.BYTE:
case Type.SHORT:
case Type.INT:
t = Opcodes.INTEGER;
break;
case Type.FLOAT:
t = Opcodes.FLOAT;
break;
case Type.LONG:
t = Opcodes.LONG;
break;
case Type.DOUBLE:
t = Opcodes.DOUBLE;
break;
case Type.ARRAY:
t = type.getDescriptor();
break;
// case Type.OBJECT:
default:
t = type.getInternalName();
break;
}
int local = newLocalMapping(type);
setLocalType(local, type);
@ -284,39 +264,30 @@ public class LocalVariablesSorter extends MethodVisitor {
}
/**
* Notifies subclasses that a new stack map frame is being visited. The
* array argument contains the stack map frame types corresponding to the
* local variables added with {@link #newLocal}. This method can update
* these types in place for the stack map frame being visited. The default
* implementation of this method does nothing, i.e. a local variable added
* with {@link #newLocal} will have the same type in all stack map frames.
* But this behavior is not always the desired one, for instance if a local
* variable is added in the middle of a try/catch block: the frame for the
* exception handler should have a TOP type for this new local.
* Notifies subclasses that a new stack map frame is being visited. The array argument contains
* the stack map frame types corresponding to the local variables added with {@link #newLocal}.
* This method can update these types in place for the stack map frame being visited. The
* default implementation of this method does nothing, i.e. a local variable added with
* {@link #newLocal} will have the same type in all stack map frames. But this behavior is not
* always the desired one, for instance if a local variable is added in the middle of a
* try/catch block: the frame for the exception handler should have a TOP type for this new
* local.
*
* @param newLocals
* the stack map frame types corresponding to the local variables
* added with {@link #newLocal} (and null for the others). The
* format of this array is the same as in
* {@link MethodVisitor#visitFrame}, except that long and double
* types use two slots. The types for the current stack map frame
* must be updated in place in this array.
* @param newLocals the stack map frame types corresponding to the local variables added with
* {@link #newLocal} (and null for the others). The format of this array is the same as
* in {@link MethodVisitor#visitFrame}, except that long and double types use two slots.
* The types for the current stack map frame must be updated in place in this array.
*/
protected void updateNewLocals(Object[] newLocals) {
}
protected void updateNewLocals(Object[] newLocals) {}
/**
* Notifies subclasses that a local variable has been added or remapped. The
* default implementation of this method does nothing.
* Notifies subclasses that a local variable has been added or remapped. The default
* implementation of this method does nothing.
*
* @param local
* a local variable identifier, as returned by {@link #newLocal
* newLocal()}.
* @param type
* the type of the value being stored in the local variable.
* @param local a local variable identifier, as returned by {@link #newLocal newLocal()}.
* @param type the type of the value being stored in the local variable.
*/
protected void setLocalType(final int local, final Type type) {
}
protected void setLocalType(final int local, final Type type) {}
private void setFrameLocal(final int local, final Object type) {
int l = newLocals.length;

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.commons;
@ -74,10 +66,8 @@ public class Method {
/**
* Creates a new {@link Method}.
*
* @param name
* the method's name.
* @param desc
* the method's descriptor.
* @param name the method's name.
* @param desc the method's descriptor.
*/
public Method(final String name, final String desc) {
this.name = name;
@ -87,25 +77,19 @@ public class Method {
/**
* Creates a new {@link Method}.
*
* @param name
* the method's name.
* @param returnType
* the method's return type.
* @param argumentTypes
* the method's argument types.
* @param name the method's name.
* @param returnType the method's return type.
* @param argumentTypes the method's argument types.
*/
public Method(final String name, final Type returnType,
final Type[] argumentTypes) {
public Method(final String name, final Type returnType, final Type[] argumentTypes) {
this(name, Type.getMethodDescriptor(returnType, argumentTypes));
}
/**
* Creates a new {@link Method}.
*
* @param m
* a java.lang.reflect method descriptor
* @return a {@link Method} corresponding to the given Java method
* declaration.
* @param m a java.lang.reflect method descriptor
* @return a {@link Method} corresponding to the given Java method declaration.
*/
public static Method getMethod(java.lang.reflect.Method m) {
return new Method(m.getName(), Type.getMethodDescriptor(m));
@ -114,60 +98,43 @@ public class Method {
/**
* Creates a new {@link Method}.
*
* @param c
* a java.lang.reflect constructor descriptor
* @return a {@link Method} corresponding to the given Java constructor
* declaration.
* @param c a java.lang.reflect constructor descriptor
* @return a {@link Method} corresponding to the given Java constructor declaration.
*/
public static Method getMethod(java.lang.reflect.Constructor<?> c) {
return new Method("<init>", Type.getConstructorDescriptor(c));
}
/**
* Returns a {@link Method} corresponding to the given Java method
* declaration.
* Returns a {@link Method} corresponding to the given Java method declaration.
*
* @param method
* a Java method declaration, without argument names, of the form
* "returnType name (argumentType1, ... argumentTypeN)", where
* the types are in plain Java (e.g. "int", "float",
* "java.util.List", ...). Classes of the java.lang package can
* be specified by their unqualified name; all other classes
* names must be fully qualified.
* @return a {@link Method} corresponding to the given Java method
* declaration.
* @throws IllegalArgumentException
* if <code>method</code> could not get parsed.
* @param method a Java method declaration, without argument names, of the form "returnType name
* (argumentType1, ... argumentTypeN)", where the types are in plain Java (e.g. "int",
* "float", "java.util.List", ...). Classes of the java.lang package can be specified by
* their unqualified name; all other classes names must be fully qualified.
* @return a {@link Method} corresponding to the given Java method declaration.
* @throws IllegalArgumentException if <code>method</code> could not get parsed.
*/
public static Method getMethod(final String method)
throws IllegalArgumentException {
public static Method getMethod(final String method) throws IllegalArgumentException {
return getMethod(method, false);
}
/**
* Returns a {@link Method} corresponding to the given Java method
* declaration.
* Returns a {@link Method} corresponding to the given Java method declaration.
*
* @param method
* a Java method declaration, without argument names, of the form
* "returnType name (argumentType1, ... argumentTypeN)", where
* the types are in plain Java (e.g. "int", "float",
* "java.util.List", ...). Classes of the java.lang package may
* be specified by their unqualified name, depending on the
* defaultPackage argument; all other classes names must be fully
* qualified.
* @param defaultPackage
* true if unqualified class names belong to the default package,
* or false if they correspond to java.lang classes. For instance
* "Object" means "Object" if this option is true, or
* "java.lang.Object" otherwise.
* @return a {@link Method} corresponding to the given Java method
* declaration.
* @throws IllegalArgumentException
* if <code>method</code> could not get parsed.
* @param method a Java method declaration, without argument names, of the form "returnType name
* (argumentType1, ... argumentTypeN)", where the types are in plain Java (e.g. "int",
* "float", "java.util.List", ...). Classes of the java.lang package may be specified by
* their unqualified name, depending on the defaultPackage argument; all other classes
* names must be fully qualified.
* @param defaultPackage true if unqualified class names belong to the default package, or false
* if they correspond to java.lang classes. For instance "Object" means "Object" if this
* option is true, or "java.lang.Object" otherwise.
* @return a {@link Method} corresponding to the given Java method declaration.
* @throws IllegalArgumentException if <code>method</code> could not get parsed.
*/
public static Method getMethod(final String method,
final boolean defaultPackage) throws IllegalArgumentException {
public static Method getMethod(final String method, final boolean defaultPackage)
throws IllegalArgumentException {
int space = method.indexOf(' ');
int start = method.indexOf('(', space) + 1;
int end = method.indexOf(')', start);
@ -279,4 +246,4 @@ public class Method {
public int hashCode() {
return name.hashCode() ^ desc.hashCode();
}
}
}

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.commons;
@ -37,8 +29,7 @@ import org.objectweb.asm.signature.SignatureVisitor;
import org.objectweb.asm.signature.SignatureWriter;
/**
* A class responsible for remapping types and names. Subclasses can override
* the following methods:
* A class responsible for remapping types and names. Subclasses can override the following methods:
*
* <ul>
* <li>{@link #map(String)} - map type</li>
@ -53,34 +44,34 @@ public abstract class Remapper {
public String mapDesc(String desc) {
Type t = Type.getType(desc);
switch (t.getSort()) {
case Type.ARRAY:
String s = mapDesc(t.getElementType().getDescriptor());
for (int i = 0; i < t.getDimensions(); ++i) {
s = '[' + s;
}
return s;
case Type.OBJECT:
String newType = map(t.getInternalName());
if (newType != null) {
return 'L' + newType + ';';
}
case Type.ARRAY:
String s = mapDesc(t.getElementType().getDescriptor());
for (int i = 0; i < t.getDimensions(); ++i) {
s = '[' + s;
}
return s;
case Type.OBJECT:
String newType = map(t.getInternalName());
if (newType != null) {
return 'L' + newType + ';';
}
}
return desc;
}
private Type mapType(Type t) {
switch (t.getSort()) {
case Type.ARRAY:
String s = mapDesc(t.getElementType().getDescriptor());
for (int i = 0; i < t.getDimensions(); ++i) {
s = '[' + s;
}
return Type.getType(s);
case Type.OBJECT:
s = map(t.getInternalName());
return s != null ? Type.getObjectType(s) : t;
case Type.METHOD:
return Type.getMethodType(mapMethodDesc(t.getDescriptor()));
case Type.ARRAY:
String s = mapDesc(t.getElementType().getDescriptor());
for (int i = 0; i < t.getDimensions(); ++i) {
s = '[' + s;
}
return Type.getType(s);
case Type.OBJECT:
s = map(t.getInternalName());
return s != null ? Type.getObjectType(s) : t;
case Type.METHOD:
return Type.getMethodType(mapMethodDesc(t.getDescriptor()));
}
return t;
}
@ -137,8 +128,8 @@ public abstract class Remapper {
}
if (value instanceof Handle) {
Handle h = (Handle) value;
return new Handle(h.getTag(), mapType(h.getOwner()), mapMethodName(
h.getOwner(), h.getName(), h.getDesc()),
return new Handle(h.getTag(), mapType(h.getOwner()),
mapMethodName(h.getOwner(), h.getName(), h.getDesc()),
mapMethodDesc(h.getDesc()));
}
return value;
@ -146,10 +137,8 @@ public abstract class Remapper {
/**
*
* @param typeSignature
* true if signature is a FieldTypeSignature, such as the
* signature parameter of the ClassVisitor.visitField or
* MethodVisitor.visitLocalVariable methods
* @param typeSignature true if signature is a FieldTypeSignature, such as the signature
* parameter of the ClassVisitor.visitField or MethodVisitor.visitLocalVariable methods
*/
public String mapSignature(String signature, boolean typeSignature) {
if (signature == null) {
@ -166,20 +155,16 @@ public abstract class Remapper {
return w.toString();
}
protected SignatureVisitor createRemappingSignatureAdapter(
SignatureVisitor v) {
protected SignatureVisitor createRemappingSignatureAdapter(SignatureVisitor v) {
return new RemappingSignatureAdapter(v, this);
}
/**
* Map method name to the new name. Subclasses can override.
*
* @param owner
* owner of the method.
* @param name
* name of the method.
* @param desc
* descriptor of the method.
* @param owner owner of the method.
* @param name name of the method.
* @param desc descriptor of the method.
* @return new name of the method
*/
public String mapMethodName(String owner, String name, String desc) {
@ -189,10 +174,8 @@ public abstract class Remapper {
/**
* Map invokedynamic method name to the new name. Subclasses can override.
*
* @param name
* name of the invokedynamic.
* @param desc
* descriptor of the invokedynamic.
* @param name name of the invokedynamic.
* @param desc descriptor of the invokedynamic.
* @return new invokdynamic name.
*/
public String mapInvokeDynamicMethodName(String name, String desc) {
@ -202,12 +185,9 @@ public abstract class Remapper {
/**
* Map field name to the new name. Subclasses can override.
*
* @param owner
* owner of the field.
* @param name
* name of the field
* @param desc
* descriptor of the field
* @param owner owner of the field.
* @param name name of the field
* @param desc descriptor of the field
* @return new name of the field.
*/
public String mapFieldName(String owner, String name, String desc) {

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.commons;
@ -42,13 +34,12 @@ public class RemappingAnnotationAdapter extends AnnotationVisitor {
protected final Remapper remapper;
public RemappingAnnotationAdapter(final AnnotationVisitor av,
final Remapper remapper) {
public RemappingAnnotationAdapter(final AnnotationVisitor av, final Remapper remapper) {
this(Opcodes.ASM4, av, remapper);
}
protected RemappingAnnotationAdapter(final int api,
final AnnotationVisitor av, final Remapper remapper) {
protected RemappingAnnotationAdapter(final int api, final AnnotationVisitor av,
final Remapper remapper) {
super(api, av);
this.remapper = remapper;
}
@ -66,14 +57,12 @@ public class RemappingAnnotationAdapter extends AnnotationVisitor {
@Override
public AnnotationVisitor visitAnnotation(String name, String desc) {
AnnotationVisitor v = av.visitAnnotation(name, remapper.mapDesc(desc));
return v == null ? null : (v == av ? this
: new RemappingAnnotationAdapter(v, remapper));
return v == null ? null : (v == av ? this : new RemappingAnnotationAdapter(v, remapper));
}
@Override
public AnnotationVisitor visitArray(String name) {
AnnotationVisitor v = av.visitArray(name);
return v == null ? null : (v == av ? this
: new RemappingAnnotationAdapter(v, remapper));
return v == null ? null : (v == av ? this : new RemappingAnnotationAdapter(v, remapper));
}
}

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.commons;
@ -51,18 +43,17 @@ public class RemappingClassAdapter extends ClassVisitor {
this(Opcodes.ASM4, cv, remapper);
}
protected RemappingClassAdapter(final int api, final ClassVisitor cv,
final Remapper remapper) {
protected RemappingClassAdapter(final int api, final ClassVisitor cv, final Remapper remapper) {
super(api, cv);
this.remapper = remapper;
}
@Override
public void visit(int version, int access, String name, String signature,
String superName, String[] interfaces) {
public void visit(int version, int access, String name, String signature, String superName,
String[] interfaces) {
this.className = name;
super.visit(version, access, remapper.mapType(name), remapper
.mapSignature(signature, false), remapper.mapType(superName),
super.visit(version, access, remapper.mapType(name),
remapper.mapSignature(signature, false), remapper.mapType(superName),
interfaces == null ? null : remapper.mapTypes(interfaces));
}
@ -74,39 +65,35 @@ public class RemappingClassAdapter extends ClassVisitor {
}
@Override
public FieldVisitor visitField(int access, String name, String desc,
String signature, Object value) {
FieldVisitor fv = super.visitField(access,
remapper.mapFieldName(className, name, desc),
public FieldVisitor visitField(int access, String name, String desc, String signature,
Object value) {
FieldVisitor fv = super.visitField(access, remapper.mapFieldName(className, name, desc),
remapper.mapDesc(desc), remapper.mapSignature(signature, true),
remapper.mapValue(value));
return fv == null ? null : createRemappingFieldAdapter(fv);
}
@Override
public MethodVisitor visitMethod(int access, String name, String desc,
String signature, String[] exceptions) {
public MethodVisitor visitMethod(int access, String name, String desc, String signature,
String[] exceptions) {
String newDesc = remapper.mapMethodDesc(desc);
MethodVisitor mv = super.visitMethod(access, remapper.mapMethodName(
className, name, desc), newDesc, remapper.mapSignature(
signature, false),
MethodVisitor mv = super.visitMethod(access, remapper.mapMethodName(className, name, desc),
newDesc, remapper.mapSignature(signature, false),
exceptions == null ? null : remapper.mapTypes(exceptions));
return mv == null ? null : createRemappingMethodAdapter(access,
newDesc, mv);
return mv == null ? null : createRemappingMethodAdapter(access, newDesc, mv);
}
@Override
public void visitInnerClass(String name, String outerName,
String innerName, int access) {
public void visitInnerClass(String name, String outerName, String innerName, int access) {
// TODO should innerName be changed?
super.visitInnerClass(remapper.mapType(name), outerName == null ? null
: remapper.mapType(outerName), innerName, access);
super.visitInnerClass(remapper.mapType(name),
outerName == null ? null : remapper.mapType(outerName), innerName, access);
}
@Override
public void visitOuterClass(String owner, String name, String desc) {
super.visitOuterClass(remapper.mapType(owner), name == null ? null
: remapper.mapMethodName(owner, name, desc),
super.visitOuterClass(remapper.mapType(owner),
name == null ? null : remapper.mapMethodName(owner, name, desc),
desc == null ? null : remapper.mapMethodDesc(desc));
}
@ -114,13 +101,12 @@ public class RemappingClassAdapter extends ClassVisitor {
return new RemappingFieldAdapter(fv, remapper);
}
protected MethodVisitor createRemappingMethodAdapter(int access,
String newDesc, MethodVisitor mv) {
protected MethodVisitor createRemappingMethodAdapter(int access, String newDesc,
MethodVisitor mv) {
return new RemappingMethodAdapter(access, newDesc, mv, remapper);
}
protected AnnotationVisitor createRemappingAnnotationAdapter(
AnnotationVisitor av) {
protected AnnotationVisitor createRemappingAnnotationAdapter(AnnotationVisitor av) {
return new RemappingAnnotationAdapter(av, remapper);
}
}

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.commons;
@ -47,16 +39,14 @@ public class RemappingFieldAdapter extends FieldVisitor {
this(Opcodes.ASM4, fv, remapper);
}
protected RemappingFieldAdapter(final int api, final FieldVisitor fv,
final Remapper remapper) {
protected RemappingFieldAdapter(final int api, final FieldVisitor fv, final Remapper remapper) {
super(api, fv);
this.remapper = remapper;
}
@Override
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
AnnotationVisitor av = fv.visitAnnotation(remapper.mapDesc(desc),
visible);
AnnotationVisitor av = fv.visitAnnotation(remapper.mapDesc(desc), visible);
return av == null ? null : new RemappingAnnotationAdapter(av, remapper);
}
}

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.commons;
@ -45,13 +37,13 @@ public class RemappingMethodAdapter extends LocalVariablesSorter {
protected final Remapper remapper;
public RemappingMethodAdapter(final int access, final String desc,
final MethodVisitor mv, final Remapper remapper) {
public RemappingMethodAdapter(final int access, final String desc, final MethodVisitor mv,
final Remapper remapper) {
this(Opcodes.ASM4, access, desc, mv, remapper);
}
protected RemappingMethodAdapter(final int api, final int access,
final String desc, final MethodVisitor mv, final Remapper remapper) {
protected RemappingMethodAdapter(final int api, final int access, final String desc,
final MethodVisitor mv, final Remapper remapper) {
super(api, access, desc, mv);
this.remapper = remapper;
}
@ -64,22 +56,19 @@ public class RemappingMethodAdapter extends LocalVariablesSorter {
@Override
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
AnnotationVisitor av = mv.visitAnnotation(remapper.mapDesc(desc),
visible);
AnnotationVisitor av = mv.visitAnnotation(remapper.mapDesc(desc), visible);
return av == null ? av : new RemappingAnnotationAdapter(av, remapper);
}
@Override
public AnnotationVisitor visitParameterAnnotation(int parameter,
String desc, boolean visible) {
AnnotationVisitor av = mv.visitParameterAnnotation(parameter,
remapper.mapDesc(desc), visible);
public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) {
AnnotationVisitor av =
mv.visitParameterAnnotation(parameter, remapper.mapDesc(desc), visible);
return av == null ? av : new RemappingAnnotationAdapter(av, remapper);
}
@Override
public void visitFrame(int type, int nLocal, Object[] local, int nStack,
Object[] stack) {
public void visitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack) {
super.visitFrame(type, nLocal, remapEntries(nLocal, local), nStack,
remapEntries(nStack, stack));
}
@ -93,8 +82,7 @@ public class RemappingMethodAdapter extends LocalVariablesSorter {
}
do {
Object t = entries[i];
newEntries[i++] = t instanceof String ? remapper
.mapType((String) t) : t;
newEntries[i++] = t instanceof String ? remapper.mapType((String) t) : t;
} while (i < n);
return newEntries;
}
@ -103,31 +91,24 @@ public class RemappingMethodAdapter extends LocalVariablesSorter {
}
@Override
public void visitFieldInsn(int opcode, String owner, String name,
String desc) {
public void visitFieldInsn(int opcode, String owner, String name, String desc) {
super.visitFieldInsn(opcode, remapper.mapType(owner),
remapper.mapFieldName(owner, name, desc),
remapper.mapDesc(desc));
remapper.mapFieldName(owner, name, desc), remapper.mapDesc(desc));
}
@Override
public void visitMethodInsn(int opcode, String owner, String name,
String desc) {
public void visitMethodInsn(int opcode, String owner, String name, String desc) {
super.visitMethodInsn(opcode, remapper.mapType(owner),
remapper.mapMethodName(owner, name, desc),
remapper.mapMethodDesc(desc));
remapper.mapMethodName(owner, name, desc), remapper.mapMethodDesc(desc));
}
@Override
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
Object... bsmArgs) {
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
for (int i = 0; i < bsmArgs.length; i++) {
bsmArgs[i] = remapper.mapValue(bsmArgs[i]);
}
super.visitInvokeDynamicInsn(
remapper.mapInvokeDynamicMethodName(name, desc),
remapper.mapMethodDesc(desc), (Handle) remapper.mapValue(bsm),
bsmArgs);
super.visitInvokeDynamicInsn(remapper.mapInvokeDynamicMethodName(name, desc),
remapper.mapMethodDesc(desc), (Handle) remapper.mapValue(bsm), bsmArgs);
}
@Override
@ -146,15 +127,13 @@ public class RemappingMethodAdapter extends LocalVariablesSorter {
}
@Override
public void visitTryCatchBlock(Label start, Label end, Label handler,
String type) {
super.visitTryCatchBlock(start, end, handler, type == null ? null
: remapper.mapType(type));
public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
super.visitTryCatchBlock(start, end, handler, type == null ? null : remapper.mapType(type));
}
@Override
public void visitLocalVariable(String name, String desc, String signature,
Label start, Label end, int index) {
public void visitLocalVariable(String name, String desc, String signature, Label start,
Label end, int index) {
super.visitLocalVariable(name, remapper.mapDesc(desc),
remapper.mapSignature(signature, true), start, end, index);
}

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.commons;
@ -46,13 +38,12 @@ public class RemappingSignatureAdapter extends SignatureVisitor {
private String className;
public RemappingSignatureAdapter(final SignatureVisitor v,
final Remapper remapper) {
public RemappingSignatureAdapter(final SignatureVisitor v, final Remapper remapper) {
this(Opcodes.ASM4, v, remapper);
}
protected RemappingSignatureAdapter(final int api,
final SignatureVisitor v, final Remapper remapper) {
protected RemappingSignatureAdapter(final int api, final SignatureVisitor v,
final Remapper remapper) {
super(api);
this.v = v;
this.remapper = remapper;
@ -69,8 +60,8 @@ public class RemappingSignatureAdapter extends SignatureVisitor {
String remappedOuter = remapper.mapType(className) + '$';
className = className + '$' + name;
String remappedName = remapper.mapType(className);
int index = remappedName.startsWith(remappedOuter) ? remappedOuter
.length() : remappedName.lastIndexOf('$') + 1;
int index = remappedName.startsWith(remappedOuter) ? remappedOuter.length()
: remappedName.lastIndexOf('$') + 1;
v.visitInnerClassType(remappedName.substring(index));
}

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.commons;
@ -44,8 +36,8 @@ import java.util.Arrays;
import java.util.Collection;
/**
* A {@link ClassVisitor} that adds a serial version unique identifier to a
* class if missing. Here is typical usage of this class:
* A {@link ClassVisitor} that adds a serial version unique identifier to a class if missing. Here
* is typical usage of this class:
*
* <pre>
* ClassWriter cw = new ClassWriter(...);
@ -54,8 +46,8 @@ import java.util.Collection;
* new ClassReader(orginalClass).accept(ca, false);
* </pre>
* <p>
* The SVUID algorithm can be found <a href=
* "http://java.sun.com/j2se/1.4.2/docs/guide/serialization/spec/class.html"
* The SVUID algorithm can be found
* <a href= "http://java.sun.com/j2se/1.4.2/docs/guide/serialization/spec/class.html"
* >http://java.sun.com/j2se/1.4.2/docs/guide/serialization/spec/class.html</a>:
*
* <pre>
@ -113,8 +105,7 @@ import java.util.Collection;
public class SerialVersionUIDAdder extends ClassVisitor {
/**
* Collection of fields. (except private static and private transient
* fields)
* Collection of fields. (except private static and private transient fields)
*/
private final Collection<Item> svuidFields;
/**
@ -151,12 +142,10 @@ public class SerialVersionUIDAdder extends ClassVisitor {
private boolean hasStaticInitializer;
/**
* Creates a new {@link SerialVersionUIDAdder}. <i>Subclasses must not use
* this constructor</i>. Instead, they must use the
* {@link #SerialVersionUIDAdder(int, ClassVisitor)} version.
* Creates a new {@link SerialVersionUIDAdder}. <i>Subclasses must not use this constructor</i>.
* Instead, they must use the {@link #SerialVersionUIDAdder(int, ClassVisitor)} version.
*
* @param cv a {@link ClassVisitor} to which this visitor will delegate
* calls.
* @param cv a {@link ClassVisitor} to which this visitor will delegate calls.
*/
public SerialVersionUIDAdder(final ClassVisitor cv) {
this(Opcodes.ASM4, cv);
@ -165,10 +154,9 @@ public class SerialVersionUIDAdder extends ClassVisitor {
/**
* Creates a new {@link SerialVersionUIDAdder}.
*
* @param api the ASM API version implemented by this visitor. Must be one
* of {@link Opcodes#ASM4}.
* @param cv a {@link ClassVisitor} to which this visitor will delegate
* calls.
* @param api the ASM API version implemented by this visitor. Must be one of
* {@link Opcodes#ASM4}.
* @param cv a {@link ClassVisitor} to which this visitor will delegate calls.
*/
protected SerialVersionUIDAdder(final int api, final ClassVisitor cv) {
super(api, cv);
@ -185,31 +173,29 @@ public class SerialVersionUIDAdder extends ClassVisitor {
* Sorts the items in the collection and writes it to the data output stream
*
* @param itemCollection collection of items
* @param dos a <code>DataOutputStream</code> value
* @param dotted a <code>boolean</code> value
* @param dos a <code>DataOutputStream</code> value
* @param dotted a <code>boolean</code> value
* @throws IOException if an error occurs
*/
private static void writeItems(final Collection<Item> itemCollection,
final DataOutput dos, final boolean dotted) throws IOException {
private static void writeItems(final Collection<Item> itemCollection, final DataOutput dos,
final boolean dotted) throws IOException {
int size = itemCollection.size();
Item[] items = itemCollection.toArray(new Item[size]);
Arrays.sort(items);
for (int i = 0; i < size; i++) {
dos.writeUTF(items[i].name);
dos.writeInt(items[i].access);
dos.writeUTF(dotted ? items[i].desc.replace('/', '.')
: items[i].desc);
dos.writeUTF(dotted ? items[i].desc.replace('/', '.') : items[i].desc);
}
}
/*
* Visit class header and get class name, access , and interfaces
* information (step 1,2, and 3) for SVUID computation.
* Visit class header and get class name, access , and interfaces information (step 1,2, and 3)
* for SVUID computation.
*/
@Override
public void visit(final int version, final int access, final String name,
final String signature, final String superName,
final String[] interfaces) {
final String signature, final String superName, final String[] interfaces) {
computeSVUID = (access & Opcodes.ACC_INTERFACE) == 0;
if (computeSVUID) {
@ -222,27 +208,23 @@ public class SerialVersionUIDAdder extends ClassVisitor {
}
/*
* Visit the methods and get constructor and method information (step 5 and
* 7). Also determine if there is a class initializer (step 6).
* Visit the methods and get constructor and method information (step 5 and 7). Also determine
* if there is a class initializer (step 6).
*/
@Override
public MethodVisitor visitMethod(final int access, final String name,
final String desc, final String signature, final String[] exceptions) {
public MethodVisitor visitMethod(final int access, final String name, final String desc,
final String signature, final String[] exceptions) {
if (computeSVUID) {
if ("<clinit>".equals(name)) {
hasStaticInitializer = true;
}
/*
* Remembers non private constructors and methods for SVUID
* computation For constructor and method modifiers, only the
* ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL,
* ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT and ACC_STRICT flags
* are used.
* Remembers non private constructors and methods for SVUID computation For constructor
* and method modifiers, only the ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC,
* ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT and ACC_STRICT flags are used.
*/
int mods = access
& (Opcodes.ACC_PUBLIC | Opcodes.ACC_PRIVATE
| Opcodes.ACC_PROTECTED | Opcodes.ACC_STATIC
| Opcodes.ACC_FINAL | Opcodes.ACC_SYNCHRONIZED
int mods = access & (Opcodes.ACC_PUBLIC | Opcodes.ACC_PRIVATE | Opcodes.ACC_PROTECTED
| Opcodes.ACC_STATIC | Opcodes.ACC_FINAL | Opcodes.ACC_SYNCHRONIZED
| Opcodes.ACC_NATIVE | Opcodes.ACC_ABSTRACT | Opcodes.ACC_STRICT);
// all non private methods
@ -259,12 +241,12 @@ public class SerialVersionUIDAdder extends ClassVisitor {
}
/*
* Gets class field information for step 4 of the algorithm. Also determines
* if the class already has a SVUID.
* Gets class field information for step 4 of the algorithm. Also determines if the class
* already has a SVUID.
*/
@Override
public FieldVisitor visitField(final int access, final String name,
final String desc, final String signature, final Object value) {
public FieldVisitor visitField(final int access, final String name, final String desc,
final String signature, final Object value) {
if (computeSVUID) {
if ("serialVersionUID".equals(name)) {
// since the class already has SVUID, we won't be computing it.
@ -272,17 +254,15 @@ public class SerialVersionUIDAdder extends ClassVisitor {
hasSVUID = true;
}
/*
* Remember field for SVUID computation For field modifiers, only
* the ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC,
* ACC_FINAL, ACC_VOLATILE, and ACC_TRANSIENT flags are used when
* computing serialVersionUID values.
* Remember field for SVUID computation For field modifiers, only the ACC_PUBLIC,
* ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_VOLATILE, and ACC_TRANSIENT
* flags are used when computing serialVersionUID values.
*/
if ((access & Opcodes.ACC_PRIVATE) == 0
|| (access & (Opcodes.ACC_STATIC | Opcodes.ACC_TRANSIENT)) == 0) {
int mods = access
& (Opcodes.ACC_PUBLIC | Opcodes.ACC_PRIVATE
| Opcodes.ACC_PROTECTED | Opcodes.ACC_STATIC
| Opcodes.ACC_FINAL | Opcodes.ACC_VOLATILE | Opcodes.ACC_TRANSIENT);
int mods = access & (Opcodes.ACC_PUBLIC | Opcodes.ACC_PRIVATE
| Opcodes.ACC_PROTECTED | Opcodes.ACC_STATIC | Opcodes.ACC_FINAL
| Opcodes.ACC_VOLATILE | Opcodes.ACC_TRANSIENT);
svuidFields.add(new Item(name, mods, desc));
}
}
@ -291,15 +271,14 @@ public class SerialVersionUIDAdder extends ClassVisitor {
}
/**
* Handle a bizarre special case. Nested classes (static classes declared
* inside another class) that are protected have their access bit set to
* public in their class files to deal with some odd reflection situation.
* Our SVUID computation must do as the JVM does and ignore access bits in
* the class file in favor of the access bits InnerClass attribute.
* Handle a bizarre special case. Nested classes (static classes declared inside another class)
* that are protected have their access bit set to public in their class files to deal with some
* odd reflection situation. Our SVUID computation must do as the JVM does and ignore access
* bits in the class file in favor of the access bits InnerClass attribute.
*/
@Override
public void visitInnerClass(final String aname, final String outerName,
final String innerName, final int attr_access) {
public void visitInnerClass(final String aname, final String outerName, final String innerName,
final int attr_access) {
if ((name != null) && name.equals(aname)) {
this.access = attr_access;
}
@ -320,8 +299,7 @@ public class SerialVersionUIDAdder extends ClassVisitor {
try {
addSVUID(computeSVUID());
} catch (Throwable e) {
throw new RuntimeException("Error while computing SVUID for "
+ name, e);
throw new RuntimeException("Error while computing SVUID for " + name, e);
}
}
@ -329,8 +307,8 @@ public class SerialVersionUIDAdder extends ClassVisitor {
}
/**
* Returns true if the class already has a SVUID field. The result of this
* method is only valid when visitEnd is or has been called.
* Returns true if the class already has a SVUID field. The result of this method is only valid
* when visitEnd is or has been called.
*
* @return true if the class already has a SVUID field.
*/
@ -339,8 +317,8 @@ public class SerialVersionUIDAdder extends ClassVisitor {
}
protected void addSVUID(long svuid) {
FieldVisitor fv = super.visitField(Opcodes.ACC_FINAL
+ Opcodes.ACC_STATIC, "serialVersionUID", "J", null, svuid);
FieldVisitor fv = super.visitField(Opcodes.ACC_FINAL + Opcodes.ACC_STATIC,
"serialVersionUID", "J", null, svuid);
if (null != fv) {
fv.visitEnd();
}
@ -369,13 +347,11 @@ public class SerialVersionUIDAdder extends ClassVisitor {
/*
* 2. The class modifiers written as a 32-bit integer.
*/
dos.writeInt(access
& (Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL
| Opcodes.ACC_INTERFACE | Opcodes.ACC_ABSTRACT));
dos.writeInt(access & (Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL | Opcodes.ACC_INTERFACE
| Opcodes.ACC_ABSTRACT));
/*
* 3. The name of each interface sorted by name written using UTF
* encoding.
* 3. The name of each interface sorted by name written using UTF encoding.
*/
Arrays.sort(interfaces);
for (String anInterface : interfaces) {
@ -383,24 +359,22 @@ public class SerialVersionUIDAdder extends ClassVisitor {
}
/*
* 4. For each field of the class sorted by field name (except
* private static and private transient fields):
* 4. For each field of the class sorted by field name (except private static and
* private transient fields):
*
* 1. The name of the field in UTF encoding. 2. The modifiers of the
* field written as a 32-bit integer. 3. The descriptor of the field
* in UTF encoding
* 1. The name of the field in UTF encoding. 2. The modifiers of the field written as a
* 32-bit integer. 3. The descriptor of the field in UTF encoding
*
* Note that field signatures are not dot separated. Method and
* constructor signatures are dot separated. Go figure...
* Note that field signatures are not dot separated. Method and constructor signatures
* are dot separated. Go figure...
*/
writeItems(svuidFields, dos, false);
/*
* 5. If a class initializer exists, write out the following: 1. The
* name of the method, <clinit>, in UTF encoding. 2. The modifier of
* the method, java.lang.reflect.Modifier.STATIC, written as a
* 32-bit integer. 3. The descriptor of the method, ()V, in UTF
* encoding.
* 5. If a class initializer exists, write out the following: 1. The name of the method,
* <clinit>, in UTF encoding. 2. The modifier of the method,
* java.lang.reflect.Modifier.STATIC, written as a 32-bit integer. 3. The descriptor of
* the method, ()V, in UTF encoding.
*/
if (hasStaticInitializer) {
dos.writeUTF("<clinit>");
@ -409,42 +383,37 @@ public class SerialVersionUIDAdder extends ClassVisitor {
} // if..
/*
* 6. For each non-private constructor sorted by method name and
* signature: 1. The name of the method, <init>, in UTF encoding. 2.
* The modifiers of the method written as a 32-bit integer. 3. The
* descriptor of the method in UTF encoding.
* 6. For each non-private constructor sorted by method name and signature: 1. The name
* of the method, <init>, in UTF encoding. 2. The modifiers of the method written as a
* 32-bit integer. 3. The descriptor of the method in UTF encoding.
*/
writeItems(svuidConstructors, dos, true);
/*
* 7. For each non-private method sorted by method name and
* signature: 1. The name of the method in UTF encoding. 2. The
* modifiers of the method written as a 32-bit integer. 3. The
* descriptor of the method in UTF encoding.
* 7. For each non-private method sorted by method name and signature: 1. The name of
* the method in UTF encoding. 2. The modifiers of the method written as a 32-bit
* integer. 3. The descriptor of the method in UTF encoding.
*/
writeItems(svuidMethods, dos, true);
dos.flush();
/*
* 8. The SHA-1 algorithm is executed on the stream of bytes
* produced by DataOutputStream and produces five 32-bit values
* sha[0..4].
* 8. The SHA-1 algorithm is executed on the stream of bytes produced by
* DataOutputStream and produces five 32-bit values sha[0..4].
*/
byte[] hashBytes = computeSHAdigest(bos.toByteArray());
/*
* 9. The hash value is assembled from the first and second 32-bit
* values of the SHA-1 message digest. If the result of the message
* digest, the five 32-bit words H0 H1 H2 H3 H4, is in an array of
* five int values named sha, the hash value would be computed as
* follows:
* 9. The hash value is assembled from the first and second 32-bit values of the SHA-1
* message digest. If the result of the message digest, the five 32-bit words H0 H1 H2
* H3 H4, is in an array of five int values named sha, the hash value would be computed
* as follows:
*
* long hash = ((sha[0] >>> 24) & 0xFF) | ((sha[0] >>> 16) & 0xFF)
* << 8 | ((sha[0] >>> 8) & 0xFF) << 16 | ((sha[0] >>> 0) & 0xFF) <<
* 24 | ((sha[1] >>> 24) & 0xFF) << 32 | ((sha[1] >>> 16) & 0xFF) <<
* 40 | ((sha[1] >>> 8) & 0xFF) << 48 | ((sha[1] >>> 0) & 0xFF) <<
* 56;
* long hash = ((sha[0] >>> 24) & 0xFF) | ((sha[0] >>> 16) & 0xFF) << 8 | ((sha[0] >>>
* 8) & 0xFF) << 16 | ((sha[0] >>> 0) & 0xFF) << 24 | ((sha[1] >>> 24) & 0xFF) << 32 |
* ((sha[1] >>> 16) & 0xFF) << 40 | ((sha[1] >>> 8) & 0xFF) << 48 | ((sha[1] >>> 0) &
* 0xFF) << 56;
*/
for (int i = Math.min(hashBytes.length, 8) - 1; i >= 0; i--) {
svuid = (svuid << 8) | (hashBytes[i] & 0xFF);

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.commons;

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.commons;
@ -52,23 +44,21 @@ public class StaticInitMerger extends ClassVisitor {
this(Opcodes.ASM4, prefix, cv);
}
protected StaticInitMerger(final int api, final String prefix,
final ClassVisitor cv) {
protected StaticInitMerger(final int api, final String prefix, final ClassVisitor cv) {
super(api, cv);
this.prefix = prefix;
}
@Override
public void visit(final int version, final int access, final String name,
final String signature, final String superName,
final String[] interfaces) {
final String signature, final String superName, final String[] interfaces) {
cv.visit(version, access, name, signature, superName, interfaces);
this.name = name;
}
@Override
public MethodVisitor visitMethod(final int access, final String name,
final String desc, final String signature, final String[] exceptions) {
public MethodVisitor visitMethod(final int access, final String name, final String desc,
final String signature, final String[] exceptions) {
MethodVisitor mv;
if ("<clinit>".equals(name)) {
int a = Opcodes.ACC_PRIVATE + Opcodes.ACC_STATIC;

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.commons;
@ -43,10 +35,8 @@ public interface TableSwitchGenerator {
/**
* Generates the code for a switch case.
*
* @param key
* the switch case key.
* @param end
* a label that corresponds to the end of the switch statement.
* @param key the switch case key.
* @param end a label that corresponds to the end of the switch statement.
*/
void generateCase(int key, Label end);

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.commons;
@ -39,30 +31,27 @@ import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.TryCatchBlockNode;
/**
* A {@link MethodVisitor} adapter to sort the exception handlers. The handlers
* are sorted in a method innermost-to-outermost. This allows the programmer to
* add handlers without worrying about ordering them correctly with respect to
* existing, in-code handlers.
* A {@link MethodVisitor} adapter to sort the exception handlers. The handlers are sorted in a
* method innermost-to-outermost. This allows the programmer to add handlers without worrying about
* ordering them correctly with respect to existing, in-code handlers.
*
* Behavior is only defined for properly-nested handlers. If any "try" blocks
* overlap (something that isn't possible in Java code) then this may not do
* what you want. In fact, this adapter just sorts by the length of the "try"
* block, taking advantage of the fact that a given try block must be larger
* than any block it contains).
* Behavior is only defined for properly-nested handlers. If any "try" blocks overlap (something
* that isn't possible in Java code) then this may not do what you want. In fact, this adapter just
* sorts by the length of the "try" block, taking advantage of the fact that a given try block must
* be larger than any block it contains).
*
* @author Adrian Sampson
*/
public class TryCatchBlockSorter extends MethodNode {
public TryCatchBlockSorter(final MethodVisitor mv, final int access,
final String name, final String desc, final String signature,
final String[] exceptions) {
public TryCatchBlockSorter(final MethodVisitor mv, final int access, final String name,
final String desc, final String signature, final String[] exceptions) {
this(Opcodes.ASM4, mv, access, name, desc, signature, exceptions);
}
protected TryCatchBlockSorter(final int api, final MethodVisitor mv,
final int access, final String name, final String desc,
final String signature, final String[] exceptions) {
protected TryCatchBlockSorter(final int api, final MethodVisitor mv, final int access,
final String name, final String desc, final String signature,
final String[] exceptions) {
super(api, access, name, desc, signature, exceptions);
this.mv = mv;
}

View File

@ -1,37 +1,28 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.signature;
/**
* A type signature parser to make a signature visitor visit an existing
* signature.
* A type signature parser to make a signature visitor visit an existing signature.
*
* @author Thomas Hallgren
* @author Eric Bruneton
@ -46,28 +37,23 @@ public class SignatureReader {
/**
* Constructs a {@link SignatureReader} for the given signature.
*
* @param signature
* A <i>ClassSignature</i>, <i>MethodTypeSignature</i>, or
* <i>FieldTypeSignature</i>.
* @param signature A <i>ClassSignature</i>, <i>MethodTypeSignature</i>, or
* <i>FieldTypeSignature</i>.
*/
public SignatureReader(final String signature) {
this.signature = signature;
}
/**
* Makes the given visitor visit the signature of this
* {@link SignatureReader}. This signature is the one specified in the
* constructor (see {@link #SignatureReader(String) SignatureReader}). This
* method is intended to be called on a {@link SignatureReader} that was
* created using a <i>ClassSignature</i> (such as the <code>signature</code>
* parameter of the {@link org.objectweb.asm.ClassVisitor#visit
* ClassVisitor.visit} method) or a <i>MethodTypeSignature</i> (such as the
* <code>signature</code> parameter of the
* {@link org.objectweb.asm.ClassVisitor#visitMethod
* ClassVisitor.visitMethod} method).
* Makes the given visitor visit the signature of this {@link SignatureReader}. This signature
* is the one specified in the constructor (see {@link #SignatureReader(String)
* SignatureReader}). This method is intended to be called on a {@link SignatureReader} that was
* created using a <i>ClassSignature</i> (such as the <code>signature</code> parameter of the
* {@link org.objectweb.asm.ClassVisitor#visit ClassVisitor.visit} method) or a
* <i>MethodTypeSignature</i> (such as the <code>signature</code> parameter of the
* {@link org.objectweb.asm.ClassVisitor#visitMethod ClassVisitor.visitMethod} method).
*
* @param v
* the visitor that must visit this signature.
* @param v the visitor that must visit this signature.
*/
public void accept(final SignatureVisitor v) {
String signature = this.signature;
@ -113,18 +99,15 @@ public class SignatureReader {
}
/**
* Makes the given visitor visit the signature of this
* {@link SignatureReader}. This signature is the one specified in the
* constructor (see {@link #SignatureReader(String) SignatureReader}). This
* method is intended to be called on a {@link SignatureReader} that was
* created using a <i>FieldTypeSignature</i>, such as the
* <code>signature</code> parameter of the
* {@link org.objectweb.asm.ClassVisitor#visitField ClassVisitor.visitField}
* or {@link org.objectweb.asm.MethodVisitor#visitLocalVariable
* MethodVisitor.visitLocalVariable} methods.
* Makes the given visitor visit the signature of this {@link SignatureReader}. This signature
* is the one specified in the constructor (see {@link #SignatureReader(String)
* SignatureReader}). This method is intended to be called on a {@link SignatureReader} that was
* created using a <i>FieldTypeSignature</i>, such as the <code>signature</code> parameter of
* the {@link org.objectweb.asm.ClassVisitor#visitField ClassVisitor.visitField} or
* {@link org.objectweb.asm.MethodVisitor#visitLocalVariable MethodVisitor.visitLocalVariable}
* methods.
*
* @param v
* the visitor that must visit this signature.
* @param v the visitor that must visit this signature.
*/
public void acceptType(final SignatureVisitor v) {
parseType(this.signature, 0, v);
@ -133,96 +116,90 @@ public class SignatureReader {
/**
* Parses a field type signature and makes the given visitor visit it.
*
* @param signature
* a string containing the signature that must be parsed.
* @param pos
* index of the first character of the signature to parsed.
* @param v
* the visitor that must visit this signature.
* @param signature a string containing the signature that must be parsed.
* @param pos index of the first character of the signature to parsed.
* @param v the visitor that must visit this signature.
* @return the index of the first character after the parsed signature.
*/
private static int parseType(final String signature, int pos,
final SignatureVisitor v) {
private static int parseType(final String signature, int pos, final SignatureVisitor v) {
char c;
int start, end;
boolean visited, inner;
String name;
switch (c = signature.charAt(pos++)) {
case 'Z':
case 'C':
case 'B':
case 'S':
case 'I':
case 'F':
case 'J':
case 'D':
case 'V':
v.visitBaseType(c);
return pos;
case 'Z':
case 'C':
case 'B':
case 'S':
case 'I':
case 'F':
case 'J':
case 'D':
case 'V':
v.visitBaseType(c);
return pos;
case '[':
return parseType(signature, pos, v.visitArrayType());
case '[':
return parseType(signature, pos, v.visitArrayType());
case 'T':
end = signature.indexOf(';', pos);
v.visitTypeVariable(signature.substring(pos, end));
return end + 1;
case 'T':
end = signature.indexOf(';', pos);
v.visitTypeVariable(signature.substring(pos, end));
return end + 1;
default: // case 'L':
start = pos;
visited = false;
inner = false;
for (;;) {
switch (c = signature.charAt(pos++)) {
case '.':
case ';':
if (!visited) {
name = signature.substring(start, pos - 1);
if (inner) {
v.visitInnerClassType(name);
} else {
v.visitClassType(name);
}
}
if (c == ';') {
v.visitEnd();
return pos;
}
start = pos;
visited = false;
inner = true;
break;
case '<':
name = signature.substring(start, pos - 1);
if (inner) {
v.visitInnerClassType(name);
} else {
v.visitClassType(name);
}
visited = true;
top: for (;;) {
switch (c = signature.charAt(pos)) {
case '>':
break top;
case '*':
++pos;
v.visitTypeArgument();
default: // case 'L':
start = pos;
visited = false;
inner = false;
for (;;) {
switch (c = signature.charAt(pos++)) {
case '.':
case ';':
if (!visited) {
name = signature.substring(start, pos - 1);
if (inner) {
v.visitInnerClassType(name);
} else {
v.visitClassType(name);
}
}
if (c == ';') {
v.visitEnd();
return pos;
}
start = pos;
visited = false;
inner = true;
break;
case '+':
case '-':
pos = parseType(signature, pos + 1,
v.visitTypeArgument(c));
break;
default:
pos = parseType(signature, pos,
v.visitTypeArgument('='));
break;
}
case '<':
name = signature.substring(start, pos - 1);
if (inner) {
v.visitInnerClassType(name);
} else {
v.visitClassType(name);
}
visited = true;
top: for (;;) {
switch (c = signature.charAt(pos)) {
case '>':
break top;
case '*':
++pos;
v.visitTypeArgument();
break;
case '+':
case '-':
pos = parseType(signature, pos + 1, v.visitTypeArgument(c));
break;
default:
pos = parseType(signature, pos, v.visitTypeArgument('='));
break;
}
}
}
}
}
}
}
}

View File

@ -1,54 +1,41 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.signature;
import org.objectweb.asm.Opcodes;
/**
* A visitor to visit a generic signature. The methods of this interface must be
* called in one of the three following orders (the last one is the only valid
* order for a {@link SignatureVisitor} that is returned by a method of this
* interface):
* A visitor to visit a generic signature. The methods of this interface must be called in one of
* the three following orders (the last one is the only valid order for a {@link SignatureVisitor}
* that is returned by a method of this interface):
* <ul>
* <li><i>ClassSignature</i> = ( <tt>visitFormalTypeParameter</tt>
* <tt>visitClassBound</tt>? <tt>visitInterfaceBound</tt>* )* (
* <tt>visitSuperClass</tt> <tt>visitInterface</tt>* )</li>
* <li><i>MethodSignature</i> = ( <tt>visitFormalTypeParameter</tt>
* <tt>visitClassBound</tt>? <tt>visitInterfaceBound</tt>* )* (
* <tt>visitParameterType</tt>* <tt>visitReturnType</tt>
* <li><i>ClassSignature</i> = ( <tt>visitFormalTypeParameter</tt> <tt>visitClassBound</tt>?
* <tt>visitInterfaceBound</tt>* )* ( <tt>visitSuperClass</tt> <tt>visitInterface</tt>* )</li>
* <li><i>MethodSignature</i> = ( <tt>visitFormalTypeParameter</tt> <tt>visitClassBound</tt>?
* <tt>visitInterfaceBound</tt>* )* ( <tt>visitParameterType</tt>* <tt>visitReturnType</tt>
* <tt>visitExceptionType</tt>* )</li>
* <li><i>TypeSignature</i> = <tt>visitBaseType</tt> |
* <tt>visitTypeVariable</tt> | <tt>visitArrayType</tt> | (
* <tt>visitClassType</tt> <tt>visitTypeArgument</tt>* (
* <tt>visitInnerClassType</tt> <tt>visitTypeArgument</tt>* )* <tt>visitEnd</tt>
* ) )</li>
* <li><i>TypeSignature</i> = <tt>visitBaseType</tt> | <tt>visitTypeVariable</tt> |
* <tt>visitArrayType</tt> | ( <tt>visitClassType</tt> <tt>visitTypeArgument</tt>* (
* <tt>visitInnerClassType</tt> <tt>visitTypeArgument</tt>* )* <tt>visitEnd</tt> ) )</li>
* </ul>
*
* @author Thomas Hallgren
@ -72,17 +59,16 @@ public abstract class SignatureVisitor {
public final static char INSTANCEOF = '=';
/**
* The ASM API version implemented by this visitor. The value of this field
* must be one of {@link Opcodes#ASM4}.
* The ASM API version implemented by this visitor. The value of this field must be one of
* {@link Opcodes#ASM4}.
*/
protected final int api;
/**
* Constructs a new {@link SignatureVisitor}.
*
* @param api
* the ASM API version implemented by this visitor. Must be one
* of {@link Opcodes#ASM4}.
* @param api the ASM API version implemented by this visitor. Must be one of
* {@link Opcodes#ASM4}.
*/
public SignatureVisitor(final int api) {
this.api = api;
@ -91,11 +77,9 @@ public abstract class SignatureVisitor {
/**
* Visits a formal type parameter.
*
* @param name
* the name of the formal parameter.
* @param name the name of the formal parameter.
*/
public void visitFormalTypeParameter(String name) {
}
public void visitFormalTypeParameter(String name) {}
/**
* Visits the class bound of the last visited formal type parameter.
@ -118,8 +102,7 @@ public abstract class SignatureVisitor {
/**
* Visits the type of the super class.
*
* @return a non null visitor to visit the signature of the super class
* type.
* @return a non null visitor to visit the signature of the super class type.
*/
public SignatureVisitor visitSuperclass() {
return this;
@ -164,63 +147,49 @@ public abstract class SignatureVisitor {
/**
* Visits a signature corresponding to a primitive type.
*
* @param descriptor
* the descriptor of the primitive type, or 'V' for <tt>void</tt>
* .
* @param descriptor the descriptor of the primitive type, or 'V' for <tt>void</tt> .
*/
public void visitBaseType(char descriptor) {
}
public void visitBaseType(char descriptor) {}
/**
* Visits a signature corresponding to a type variable.
*
* @param name
* the name of the type variable.
* @param name the name of the type variable.
*/
public void visitTypeVariable(String name) {
}
public void visitTypeVariable(String name) {}
/**
* Visits a signature corresponding to an array type.
*
* @return a non null visitor to visit the signature of the array element
* type.
* @return a non null visitor to visit the signature of the array element type.
*/
public SignatureVisitor visitArrayType() {
return this;
}
/**
* Starts the visit of a signature corresponding to a class or interface
* type.
* Starts the visit of a signature corresponding to a class or interface type.
*
* @param name
* the internal name of the class or interface.
* @param name the internal name of the class or interface.
*/
public void visitClassType(String name) {
}
public void visitClassType(String name) {}
/**
* Visits an inner class.
*
* @param name
* the local name of the inner class in its enclosing class.
* @param name the local name of the inner class in its enclosing class.
*/
public void visitInnerClassType(String name) {
}
public void visitInnerClassType(String name) {}
/**
* Visits an unbounded type argument of the last visited class or inner
* class type.
* Visits an unbounded type argument of the last visited class or inner class type.
*/
public void visitTypeArgument() {
}
public void visitTypeArgument() {}
/**
* Visits a type argument of the last visited class or inner class type.
*
* @param wildcard
* '+', '-' or '='.
* @param wildcard '+', '-' or '='.
* @return a non null visitor to visit the signature of the type argument.
*/
public SignatureVisitor visitTypeArgument(char wildcard) {
@ -230,6 +199,5 @@ public abstract class SignatureVisitor {
/**
* Ends the visit of a signature corresponding to a class or interface type.
*/
public void visitEnd() {
}
public void visitEnd() {}
}

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.signature;
@ -55,10 +47,9 @@ public class SignatureWriter extends SignatureVisitor {
private boolean hasParameters;
/**
* Stack used to keep track of class types that have arguments. Each element
* of this stack is a boolean encoded in one bit. The top of the stack is
* the lowest order bit. Pushing false = *2, pushing true = *2+1, popping =
* /2.
* Stack used to keep track of class types that have arguments. Each element of this stack is a
* boolean encoded in one bit. The top of the stack is the lowest order bit. Pushing false = *2,
* pushing true = *2+1, popping = /2.
*/
private int argumentStack;
@ -224,4 +215,4 @@ public class SignatureWriter extends SignatureVisitor {
}
argumentStack /= 2;
}
}
}

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.tree;
@ -35,8 +27,8 @@ import java.util.Map;
import org.objectweb.asm.MethodVisitor;
/**
* A node that represents a bytecode instruction. <i>An instruction can appear
* at most once in at most one {@link InsnList} at a time</i>.
* A node that represents a bytecode instruction. <i>An instruction can appear at most once in at
* most one {@link InsnList} at a time</i>.
*
* @author Eric Bruneton
*/
@ -138,18 +130,16 @@ public abstract class AbstractInsnNode {
AbstractInsnNode next;
/**
* Index of this instruction in the list to which it belongs. The value of
* this field is correct only when {@link InsnList#cache} is not null. A
* value of -1 indicates that this instruction does not belong to any
* {@link InsnList}.
* Index of this instruction in the list to which it belongs. The value of this field is correct
* only when {@link InsnList#cache} is not null. A value of -1 indicates that this instruction
* does not belong to any {@link InsnList}.
*/
int index;
/**
* Constructs a new {@link AbstractInsnNode}.
*
* @param opcode
* the opcode of the instruction to be constructed.
* @param opcode the opcode of the instruction to be constructed.
*/
protected AbstractInsnNode(final int opcode) {
this.opcode = opcode;
@ -168,28 +158,25 @@ public abstract class AbstractInsnNode {
/**
* Returns the type of this instruction.
*
* @return the type of this instruction, i.e. one the constants defined in
* this class.
* @return the type of this instruction, i.e. one the constants defined in this class.
*/
public abstract int getType();
/**
* Returns the previous instruction in the list to which this instruction
* belongs, if any.
* Returns the previous instruction in the list to which this instruction belongs, if any.
*
* @return the previous instruction in the list to which this instruction
* belongs, if any. May be <tt>null</tt>.
* @return the previous instruction in the list to which this instruction belongs, if any. May
* be <tt>null</tt>.
*/
public AbstractInsnNode getPrevious() {
return prev;
}
/**
* Returns the next instruction in the list to which this instruction
* belongs, if any.
* Returns the next instruction in the list to which this instruction belongs, if any.
*
* @return the next instruction in the list to which this instruction
* belongs, if any. May be <tt>null</tt>.
* @return the next instruction in the list to which this instruction belongs, if any. May be
* <tt>null</tt>.
*/
public AbstractInsnNode getNext() {
return next;
@ -198,47 +185,38 @@ public abstract class AbstractInsnNode {
/**
* Makes the given code visitor visit this instruction.
*
* @param cv
* a code visitor.
* @param cv a code visitor.
*/
public abstract void accept(final MethodVisitor cv);
/**
* Returns a copy of this instruction.
*
* @param labels
* a map from LabelNodes to cloned LabelNodes.
* @return a copy of this instruction. The returned instruction does not
* belong to any {@link InsnList}.
* @param labels a map from LabelNodes to cloned LabelNodes.
* @return a copy of this instruction. The returned instruction does not belong to any
* {@link InsnList}.
*/
public abstract AbstractInsnNode clone(
final Map<LabelNode, LabelNode> labels);
public abstract AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels);
/**
* Returns the clone of the given label.
*
* @param label
* a label.
* @param map
* a map from LabelNodes to cloned LabelNodes.
* @param label a label.
* @param map a map from LabelNodes to cloned LabelNodes.
* @return the clone of the given label.
*/
static LabelNode clone(final LabelNode label,
final Map<LabelNode, LabelNode> map) {
static LabelNode clone(final LabelNode label, final Map<LabelNode, LabelNode> map) {
return map.get(label);
}
/**
* Returns the clones of the given labels.
*
* @param labels
* a list of labels.
* @param map
* a map from LabelNodes to cloned LabelNodes.
* @param labels a list of labels.
* @param map a map from LabelNodes to cloned LabelNodes.
* @return the clones of the given labels.
*/
static LabelNode[] clone(final List<LabelNode> labels,
final Map<LabelNode, LabelNode> map) {
static LabelNode[] clone(final List<LabelNode> labels, final Map<LabelNode, LabelNode> map) {
LabelNode[] clones = new LabelNode[labels.size()];
for (int i = 0; i < clones.length; ++i) {
clones[i] = map.get(labels.get(i));

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.tree;
@ -35,247 +27,192 @@ import java.util.List;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.Opcodes;
//import cn.edu.pku.dpartner.comm.api.context.DelayLogger;
// import cn.edu.pku.dpartner.comm.api.context.DelayLogger;
/**
* A node that represents an annotationn.
*
* @author Eric Bruneton
*/
public class AnnotationNode extends AnnotationVisitor
{
public class AnnotationNode extends AnnotationVisitor {
/**
* The class descriptor of the annotation class.
*/
public String desc;
/**
* The class descriptor of the annotation class.
*/
public String desc;
/**
* The name value pairs of this annotation. Each name value pair is stored
* as two consecutive elements in the list. The name is a {@link String},
* and the value may be a {@link Byte}, {@link Boolean}, {@link Character},
* {@link Short}, {@link Integer}, {@link Long}, {@link Float},
* {@link Double}, {@link String} or {@link org.objectweb.asm.Type}, or an
* two elements String array (for enumeration values), a
* {@link AnnotationNode}, or a {@link List} of values of one of the
* preceding types. The list may be <tt>null</tt> if there is no name value
* pair.
*/
public List<Object> values;
/**
* The name value pairs of this annotation. Each name value pair is stored as two consecutive
* elements in the list. The name is a {@link String}, and the value may be a {@link Byte},
* {@link Boolean}, {@link Character}, {@link Short}, {@link Integer}, {@link Long},
* {@link Float}, {@link Double}, {@link String} or {@link org.objectweb.asm.Type}, or an two
* elements String array (for enumeration values), a {@link AnnotationNode}, or a {@link List}
* of values of one of the preceding types. The list may be <tt>null</tt> if there is no name
* value pair.
*/
public List<Object> values;
/**
* Constructs a new {@link AnnotationNode}. <i>Subclasses must not use this
* constructor</i>. Instead, they must use the
* {@link #AnnotationNode(int, String)} version.
*
* @param desc
* the class descriptor of the annotation class.
*/
public AnnotationNode(final String desc)
{
this(Opcodes.ASM4, desc);
}
/**
* Constructs a new {@link AnnotationNode}. <i>Subclasses must not use this constructor</i>.
* Instead, they must use the {@link #AnnotationNode(int, String)} version.
*
* @param desc the class descriptor of the annotation class.
*/
public AnnotationNode(final String desc) {
this(Opcodes.ASM4, desc);
}
/**
* Constructs a new {@link AnnotationNode}.
*
* @param api
* the ASM API version implemented by this visitor. Must be one
* of {@link Opcodes#ASM4}.
* @param desc
* the class descriptor of the annotation class.
*/
public AnnotationNode(final int api, final String desc)
{
super(api);
this.desc = desc;
}
/**
* Constructs a new {@link AnnotationNode}.
*
* @param api the ASM API version implemented by this visitor. Must be one of
* {@link Opcodes#ASM4}.
* @param desc the class descriptor of the annotation class.
*/
public AnnotationNode(final int api, final String desc) {
super(api);
this.desc = desc;
}
/**
* Constructs a new {@link AnnotationNode} to visit an array value.
*
* @param values
* where the visited values must be stored.
*/
AnnotationNode(final List<Object> values)
{
super(Opcodes.ASM4);
this.values = values;
}
/**
* Constructs a new {@link AnnotationNode} to visit an array value.
*
* @param values where the visited values must be stored.
*/
AnnotationNode(final List<Object> values) {
super(Opcodes.ASM4);
this.values = values;
}
// ------------------------------------------------------------------------
// Implementation of the AnnotationVisitor abstract class
// ------------------------------------------------------------------------
// ------------------------------------------------------------------------
// Implementation of the AnnotationVisitor abstract class
// ------------------------------------------------------------------------
@Override
public void visit(final String name, final Object value)
{
if (values == null)
{
values = new ArrayList<Object>(this.desc != null ? 2 : 1);
}
if (this.desc != null)
{
values.add(name);
}
// else
// {
// System.out.println("[AnnotationNode] desc is null!");
// values.add("");
// }
values.add(value);
}
@Override
public void visit(final String name, final Object value) {
if (values == null) {
values = new ArrayList<Object>(this.desc != null ? 2 : 1);
}
if (this.desc != null) {
values.add(name);
}
// else
// {
// System.out.println("[AnnotationNode] desc is null!");
// values.add("");
// }
values.add(value);
}
@Override
public void visitEnum(final String name, final String desc,
final String value)
{
if (values == null)
{
values = new ArrayList<Object>(this.desc != null ? 2 : 1);
}
if (this.desc != null)
{
values.add(name);
}
values.add(new String[]
{ desc, value });
}
@Override
public void visitEnum(final String name, final String desc, final String value) {
if (values == null) {
values = new ArrayList<Object>(this.desc != null ? 2 : 1);
}
if (this.desc != null) {
values.add(name);
}
values.add(new String[] {desc, value});
}
@Override
public AnnotationVisitor visitAnnotation(final String name,
final String desc)
{
if (values == null)
{
values = new ArrayList<Object>(this.desc != null ? 2 : 1);
}
if (this.desc != null)
{
values.add(name);
}
AnnotationNode annotation = new AnnotationNode(desc);
values.add(annotation);
return annotation;
}
@Override
public AnnotationVisitor visitAnnotation(final String name, final String desc) {
if (values == null) {
values = new ArrayList<Object>(this.desc != null ? 2 : 1);
}
if (this.desc != null) {
values.add(name);
}
AnnotationNode annotation = new AnnotationNode(desc);
values.add(annotation);
return annotation;
}
@Override
public AnnotationVisitor visitArray(final String name)
{
if (values == null)
{
values = new ArrayList<Object>(this.desc != null ? 2 : 1);
}
if (this.desc != null)
{
values.add(name);
}
List<Object> array = new ArrayList<Object>();
values.add(array);
return new AnnotationNode(array);
}
@Override
public AnnotationVisitor visitArray(final String name) {
if (values == null) {
values = new ArrayList<Object>(this.desc != null ? 2 : 1);
}
if (this.desc != null) {
values.add(name);
}
List<Object> array = new ArrayList<Object>();
values.add(array);
return new AnnotationNode(array);
}
@Override
public void visitEnd()
{
}
@Override
public void visitEnd() {}
// ------------------------------------------------------------------------
// Accept methods
// ------------------------------------------------------------------------
// ------------------------------------------------------------------------
// Accept methods
// ------------------------------------------------------------------------
/**
* Checks that this annotation node is compatible with the given ASM API
* version. This methods checks that this node, and all its nodes
* recursively, do not contain elements that were introduced in more recent
* versions of the ASM API than the given version.
*
* @param api
* an ASM API version. Must be one of {@link Opcodes#ASM4}.
*/
public void check(final int api)
{
// nothing to do
}
/**
* Checks that this annotation node is compatible with the given ASM API version. This methods
* checks that this node, and all its nodes recursively, do not contain elements that were
* introduced in more recent versions of the ASM API than the given version.
*
* @param api an ASM API version. Must be one of {@link Opcodes#ASM4}.
*/
public void check(final int api) {
// nothing to do
}
/**
* Makes the given visitor visit this annotation.
*
* @param av
* an annotation visitor. Maybe <tt>null</tt>.
*/
public void accept(final AnnotationVisitor av)
{
if (av != null)
{
if (values != null)
{
for (int i = 0; i < values.size(); i += 2)
{
if (values.get(i) == null)
{
System.out
.println("[AnnotationNode] name is null!!!!!");
// DelayLogger.logValue(values);
System.out.flush();
try
{
Thread.sleep(2000);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
String name = (String) values.get(i);
Object value = values.get(i + 1);
accept(av, name, value);
}
}
av.visitEnd();
}
}
/**
* Makes the given visitor visit this annotation.
*
* @param av an annotation visitor. Maybe <tt>null</tt>.
*/
public void accept(final AnnotationVisitor av) {
if (av != null) {
if (values != null) {
for (int i = 0; i < values.size(); i += 2) {
if (values.get(i) == null) {
System.out.println("[AnnotationNode] name is null!!!!!");
// DelayLogger.logValue(values);
System.out.flush();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
String name = (String) values.get(i);
Object value = values.get(i + 1);
accept(av, name, value);
}
}
av.visitEnd();
}
}
/**
* Makes the given visitor visit a given annotation value.
*
* @param av
* an annotation visitor. Maybe <tt>null</tt>.
* @param name
* the value name.
* @param value
* the actual value.
*/
static void accept(final AnnotationVisitor av, final String name,
final Object value)
{
if (av != null)
{
if (value instanceof String[])
{
String[] typeconst = (String[]) value;
av.visitEnum(name, typeconst[0], typeconst[1]);
}
else if (value instanceof AnnotationNode)
{
AnnotationNode an = (AnnotationNode) value;
an.accept(av.visitAnnotation(name, an.desc));
}
else if (value instanceof List)
{
AnnotationVisitor v = av.visitArray(name);
List<?> array = (List<?>) value;
for (int j = 0; j < array.size(); ++j)
{
accept(v, null, array.get(j));
}
v.visitEnd();
}
else
{
av.visit(name, value);
}
}
}
/**
* Makes the given visitor visit a given annotation value.
*
* @param av an annotation visitor. Maybe <tt>null</tt>.
* @param name the value name.
* @param value the actual value.
*/
static void accept(final AnnotationVisitor av, final String name, final Object value) {
if (av != null) {
if (value instanceof String[]) {
String[] typeconst = (String[]) value;
av.visitEnum(name, typeconst[0], typeconst[1]);
} else if (value instanceof AnnotationNode) {
AnnotationNode an = (AnnotationNode) value;
an.accept(av.visitAnnotation(name, an.desc));
} else if (value instanceof List) {
AnnotationVisitor v = av.visitArray(name);
List<?> array = (List<?>) value;
for (int j = 0; j < array.size(); ++j) {
accept(v, null, array.get(j));
}
v.visitEnd();
} else {
av.visit(name, value);
}
}
}
}

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.tree;
@ -53,14 +45,14 @@ public class ClassNode extends ClassVisitor {
public int version;
/**
* The class's access flags (see {@link org.objectweb.asm.Opcodes}). This
* field also indicates if the class is deprecated.
* The class's access flags (see {@link org.objectweb.asm.Opcodes}). This field also indicates
* if the class is deprecated.
*/
public int access;
/**
* The internal name of the class (see
* {@link org.objectweb.asm.Type#getInternalName() getInternalName}).
* The internal name of the class (see {@link org.objectweb.asm.Type#getInternalName()
* getInternalName}).
*/
public String name;
@ -70,53 +62,50 @@ public class ClassNode extends ClassVisitor {
public String signature;
/**
* The internal of name of the super class (see
* {@link org.objectweb.asm.Type#getInternalName() getInternalName}). For
* interfaces, the super class is {@link Object}. May be <tt>null</tt>, but
* only for the {@link Object} class.
* The internal of name of the super class (see {@link org.objectweb.asm.Type#getInternalName()
* getInternalName}). For interfaces, the super class is {@link Object}. May be <tt>null</tt>,
* but only for the {@link Object} class.
*/
public String superName;
/**
* The internal names of the class's interfaces (see
* {@link org.objectweb.asm.Type#getInternalName() getInternalName}). This
* list is a list of {@link String} objects.
* {@link org.objectweb.asm.Type#getInternalName() getInternalName}). This list is a list of
* {@link String} objects.
*/
public List<String> interfaces;
/**
* The name of the source file from which this class was compiled. May be
* <tt>null</tt>.
* The name of the source file from which this class was compiled. May be <tt>null</tt>.
*/
public String sourceFile;
/**
* Debug information to compute the correspondence between source and
* compiled elements of the class. May be <tt>null</tt>.
* Debug information to compute the correspondence between source and compiled elements of the
* class. May be <tt>null</tt>.
*/
public String sourceDebug;
/**
* The internal name of the enclosing class of the class. May be
* <tt>null</tt>.
* The internal name of the enclosing class of the class. May be <tt>null</tt>.
*/
public String outerClass;
/**
* The name of the method that contains the class, or <tt>null</tt> if the
* class is not enclosed in a method.
* The name of the method that contains the class, or <tt>null</tt> if the class is not enclosed
* in a method.
*/
public String outerMethod;
/**
* The descriptor of the method that contains the class, or <tt>null</tt> if
* the class is not enclosed in a method.
* The descriptor of the method that contains the class, or <tt>null</tt> if the class is not
* enclosed in a method.
*/
public String outerMethodDesc;
/**
* The runtime visible annotations of this class. This list is a list of
* {@link AnnotationNode} objects. May be <tt>null</tt>.
* The runtime visible annotations of this class. This list is a list of {@link AnnotationNode}
* objects. May be <tt>null</tt>.
*
* @associates org.objectweb.asm.tree.AnnotationNode
* @label visible
@ -133,41 +122,38 @@ public class ClassNode extends ClassVisitor {
public List<AnnotationNode> invisibleAnnotations;
/**
* The non standard attributes of this class. This list is a list of
* {@link Attribute} objects. May be <tt>null</tt>.
* The non standard attributes of this class. This list is a list of {@link Attribute} objects.
* May be <tt>null</tt>.
*
* @associates org.objectweb.asm.Attribute
*/
public List<Attribute> attrs;
/**
* Informations about the inner classes of this class. This list is a list
* of {@link InnerClassNode} objects.
* Informations about the inner classes of this class. This list is a list of
* {@link InnerClassNode} objects.
*
* @associates org.objectweb.asm.tree.InnerClassNode
*/
public List<InnerClassNode> innerClasses;
/**
* The fields of this class. This list is a list of {@link FieldNode}
* objects.
* The fields of this class. This list is a list of {@link FieldNode} objects.
*
* @associates org.objectweb.asm.tree.FieldNode
*/
public List<FieldNode> fields;
/**
* The methods of this class. This list is a list of {@link MethodNode}
* objects.
* The methods of this class. This list is a list of {@link MethodNode} objects.
*
* @associates org.objectweb.asm.tree.MethodNode
*/
public List<MethodNode> methods;
/**
* Constructs a new {@link ClassNode}. <i>Subclasses must not use this
* constructor</i>. Instead, they must use the {@link #ClassNode(int)}
* version.
* Constructs a new {@link ClassNode}. <i>Subclasses must not use this constructor</i>. Instead,
* they must use the {@link #ClassNode(int)} version.
*/
public ClassNode() {
this(Opcodes.ASM4);
@ -176,9 +162,8 @@ public class ClassNode extends ClassVisitor {
/**
* Constructs a new {@link ClassNode}.
*
* @param api
* the ASM API version implemented by this visitor. Must be one
* of {@link Opcodes#ASM4}.
* @param api the ASM API version implemented by this visitor. Must be one of
* {@link Opcodes#ASM4}.
*/
public ClassNode(final int api) {
super(api);
@ -194,8 +179,7 @@ public class ClassNode extends ClassVisitor {
@Override
public void visit(final int version, final int access, final String name,
final String signature, final String superName,
final String[] interfaces) {
final String signature, final String superName, final String[] interfaces) {
this.version = version;
this.access = access;
this.name = name;
@ -213,16 +197,14 @@ public class ClassNode extends ClassVisitor {
}
@Override
public void visitOuterClass(final String owner, final String name,
final String desc) {
public void visitOuterClass(final String owner, final String name, final String desc) {
outerClass = owner;
outerMethod = name;
outerMethodDesc = desc;
}
@Override
public AnnotationVisitor visitAnnotation(final String desc,
final boolean visible) {
public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
AnnotationNode an = new AnnotationNode(desc);
if (visible) {
if (visibleAnnotations == null) {
@ -247,46 +229,41 @@ public class ClassNode extends ClassVisitor {
}
@Override
public void visitInnerClass(final String name, final String outerName,
final String innerName, final int access) {
InnerClassNode icn = new InnerClassNode(name, outerName, innerName,
access);
public void visitInnerClass(final String name, final String outerName, final String innerName,
final int access) {
InnerClassNode icn = new InnerClassNode(name, outerName, innerName, access);
innerClasses.add(icn);
}
@Override
public FieldVisitor visitField(final int access, final String name,
final String desc, final String signature, final Object value) {
public FieldVisitor visitField(final int access, final String name, final String desc,
final String signature, final Object value) {
FieldNode fn = new FieldNode(access, name, desc, signature, value);
fields.add(fn);
return fn;
}
@Override
public MethodVisitor visitMethod(final int access, final String name,
final String desc, final String signature, final String[] exceptions) {
MethodNode mn = new MethodNode(access, name, desc, signature,
exceptions);
public MethodVisitor visitMethod(final int access, final String name, final String desc,
final String signature, final String[] exceptions) {
MethodNode mn = new MethodNode(access, name, desc, signature, exceptions);
methods.add(mn);
return mn;
}
@Override
public void visitEnd() {
}
public void visitEnd() {}
// ------------------------------------------------------------------------
// Accept method
// ------------------------------------------------------------------------
/**
* Checks that this class node is compatible with the given ASM API version.
* This methods checks that this node, and all its nodes recursively, do not
* contain elements that were introduced in more recent versions of the ASM
* API than the given version.
* Checks that this class node is compatible with the given ASM API version. This methods checks
* that this node, and all its nodes recursively, do not contain elements that were introduced
* in more recent versions of the ASM API than the given version.
*
* @param api
* an ASM API version. Must be one of {@link Opcodes#ASM4}.
* @param api an ASM API version. Must be one of {@link Opcodes#ASM4}.
*/
public void check(final int api) {
// nothing to do
@ -295,8 +272,7 @@ public class ClassNode extends ClassVisitor {
/**
* Makes the given class visitor visit this class.
*
* @param cv
* a class visitor.
* @param cv a class visitor.
*/
public void accept(final ClassVisitor cv) {
// visits header

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.tree;
@ -34,8 +26,8 @@ import java.util.Map;
import org.objectweb.asm.MethodVisitor;
/**
* A node that represents a field instruction. A field instruction is an
* instruction that loads or stores the value of a field of an object.
* A node that represents a field instruction. A field instruction is an instruction that loads or
* stores the value of a field of an object.
*
* @author Eric Bruneton
*/
@ -60,20 +52,15 @@ public class FieldInsnNode extends AbstractInsnNode {
/**
* Constructs a new {@link FieldInsnNode}.
*
* @param opcode
* the opcode of the type instruction to be constructed. This
* opcode must be GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
* @param owner
* the internal name of the field's owner class (see
* {@link org.objectweb.asm.Type#getInternalName()
* getInternalName}).
* @param name
* the field's name.
* @param desc
* the field's descriptor (see {@link org.objectweb.asm.Type}).
* @param opcode the opcode of the type instruction to be constructed. This opcode must be
* GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
* @param owner the internal name of the field's owner class (see
* {@link org.objectweb.asm.Type#getInternalName() getInternalName}).
* @param name the field's name.
* @param desc the field's descriptor (see {@link org.objectweb.asm.Type}).
*/
public FieldInsnNode(final int opcode, final String owner,
final String name, final String desc) {
public FieldInsnNode(final int opcode, final String owner, final String name,
final String desc) {
super(opcode);
this.owner = owner;
this.name = name;
@ -83,9 +70,8 @@ public class FieldInsnNode extends AbstractInsnNode {
/**
* Sets the opcode of this instruction.
*
* @param opcode
* the new instruction opcode. This opcode must be GETSTATIC,
* PUTSTATIC, GETFIELD or PUTFIELD.
* @param opcode the new instruction opcode. This opcode must be GETSTATIC, PUTSTATIC, GETFIELD
* or PUTFIELD.
*/
public void setOpcode(final int opcode) {
this.opcode = opcode;

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.tree;
@ -46,8 +38,8 @@ import org.objectweb.asm.Opcodes;
public class FieldNode extends FieldVisitor {
/**
* The field's access flags (see {@link org.objectweb.asm.Opcodes}). This
* field also indicates if the field is synthetic and/or deprecated.
* The field's access flags (see {@link org.objectweb.asm.Opcodes}). This field also indicates
* if the field is synthetic and/or deprecated.
*/
public int access;
@ -67,15 +59,15 @@ public class FieldNode extends FieldVisitor {
public String signature;
/**
* The field's initial value. This field, which may be <tt>null</tt> if the
* field does not have an initial value, must be an {@link Integer}, a
* {@link Float}, a {@link Long}, a {@link Double} or a {@link String}.
* The field's initial value. This field, which may be <tt>null</tt> if the field does not have
* an initial value, must be an {@link Integer}, a {@link Float}, a {@link Long}, a
* {@link Double} or a {@link String}.
*/
public Object value;
/**
* The runtime visible annotations of this field. This list is a list of
* {@link AnnotationNode} objects. May be <tt>null</tt>.
* The runtime visible annotations of this field. This list is a list of {@link AnnotationNode}
* objects. May be <tt>null</tt>.
*
* @associates org.objectweb.asm.tree.AnnotationNode
* @label visible
@ -92,67 +84,48 @@ public class FieldNode extends FieldVisitor {
public List<AnnotationNode> invisibleAnnotations;
/**
* The non standard attributes of this field. This list is a list of
* {@link Attribute} objects. May be <tt>null</tt>.
* The non standard attributes of this field. This list is a list of {@link Attribute} objects.
* May be <tt>null</tt>.
*
* @associates org.objectweb.asm.Attribute
*/
public List<Attribute> attrs;
/**
* Constructs a new {@link FieldNode}. <i>Subclasses must not use this
* constructor</i>. Instead, they must use the
* {@link #FieldNode(int, int, String, String, String, Object)} version.
* Constructs a new {@link FieldNode}. <i>Subclasses must not use this constructor</i>. Instead,
* they must use the {@link #FieldNode(int, int, String, String, String, Object)} version.
*
* @param access
* the field's access flags (see
* {@link org.objectweb.asm.Opcodes}). This parameter also
* indicates if the field is synthetic and/or deprecated.
* @param name
* the field's name.
* @param desc
* the field's descriptor (see {@link org.objectweb.asm.Type
* Type}).
* @param signature
* the field's signature.
* @param value
* the field's initial value. This parameter, which may be
* <tt>null</tt> if the field does not have an initial value,
* must be an {@link Integer}, a {@link Float}, a {@link Long}, a
* {@link Double} or a {@link String}.
* @param access the field's access flags (see {@link org.objectweb.asm.Opcodes}). This
* parameter also indicates if the field is synthetic and/or deprecated.
* @param name the field's name.
* @param desc the field's descriptor (see {@link org.objectweb.asm.Type Type}).
* @param signature the field's signature.
* @param value the field's initial value. This parameter, which may be <tt>null</tt> if the
* field does not have an initial value, must be an {@link Integer}, a {@link Float}, a
* {@link Long}, a {@link Double} or a {@link String}.
*/
public FieldNode(final int access, final String name, final String desc,
final String signature, final Object value) {
public FieldNode(final int access, final String name, final String desc, final String signature,
final Object value) {
this(Opcodes.ASM4, access, name, desc, signature, value);
}
/**
* Constructs a new {@link FieldNode}. <i>Subclasses must not use this
* constructor</i>. Instead, they must use the
* {@link #FieldNode(int, int, String, String, String, Object)} version.
* Constructs a new {@link FieldNode}. <i>Subclasses must not use this constructor</i>. Instead,
* they must use the {@link #FieldNode(int, int, String, String, String, Object)} version.
*
* @param api
* the ASM API version implemented by this visitor. Must be one
* of {@link Opcodes#ASM4}.
* @param access
* the field's access flags (see
* {@link org.objectweb.asm.Opcodes}). This parameter also
* indicates if the field is synthetic and/or deprecated.
* @param name
* the field's name.
* @param desc
* the field's descriptor (see {@link org.objectweb.asm.Type
* Type}).
* @param signature
* the field's signature.
* @param value
* the field's initial value. This parameter, which may be
* <tt>null</tt> if the field does not have an initial value,
* must be an {@link Integer}, a {@link Float}, a {@link Long}, a
* {@link Double} or a {@link String}.
* @param api the ASM API version implemented by this visitor. Must be one of
* {@link Opcodes#ASM4}.
* @param access the field's access flags (see {@link org.objectweb.asm.Opcodes}). This
* parameter also indicates if the field is synthetic and/or deprecated.
* @param name the field's name.
* @param desc the field's descriptor (see {@link org.objectweb.asm.Type Type}).
* @param signature the field's signature.
* @param value the field's initial value. This parameter, which may be <tt>null</tt> if the
* field does not have an initial value, must be an {@link Integer}, a {@link Float}, a
* {@link Long}, a {@link Double} or a {@link String}.
*/
public FieldNode(final int api, final int access, final String name,
final String desc, final String signature, final Object value) {
public FieldNode(final int api, final int access, final String name, final String desc,
final String signature, final Object value) {
super(api);
this.access = access;
this.name = name;
@ -166,8 +139,7 @@ public class FieldNode extends FieldVisitor {
// ------------------------------------------------------------------------
@Override
public AnnotationVisitor visitAnnotation(final String desc,
final boolean visible) {
public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
AnnotationNode an = new AnnotationNode(desc);
if (visible) {
if (visibleAnnotations == null) {
@ -192,21 +164,18 @@ public class FieldNode extends FieldVisitor {
}
@Override
public void visitEnd() {
}
public void visitEnd() {}
// ------------------------------------------------------------------------
// Accept methods
// ------------------------------------------------------------------------
/**
* Checks that this field node is compatible with the given ASM API version.
* This methods checks that this node, and all its nodes recursively, do not
* contain elements that were introduced in more recent versions of the ASM
* API than the given version.
* Checks that this field node is compatible with the given ASM API version. This methods checks
* that this node, and all its nodes recursively, do not contain elements that were introduced
* in more recent versions of the ASM API than the given version.
*
* @param api
* an ASM API version. Must be one of {@link Opcodes#ASM4}.
* @param api an ASM API version. Must be one of {@link Opcodes#ASM4}.
*/
public void check(final int api) {
// nothing to do
@ -215,8 +184,7 @@ public class FieldNode extends FieldVisitor {
/**
* Makes the given class visitor visit this field.
*
* @param cv
* a class visitor.
* @param cv a class visitor.
*/
public void accept(final ClassVisitor cv) {
FieldVisitor fv = cv.visitField(access, name, desc, signature, value);

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.tree;
@ -38,42 +30,39 @@ import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
/**
* A node that represents a stack map frame. These nodes are pseudo instruction
* nodes in order to be inserted in an instruction list. In fact these nodes
* must(*) be inserted <i>just before</i> any instruction node <b>i</b> that
* follows an unconditionnal branch instruction such as GOTO or THROW, that is
* the target of a jump instruction, or that starts an exception handler block.
* The stack map frame types must describe the values of the local variables and
* of the operand stack elements <i>just before</i> <b>i</b> is executed. <br>
* A node that represents a stack map frame. These nodes are pseudo instruction nodes in order to be
* inserted in an instruction list. In fact these nodes must(*) be inserted <i>just before</i> any
* instruction node <b>i</b> that follows an unconditionnal branch instruction such as GOTO or
* THROW, that is the target of a jump instruction, or that starts an exception handler block. The
* stack map frame types must describe the values of the local variables and of the operand stack
* elements <i>just before</i> <b>i</b> is executed. <br>
* <br>
* (*) this is mandatory only for classes whose version is greater than or equal
* to {@link Opcodes#V1_6 V1_6}.
* (*) this is mandatory only for classes whose version is greater than or equal to
* {@link Opcodes#V1_6 V1_6}.
*
* @author Eric Bruneton
*/
public class FrameNode extends AbstractInsnNode {
/**
* The type of this frame. Must be {@link Opcodes#F_NEW} for expanded
* frames, or {@link Opcodes#F_FULL}, {@link Opcodes#F_APPEND},
* {@link Opcodes#F_CHOP}, {@link Opcodes#F_SAME} or
* {@link Opcodes#F_APPEND}, {@link Opcodes#F_SAME1} for compressed frames.
* The type of this frame. Must be {@link Opcodes#F_NEW} for expanded frames, or
* {@link Opcodes#F_FULL}, {@link Opcodes#F_APPEND}, {@link Opcodes#F_CHOP},
* {@link Opcodes#F_SAME} or {@link Opcodes#F_APPEND}, {@link Opcodes#F_SAME1} for compressed
* frames.
*/
public int type;
/**
* The types of the local variables of this stack map frame. Elements of
* this list can be Integer, String or LabelNode objects (for primitive,
* reference and uninitialized types respectively - see
* {@link MethodVisitor}).
* The types of the local variables of this stack map frame. Elements of this list can be
* Integer, String or LabelNode objects (for primitive, reference and uninitialized types
* respectively - see {@link MethodVisitor}).
*/
public List<Object> local;
/**
* The types of the operand stack elements of this stack map frame. Elements
* of this list can be Integer, String or LabelNode objects (for primitive,
* reference and uninitialized types respectively - see
* {@link MethodVisitor}).
* The types of the operand stack elements of this stack map frame. Elements of this list can be
* Integer, String or LabelNode objects (for primitive, reference and uninitialized types
* respectively - see {@link MethodVisitor}).
*/
public List<Object> stack;
@ -84,48 +73,40 @@ public class FrameNode extends AbstractInsnNode {
/**
* Constructs a new {@link FrameNode}.
*
* @param type
* the type of this frame. Must be {@link Opcodes#F_NEW} for
* expanded frames, or {@link Opcodes#F_FULL},
* {@link Opcodes#F_APPEND}, {@link Opcodes#F_CHOP},
* {@link Opcodes#F_SAME} or {@link Opcodes#F_APPEND},
* {@link Opcodes#F_SAME1} for compressed frames.
* @param nLocal
* number of local variables of this stack map frame.
* @param local
* the types of the local variables of this stack map frame.
* Elements of this list can be Integer, String or LabelNode
* objects (for primitive, reference and uninitialized types
* respectively - see {@link MethodVisitor}).
* @param nStack
* number of operand stack elements of this stack map frame.
* @param stack
* the types of the operand stack elements of this stack map
* frame. Elements of this list can be Integer, String or
* LabelNode objects (for primitive, reference and uninitialized
* types respectively - see {@link MethodVisitor}).
* @param type the type of this frame. Must be {@link Opcodes#F_NEW} for expanded frames, or
* {@link Opcodes#F_FULL}, {@link Opcodes#F_APPEND}, {@link Opcodes#F_CHOP},
* {@link Opcodes#F_SAME} or {@link Opcodes#F_APPEND}, {@link Opcodes#F_SAME1} for
* compressed frames.
* @param nLocal number of local variables of this stack map frame.
* @param local the types of the local variables of this stack map frame. Elements of this list
* can be Integer, String or LabelNode objects (for primitive, reference and
* uninitialized types respectively - see {@link MethodVisitor}).
* @param nStack number of operand stack elements of this stack map frame.
* @param stack the types of the operand stack elements of this stack map frame. Elements of
* this list can be Integer, String or LabelNode objects (for primitive, reference and
* uninitialized types respectively - see {@link MethodVisitor}).
*/
public FrameNode(final int type, final int nLocal, final Object[] local,
final int nStack, final Object[] stack) {
public FrameNode(final int type, final int nLocal, final Object[] local, final int nStack,
final Object[] stack) {
super(-1);
this.type = type;
switch (type) {
case Opcodes.F_NEW:
case Opcodes.F_FULL:
this.local = asList(nLocal, local);
this.stack = asList(nStack, stack);
break;
case Opcodes.F_APPEND:
this.local = asList(nLocal, local);
break;
case Opcodes.F_CHOP:
this.local = Arrays.asList(new Object[nLocal]);
break;
case Opcodes.F_SAME:
break;
case Opcodes.F_SAME1:
this.stack = asList(1, stack);
break;
case Opcodes.F_NEW:
case Opcodes.F_FULL:
this.local = asList(nLocal, local);
this.stack = asList(nStack, stack);
break;
case Opcodes.F_APPEND:
this.local = asList(nLocal, local);
break;
case Opcodes.F_CHOP:
this.local = Arrays.asList(new Object[nLocal]);
break;
case Opcodes.F_SAME:
break;
case Opcodes.F_SAME1:
this.stack = asList(1, stack);
break;
}
}
@ -137,29 +118,27 @@ public class FrameNode extends AbstractInsnNode {
/**
* Makes the given visitor visit this stack map frame.
*
* @param mv
* a method visitor.
* @param mv a method visitor.
*/
@Override
public void accept(final MethodVisitor mv) {
switch (type) {
case Opcodes.F_NEW:
case Opcodes.F_FULL:
mv.visitFrame(type, local.size(), asArray(local), stack.size(),
asArray(stack));
break;
case Opcodes.F_APPEND:
mv.visitFrame(type, local.size(), asArray(local), 0, null);
break;
case Opcodes.F_CHOP:
mv.visitFrame(type, local.size(), null, 0, null);
break;
case Opcodes.F_SAME:
mv.visitFrame(type, 0, null, 0, null);
break;
case Opcodes.F_SAME1:
mv.visitFrame(type, 0, null, 1, asArray(stack));
break;
case Opcodes.F_NEW:
case Opcodes.F_FULL:
mv.visitFrame(type, local.size(), asArray(local), stack.size(), asArray(stack));
break;
case Opcodes.F_APPEND:
mv.visitFrame(type, local.size(), asArray(local), 0, null);
break;
case Opcodes.F_CHOP:
mv.visitFrame(type, local.size(), null, 0, null);
break;
case Opcodes.F_SAME:
mv.visitFrame(type, 0, null, 0, null);
break;
case Opcodes.F_SAME1:
mv.visitFrame(type, 0, null, 1, asArray(stack));
break;
}
}

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.tree;
@ -54,10 +46,8 @@ public class IincInsnNode extends AbstractInsnNode {
/**
* Constructs a new {@link IincInsnNode}.
*
* @param var
* index of the local variable to be incremented.
* @param incr
* increment amount to increment the local variable by.
* @param var index of the local variable to be incremented.
* @param incr increment amount to increment the local variable by.
*/
public IincInsnNode(final int var, final int incr) {
super(Opcodes.IINC);
@ -79,4 +69,4 @@ public class IincInsnNode extends AbstractInsnNode {
public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
return new IincInsnNode(var, incr);
}
}
}

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.tree;
@ -39,50 +31,43 @@ import org.objectweb.asm.ClassVisitor;
public class InnerClassNode {
/**
* The internal name of an inner class (see
* {@link org.objectweb.asm.Type#getInternalName() getInternalName}).
* The internal name of an inner class (see {@link org.objectweb.asm.Type#getInternalName()
* getInternalName}).
*/
public String name;
/**
* The internal name of the class to which the inner class belongs (see
* {@link org.objectweb.asm.Type#getInternalName() getInternalName}). May be
* <tt>null</tt>.
* {@link org.objectweb.asm.Type#getInternalName() getInternalName}). May be <tt>null</tt>.
*/
public String outerName;
/**
* The (simple) name of the inner class inside its enclosing class. May be
* <tt>null</tt> for anonymous inner classes.
* The (simple) name of the inner class inside its enclosing class. May be <tt>null</tt> for
* anonymous inner classes.
*/
public String innerName;
/**
* The access flags of the inner class as originally declared in the
* enclosing class.
* The access flags of the inner class as originally declared in the enclosing class.
*/
public int access;
/**
* Constructs a new {@link InnerClassNode}.
*
* @param name
* the internal name of an inner class (see
* {@link org.objectweb.asm.Type#getInternalName()
* getInternalName}).
* @param outerName
* the internal name of the class to which the inner class
* belongs (see {@link org.objectweb.asm.Type#getInternalName()
* getInternalName}). May be <tt>null</tt>.
* @param innerName
* the (simple) name of the inner class inside its enclosing
* class. May be <tt>null</tt> for anonymous inner classes.
* @param access
* the access flags of the inner class as originally declared in
* the enclosing class.
* @param name the internal name of an inner class (see
* {@link org.objectweb.asm.Type#getInternalName() getInternalName}).
* @param outerName the internal name of the class to which the inner class belongs (see
* {@link org.objectweb.asm.Type#getInternalName() getInternalName}). May be
* <tt>null</tt>.
* @param innerName the (simple) name of the inner class inside its enclosing class. May be
* <tt>null</tt> for anonymous inner classes.
* @param access the access flags of the inner class as originally declared in the enclosing
* class.
*/
public InnerClassNode(final String name, final String outerName,
final String innerName, final int access) {
public InnerClassNode(final String name, final String outerName, final String innerName,
final int access) {
this.name = name;
this.outerName = outerName;
this.innerName = innerName;
@ -92,8 +77,7 @@ public class InnerClassNode {
/**
* Makes the given class visitor visit this inner class.
*
* @param cv
* a class visitor.
* @param cv a class visitor.
*/
public void accept(final ClassVisitor cv) {
cv.visitInnerClass(name, outerName, innerName, access);

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.tree;
@ -35,8 +27,8 @@ import java.util.NoSuchElementException;
import org.objectweb.asm.MethodVisitor;
/**
* A doubly linked list of {@link AbstractInsnNode} objects. <i>This
* implementation is not thread safe</i>.
* A doubly linked list of {@link AbstractInsnNode} objects. <i>This implementation is not thread
* safe</i>.
*/
public class InsnList {
@ -56,8 +48,8 @@ public class InsnList {
private AbstractInsnNode last;
/**
* A cache of the instructions of this list. This cache is used to improve
* the performance of the {@link #get} method.
* A cache of the instructions of this list. This cache is used to improve the performance of
* the {@link #get} method.
*/
AbstractInsnNode[] cache;
@ -73,8 +65,7 @@ public class InsnList {
/**
* Returns the first instruction in this list.
*
* @return the first instruction in this list, or <tt>null</tt> if the list
* is empty.
* @return the first instruction in this list, or <tt>null</tt> if the list is empty.
*/
public AbstractInsnNode getFirst() {
return first;
@ -83,24 +74,21 @@ public class InsnList {
/**
* Returns the last instruction in this list.
*
* @return the last instruction in this list, or <tt>null</tt> if the list
* is empty.
* @return the last instruction in this list, or <tt>null</tt> if the list is empty.
*/
public AbstractInsnNode getLast() {
return last;
}
/**
* Returns the instruction whose index is given. This method builds a cache
* of the instructions in this list to avoid scanning the whole list each
* time it is called. Once the cache is built, this method run in constant
* time. This cache is invalidated by all the methods that modify the list.
* Returns the instruction whose index is given. This method builds a cache of the instructions
* in this list to avoid scanning the whole list each time it is called. Once the cache is
* built, this method run in constant time. This cache is invalidated by all the methods that
* modify the list.
*
* @param index
* the index of the instruction that must be returned.
* @param index the index of the instruction that must be returned.
* @return the instruction whose index is given.
* @throws IndexOutOfBoundsException
* if (index < 0 || index >= size()).
* @throws IndexOutOfBoundsException if (index < 0 || index >= size()).
*/
public AbstractInsnNode get(final int index) {
if (index < 0 || index >= size) {
@ -113,12 +101,11 @@ public class InsnList {
}
/**
* Returns <tt>true</tt> if the given instruction belongs to this list. This
* method always scans the instructions of this list until it finds the
* given instruction or reaches the end of the list.
* Returns <tt>true</tt> if the given instruction belongs to this list. This method always scans
* the instructions of this list until it finds the given instruction or reaches the end of the
* list.
*
* @param insn
* an instruction.
* @param insn an instruction.
* @return <tt>true</tt> if the given instruction belongs to this list.
*/
public boolean contains(final AbstractInsnNode insn) {
@ -130,18 +117,16 @@ public class InsnList {
}
/**
* Returns the index of the given instruction in this list. This method
* builds a cache of the instruction indexes to avoid scanning the whole
* list each time it is called. Once the cache is built, this method run in
* constant time. The cache is invalidated by all the methods that modify
* the list.
* Returns the index of the given instruction in this list. This method builds a cache of the
* instruction indexes to avoid scanning the whole list each time it is called. Once the cache
* is built, this method run in constant time. The cache is invalidated by all the methods that
* modify the list.
*
* @param insn
* an instruction <i>of this list</i>.
* @return the index of the given instruction in this list. <i>The result of
* this method is undefined if the given instruction does not belong
* to this list</i>. Use {@link #contains contains} to test if an
* instruction belongs to an instruction list or not.
* @param insn an instruction <i>of this list</i>.
* @return the index of the given instruction in this list. <i>The result of this method is
* undefined if the given instruction does not belong to this list</i>. Use
* {@link #contains contains} to test if an instruction belongs to an instruction list
* or not.
*/
public int indexOf(final AbstractInsnNode insn) {
if (cache == null) {
@ -153,8 +138,7 @@ public class InsnList {
/**
* Makes the given visitor visit all of the instructions in this list.
*
* @param mv
* the method visitor that must visit the instructions.
* @param mv the method visitor that must visit the instructions.
*/
public void accept(final MethodVisitor mv) {
AbstractInsnNode insn = first;
@ -203,11 +187,8 @@ public class InsnList {
/**
* Replaces an instruction of this list with another instruction.
*
* @param location
* an instruction <i>of this list</i>.
* @param insn
* another instruction, <i>which must not belong to any
* {@link InsnList}</i>.
* @param location an instruction <i>of this list</i>.
* @param insn another instruction, <i>which must not belong to any {@link InsnList}</i>.
*/
public void set(final AbstractInsnNode location, final AbstractInsnNode insn) {
AbstractInsnNode next = location.next;
@ -239,9 +220,7 @@ public class InsnList {
/**
* Adds the given instruction to the end of this list.
*
* @param insn
* an instruction, <i>which must not belong to any
* {@link InsnList}</i>.
* @param insn an instruction, <i>which must not belong to any {@link InsnList}</i>.
*/
public void add(final AbstractInsnNode insn) {
++size;
@ -260,9 +239,8 @@ public class InsnList {
/**
* Adds the given instructions to the end of this list.
*
* @param insns
* an instruction list, which is cleared during the process. This
* list must be different from 'this'.
* @param insns an instruction list, which is cleared during the process. This list must be
* different from 'this'.
*/
public void add(final InsnList insns) {
if (insns.size == 0) {
@ -285,9 +263,7 @@ public class InsnList {
/**
* Inserts the given instruction at the begining of this list.
*
* @param insn
* an instruction, <i>which must not belong to any
* {@link InsnList}</i>.
* @param insn an instruction, <i>which must not belong to any {@link InsnList}</i>.
*/
public void insert(final AbstractInsnNode insn) {
++size;
@ -306,9 +282,8 @@ public class InsnList {
/**
* Inserts the given instructions at the begining of this list.
*
* @param insns
* an instruction list, which is cleared during the process. This
* list must be different from 'this'.
* @param insns an instruction list, which is cleared during the process. This list must be
* different from 'this'.
*/
public void insert(final InsnList insns) {
if (insns.size == 0) {
@ -331,15 +306,11 @@ public class InsnList {
/**
* Inserts the given instruction after the specified instruction.
*
* @param location
* an instruction <i>of this list</i> after which insn must be
* inserted.
* @param insn
* the instruction to be inserted, <i>which must not belong to
* any {@link InsnList}</i>.
* @param location an instruction <i>of this list</i> after which insn must be inserted.
* @param insn the instruction to be inserted, <i>which must not belong to any
* {@link InsnList}</i>.
*/
public void insert(final AbstractInsnNode location,
final AbstractInsnNode insn) {
public void insert(final AbstractInsnNode location, final AbstractInsnNode insn) {
++size;
AbstractInsnNode next = location.next;
if (next == null) {
@ -357,12 +328,10 @@ public class InsnList {
/**
* Inserts the given instructions after the specified instruction.
*
* @param location
* an instruction <i>of this list</i> after which the
* instructions must be inserted.
* @param insns
* the instruction list to be inserted, which is cleared during
* the process. This list must be different from 'this'.
* @param location an instruction <i>of this list</i> after which the instructions must be
* inserted.
* @param insns the instruction list to be inserted, which is cleared during the process. This
* list must be different from 'this'.
*/
public void insert(final AbstractInsnNode location, final InsnList insns) {
if (insns.size == 0) {
@ -387,15 +356,11 @@ public class InsnList {
/**
* Inserts the given instruction before the specified instruction.
*
* @param location
* an instruction <i>of this list</i> before which insn must be
* inserted.
* @param insn
* the instruction to be inserted, <i>which must not belong to
* any {@link InsnList}</i>.
* @param location an instruction <i>of this list</i> before which insn must be inserted.
* @param insn the instruction to be inserted, <i>which must not belong to any
* {@link InsnList}</i>.
*/
public void insertBefore(final AbstractInsnNode location,
final AbstractInsnNode insn) {
public void insertBefore(final AbstractInsnNode location, final AbstractInsnNode insn) {
++size;
AbstractInsnNode prev = location.prev;
if (prev == null) {
@ -413,15 +378,12 @@ public class InsnList {
/**
* Inserts the given instructions before the specified instruction.
*
* @param location
* an instruction <i>of this list</i> before which the
* instructions must be inserted.
* @param insns
* the instruction list to be inserted, which is cleared during
* the process. This list must be different from 'this'.
* @param location an instruction <i>of this list</i> before which the instructions must be
* inserted.
* @param insns the instruction list to be inserted, which is cleared during the process. This
* list must be different from 'this'.
*/
public void insertBefore(final AbstractInsnNode location,
final InsnList insns) {
public void insertBefore(final AbstractInsnNode location, final InsnList insns) {
if (insns.size == 0) {
return;
}
@ -444,8 +406,7 @@ public class InsnList {
/**
* Removes the given instruction from this list.
*
* @param insn
* the instruction <i>of this list</i> that must be removed.
* @param insn the instruction <i>of this list</i> that must be removed.
*/
public void remove(final AbstractInsnNode insn) {
--size;
@ -477,9 +438,8 @@ public class InsnList {
/**
* Removes all of the instructions of this list.
*
* @param mark
* if the instructions must be marked as no longer belonging to
* any {@link InsnList}.
* @param mark if the instructions must be marked as no longer belonging to any
* {@link InsnList}.
*/
void removeAll(final boolean mark) {
if (mark) {
@ -506,9 +466,8 @@ public class InsnList {
}
/**
* Reset all labels in the instruction list. This method should be called
* before reusing same instructions list between several
* <code>ClassWriter</code>s.
* Reset all labels in the instruction list. This method should be called before reusing same
* instructions list between several <code>ClassWriter</code>s.
*/
public void resetLabels() {
AbstractInsnNode insn = first;

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.tree;
@ -43,22 +35,17 @@ public class InsnNode extends AbstractInsnNode {
/**
* Constructs a new {@link InsnNode}.
*
* @param opcode
* the opcode of the instruction to be constructed. This opcode
* must be NOP, ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1,
* ICONST_2, ICONST_3, ICONST_4, ICONST_5, LCONST_0, LCONST_1,
* FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD,
* LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD,
* IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE,
* SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1,
* DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB,
* IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM,
* FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL, ISHR, LSHR,
* IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D,
* L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S,
* LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IRETURN, LRETURN, FRETURN,
* DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW, MONITORENTER,
* or MONITOREXIT.
* @param opcode the opcode of the instruction to be constructed. This opcode must be NOP,
* ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5,
* LCONST_0, LCONST_1, FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD, LALOAD,
* FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IASTORE, LASTORE, FASTORE, DASTORE,
* AASTORE, BASTORE, CASTORE, SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1,
* DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL,
* IDIV, LDIV, FDIV, DDIV, IREM, LREM, FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL,
* ISHR, LSHR, IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D, L2I, L2F,
* L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S, LCMP, FCMPL, FCMPG, DCMPL, DCMPG,
* IRETURN, LRETURN, FRETURN, DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW,
* MONITORENTER, or MONITOREXIT.
*/
public InsnNode(final int opcode) {
super(opcode);
@ -72,8 +59,7 @@ public class InsnNode extends AbstractInsnNode {
/**
* Makes the given visitor visit this instruction.
*
* @param mv
* a method visitor.
* @param mv a method visitor.
*/
@Override
public void accept(final MethodVisitor mv) {

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.tree;
@ -48,11 +40,9 @@ public class IntInsnNode extends AbstractInsnNode {
/**
* Constructs a new {@link IntInsnNode}.
*
* @param opcode
* the opcode of the instruction to be constructed. This opcode
* must be BIPUSH, SIPUSH or NEWARRAY.
* @param operand
* the operand of the instruction to be constructed.
* @param opcode the opcode of the instruction to be constructed. This opcode must be BIPUSH,
* SIPUSH or NEWARRAY.
* @param operand the operand of the instruction to be constructed.
*/
public IntInsnNode(final int opcode, final int operand) {
super(opcode);
@ -62,9 +52,7 @@ public class IntInsnNode extends AbstractInsnNode {
/**
* Sets the opcode of this instruction.
*
* @param opcode
* the new instruction opcode. This opcode must be BIPUSH, SIPUSH
* or NEWARRAY.
* @param opcode the new instruction opcode. This opcode must be BIPUSH, SIPUSH or NEWARRAY.
*/
public void setOpcode(final int opcode) {
this.opcode = opcode;

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.tree;
@ -65,17 +57,13 @@ public class InvokeDynamicInsnNode extends AbstractInsnNode {
/**
* Constructs a new {@link InvokeDynamicInsnNode}.
*
* @param name
* invokedynamic name.
* @param desc
* invokedynamic descriptor (see {@link org.objectweb.asm.Type}).
* @param bsm
* the bootstrap method.
* @param bsmArgs
* the boostrap constant arguments.
* @param name invokedynamic name.
* @param desc invokedynamic descriptor (see {@link org.objectweb.asm.Type}).
* @param bsm the bootstrap method.
* @param bsmArgs the boostrap constant arguments.
*/
public InvokeDynamicInsnNode(final String name, final String desc,
final Handle bsm, final Object... bsmArgs) {
public InvokeDynamicInsnNode(final String name, final String desc, final Handle bsm,
final Object... bsmArgs) {
super(Opcodes.INVOKEDYNAMIC);
this.name = name;
this.desc = desc;
@ -97,4 +85,4 @@ public class InvokeDynamicInsnNode extends AbstractInsnNode {
public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
return new InvokeDynamicInsnNode(name, desc, bsm, bsmArgs);
}
}
}

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.tree;
@ -34,31 +26,27 @@ import java.util.Map;
import org.objectweb.asm.MethodVisitor;
/**
* A node that represents a jump instruction. A jump instruction is an
* instruction that may jump to another instruction.
* A node that represents a jump instruction. A jump instruction is an instruction that may jump to
* another instruction.
*
* @author Eric Bruneton
*/
public class JumpInsnNode extends AbstractInsnNode {
/**
* The operand of this instruction. This operand is a label that designates
* the instruction to which this instruction may jump.
* The operand of this instruction. This operand is a label that designates the instruction to
* which this instruction may jump.
*/
public LabelNode label;
/**
* Constructs a new {@link JumpInsnNode}.
*
* @param opcode
* the opcode of the type instruction to be constructed. This
* opcode must be IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ,
* IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE,
* IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
* @param label
* the operand of the instruction to be constructed. This operand
* is a label that designates the instruction to which the jump
* instruction may jump.
* @param opcode the opcode of the type instruction to be constructed. This opcode must be IFEQ,
* IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT,
* IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
* @param label the operand of the instruction to be constructed. This operand is a label that
* designates the instruction to which the jump instruction may jump.
*/
public JumpInsnNode(final int opcode, final LabelNode label) {
super(opcode);
@ -68,11 +56,9 @@ public class JumpInsnNode extends AbstractInsnNode {
/**
* Sets the opcode of this instruction.
*
* @param opcode
* the new instruction opcode. This opcode must be IFEQ, IFNE,
* IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT,
* IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE, GOTO,
* JSR, IFNULL or IFNONNULL.
* @param opcode the new instruction opcode. This opcode must be IFEQ, IFNE, IFLT, IFGE, IFGT,
* IFLE, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ACMPEQ,
* IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
*/
public void setOpcode(final int opcode) {
this.opcode = opcode;

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.tree;
@ -75,4 +67,4 @@ public class LabelNode extends AbstractInsnNode {
public void resetLabel() {
label = null;
}
}
}

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.tree;
@ -42,19 +34,18 @@ import org.objectweb.asm.Opcodes;
public class LdcInsnNode extends AbstractInsnNode {
/**
* The constant to be loaded on the stack. This parameter must be a non null
* {@link Integer}, a {@link Float}, a {@link Long}, a {@link Double}, a
* {@link String} or a {@link org.objectweb.asm.Type}.
* The constant to be loaded on the stack. This parameter must be a non null {@link Integer}, a
* {@link Float}, a {@link Long}, a {@link Double}, a {@link String} or a
* {@link org.objectweb.asm.Type}.
*/
public Object cst;
/**
* Constructs a new {@link LdcInsnNode}.
*
* @param cst
* the constant to be loaded on the stack. This parameter must be
* a non null {@link Integer}, a {@link Float}, a {@link Long}, a
* {@link Double} or a {@link String}.
* @param cst the constant to be loaded on the stack. This parameter must be a non null
* {@link Integer}, a {@link Float}, a {@link Long}, a {@link Double} or a
* {@link String}.
*/
public LdcInsnNode(final Object cst) {
super(Opcodes.LDC);
@ -75,4 +66,4 @@ public class LdcInsnNode extends AbstractInsnNode {
public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
return new LdcInsnNode(cst);
}
}
}

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.tree;
@ -34,16 +26,15 @@ import java.util.Map;
import org.objectweb.asm.MethodVisitor;
/**
* A node that represents a line number declaration. These nodes are pseudo
* instruction nodes in order to be inserted in an instruction list.
* A node that represents a line number declaration. These nodes are pseudo instruction nodes in
* order to be inserted in an instruction list.
*
* @author Eric Bruneton
*/
public class LineNumberNode extends AbstractInsnNode {
/**
* A line number. This number refers to the source file from which the class
* was compiled.
* A line number. This number refers to the source file from which the class was compiled.
*/
public int line;
@ -55,11 +46,9 @@ public class LineNumberNode extends AbstractInsnNode {
/**
* Constructs a new {@link LineNumberNode}.
*
* @param line
* a line number. This number refers to the source file from
* which the class was compiled.
* @param start
* the first instruction corresponding to this line number.
* @param line a line number. This number refers to the source file from which the class was
* compiled.
* @param start the first instruction corresponding to this line number.
*/
public LineNumberNode(final int line, final LabelNode start) {
super(-1);

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.tree;
@ -54,14 +46,12 @@ public class LocalVariableNode {
public String signature;
/**
* The first instruction corresponding to the scope of this local variable
* (inclusive).
* The first instruction corresponding to the scope of this local variable (inclusive).
*/
public LabelNode start;
/**
* The last instruction corresponding to the scope of this local variable
* (exclusive).
* The last instruction corresponding to the scope of this local variable (exclusive).
*/
public LabelNode end;
@ -73,24 +63,17 @@ public class LocalVariableNode {
/**
* Constructs a new {@link LocalVariableNode}.
*
* @param name
* the name of a local variable.
* @param desc
* the type descriptor of this local variable.
* @param signature
* the signature of this local variable. May be <tt>null</tt>.
* @param start
* the first instruction corresponding to the scope of this local
* variable (inclusive).
* @param end
* the last instruction corresponding to the scope of this local
* variable (exclusive).
* @param index
* the local variable's index.
* @param name the name of a local variable.
* @param desc the type descriptor of this local variable.
* @param signature the signature of this local variable. May be <tt>null</tt>.
* @param start the first instruction corresponding to the scope of this local variable
* (inclusive).
* @param end the last instruction corresponding to the scope of this local variable
* (exclusive).
* @param index the local variable's index.
*/
public LocalVariableNode(final String name, final String desc,
final String signature, final LabelNode start, final LabelNode end,
final int index) {
public LocalVariableNode(final String name, final String desc, final String signature,
final LabelNode start, final LabelNode end, final int index) {
this.name = name;
this.desc = desc;
this.signature = signature;
@ -102,11 +85,9 @@ public class LocalVariableNode {
/**
* Makes the given visitor visit this local variable declaration.
*
* @param mv
* a method visitor.
* @param mv a method visitor.
*/
public void accept(final MethodVisitor mv) {
mv.visitLocalVariable(name, desc, signature, start.getLabel(),
end.getLabel(), index);
mv.visitLocalVariable(name, desc, signature, start.getLabel(), end.getLabel(), index);
}
}

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.tree;
@ -56,29 +48,23 @@ public class LookupSwitchInsnNode extends AbstractInsnNode {
public List<Integer> keys;
/**
* Beginnings of the handler blocks. This list is a list of
* {@link LabelNode} objects.
* Beginnings of the handler blocks. This list is a list of {@link LabelNode} objects.
*/
public List<LabelNode> labels;
/**
* Constructs a new {@link LookupSwitchInsnNode}.
*
* @param dflt
* beginning of the default handler block.
* @param keys
* the values of the keys.
* @param labels
* beginnings of the handler blocks. <tt>labels[i]</tt> is the
* beginning of the handler block for the <tt>keys[i]</tt> key.
* @param dflt beginning of the default handler block.
* @param keys the values of the keys.
* @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is the beginning of the
* handler block for the <tt>keys[i]</tt> key.
*/
public LookupSwitchInsnNode(final LabelNode dflt, final int[] keys,
final LabelNode[] labels) {
public LookupSwitchInsnNode(final LabelNode dflt, final int[] keys, final LabelNode[] labels) {
super(Opcodes.LOOKUPSWITCH);
this.dflt = dflt;
this.keys = new ArrayList<Integer>(keys == null ? 0 : keys.length);
this.labels = new ArrayList<LabelNode>(labels == null ? 0
: labels.length);
this.labels = new ArrayList<LabelNode>(labels == null ? 0 : labels.length);
if (keys != null) {
for (int i = 0; i < keys.length; ++i) {
this.keys.add(new Integer(keys[i]));
@ -109,8 +95,8 @@ public class LookupSwitchInsnNode extends AbstractInsnNode {
@Override
public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
LookupSwitchInsnNode clone = new LookupSwitchInsnNode(clone(dflt,
labels), null, clone(this.labels, labels));
LookupSwitchInsnNode clone =
new LookupSwitchInsnNode(clone(dflt, labels), null, clone(this.labels, labels));
clone.keys.addAll(keys);
return clone;
}

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.tree;
@ -34,8 +26,8 @@ import java.util.Map;
import org.objectweb.asm.MethodVisitor;
/**
* A node that represents a method instruction. A method instruction is an
* instruction that invokes a method.
* A node that represents a method instruction. A method instruction is an instruction that invokes
* a method.
*
* @author Eric Bruneton
*/
@ -60,21 +52,15 @@ public class MethodInsnNode extends AbstractInsnNode {
/**
* Constructs a new {@link MethodInsnNode}.
*
* @param opcode
* the opcode of the type instruction to be constructed. This
* opcode must be INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or
* INVOKEINTERFACE.
* @param owner
* the internal name of the method's owner class (see
* {@link org.objectweb.asm.Type#getInternalName()
* getInternalName}).
* @param name
* the method's name.
* @param desc
* the method's descriptor (see {@link org.objectweb.asm.Type}).
* @param opcode the opcode of the type instruction to be constructed. This opcode must be
* INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or INVOKEINTERFACE.
* @param owner the internal name of the method's owner class (see
* {@link org.objectweb.asm.Type#getInternalName() getInternalName}).
* @param name the method's name.
* @param desc the method's descriptor (see {@link org.objectweb.asm.Type}).
*/
public MethodInsnNode(final int opcode, final String owner,
final String name, final String desc) {
public MethodInsnNode(final int opcode, final String owner, final String name,
final String desc) {
super(opcode);
this.owner = owner;
this.name = name;
@ -84,9 +70,8 @@ public class MethodInsnNode extends AbstractInsnNode {
/**
* Sets the opcode of this instruction.
*
* @param opcode
* the new instruction opcode. This opcode must be INVOKEVIRTUAL,
* INVOKESPECIAL, INVOKESTATIC or INVOKEINTERFACE.
* @param opcode the new instruction opcode. This opcode must be INVOKEVIRTUAL, INVOKESPECIAL,
* INVOKESTATIC or INVOKEINTERFACE.
*/
public void setOpcode(final int opcode) {
this.opcode = opcode;
@ -106,4 +91,4 @@ public class MethodInsnNode extends AbstractInsnNode {
public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
return new MethodInsnNode(opcode, owner, name, desc);
}
}
}

View File

@ -1,31 +1,23 @@
/***
* ASM: a very small and fast Java bytecode manipulation framework
* Copyright (c) 2000-2011 INRIA, France Telecom
* All rights reserved.
* ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA,
* France Telecom All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: 1. Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holders nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.objectweb.asm.tree;
@ -50,8 +42,8 @@ import org.objectweb.asm.Type;
public class MethodNode extends MethodVisitor {
/**
* The method's access flags (see {@link Opcodes}). This field also
* indicates if the method is synthetic and/or deprecated.
* The method's access flags (see {@link Opcodes}). This field also indicates if the method is
* synthetic and/or deprecated.
*/
public int access;
@ -71,15 +63,14 @@ public class MethodNode extends MethodVisitor {
public String signature;
/**
* The internal names of the method's exception classes (see
* {@link Type#getInternalName() getInternalName}). This list is a list of
* {@link String} objects.
* The internal names of the method's exception classes (see {@link Type#getInternalName()
* getInternalName}). This list is a list of {@link String} objects.
*/
public List<String> exceptions;
/**
* The runtime visible annotations of this method. This list is a list of
* {@link AnnotationNode} objects. May be <tt>null</tt>.
* The runtime visible annotations of this method. This list is a list of {@link AnnotationNode}
* objects. May be <tt>null</tt>.
*
* @associates org.objectweb.asm.tree.AnnotationNode
* @label visible
@ -96,26 +87,25 @@ public class MethodNode extends MethodVisitor {
public List<AnnotationNode> invisibleAnnotations;
/**
* The non standard attributes of this method. This list is a list of
* {@link Attribute} objects. May be <tt>null</tt>.
* The non standard attributes of this method. This list is a list of {@link Attribute} objects.
* May be <tt>null</tt>.
*
* @associates org.objectweb.asm.Attribute
*/
public List<Attribute> attrs;
/**
* The default value of this annotation interface method. This field must be
* a {@link Byte}, {@link Boolean}, {@link Character}, {@link Short},
* {@link Integer}, {@link Long}, {@link Float}, {@link Double},
* {@link String} or {@link Type}, or an two elements String array (for
* enumeration values), a {@link AnnotationNode}, or a {@link List} of
* values of one of the preceding types. May be <tt>null</tt>.
* The default value of this annotation interface method. This field must be a {@link Byte},
* {@link Boolean}, {@link Character}, {@link Short}, {@link Integer}, {@link Long},
* {@link Float}, {@link Double}, {@link String} or {@link Type}, or an two elements String
* array (for enumeration values), a {@link AnnotationNode}, or a {@link List} of values of one
* of the preceding types. May be <tt>null</tt>.
*/
public Object annotationDefault;
/**
* The runtime visible parameter annotations of this method. These lists are
* lists of {@link AnnotationNode} objects. May be <tt>null</tt>.
* The runtime visible parameter annotations of this method. These lists are lists of
* {@link AnnotationNode} objects. May be <tt>null</tt>.
*
* @associates org.objectweb.asm.tree.AnnotationNode
* @label invisible parameters
@ -123,8 +113,8 @@ public class MethodNode extends MethodVisitor {
public List<AnnotationNode>[] visibleParameterAnnotations;
/**
* The runtime invisible parameter annotations of this method. These lists
* are lists of {@link AnnotationNode} objects. May be <tt>null</tt>.
* The runtime invisible parameter annotations of this method. These lists are lists of
* {@link AnnotationNode} objects. May be <tt>null</tt>.
*
* @associates org.objectweb.asm.tree.AnnotationNode
* @label visible parameters
@ -132,8 +122,7 @@ public class MethodNode extends MethodVisitor {
public List<AnnotationNode>[] invisibleParameterAnnotations;
/**
* The instructions of this method. This list is a list of
* {@link AbstractInsnNode} objects.
* The instructions of this method. This list is a list of {@link AbstractInsnNode} objects.
*
* @associates org.objectweb.asm.tree.AbstractInsnNode
* @label instructions
@ -141,8 +130,8 @@ public class MethodNode extends MethodVisitor {
public InsnList instructions;
/**
* The try catch blocks of this method. This list is a list of
* {@link TryCatchBlockNode} objects.
* The try catch blocks of this method. This list is a list of {@link TryCatchBlockNode}
* objects.
*
* @associates org.objectweb.asm.tree.TryCatchBlockNode
*/
@ -159,8 +148,8 @@ public class MethodNode extends MethodVisitor {
public int maxLocals;
/**
* The local variables of this method. This list is a list of
* {@link LocalVariableNode} objects. May be <tt>null</tt>
* The local variables of this method. This list is a list of {@link LocalVariableNode} objects.
* May be <tt>null</tt>
*
* @associates org.objectweb.asm.tree.LocalVariableNode
*/
@ -172,9 +161,8 @@ public class MethodNode extends MethodVisitor {
private boolean visited;
/**
* Constructs an uninitialized {@link MethodNode}. <i>Subclasses must not
* use this constructor</i>. Instead, they must use the
* {@link #MethodNode(int)} version.
* Constructs an uninitialized {@link MethodNode}. <i>Subclasses must not use this
* constructor</i>. Instead, they must use the {@link #MethodNode(int)} version.
*/
public MethodNode() {
this(Opcodes.ASM4);
@ -183,9 +171,8 @@ public class MethodNode extends MethodVisitor {
/**
* Constructs an uninitialized {@link MethodNode}.
*
* @param api
* the ASM API version implemented by this visitor. Must be one
* of {@link Opcodes#ASM4}.
* @param api the ASM API version implemented by this visitor. Must be one of
* {@link Opcodes#ASM4}.
*/
public MethodNode(final int api) {
super(api);
@ -193,24 +180,17 @@ public class MethodNode extends MethodVisitor {
}
/**
* Constructs a new {@link MethodNode}. <i>Subclasses must not use this
* constructor</i>. Instead, they must use the
* {@link #MethodNode(int, int, String, String, String, String[])} version.
* Constructs a new {@link MethodNode}. <i>Subclasses must not use this constructor</i>.
* Instead, they must use the {@link #MethodNode(int, int, String, String, String, String[])}
* version.
*
* @param access
* the method's access flags (see {@link Opcodes}). This
* parameter also indicates if the method is synthetic and/or
* deprecated.
* @param name
* the method's name.
* @param desc
* the method's descriptor (see {@link Type}).
* @param signature
* the method's signature. May be <tt>null</tt>.
* @param exceptions
* the internal names of the method's exception classes (see
* {@link Type#getInternalName() getInternalName}). May be
* <tt>null</tt>.
* @param access the method's access flags (see {@link Opcodes}). This parameter also indicates
* if the method is synthetic and/or deprecated.
* @param name the method's name.
* @param desc the method's descriptor (see {@link Type}).
* @param signature the method's signature. May be <tt>null</tt>.
* @param exceptions the internal names of the method's exception classes (see
* {@link Type#getInternalName() getInternalName}). May be <tt>null</tt>.
*/
public MethodNode(final int access, final String name, final String desc,
final String signature, final String[] exceptions) {
@ -220,33 +200,24 @@ public class MethodNode extends MethodVisitor {
/**
* Constructs a new {@link MethodNode}.
*
* @param api
* the ASM API version implemented by this visitor. Must be one
* of {@link Opcodes#ASM4}.
* @param access
* the method's access flags (see {@link Opcodes}). This
* parameter also indicates if the method is synthetic and/or
* deprecated.
* @param name
* the method's name.
* @param desc
* the method's descriptor (see {@link Type}).
* @param signature
* the method's signature. May be <tt>null</tt>.
* @param exceptions
* the internal names of the method's exception classes (see
* {@link Type#getInternalName() getInternalName}). May be
* <tt>null</tt>.
* @param api the ASM API version implemented by this visitor. Must be one of
* {@link Opcodes#ASM4}.
* @param access the method's access flags (see {@link Opcodes}). This parameter also indicates
* if the method is synthetic and/or deprecated.
* @param name the method's name.
* @param desc the method's descriptor (see {@link Type}).
* @param signature the method's signature. May be <tt>null</tt>.
* @param exceptions the internal names of the method's exception classes (see
* {@link Type#getInternalName() getInternalName}). May be <tt>null</tt>.
*/
public MethodNode(final int api, final int access, final String name,
final String desc, final String signature, final String[] exceptions) {
public MethodNode(final int api, final int access, final String name, final String desc,
final String signature, final String[] exceptions) {
super(api);
this.access = access;
this.name = name;
this.desc = desc;
this.signature = signature;
this.exceptions = new ArrayList<String>(exceptions == null ? 0
: exceptions.length);
this.exceptions = new ArrayList<String>(exceptions == null ? 0 : exceptions.length);
boolean isAbstract = (access & Opcodes.ACC_ABSTRACT) != 0;
if (!isAbstract) {
this.localVariables = new ArrayList<LocalVariableNode>(5);
@ -274,8 +245,7 @@ public class MethodNode extends MethodVisitor {
}
@Override
public AnnotationVisitor visitAnnotation(final String desc,
final boolean visible) {
public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
AnnotationNode an = new AnnotationNode(desc);
if (visible) {
if (visibleAnnotations == null) {
@ -292,8 +262,8 @@ public class MethodNode extends MethodVisitor {
}
@Override
public AnnotationVisitor visitParameterAnnotation(final int parameter,
final String desc, final boolean visible) {
public AnnotationVisitor visitParameterAnnotation(final int parameter, final String desc,
final boolean visible) {
AnnotationNode an = new AnnotationNode(desc);
if (visible) {
if (visibleParameterAnnotations == null) {
@ -301,8 +271,7 @@ public class MethodNode extends MethodVisitor {
visibleParameterAnnotations = (List<AnnotationNode>[]) new List<?>[params];
}
if (visibleParameterAnnotations[parameter] == null) {
visibleParameterAnnotations[parameter] = new ArrayList<AnnotationNode>(
1);
visibleParameterAnnotations[parameter] = new ArrayList<AnnotationNode>(1);
}
visibleParameterAnnotations[parameter].add(an);
} else {
@ -311,8 +280,7 @@ public class MethodNode extends MethodVisitor {
invisibleParameterAnnotations = (List<AnnotationNode>[]) new List<?>[params];
}
if (invisibleParameterAnnotations[parameter] == null) {
invisibleParameterAnnotations[parameter] = new ArrayList<AnnotationNode>(
1);
invisibleParameterAnnotations[parameter] = new ArrayList<AnnotationNode>(1);
}
invisibleParameterAnnotations[parameter].add(an);
}
@ -328,15 +296,13 @@ public class MethodNode extends MethodVisitor {
}
@Override
public void visitCode() {
}
public void visitCode() {}
@Override
public void visitFrame(final int type, final int nLocal,
final Object[] local, final int nStack, final Object[] stack) {
instructions.add(new FrameNode(type, nLocal, local == null ? null
: getLabelNodes(local), nStack, stack == null ? null
: getLabelNodes(stack)));
public void visitFrame(final int type, final int nLocal, final Object[] local, final int nStack,
final Object[] stack) {
instructions.add(new FrameNode(type, nLocal, local == null ? null : getLabelNodes(local),
nStack, stack == null ? null : getLabelNodes(stack)));
}
@Override
@ -360,20 +326,19 @@ public class MethodNode extends MethodVisitor {
}
@Override
public void visitFieldInsn(final int opcode, final String owner,
final String name, final String desc) {
public void visitFieldInsn(final int opcode, final String owner, final String name,
final String desc) {
instructions.add(new FieldInsnNode(opcode, owner, name, desc));
}
@Override
public void visitMethodInsn(final int opcode, final String owner,
final String name, final String desc) {
public void visitMethodInsn(final int opcode, final String owner, final String name,
final String desc) {
instructions.add(new MethodInsnNode(opcode, owner, name, desc));
}
@Override
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
Object... bsmArgs) {
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
instructions.add(new InvokeDynamicInsnNode(name, desc, bsm, bsmArgs));
}
@ -398,17 +363,15 @@ public class MethodNode extends MethodVisitor {
}
@Override
public void visitTableSwitchInsn(final int min, final int max,
final Label dflt, final Label... labels) {
instructions.add(new TableSwitchInsnNode(min, max, getLabelNode(dflt),
getLabelNodes(labels)));
public void visitTableSwitchInsn(final int min, final int max, final Label dflt,
final Label... labels) {
instructions
.add(new TableSwitchInsnNode(min, max, getLabelNode(dflt), getLabelNodes(labels)));
}
@Override
public void visitLookupSwitchInsn(final Label dflt, final int[] keys,
final Label[] labels) {
instructions.add(new LookupSwitchInsnNode(getLabelNode(dflt), keys,
getLabelNodes(labels)));
public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Label[] labels) {
instructions.add(new LookupSwitchInsnNode(getLabelNode(dflt), keys, getLabelNodes(labels)));
}
@Override
@ -417,18 +380,17 @@ public class MethodNode extends MethodVisitor {
}
@Override
public void visitTryCatchBlock(final Label start, final Label end,
final Label handler, final String type) {
tryCatchBlocks.add(new TryCatchBlockNode(getLabelNode(start),
getLabelNode(end), getLabelNode(handler), type));
public void visitTryCatchBlock(final Label start, final Label end, final Label handler,
final String type) {
tryCatchBlocks.add(new TryCatchBlockNode(getLabelNode(start), getLabelNode(end),
getLabelNode(handler), type));
}
@Override
public void visitLocalVariable(final String name, final String desc,
final String signature, final Label start, final Label end,
final int index) {
localVariables.add(new LocalVariableNode(name, desc, signature,
getLabelNode(start), getLabelNode(end), index));
public void visitLocalVariable(final String name, final String desc, final String signature,
final Label start, final Label end, final int index) {
localVariables.add(new LocalVariableNode(name, desc, signature, getLabelNode(start),
getLabelNode(end), index));
}
@Override
@ -443,17 +405,14 @@ public class MethodNode extends MethodVisitor {
}
@Override
public void visitEnd() {
}
public void visitEnd() {}
/**
* Returns the LabelNode corresponding to the given Label. Creates a new
* LabelNode if necessary. The default implementation of this method uses
* the {@link Label#info} field to store associations between labels and
* label nodes.
* Returns the LabelNode corresponding to the given Label. Creates a new LabelNode if necessary.
* The default implementation of this method uses the {@link Label#info} field to store
* associations between labels and label nodes.
*
* @param l
* a Label.
* @param l a Label.
* @return the LabelNode corresponding to l.
*/
protected LabelNode getLabelNode(final Label l) {
@ -488,13 +447,11 @@ public class MethodNode extends MethodVisitor {
// ------------------------------------------------------------------------
/**
* Checks that this method node is compatible with the given ASM API
* version. This methods checks that this node, and all its nodes
* recursively, do not contain elements that were introduced in more recent
* versions of the ASM API than the given version.
* Checks that this method node is compatible with the given ASM API version. This methods
* checks that this node, and all its nodes recursively, do not contain elements that were
* introduced in more recent versions of the ASM API than the given version.
*
* @param api
* an ASM API version. Must be one of {@link Opcodes#ASM4}.
* @param api an ASM API version. Must be one of {@link Opcodes#ASM4}.
*/
public void check(final int api) {
// nothing to do
@ -503,14 +460,12 @@ public class MethodNode extends MethodVisitor {
/**
* Makes the given class visitor visit this method.
*
* @param cv
* a class visitor.
* @param cv a class visitor.
*/
public void accept(final ClassVisitor cv) {
String[] exceptions = new String[this.exceptions.size()];
this.exceptions.toArray(exceptions);
MethodVisitor mv = cv.visitMethod(access, name, desc, signature,
exceptions);
MethodVisitor mv = cv.visitMethod(access, name, desc, signature, exceptions);
if (mv != null) {
accept(mv);
}
@ -519,8 +474,7 @@ public class MethodNode extends MethodVisitor {
/**
* Makes the given method visitor visit this method.
*
* @param mv
* a method visitor.
* @param mv a method visitor.
*/
public void accept(final MethodVisitor mv) {
// visits the method attributes
@ -542,8 +496,7 @@ public class MethodNode extends MethodVisitor {
AnnotationNode an = invisibleAnnotations.get(i);
an.accept(mv.visitAnnotation(an.desc, false));
}
n = visibleParameterAnnotations == null ? 0
: visibleParameterAnnotations.length;
n = visibleParameterAnnotations == null ? 0 : visibleParameterAnnotations.length;
for (i = 0; i < n; ++i) {
List<?> l = visibleParameterAnnotations[i];
if (l == null) {
@ -554,8 +507,7 @@ public class MethodNode extends MethodVisitor {
an.accept(mv.visitParameterAnnotation(i, an.desc, true));
}
}
n = invisibleParameterAnnotations == null ? 0
: invisibleParameterAnnotations.length;
n = invisibleParameterAnnotations == null ? 0 : invisibleParameterAnnotations.length;
for (i = 0; i < n; ++i) {
List<?> l = invisibleParameterAnnotations[i];
if (l == null) {

Some files were not shown because too many files have changed in this diff Show More