mirror of
https://github.com/openjdk/jdk.git
synced 2026-03-24 14:49:58 +00:00
Merge
This commit is contained in:
commit
445e0b26e8
@ -49,3 +49,4 @@ e1b972ff53cd58f825791f8ed9b2deffd16e768c jdk7-b68
|
||||
0d7e03b426df27c21dcc44ffb9178eacd1b04f10 jdk7-b72
|
||||
3ac6dcf7823205546fbbc3d4ea59f37358d0b0d4 jdk7-b73
|
||||
2c88089b6e1c053597418099a14232182c387edc jdk7-b74
|
||||
d1516b9f23954b29b8e76e6f4efc467c08c78133 jdk7-b75
|
||||
|
||||
@ -545,7 +545,11 @@
|
||||
</li>
|
||||
<li>
|
||||
<strong>Windows:</strong>
|
||||
Make sure you start your build inside a bash/sh/ksh shell.
|
||||
Make sure you start your build inside a bash/sh/ksh shell
|
||||
and are using a <tt>make.exe</tt> utility built for that
|
||||
environment (a cygwin <tt>make.exe</tt> is not the same
|
||||
as a <tt>make.exe</tt> built for something like
|
||||
<a href="http://www.mkssoftware.com/">MKS</a>).
|
||||
<br>
|
||||
<b>WARNING:</b> Watch out for make version 3.81, it may
|
||||
not work due to a lack of support for MS-DOS drive letter paths
|
||||
@ -826,7 +830,8 @@
|
||||
All OpenJDK builds require access to the previously released
|
||||
JDK 6, this is often called a bootstrap JDK.
|
||||
The JDK 6 binaries can be downloaded from Sun's
|
||||
<a href="http://java.sun.com/javase/1.6.0/download.html" target="_blank">JDK 6 download site</a>.
|
||||
<a href="http://java.sun.com/javase/downloads/index.jsp"
|
||||
target="_blank">JDK 6 download site</a>.
|
||||
For build performance reasons
|
||||
is very important that this bootstrap JDK be made available on the
|
||||
local disk of the machine doing the build.
|
||||
|
||||
@ -49,3 +49,4 @@ a12ea7c7b497b4ba7830550095ef633bd6f43971 jdk7-b67
|
||||
c793a31209263fbb867c23c752599d85c21abb73 jdk7-b72
|
||||
b751c528c55560cf2adeaeef24b39ca1f4d1cbf7 jdk7-b73
|
||||
5d0cf59a3203b9f57aceebc33ae656b884987955 jdk7-b74
|
||||
0fb137085952c8e47878e240d1cb40f14de463c4 jdk7-b75
|
||||
|
||||
@ -99,8 +99,16 @@ CFLAGS_REQUIRED_sparcv9 += -m64 -mcpu=v9
|
||||
LDFLAGS_COMMON_sparcv9 += -m64 -mcpu=v9
|
||||
CFLAGS_REQUIRED_sparc += -m32 -mcpu=v9
|
||||
LDFLAGS_COMMON_sparc += -m32 -mcpu=v9
|
||||
CFLAGS_REQUIRED = $(CFLAGS_REQUIRED_$(ARCH))
|
||||
LDFLAGS_COMMON += $(LDFLAGS_COMMON_$(ARCH))
|
||||
ifeq ($(ZERO_BUILD), true)
|
||||
CFLAGS_REQUIRED = $(ZERO_ARCHFLAG)
|
||||
ifeq ($(ZERO_ENDIANNESS), little)
|
||||
CFLAGS_REQUIRED += -D_LITTLE_ENDIAN
|
||||
endif
|
||||
LDFLAGS_COMMON += $(ZERO_ARCHFLAG)
|
||||
else
|
||||
CFLAGS_REQUIRED = $(CFLAGS_REQUIRED_$(ARCH))
|
||||
LDFLAGS_COMMON += $(LDFLAGS_COMMON_$(ARCH))
|
||||
endif
|
||||
|
||||
# Add in platform specific optimizations for all opt levels
|
||||
CC_HIGHEST_OPT += $(_OPT_$(ARCH))
|
||||
@ -196,7 +204,7 @@ endif
|
||||
|
||||
EXTRA_LIBS += -lc
|
||||
|
||||
LDFLAGS_DEFS_OPTION = -z defs
|
||||
LDFLAGS_DEFS_OPTION = -Xlinker -z -Xlinker defs
|
||||
LDFLAGS_COMMON += $(LDFLAGS_DEFS_OPTION)
|
||||
|
||||
#
|
||||
|
||||
@ -70,6 +70,11 @@ ifeq ($(PLATFORM), linux)
|
||||
else
|
||||
CXX = $(COMPILER_PATH)g++
|
||||
endif
|
||||
ifeq ($(ZERO_BUILD), true)
|
||||
# zero
|
||||
REQUIRED_CC_VER = 3.2
|
||||
REQUIRED_GCC_VER = 3.2.*
|
||||
else
|
||||
ifneq ("$(findstring sparc,$(ARCH))", "")
|
||||
# sparc or sparcv9
|
||||
REQUIRED_CC_VER = 4.0
|
||||
@ -88,6 +93,7 @@ ifeq ($(PLATFORM), linux)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
# Option used to create a shared library
|
||||
SHARED_LIBRARY_FLAG = -shared -mimpure-text
|
||||
SUN_COMP_VER := $(shell $(CC) --verbose 2>&1 )
|
||||
|
||||
@ -49,3 +49,4 @@ d07e68298d4e17ebf93d8299e43fcc3ded26472a jdk7-b68
|
||||
a94714c550658fd6741793ef036cb9625dc2ab1a jdk7-b72
|
||||
faf94d94786b621f8e13cbcc941ca69c6d967c3f jdk7-b73
|
||||
f4b900403d6e4b0af51447bd13bbe23fe3a1dac7 jdk7-b74
|
||||
d8dd291a362acb656026a9c0a9da48501505a1e7 jdk7-b75
|
||||
|
||||
@ -48,8 +48,16 @@ if [ "$OS" = "Linux" ]; then
|
||||
CPU=i386
|
||||
fi
|
||||
else
|
||||
LD_AUDIT_32=$STARTDIR/../src/os/solaris/proc/`uname -p`/libsaproc_audit.so
|
||||
export LD_AUDIT_32
|
||||
# configure audit helper library if SA_ALTROOT is set
|
||||
if [ -n "$SA_ALTROOT" ]; then
|
||||
LD_AUDIT_32=$STARTDIR/../src/os/solaris/proc/`uname -p`/libsaproc_audit.so
|
||||
export LD_AUDIT_32
|
||||
if [ ! -f $LD_AUDIT_32 ]; then
|
||||
echo "SA_ALTROOT is set and can't find libsaproc_audit.so."
|
||||
echo "Make sure to build it with 'make natives'."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
SA_LIBPATH=$STARTDIR/../src/os/solaris/proc/`uname -p`:$STARTDIR/solaris/`uname -p`
|
||||
OPTIONS="-Dsa.library.path=$SA_LIBPATH -Dsun.jvm.hotspot.debugger.useProcDebugger"
|
||||
CPU=sparc
|
||||
|
||||
@ -43,8 +43,16 @@ else
|
||||
fi
|
||||
fi
|
||||
|
||||
LD_AUDIT_64=$STARTDIR/../src/os/solaris/proc/$CPU/libsaproc_audit.so
|
||||
export LD_AUDIT_64
|
||||
# configure audit helper library if SA_ALTROOT is set
|
||||
if [ -n "$SA_ALTROOT" ]; then
|
||||
LD_AUDIT_64=$STARTDIR/../src/os/solaris/proc/$CPU/libsaproc_audit.so
|
||||
export LD_AUDIT_64
|
||||
if [ ! -f $LD_AUDIT_64 ]; then
|
||||
echo "SA_ALTROOT is set and can't find libsaproc_audit.so."
|
||||
echo "Make sure to build it with 'make natives'."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
SA_LIBPATH=$STARTDIR/../src/os/solaris/proc/$CPU:$STARTDIR/solaris/$CPU
|
||||
|
||||
OPTIONS="-Dsa.library.path=$SA_LIBPATH -Dsun.jvm.hotspot.debugger.useProcDebugger"
|
||||
|
||||
@ -926,6 +926,28 @@ public class CommandProcessor {
|
||||
}
|
||||
}
|
||||
},
|
||||
new Command("dumpcodecache", "dumpcodecache", false) {
|
||||
public void doit(Tokens t) {
|
||||
if (t.countTokens() != 0) {
|
||||
usage();
|
||||
} else {
|
||||
final PrintStream fout = out;
|
||||
final HTMLGenerator gen = new HTMLGenerator(false);
|
||||
CodeCacheVisitor v = new CodeCacheVisitor() {
|
||||
public void prologue(Address start, Address end) {
|
||||
}
|
||||
public void visit(CodeBlob blob) {
|
||||
fout.println(gen.genHTML(blob.instructionsBegin()));
|
||||
}
|
||||
public void epilogue() {
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
VM.getVM().getCodeCache().iterate(v);
|
||||
}
|
||||
}
|
||||
},
|
||||
new Command("where", "where { -a | id }", false) {
|
||||
public void doit(Tokens t) {
|
||||
if (t.countTokens() != 1) {
|
||||
|
||||
@ -173,7 +173,8 @@ public class CodeCache {
|
||||
CodeBlob lastBlob = null;
|
||||
while (ptr != null && ptr.lessThan(end)) {
|
||||
try {
|
||||
CodeBlob blob = findBlobUnsafe(ptr);
|
||||
// Use findStart to get a pointer inside blob other findBlob asserts
|
||||
CodeBlob blob = findBlobUnsafe(heap.findStart(ptr));
|
||||
if (blob != null) {
|
||||
visitor.visit(blob);
|
||||
if (blob == lastBlob) {
|
||||
|
||||
@ -42,7 +42,7 @@ public class NMethod extends CodeBlob {
|
||||
/** To support simple linked-list chaining of nmethods */
|
||||
private static AddressField osrLinkField;
|
||||
private static AddressField scavengeRootLinkField;
|
||||
private static CIntegerField scavengeRootStateField;
|
||||
private static JByteField scavengeRootStateField;
|
||||
|
||||
/** Offsets for different nmethod parts */
|
||||
private static CIntegerField exceptionOffsetField;
|
||||
@ -92,7 +92,7 @@ public class NMethod extends CodeBlob {
|
||||
entryBCIField = type.getCIntegerField("_entry_bci");
|
||||
osrLinkField = type.getAddressField("_osr_link");
|
||||
scavengeRootLinkField = type.getAddressField("_scavenge_root_link");
|
||||
scavengeRootStateField = type.getCIntegerField("_scavenge_root_state");
|
||||
scavengeRootStateField = type.getJByteField("_scavenge_root_state");
|
||||
|
||||
exceptionOffsetField = type.getCIntegerField("_exception_offset");
|
||||
deoptOffsetField = type.getCIntegerField("_deoptimize_offset");
|
||||
@ -274,7 +274,7 @@ public class NMethod extends CodeBlob {
|
||||
if (Assert.ASSERTS_ENABLED) {
|
||||
Assert.that(pd != null, "scope must be present");
|
||||
}
|
||||
return new ScopeDesc(this, pd.getScopeDecodeOffset(), pd.getReexecute());
|
||||
return new ScopeDesc(this, pd.getScopeDecodeOffset(), pd.getObjDecodeOffset(), pd.getReexecute());
|
||||
}
|
||||
|
||||
/** This is only for use by the debugging system, and is only
|
||||
@ -306,11 +306,11 @@ public class NMethod extends CodeBlob {
|
||||
public ScopeDesc getScopeDescNearDbg(Address pc) {
|
||||
PCDesc pd = getPCDescNearDbg(pc);
|
||||
if (pd == null) return null;
|
||||
return new ScopeDesc(this, pd.getScopeDecodeOffset(), pd.getReexecute());
|
||||
return new ScopeDesc(this, pd.getScopeDecodeOffset(), pd.getObjDecodeOffset(), pd.getReexecute());
|
||||
}
|
||||
|
||||
public Map/*<Address, PcDesc>*/ getSafepoints() {
|
||||
Map safepoints = new HashMap(); // Map<Address, PcDesc>
|
||||
public Map/*<Address, PCDesc>*/ getSafepoints() {
|
||||
Map safepoints = new HashMap(); // Map<Address, PCDesc>
|
||||
sun.jvm.hotspot.debugger.Address p = null;
|
||||
for (p = scopesPCsBegin(); p.lessThan(scopesPCsEnd());
|
||||
p = p.addOffsetTo(pcDescSize)) {
|
||||
|
||||
@ -36,6 +36,7 @@ import sun.jvm.hotspot.types.*;
|
||||
public class PCDesc extends VMObject {
|
||||
private static CIntegerField pcOffsetField;
|
||||
private static CIntegerField scopeDecodeOffsetField;
|
||||
private static CIntegerField objDecodeOffsetField;
|
||||
private static CIntegerField pcFlagsField;
|
||||
|
||||
static {
|
||||
@ -51,6 +52,7 @@ public class PCDesc extends VMObject {
|
||||
|
||||
pcOffsetField = type.getCIntegerField("_pc_offset");
|
||||
scopeDecodeOffsetField = type.getCIntegerField("_scope_decode_offset");
|
||||
objDecodeOffsetField = type.getCIntegerField("_obj_decode_offset");
|
||||
pcFlagsField = type.getCIntegerField("_flags");
|
||||
}
|
||||
|
||||
@ -68,6 +70,10 @@ public class PCDesc extends VMObject {
|
||||
return ((int) scopeDecodeOffsetField.getValue(addr));
|
||||
}
|
||||
|
||||
public int getObjDecodeOffset() {
|
||||
return ((int) objDecodeOffsetField.getValue(addr));
|
||||
}
|
||||
|
||||
public Address getRealPC(NMethod code) {
|
||||
return code.instructionsBegin().addOffsetTo(getPCOffset());
|
||||
}
|
||||
|
||||
@ -51,11 +51,10 @@ public class ScopeDesc {
|
||||
/** Scalar replaced bjects pool */
|
||||
private List objects; // ArrayList<ScopeValue>
|
||||
|
||||
|
||||
public ScopeDesc(NMethod code, int decodeOffset, boolean reexecute) {
|
||||
private ScopeDesc(NMethod code, int decodeOffset, List objects, boolean reexecute) {
|
||||
this.code = code;
|
||||
this.decodeOffset = decodeOffset;
|
||||
this.objects = decodeObjectValues(DebugInformationRecorder.SERIALIZED_NULL);
|
||||
this.objects = objects;
|
||||
this.reexecute = reexecute;
|
||||
|
||||
// Decode header
|
||||
@ -108,7 +107,7 @@ public class ScopeDesc {
|
||||
return decodeMonitorValues(monitorsDecodeOffset);
|
||||
}
|
||||
|
||||
/** Returns a List<MonitorValue> */
|
||||
/** Returns a List<ObjectValue> */
|
||||
public List getObjects() {
|
||||
return objects;
|
||||
}
|
||||
@ -119,7 +118,7 @@ public class ScopeDesc {
|
||||
return null;
|
||||
}
|
||||
|
||||
return new ScopeDesc(code, senderDecodeOffset, false);
|
||||
return new ScopeDesc(code, senderDecodeOffset, objects, false);
|
||||
}
|
||||
|
||||
/** Returns where the scope was decoded */
|
||||
|
||||
@ -807,6 +807,9 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
||||
Interpreter interp = VM.getVM().getInterpreter();
|
||||
if (interp.contains(pc)) {
|
||||
InterpreterCodelet codelet = interp.getCodeletContaining(pc);
|
||||
if (codelet == null) {
|
||||
return "Unknown location in the Interpreter: " + pc;
|
||||
}
|
||||
return genHTML(codelet);
|
||||
}
|
||||
return genHTML(blob);
|
||||
@ -969,16 +972,24 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
||||
}
|
||||
|
||||
protected String genSafepointInfo(NMethod nm, PCDesc pcDesc) {
|
||||
ScopeDesc sd = nm.getScopeDescAt(pcDesc.getRealPC(nm));
|
||||
Formatter buf = new Formatter(genHTML);
|
||||
Formatter tabs = new Formatter(genHTML);
|
||||
ScopeDesc sd = nm.getScopeDescAt(pcDesc.getRealPC(nm));
|
||||
Formatter buf = new Formatter(genHTML);
|
||||
Formatter tabs = new Formatter(genHTML);
|
||||
tabs.append(tab + tab + tab); // Initial indent for debug info
|
||||
|
||||
buf.beginTag("pre");
|
||||
genScope(buf, tabs, sd);
|
||||
buf.endTag("pre");
|
||||
buf.append(genOopMapInfo(nm, pcDesc));
|
||||
buf.beginTag("pre");
|
||||
genScope(buf, tabs, sd);
|
||||
|
||||
return buf.toString();
|
||||
// Reset indent for scalar replaced objects
|
||||
tabs = new Formatter(genHTML);
|
||||
tabs.append(tab + tab + tab); // Initial indent for debug info
|
||||
|
||||
genScObjInfo(buf, tabs, sd);
|
||||
buf.endTag("pre");
|
||||
|
||||
buf.append(genOopMapInfo(nm, pcDesc));
|
||||
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
protected void genScope(Formatter buf, Formatter tabs, ScopeDesc sd) {
|
||||
@ -1022,8 +1033,95 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
||||
buf.append(genHTMLForMonitors(sd, monitors));
|
||||
}
|
||||
|
||||
tabs.append(tab);
|
||||
buf.br();
|
||||
tabs.append(tab);
|
||||
}
|
||||
|
||||
protected void genScObjInfo(Formatter buf, Formatter tabs, ScopeDesc sd) {
|
||||
if (sd == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
List objects = sd.getObjects();
|
||||
if (objects == null) {
|
||||
return;
|
||||
}
|
||||
int length = objects.size();
|
||||
for (int i = 0; i < length; i++) {
|
||||
buf.append(tabs);
|
||||
ObjectValue ov = (ObjectValue)objects.get(i);
|
||||
buf.append("ScObj" + i);
|
||||
ScopeValue sv = ov.getKlass();
|
||||
if (Assert.ASSERTS_ENABLED) {
|
||||
Assert.that(sv.isConstantOop(), "scalar replaced object klass must be constant oop");
|
||||
}
|
||||
ConstantOopReadValue klv = (ConstantOopReadValue)sv;
|
||||
OopHandle klHandle = klv.getValue();
|
||||
if (Assert.ASSERTS_ENABLED) {
|
||||
Assert.that(klHandle != null, "scalar replaced object klass must be not NULL");
|
||||
}
|
||||
Oop obj = VM.getVM().getObjectHeap().newOop(klHandle);
|
||||
if (obj instanceof InstanceKlass) {
|
||||
InstanceKlass kls = (InstanceKlass) obj;
|
||||
buf.append(" " + kls.getName().asString() + "={");
|
||||
int flen = ov.fieldsSize();
|
||||
|
||||
TypeArray klfields = kls.getFields();
|
||||
int klen = (int) klfields.getLength();
|
||||
|
||||
ConstantPool cp = kls.getConstants();
|
||||
int findex = 0;
|
||||
for (int index = 0; index < klen; index += kls.NEXT_OFFSET) {
|
||||
int accsFlags = klfields.getShortAt(index + kls.ACCESS_FLAGS_OFFSET);
|
||||
int nameIndex = klfields.getShortAt(index + kls.NAME_INDEX_OFFSET);
|
||||
AccessFlags access = new AccessFlags(accsFlags);
|
||||
if (!access.isStatic()) {
|
||||
ScopeValue svf = ov.getFieldAt(findex++);
|
||||
String fstr = scopeValueAsString(sd, svf);
|
||||
Symbol f_name = cp.getSymbolAt(nameIndex);
|
||||
buf.append(" [" + f_name.asString() + " :"+ index + "]=(#" + fstr + ")");
|
||||
}
|
||||
}
|
||||
buf.append(" }");
|
||||
} else {
|
||||
buf.append(" ");
|
||||
int flen = ov.fieldsSize();
|
||||
if (obj instanceof TypeArrayKlass) {
|
||||
TypeArrayKlass kls = (TypeArrayKlass) obj;
|
||||
buf.append(kls.getElementTypeName() + "[" + flen + "]");
|
||||
} else if (obj instanceof ObjArrayKlass) {
|
||||
ObjArrayKlass kls = (ObjArrayKlass) obj;
|
||||
Klass elobj = kls.getBottomKlass();
|
||||
if (elobj instanceof InstanceKlass) {
|
||||
buf.append(elobj.getName().asString());
|
||||
} else if (elobj instanceof TypeArrayKlass) {
|
||||
TypeArrayKlass elkls = (TypeArrayKlass) elobj;
|
||||
buf.append(elkls.getElementTypeName());
|
||||
} else {
|
||||
if (Assert.ASSERTS_ENABLED) {
|
||||
Assert.that(false, "unknown scalar replaced object klass!");
|
||||
}
|
||||
}
|
||||
buf.append("[" + flen + "]");
|
||||
int ndim = (int) kls.getDimension();
|
||||
while (--ndim > 0) {
|
||||
buf.append("[]");
|
||||
}
|
||||
} else {
|
||||
if (Assert.ASSERTS_ENABLED) {
|
||||
Assert.that(false, "unknown scalar replaced object klass!");
|
||||
}
|
||||
}
|
||||
buf.append("={");
|
||||
for (int findex = 0; findex < flen; findex++) {
|
||||
ScopeValue svf = ov.getFieldAt(findex);
|
||||
String fstr = scopeValueAsString(sd, svf);
|
||||
buf.append(" [" + findex + "]=(#" + fstr + ")");
|
||||
}
|
||||
buf.append(" }");
|
||||
}
|
||||
buf.br();
|
||||
}
|
||||
}
|
||||
|
||||
protected String genHTMLForOopMap(OopMap map) {
|
||||
@ -1037,8 +1135,6 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
||||
tmpBuf.beginTag("tr");
|
||||
tmpBuf.beginTag("td");
|
||||
tmpBuf.append(type);
|
||||
tmpBuf.endTag("td");
|
||||
tmpBuf.endTag("tr");
|
||||
for (; ! oms.isDone(); oms.next()) {
|
||||
OopMapValue omv = oms.getCurrent();
|
||||
if (omv == null) {
|
||||
@ -1048,7 +1144,7 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
||||
VMReg vmReg = omv.getReg();
|
||||
int reg = vmReg.getValue();
|
||||
if (reg < stack0) {
|
||||
tmpBuf.append(VMRegImpl.getRegisterName(vmReg.getValue()));
|
||||
tmpBuf.append(VMRegImpl.getRegisterName(reg));
|
||||
} else {
|
||||
tmpBuf.append('[');
|
||||
tmpBuf.append(Integer.toString((reg - stack0) * 4));
|
||||
@ -1058,7 +1154,13 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
||||
tmpBuf.append(" = ");
|
||||
VMReg vmContentReg = omv.getContentReg();
|
||||
int contentReg = vmContentReg.getValue();
|
||||
tmpBuf.append(VMRegImpl.getRegisterName(vmContentReg.getValue()));
|
||||
if (contentReg < stack0) {
|
||||
tmpBuf.append(VMRegImpl.getRegisterName(contentReg));
|
||||
} else {
|
||||
tmpBuf.append('[');
|
||||
tmpBuf.append(Integer.toString((contentReg - stack0) * 4));
|
||||
tmpBuf.append(']');
|
||||
}
|
||||
}
|
||||
tmpBuf.append(spaces);
|
||||
}
|
||||
@ -1072,19 +1174,19 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
||||
|
||||
OopMapValueIterator omvIterator = new OopMapValueIterator();
|
||||
OopMapStream oms = new OopMapStream(map, OopMapValue.OopTypes.OOP_VALUE);
|
||||
buf.append(omvIterator.iterate(oms, "Oop:", false));
|
||||
|
||||
oms = new OopMapStream(map, OopMapValue.OopTypes.VALUE_VALUE);
|
||||
buf.append(omvIterator.iterate(oms, "Value:", false));
|
||||
buf.append(omvIterator.iterate(oms, "Oops:", false));
|
||||
|
||||
oms = new OopMapStream(map, OopMapValue.OopTypes.NARROWOOP_VALUE);
|
||||
buf.append(omvIterator.iterate(oms, "Oop:", false));
|
||||
buf.append(omvIterator.iterate(oms, "narrowOops:", false));
|
||||
|
||||
oms = new OopMapStream(map, OopMapValue.OopTypes.VALUE_VALUE);
|
||||
buf.append(omvIterator.iterate(oms, "Values:", false));
|
||||
|
||||
oms = new OopMapStream(map, OopMapValue.OopTypes.CALLEE_SAVED_VALUE);
|
||||
buf.append(omvIterator.iterate(oms, "Callee saved:", true));
|
||||
|
||||
oms = new OopMapStream(map, OopMapValue.OopTypes.DERIVED_OOP_VALUE);
|
||||
buf.append(omvIterator.iterate(oms, "Derived oop:", true));
|
||||
buf.append(omvIterator.iterate(oms, "Derived oops:", true));
|
||||
|
||||
buf.endTag("table");
|
||||
return buf.toString();
|
||||
@ -1093,6 +1195,8 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
||||
|
||||
protected String genOopMapInfo(NMethod nmethod, PCDesc pcDesc) {
|
||||
OopMapSet mapSet = nmethod.getOopMaps();
|
||||
if (mapSet == null || (mapSet.getSize() <= 0))
|
||||
return "";
|
||||
int pcOffset = pcDesc.getPCOffset();
|
||||
OopMap map = mapSet.findMapAtOffset(pcOffset, VM.getVM().isDebugging());
|
||||
if (map == null) {
|
||||
@ -1106,6 +1210,7 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
||||
Formatter buf = new Formatter(genHTML);
|
||||
buf.beginTag("pre");
|
||||
buf.append("OopMap: ");
|
||||
buf.br();
|
||||
buf.append(genHTMLForOopMap(map));
|
||||
buf.endTag("pre");
|
||||
|
||||
@ -1154,7 +1259,7 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
private String scopeValueAsString(ScopeValue sv) {
|
||||
private String scopeValueAsString(ScopeDesc sd, ScopeValue sv) {
|
||||
Formatter buf = new Formatter(genHTML);
|
||||
if (sv.isConstantInt()) {
|
||||
buf.append("int ");
|
||||
@ -1187,6 +1292,11 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
||||
} else {
|
||||
buf.append("null");
|
||||
}
|
||||
} else if (sv.isObject()) {
|
||||
ObjectValue ov = (ObjectValue)sv;
|
||||
buf.append("#ScObj" + sd.getObjects().indexOf(ov));
|
||||
} else {
|
||||
buf.append("unknown scope value " + sv);
|
||||
}
|
||||
return buf.toString();
|
||||
}
|
||||
@ -1219,7 +1329,7 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
||||
}
|
||||
|
||||
buf.append(", ");
|
||||
buf.append(scopeValueAsString(sv));
|
||||
buf.append(scopeValueAsString(sd, sv));
|
||||
buf.append(") ");
|
||||
}
|
||||
|
||||
@ -1246,7 +1356,7 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
||||
buf.append("(owner = ");
|
||||
ScopeValue owner = mv.owner();
|
||||
if (owner != null) {
|
||||
buf.append(scopeValueAsString(owner));
|
||||
buf.append(scopeValueAsString(sd, owner));
|
||||
} else {
|
||||
buf.append("null");
|
||||
}
|
||||
@ -1324,11 +1434,11 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
||||
buf.append(instr.asString(currentPc, symFinder));
|
||||
}
|
||||
|
||||
buf.br();
|
||||
if (isSafepoint && !prevWasCall) {
|
||||
buf.append(genSafepointInfo(nmethod, pcDesc));
|
||||
buf.append(genSafepointInfo(nmethod, pcDesc));
|
||||
}
|
||||
|
||||
buf.br();
|
||||
prevWasCall = instr.isCall();
|
||||
}
|
||||
|
||||
|
||||
@ -1047,7 +1047,7 @@ while (tmp.itr.hasNext()) {
|
||||
} else {
|
||||
// some type names have ':'. replace to make it as a
|
||||
// JavaScript identifier
|
||||
tmp.name = tmp.name.replace(':', '_');
|
||||
tmp.name = tmp.name.replace(':', '_').replace('<', '_').replace('>', '_').replace('*', '_').replace(' ', '_');
|
||||
eval("function read" + tmp.name + "(addr) {" +
|
||||
" return readVMType('" + tmp.name + "', addr);}");
|
||||
eval("function print" + tmp.name + "(addr) {" +
|
||||
|
||||
@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2009
|
||||
|
||||
HS_MAJOR_VER=17
|
||||
HS_MINOR_VER=0
|
||||
HS_BUILD_NUMBER=04
|
||||
HS_BUILD_NUMBER=05
|
||||
|
||||
JDK_MAJOR_VER=1
|
||||
JDK_MINOR_VER=7
|
||||
|
||||
@ -3213,9 +3213,8 @@ void SharedRuntime::generate_deopt_blob() {
|
||||
Register Oreturn0 = O0;
|
||||
Register Oreturn1 = O1;
|
||||
Register O2UnrollBlock = O2;
|
||||
Register O3tmp = O3;
|
||||
Register I5exception_tmp = I5;
|
||||
Register G4exception_tmp = G4_scratch;
|
||||
Register L0deopt_mode = L0;
|
||||
Register G4deopt_mode = G4_scratch;
|
||||
int frame_size_words;
|
||||
Address saved_Freturn0_addr(FP, -sizeof(double) + STACK_BIAS);
|
||||
#if !defined(_LP64) && defined(COMPILER2)
|
||||
@ -3265,7 +3264,7 @@ void SharedRuntime::generate_deopt_blob() {
|
||||
|
||||
map = RegisterSaver::save_live_registers(masm, 0, &frame_size_words);
|
||||
__ ba(false, cont);
|
||||
__ delayed()->mov(Deoptimization::Unpack_deopt, I5exception_tmp);
|
||||
__ delayed()->mov(Deoptimization::Unpack_deopt, L0deopt_mode);
|
||||
|
||||
int exception_offset = __ offset() - start;
|
||||
|
||||
@ -3316,7 +3315,7 @@ void SharedRuntime::generate_deopt_blob() {
|
||||
#endif
|
||||
|
||||
__ ba(false, cont);
|
||||
__ delayed()->mov(Deoptimization::Unpack_exception, I5exception_tmp);;
|
||||
__ delayed()->mov(Deoptimization::Unpack_exception, L0deopt_mode);;
|
||||
|
||||
//
|
||||
// Reexecute entry, similar to c2 uncommon trap
|
||||
@ -3326,7 +3325,7 @@ void SharedRuntime::generate_deopt_blob() {
|
||||
// No need to update oop_map as each call to save_live_registers will produce identical oopmap
|
||||
(void) RegisterSaver::save_live_registers(masm, 0, &frame_size_words);
|
||||
|
||||
__ mov(Deoptimization::Unpack_reexecute, I5exception_tmp);
|
||||
__ mov(Deoptimization::Unpack_reexecute, L0deopt_mode);
|
||||
|
||||
__ bind(cont);
|
||||
|
||||
@ -3349,14 +3348,14 @@ void SharedRuntime::generate_deopt_blob() {
|
||||
// NOTE: we know that only O0/O1 will be reloaded by restore_result_registers
|
||||
// so this move will survive
|
||||
|
||||
__ mov(I5exception_tmp, G4exception_tmp);
|
||||
__ mov(L0deopt_mode, G4deopt_mode);
|
||||
|
||||
__ mov(O0, O2UnrollBlock->after_save());
|
||||
|
||||
RegisterSaver::restore_result_registers(masm);
|
||||
|
||||
Label noException;
|
||||
__ cmp(G4exception_tmp, Deoptimization::Unpack_exception); // Was exception pending?
|
||||
__ cmp(G4deopt_mode, Deoptimization::Unpack_exception); // Was exception pending?
|
||||
__ br(Assembler::notEqual, false, Assembler::pt, noException);
|
||||
__ delayed()->nop();
|
||||
|
||||
@ -3390,10 +3389,10 @@ void SharedRuntime::generate_deopt_blob() {
|
||||
}
|
||||
#endif
|
||||
__ set_last_Java_frame(SP, noreg);
|
||||
__ call_VM_leaf(L7_thread_cache, CAST_FROM_FN_PTR(address, Deoptimization::unpack_frames), G2_thread, G4exception_tmp);
|
||||
__ call_VM_leaf(L7_thread_cache, CAST_FROM_FN_PTR(address, Deoptimization::unpack_frames), G2_thread, G4deopt_mode);
|
||||
#else
|
||||
// LP64 uses g4 in set_last_Java_frame
|
||||
__ mov(G4exception_tmp, O1);
|
||||
__ mov(G4deopt_mode, O1);
|
||||
__ set_last_Java_frame(SP, G0);
|
||||
__ call_VM_leaf(L7_thread_cache, CAST_FROM_FN_PTR(address, Deoptimization::unpack_frames), G2_thread, O1);
|
||||
#endif
|
||||
@ -3446,7 +3445,6 @@ void SharedRuntime::generate_uncommon_trap_blob() {
|
||||
#endif
|
||||
MacroAssembler* masm = new MacroAssembler(&buffer);
|
||||
Register O2UnrollBlock = O2;
|
||||
Register O3tmp = O3;
|
||||
Register O2klass_index = O2;
|
||||
|
||||
//
|
||||
|
||||
@ -9419,8 +9419,9 @@ instruct countLeadingZerosI(iRegI dst, iRegI src, iRegI tmp, flagsReg cr) %{
|
||||
// x |= (x >> 8);
|
||||
// x |= (x >> 16);
|
||||
// return (WORDBITS - popc(x));
|
||||
format %{ "SRL $src,1,$dst\t! count leading zeros (int)\n\t"
|
||||
"OR $src,$tmp,$dst\n\t"
|
||||
format %{ "SRL $src,1,$tmp\t! count leading zeros (int)\n\t"
|
||||
"SRL $src,0,$dst\t! 32-bit zero extend\n\t"
|
||||
"OR $dst,$tmp,$dst\n\t"
|
||||
"SRL $dst,2,$tmp\n\t"
|
||||
"OR $dst,$tmp,$dst\n\t"
|
||||
"SRL $dst,4,$tmp\n\t"
|
||||
@ -9437,7 +9438,8 @@ instruct countLeadingZerosI(iRegI dst, iRegI src, iRegI tmp, flagsReg cr) %{
|
||||
Register Rsrc = $src$$Register;
|
||||
Register Rtmp = $tmp$$Register;
|
||||
__ srl(Rsrc, 1, Rtmp);
|
||||
__ or3(Rsrc, Rtmp, Rdst);
|
||||
__ srl(Rsrc, 0, Rdst);
|
||||
__ or3(Rdst, Rtmp, Rdst);
|
||||
__ srl(Rdst, 2, Rtmp);
|
||||
__ or3(Rdst, Rtmp, Rdst);
|
||||
__ srl(Rdst, 4, Rtmp);
|
||||
@ -9465,7 +9467,7 @@ instruct countLeadingZerosL(iRegI dst, iRegL src, iRegL tmp, flagsReg cr) %{
|
||||
// x |= (x >> 16);
|
||||
// x |= (x >> 32);
|
||||
// return (WORDBITS - popc(x));
|
||||
format %{ "SRLX $src,1,$dst\t! count leading zeros (long)\n\t"
|
||||
format %{ "SRLX $src,1,$tmp\t! count leading zeros (long)\n\t"
|
||||
"OR $src,$tmp,$dst\n\t"
|
||||
"SRLX $dst,2,$tmp\n\t"
|
||||
"OR $dst,$tmp,$dst\n\t"
|
||||
|
||||
@ -8214,6 +8214,15 @@ void MacroAssembler::store_heap_oop(Address dst, Register src) {
|
||||
}
|
||||
}
|
||||
|
||||
// Used for storing NULLs.
|
||||
void MacroAssembler::store_heap_oop_null(Address dst) {
|
||||
if (UseCompressedOops) {
|
||||
movl(dst, (int32_t)NULL_WORD);
|
||||
} else {
|
||||
movslq(dst, (int32_t)NULL_WORD);
|
||||
}
|
||||
}
|
||||
|
||||
// Algorithm must match oop.inline.hpp encode_heap_oop.
|
||||
void MacroAssembler::encode_heap_oop(Register r) {
|
||||
assert (UseCompressedOops, "should be compressed");
|
||||
|
||||
@ -1682,6 +1682,17 @@ class MacroAssembler: public Assembler {
|
||||
|
||||
void load_heap_oop(Register dst, Address src);
|
||||
void store_heap_oop(Address dst, Register src);
|
||||
|
||||
// This dummy is to prevent a call to store_heap_oop from
|
||||
// converting a zero (like NULL) into a Register by giving
|
||||
// the compiler two choices it can't resolve
|
||||
|
||||
void store_heap_oop(Address dst, void* dummy);
|
||||
|
||||
// Used for storing NULL. All other oop constants should be
|
||||
// stored using routines that take a jobject.
|
||||
void store_heap_oop_null(Address dst);
|
||||
|
||||
void encode_heap_oop(Register r);
|
||||
void decode_heap_oop(Register r);
|
||||
void encode_heap_oop_not_null(Register r);
|
||||
|
||||
@ -271,9 +271,15 @@ void MethodHandles::remove_arg_slots(MacroAssembler* _masm,
|
||||
void trace_method_handle_stub(const char* adaptername,
|
||||
oopDesc* mh,
|
||||
intptr_t* entry_sp,
|
||||
intptr_t* saved_sp) {
|
||||
intptr_t* saved_sp,
|
||||
intptr_t* saved_bp) {
|
||||
// called as a leaf from native code: do not block the JVM!
|
||||
printf("MH %s "PTR_FORMAT" "PTR_FORMAT" "INTX_FORMAT"\n", adaptername, (void*)mh, entry_sp, entry_sp - saved_sp);
|
||||
intptr_t* last_sp = (intptr_t*) saved_bp[frame::interpreter_frame_last_sp_offset];
|
||||
intptr_t* base_sp = (intptr_t*) saved_bp[frame::interpreter_frame_monitor_block_top_offset];
|
||||
printf("MH %s mh="INTPTR_FORMAT" sp=("INTPTR_FORMAT"+"INTX_FORMAT") stack_size="INTX_FORMAT" bp="INTPTR_FORMAT"\n",
|
||||
adaptername, (intptr_t)mh, (intptr_t)entry_sp, (intptr_t)(saved_sp - entry_sp), (intptr_t)(base_sp - last_sp), (intptr_t)saved_bp);
|
||||
if (last_sp != saved_sp)
|
||||
printf("*** last_sp="INTPTR_FORMAT"\n", (intptr_t)last_sp);
|
||||
}
|
||||
#endif //PRODUCT
|
||||
|
||||
@ -293,6 +299,10 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
|
||||
Register rbx_temp = rbx;
|
||||
Register rdx_temp = rdx;
|
||||
|
||||
// This guy is set up by prepare_to_jump_from_interpreted (from interpreted calls)
|
||||
// and gen_c2i_adapter (from compiled calls):
|
||||
Register saved_last_sp = LP64_ONLY(r13) NOT_LP64(rsi);
|
||||
|
||||
guarantee(java_dyn_MethodHandle::vmentry_offset_in_bytes() != 0, "must have offsets");
|
||||
|
||||
// some handy addresses
|
||||
@ -315,6 +325,8 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
|
||||
assert(tag_offset = wordSize, "stack grows as expected");
|
||||
}
|
||||
|
||||
const int java_mirror_offset = klassOopDesc::klass_part_offset_in_bytes() + Klass::java_mirror_offset_in_bytes();
|
||||
|
||||
if (have_entry(ek)) {
|
||||
__ nop(); // empty stubs make SG sick
|
||||
return;
|
||||
@ -328,45 +340,65 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
|
||||
__ push(rax); __ push(rbx); __ push(rcx); __ push(rdx); __ push(rsi); __ push(rdi);
|
||||
__ lea(rax, Address(rsp, wordSize*6)); // entry_sp
|
||||
// arguments:
|
||||
__ push(rbp); // interpreter frame pointer
|
||||
__ push(rsi); // saved_sp
|
||||
__ push(rax); // entry_sp
|
||||
__ push(rcx); // mh
|
||||
__ push(rcx);
|
||||
__ movptr(Address(rsp, 0), (intptr_t)entry_name(ek));
|
||||
__ call_VM_leaf(CAST_FROM_FN_PTR(address, trace_method_handle_stub), 4);
|
||||
__ call_VM_leaf(CAST_FROM_FN_PTR(address, trace_method_handle_stub), 5);
|
||||
__ pop(rdi); __ pop(rsi); __ pop(rdx); __ pop(rcx); __ pop(rbx); __ pop(rax);
|
||||
}
|
||||
#endif //PRODUCT
|
||||
|
||||
switch ((int) ek) {
|
||||
case _check_mtype:
|
||||
case _raise_exception:
|
||||
{
|
||||
// this stub is special, because it requires a live mtype argument
|
||||
Register rax_mtype = rax;
|
||||
// Not a real MH entry, but rather shared code for raising an exception.
|
||||
// Extra local arguments are pushed on stack, as required type at TOS+8,
|
||||
// failing object (or NULL) at TOS+4, failing bytecode type at TOS.
|
||||
// Beyond those local arguments are the PC, of course.
|
||||
Register rdx_code = rdx_temp;
|
||||
Register rcx_fail = rcx_recv;
|
||||
Register rax_want = rax_argslot;
|
||||
Register rdi_pc = rdi;
|
||||
__ pop(rdx_code); // TOS+0
|
||||
__ pop(rcx_fail); // TOS+4
|
||||
__ pop(rax_want); // TOS+8
|
||||
__ pop(rdi_pc); // caller PC
|
||||
|
||||
// emit WrongMethodType path first, to enable jccb back-branch
|
||||
Label wrong_method_type;
|
||||
__ bind(wrong_method_type);
|
||||
__ movptr(rdx_temp, ExternalAddress((address) &_entries[_wrong_method_type]));
|
||||
__ jmp(Address(rdx_temp, MethodHandleEntry::from_interpreted_entry_offset_in_bytes()));
|
||||
__ hlt();
|
||||
__ mov(rsp, rsi); // cut the stack back to where the caller started
|
||||
|
||||
interp_entry = __ pc();
|
||||
__ check_method_handle_type(rax_mtype, rcx_recv, rdx_temp, wrong_method_type);
|
||||
// now rax_mtype is dead; subsequent stubs will use it as a temp
|
||||
// Repush the arguments as if coming from the interpreter.
|
||||
if (TaggedStackInterpreter) __ push(frame::tag_for_basic_type(T_INT));
|
||||
__ push(rdx_code);
|
||||
if (TaggedStackInterpreter) __ push(frame::tag_for_basic_type(T_OBJECT));
|
||||
__ push(rcx_fail);
|
||||
if (TaggedStackInterpreter) __ push(frame::tag_for_basic_type(T_OBJECT));
|
||||
__ push(rax_want);
|
||||
|
||||
__ jump_to_method_handle_entry(rcx_recv, rdx_temp);
|
||||
}
|
||||
break;
|
||||
Register rbx_method = rbx_temp;
|
||||
Label no_method;
|
||||
// FIXME: fill in _raise_exception_method with a suitable sun.dyn method
|
||||
__ movptr(rbx_method, ExternalAddress((address) &_raise_exception_method));
|
||||
__ testptr(rbx_method, rbx_method);
|
||||
__ jcc(Assembler::zero, no_method);
|
||||
int jobject_oop_offset = 0;
|
||||
__ movptr(rbx_method, Address(rbx_method, jobject_oop_offset)); // dereference the jobject
|
||||
__ testptr(rbx_method, rbx_method);
|
||||
__ jcc(Assembler::zero, no_method);
|
||||
__ verify_oop(rbx_method);
|
||||
__ push(rdi_pc); // and restore caller PC
|
||||
__ jmp(rbx_method_fie);
|
||||
|
||||
case _wrong_method_type:
|
||||
{
|
||||
// this stub is special, because it requires a live mtype argument
|
||||
Register rax_mtype = rax;
|
||||
|
||||
interp_entry = __ pc();
|
||||
__ push(rax_mtype); // required mtype
|
||||
__ push(rcx_recv); // random mh (1st stacked argument)
|
||||
// If we get here, the Java runtime did not do its job of creating the exception.
|
||||
// Do something that is at least causes a valid throw from the interpreter.
|
||||
__ bind(no_method);
|
||||
__ pop(rax_want);
|
||||
if (TaggedStackInterpreter) __ pop(rcx_fail);
|
||||
__ pop(rcx_fail);
|
||||
__ push(rax_want);
|
||||
__ push(rcx_fail);
|
||||
__ jump(ExternalAddress(Interpreter::throw_WrongMethodType_entry()));
|
||||
}
|
||||
break;
|
||||
@ -442,7 +474,7 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
|
||||
__ load_klass(rax_klass, rcx_recv);
|
||||
__ verify_oop(rax_klass);
|
||||
|
||||
Register rcx_temp = rcx_recv;
|
||||
Register rdi_temp = rdi;
|
||||
Register rbx_method = rbx_index;
|
||||
|
||||
// get interface klass
|
||||
@ -451,7 +483,7 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
|
||||
__ lookup_interface_method(rax_klass, rdx_intf,
|
||||
// note: next two args must be the same:
|
||||
rbx_index, rbx_method,
|
||||
rcx_temp,
|
||||
rdi_temp,
|
||||
no_such_interface);
|
||||
|
||||
__ verify_oop(rbx_method);
|
||||
@ -461,7 +493,10 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
|
||||
__ bind(no_such_interface);
|
||||
// Throw an exception.
|
||||
// For historical reasons, it will be IncompatibleClassChangeError.
|
||||
__ should_not_reach_here(); // %%% FIXME NYI
|
||||
__ pushptr(Address(rdx_intf, java_mirror_offset)); // required interface
|
||||
__ push(rcx_recv); // bad receiver
|
||||
__ push((int)Bytecodes::_invokeinterface); // who is complaining?
|
||||
__ jump(ExternalAddress(from_interpreted_entry(_raise_exception)));
|
||||
}
|
||||
break;
|
||||
|
||||
@ -524,6 +559,7 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
|
||||
break;
|
||||
|
||||
case _adapter_retype_only:
|
||||
case _adapter_retype_raw:
|
||||
// immediately jump to the next MH layer:
|
||||
__ movptr(rcx_recv, rcx_mh_vmtarget);
|
||||
__ verify_oop(rcx_recv);
|
||||
@ -545,10 +581,6 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
|
||||
__ movptr(rbx_klass, rcx_amh_argument); // this is a Class object!
|
||||
__ movptr(rbx_klass, Address(rbx_klass, java_lang_Class::klass_offset_in_bytes()));
|
||||
|
||||
// get the new MH:
|
||||
__ movptr(rcx_recv, rcx_mh_vmtarget);
|
||||
// (now we are done with the old MH)
|
||||
|
||||
Label done;
|
||||
__ movptr(rdx_temp, vmarg);
|
||||
__ testl(rdx_temp, rdx_temp);
|
||||
@ -558,17 +590,23 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
|
||||
// live at this point:
|
||||
// - rbx_klass: klass required by the target method
|
||||
// - rdx_temp: argument klass to test
|
||||
// - rcx_recv: method handle to invoke (after cast succeeds)
|
||||
// - rcx_recv: adapter method handle
|
||||
__ check_klass_subtype(rdx_temp, rbx_klass, rax_argslot, done);
|
||||
|
||||
// If we get here, the type check failed!
|
||||
// Call the wrong_method_type stub, passing the failing argument type in rax.
|
||||
Register rax_mtype = rax_argslot;
|
||||
__ push(rbx_klass); // missed klass (required type)
|
||||
__ push(rdx_temp); // bad actual type (1st stacked argument)
|
||||
__ jump(ExternalAddress(Interpreter::throw_WrongMethodType_entry()));
|
||||
__ movl(rax_argslot, rcx_amh_vmargslot); // reload argslot field
|
||||
__ movptr(rdx_temp, vmarg);
|
||||
|
||||
__ pushptr(rcx_amh_argument); // required class
|
||||
__ push(rdx_temp); // bad object
|
||||
__ push((int)Bytecodes::_checkcast); // who is complaining?
|
||||
__ jump(ExternalAddress(from_interpreted_entry(_raise_exception)));
|
||||
|
||||
__ bind(done);
|
||||
// get the new MH:
|
||||
__ movptr(rcx_recv, rcx_mh_vmtarget);
|
||||
__ jump_to_method_handle_entry(rcx_recv, rdx_temp);
|
||||
}
|
||||
break;
|
||||
@ -1107,11 +1145,17 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
|
||||
|
||||
__ bind(bad_array_klass);
|
||||
UNPUSH_RSI_RDI;
|
||||
__ stop("bad array klass NYI");
|
||||
__ pushptr(Address(rdx_array_klass, java_mirror_offset)); // required type
|
||||
__ pushptr(vmarg); // bad array
|
||||
__ push((int)Bytecodes::_aaload); // who is complaining?
|
||||
__ jump(ExternalAddress(from_interpreted_entry(_raise_exception)));
|
||||
|
||||
__ bind(bad_array_length);
|
||||
UNPUSH_RSI_RDI;
|
||||
__ stop("bad array length NYI");
|
||||
__ push(rcx_recv); // AMH requiring a certain length
|
||||
__ pushptr(vmarg); // bad array
|
||||
__ push((int)Bytecodes::_arraylength); // who is complaining?
|
||||
__ jump(ExternalAddress(from_interpreted_entry(_raise_exception)));
|
||||
|
||||
#undef UNPUSH_RSI_RDI
|
||||
}
|
||||
|
||||
@ -92,8 +92,7 @@ address TemplateInterpreterGenerator::generate_ClassCastException_handler() {
|
||||
return entry;
|
||||
}
|
||||
|
||||
// Arguments are: required type at TOS+8, failing object (or NULL) at TOS+4.
|
||||
// pc at TOS (just for debugging)
|
||||
// Arguments are: required type at TOS+4, failing object (or NULL) at TOS.
|
||||
address TemplateInterpreterGenerator::generate_WrongMethodType_handler() {
|
||||
address entry = __ pc();
|
||||
|
||||
|
||||
@ -139,7 +139,7 @@ static void do_oop_store(InterpreterMacroAssembler* _masm,
|
||||
}
|
||||
__ g1_write_barrier_pre(rdx, r8, rbx, val != noreg);
|
||||
if (val == noreg) {
|
||||
__ store_heap_oop(Address(rdx, 0), NULL_WORD);
|
||||
__ store_heap_oop_null(Address(rdx, 0));
|
||||
} else {
|
||||
__ store_heap_oop(Address(rdx, 0), val);
|
||||
__ g1_write_barrier_post(rdx, val, r8, rbx);
|
||||
@ -152,7 +152,7 @@ static void do_oop_store(InterpreterMacroAssembler* _masm,
|
||||
case BarrierSet::CardTableExtension:
|
||||
{
|
||||
if (val == noreg) {
|
||||
__ store_heap_oop(obj, NULL_WORD);
|
||||
__ store_heap_oop_null(obj);
|
||||
} else {
|
||||
__ store_heap_oop(obj, val);
|
||||
// flatten object address if needed
|
||||
@ -168,7 +168,7 @@ static void do_oop_store(InterpreterMacroAssembler* _masm,
|
||||
case BarrierSet::ModRef:
|
||||
case BarrierSet::Other:
|
||||
if (val == noreg) {
|
||||
__ store_heap_oop(obj, NULL_WORD);
|
||||
__ store_heap_oop_null(obj);
|
||||
} else {
|
||||
__ store_heap_oop(obj, val);
|
||||
}
|
||||
|
||||
@ -903,19 +903,20 @@ class sun_dyn_AdapterMethodHandle: public sun_dyn_BoundMethodHandle {
|
||||
// Relevant integer codes (keep these in synch. with MethodHandleNatives.Constants):
|
||||
enum {
|
||||
OP_RETYPE_ONLY = 0x0, // no argument changes; straight retype
|
||||
OP_CHECK_CAST = 0x1, // ref-to-ref conversion; requires a Class argument
|
||||
OP_PRIM_TO_PRIM = 0x2, // converts from one primitive to another
|
||||
OP_REF_TO_PRIM = 0x3, // unboxes a wrapper to produce a primitive
|
||||
OP_PRIM_TO_REF = 0x4, // boxes a primitive into a wrapper (NYI)
|
||||
OP_SWAP_ARGS = 0x5, // swap arguments (vminfo is 2nd arg)
|
||||
OP_ROT_ARGS = 0x6, // rotate arguments (vminfo is displaced arg)
|
||||
OP_DUP_ARGS = 0x7, // duplicates one or more arguments (at TOS)
|
||||
OP_DROP_ARGS = 0x8, // remove one or more argument slots
|
||||
OP_COLLECT_ARGS = 0x9, // combine one or more arguments into a varargs (NYI)
|
||||
OP_SPREAD_ARGS = 0xA, // expand in place a varargs array (of known size)
|
||||
OP_FLYBY = 0xB, // operate first on reified argument list (NYI)
|
||||
OP_RICOCHET = 0xC, // run an adapter chain on the return value (NYI)
|
||||
CONV_OP_LIMIT = 0xD, // limit of CONV_OP enumeration
|
||||
OP_RETYPE_RAW = 0x1, // straight retype, trusted (void->int, Object->T)
|
||||
OP_CHECK_CAST = 0x2, // ref-to-ref conversion; requires a Class argument
|
||||
OP_PRIM_TO_PRIM = 0x3, // converts from one primitive to another
|
||||
OP_REF_TO_PRIM = 0x4, // unboxes a wrapper to produce a primitive
|
||||
OP_PRIM_TO_REF = 0x5, // boxes a primitive into a wrapper (NYI)
|
||||
OP_SWAP_ARGS = 0x6, // swap arguments (vminfo is 2nd arg)
|
||||
OP_ROT_ARGS = 0x7, // rotate arguments (vminfo is displaced arg)
|
||||
OP_DUP_ARGS = 0x8, // duplicates one or more arguments (at TOS)
|
||||
OP_DROP_ARGS = 0x9, // remove one or more argument slots
|
||||
OP_COLLECT_ARGS = 0xA, // combine one or more arguments into a varargs (NYI)
|
||||
OP_SPREAD_ARGS = 0xB, // expand in place a varargs array (of known size)
|
||||
OP_FLYBY = 0xC, // operate first on reified argument list (NYI)
|
||||
OP_RICOCHET = 0xD, // run an adapter chain on the return value (NYI)
|
||||
CONV_OP_LIMIT = 0xE, // limit of CONV_OP enumeration
|
||||
|
||||
CONV_OP_MASK = 0xF00, // this nybble contains the conversion op field
|
||||
CONV_VMINFO_MASK = 0x0FF, // LSB is reserved for JVM use
|
||||
|
||||
@ -1963,7 +1963,7 @@ void SystemDictionary::initialize_preloaded_classes(TRAPS) {
|
||||
WKID meth_group_end = WK_KLASS_ENUM_NAME(WrongMethodTypeException_klass);
|
||||
initialize_wk_klasses_until(meth_group_start, scan, CHECK);
|
||||
if (EnableMethodHandles) {
|
||||
initialize_wk_klasses_through(meth_group_start, scan, CHECK);
|
||||
initialize_wk_klasses_through(meth_group_end, scan, CHECK);
|
||||
}
|
||||
if (_well_known_klasses[meth_group_start] == NULL) {
|
||||
// Skip the rest of the method handle classes, if MethodHandle is not loaded.
|
||||
|
||||
@ -667,39 +667,6 @@ ConcurrentMark::~ConcurrentMark() {
|
||||
// Called at the first checkpoint.
|
||||
//
|
||||
|
||||
#define PRINT_REACHABLE_AT_INITIAL_MARK 0
|
||||
#if PRINT_REACHABLE_AT_INITIAL_MARK
|
||||
static FILE* reachable_file = NULL;
|
||||
|
||||
class PrintReachableClosure: public OopsInGenClosure {
|
||||
CMBitMap* _bm;
|
||||
int _level;
|
||||
public:
|
||||
PrintReachableClosure(CMBitMap* bm) :
|
||||
_bm(bm), _level(0) {
|
||||
guarantee(reachable_file != NULL, "pre-condition");
|
||||
}
|
||||
void do_oop(oop* p) {
|
||||
oop obj = *p;
|
||||
HeapWord* obj_addr = (HeapWord*)obj;
|
||||
if (obj == NULL) return;
|
||||
fprintf(reachable_file, "%d: "PTR_FORMAT" -> "PTR_FORMAT" (%d)\n",
|
||||
_level, p, (void*) obj, _bm->isMarked(obj_addr));
|
||||
if (!_bm->isMarked(obj_addr)) {
|
||||
_bm->mark(obj_addr);
|
||||
_level++;
|
||||
obj->oop_iterate(this);
|
||||
_level--;
|
||||
}
|
||||
}
|
||||
};
|
||||
#endif // PRINT_REACHABLE_AT_INITIAL_MARK
|
||||
|
||||
#define SEND_HEAP_DUMP_TO_FILE 0
|
||||
#if SEND_HEAP_DUMP_TO_FILE
|
||||
static FILE* heap_dump_file = NULL;
|
||||
#endif // SEND_HEAP_DUMP_TO_FILE
|
||||
|
||||
void ConcurrentMark::clearNextBitmap() {
|
||||
guarantee(!G1CollectedHeap::heap()->mark_in_progress(), "Precondition.");
|
||||
|
||||
@ -737,32 +704,9 @@ void ConcurrentMark::checkpointRootsInitialPre() {
|
||||
|
||||
_has_aborted = false;
|
||||
|
||||
// Find all the reachable objects...
|
||||
#if PRINT_REACHABLE_AT_INITIAL_MARK
|
||||
guarantee(reachable_file == NULL, "Protocol");
|
||||
char fn_buf[100];
|
||||
sprintf(fn_buf, "/tmp/reachable.txt.%d", os::current_process_id());
|
||||
reachable_file = fopen(fn_buf, "w");
|
||||
// clear the mark bitmap (no grey objects to start with)
|
||||
_nextMarkBitMap->clearAll();
|
||||
PrintReachableClosure prcl(_nextMarkBitMap);
|
||||
g1h->process_strong_roots(true, // activate StrongRootsScope
|
||||
false, // fake perm gen collection
|
||||
SharedHeap::SO_AllClasses,
|
||||
&prcl, // Regular roots
|
||||
NULL, // do not visit active blobs
|
||||
&prcl // Perm Gen Roots
|
||||
);
|
||||
// The root iteration above "consumed" dirty cards in the perm gen.
|
||||
// Therefore, as a shortcut, we dirty all such cards.
|
||||
g1h->rem_set()->invalidate(g1h->perm_gen()->used_region(), false);
|
||||
fclose(reachable_file);
|
||||
reachable_file = NULL;
|
||||
// clear the mark bitmap again.
|
||||
_nextMarkBitMap->clearAll();
|
||||
COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
|
||||
COMPILER2_PRESENT(DerivedPointerTable::clear());
|
||||
#endif // PRINT_REACHABLE_AT_INITIAL_MARK
|
||||
if (G1PrintReachableAtInitialMark) {
|
||||
print_reachable(true, "before");
|
||||
}
|
||||
|
||||
// Initialise marking structures. This has to be done in a STW phase.
|
||||
reset();
|
||||
@ -1965,15 +1909,21 @@ void ConcurrentMark::checkpointRootsFinalWork() {
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef PRODUCT
|
||||
|
||||
class ReachablePrinterOopClosure: public OopClosure {
|
||||
private:
|
||||
G1CollectedHeap* _g1h;
|
||||
CMBitMapRO* _bitmap;
|
||||
outputStream* _out;
|
||||
bool _use_prev_marking;
|
||||
|
||||
public:
|
||||
ReachablePrinterOopClosure(CMBitMapRO* bitmap, outputStream* out) :
|
||||
_bitmap(bitmap), _g1h(G1CollectedHeap::heap()), _out(out) { }
|
||||
ReachablePrinterOopClosure(CMBitMapRO* bitmap,
|
||||
outputStream* out,
|
||||
bool use_prev_marking) :
|
||||
_g1h(G1CollectedHeap::heap()),
|
||||
_bitmap(bitmap), _out(out), _use_prev_marking(use_prev_marking) { }
|
||||
|
||||
void do_oop(narrowOop* p) { do_oop_work(p); }
|
||||
void do_oop( oop* p) { do_oop_work(p); }
|
||||
@ -1988,14 +1938,23 @@ public:
|
||||
else {
|
||||
HeapRegion* hr = _g1h->heap_region_containing(obj);
|
||||
guarantee(hr != NULL, "invariant");
|
||||
if (hr->obj_allocated_since_prev_marking(obj)) {
|
||||
bool over_tams = false;
|
||||
if (_use_prev_marking) {
|
||||
over_tams = hr->obj_allocated_since_prev_marking(obj);
|
||||
} else {
|
||||
over_tams = hr->obj_allocated_since_next_marking(obj);
|
||||
}
|
||||
|
||||
if (over_tams) {
|
||||
str = "over TAMS";
|
||||
if (_bitmap->isMarked((HeapWord*) obj))
|
||||
if (_bitmap->isMarked((HeapWord*) obj)) {
|
||||
str2 = " AND MARKED";
|
||||
} else if (_bitmap->isMarked((HeapWord*) obj))
|
||||
}
|
||||
} else if (_bitmap->isMarked((HeapWord*) obj)) {
|
||||
str = "marked";
|
||||
else
|
||||
} else {
|
||||
str = "#### NOT MARKED ####";
|
||||
}
|
||||
}
|
||||
|
||||
_out->print_cr(" "PTR_FORMAT" contains "PTR_FORMAT" %s%s",
|
||||
@ -2005,16 +1964,19 @@ public:
|
||||
|
||||
class ReachablePrinterClosure: public BitMapClosure {
|
||||
private:
|
||||
CMBitMapRO* _bitmap;
|
||||
CMBitMapRO* _bitmap;
|
||||
outputStream* _out;
|
||||
bool _use_prev_marking;
|
||||
|
||||
public:
|
||||
ReachablePrinterClosure(CMBitMapRO* bitmap, outputStream* out) :
|
||||
_bitmap(bitmap), _out(out) { }
|
||||
ReachablePrinterClosure(CMBitMapRO* bitmap,
|
||||
outputStream* out,
|
||||
bool use_prev_marking) :
|
||||
_bitmap(bitmap), _out(out), _use_prev_marking(use_prev_marking) { }
|
||||
|
||||
bool do_bit(size_t offset) {
|
||||
HeapWord* addr = _bitmap->offsetToHeapWord(offset);
|
||||
ReachablePrinterOopClosure oopCl(_bitmap, _out);
|
||||
ReachablePrinterOopClosure oopCl(_bitmap, _out, _use_prev_marking);
|
||||
|
||||
_out->print_cr(" obj "PTR_FORMAT", offset %10d (marked)", addr, offset);
|
||||
oop(addr)->oop_iterate(&oopCl);
|
||||
@ -2026,76 +1988,111 @@ public:
|
||||
|
||||
class ObjInRegionReachablePrinterClosure : public ObjectClosure {
|
||||
private:
|
||||
CMBitMapRO* _bitmap;
|
||||
CMBitMapRO* _bitmap;
|
||||
outputStream* _out;
|
||||
bool _use_prev_marking;
|
||||
|
||||
public:
|
||||
ObjInRegionReachablePrinterClosure(CMBitMapRO* bitmap,
|
||||
outputStream* out,
|
||||
bool use_prev_marking) :
|
||||
_bitmap(bitmap), _out(out), _use_prev_marking(use_prev_marking) { }
|
||||
|
||||
void do_object(oop o) {
|
||||
ReachablePrinterOopClosure oopCl(_bitmap, _out);
|
||||
ReachablePrinterOopClosure oopCl(_bitmap, _out, _use_prev_marking);
|
||||
|
||||
_out->print_cr(" obj "PTR_FORMAT" (over TAMS)", (void*) o);
|
||||
o->oop_iterate(&oopCl);
|
||||
_out->print_cr("");
|
||||
}
|
||||
|
||||
ObjInRegionReachablePrinterClosure(CMBitMapRO* bitmap, outputStream* out) :
|
||||
_bitmap(bitmap), _out(out) { }
|
||||
};
|
||||
|
||||
class RegionReachablePrinterClosure : public HeapRegionClosure {
|
||||
private:
|
||||
CMBitMapRO* _bitmap;
|
||||
CMBitMapRO* _bitmap;
|
||||
outputStream* _out;
|
||||
bool _use_prev_marking;
|
||||
|
||||
public:
|
||||
bool doHeapRegion(HeapRegion* hr) {
|
||||
HeapWord* b = hr->bottom();
|
||||
HeapWord* e = hr->end();
|
||||
HeapWord* t = hr->top();
|
||||
HeapWord* p = hr->prev_top_at_mark_start();
|
||||
HeapWord* p = NULL;
|
||||
if (_use_prev_marking) {
|
||||
p = hr->prev_top_at_mark_start();
|
||||
} else {
|
||||
p = hr->next_top_at_mark_start();
|
||||
}
|
||||
_out->print_cr("** ["PTR_FORMAT", "PTR_FORMAT"] top: "PTR_FORMAT" "
|
||||
"PTAMS: "PTR_FORMAT, b, e, t, p);
|
||||
"TAMS: "PTR_FORMAT, b, e, t, p);
|
||||
_out->print_cr("");
|
||||
|
||||
ObjInRegionReachablePrinterClosure ocl(_bitmap, _out);
|
||||
ObjInRegionReachablePrinterClosure ocl(_bitmap, _out, _use_prev_marking);
|
||||
hr->object_iterate_mem_careful(MemRegion(p, t), &ocl);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
RegionReachablePrinterClosure(CMBitMapRO* bitmap,
|
||||
outputStream* out) :
|
||||
_bitmap(bitmap), _out(out) { }
|
||||
RegionReachablePrinterClosure(CMBitMapRO* bitmap,
|
||||
outputStream* out,
|
||||
bool use_prev_marking) :
|
||||
_bitmap(bitmap), _out(out), _use_prev_marking(use_prev_marking) { }
|
||||
};
|
||||
|
||||
void ConcurrentMark::print_prev_bitmap_reachable() {
|
||||
outputStream* out = gclog_or_tty;
|
||||
void ConcurrentMark::print_reachable(bool use_prev_marking, const char* str) {
|
||||
gclog_or_tty->print_cr("== Doing reachable object dump... ");
|
||||
|
||||
#if SEND_HEAP_DUMP_TO_FILE
|
||||
guarantee(heap_dump_file == NULL, "Protocol");
|
||||
char fn_buf[100];
|
||||
sprintf(fn_buf, "/tmp/dump.txt.%d", os::current_process_id());
|
||||
heap_dump_file = fopen(fn_buf, "w");
|
||||
fileStream fstream(heap_dump_file);
|
||||
out = &fstream;
|
||||
#endif // SEND_HEAP_DUMP_TO_FILE
|
||||
if (G1PrintReachableBaseFile == NULL) {
|
||||
gclog_or_tty->print_cr(" #### error: no base file defined");
|
||||
return;
|
||||
}
|
||||
|
||||
RegionReachablePrinterClosure rcl(_prevMarkBitMap, out);
|
||||
out->print_cr("--- ITERATING OVER REGIONS WITH PTAMS < TOP");
|
||||
if (strlen(G1PrintReachableBaseFile) + 1 + strlen(str) >
|
||||
(JVM_MAXPATHLEN - 1)) {
|
||||
gclog_or_tty->print_cr(" #### error: file name too long");
|
||||
return;
|
||||
}
|
||||
|
||||
char file_name[JVM_MAXPATHLEN];
|
||||
sprintf(file_name, "%s.%s", G1PrintReachableBaseFile, str);
|
||||
gclog_or_tty->print_cr(" dumping to file %s", file_name);
|
||||
|
||||
fileStream fout(file_name);
|
||||
if (!fout.is_open()) {
|
||||
gclog_or_tty->print_cr(" #### error: could not open file");
|
||||
return;
|
||||
}
|
||||
|
||||
outputStream* out = &fout;
|
||||
|
||||
CMBitMapRO* bitmap = NULL;
|
||||
if (use_prev_marking) {
|
||||
bitmap = _prevMarkBitMap;
|
||||
} else {
|
||||
bitmap = _nextMarkBitMap;
|
||||
}
|
||||
|
||||
out->print_cr("-- USING %s", (use_prev_marking) ? "PTAMS" : "NTAMS");
|
||||
out->cr();
|
||||
|
||||
RegionReachablePrinterClosure rcl(bitmap, out, use_prev_marking);
|
||||
out->print_cr("--- ITERATING OVER REGIONS WITH TAMS < TOP");
|
||||
out->cr();
|
||||
_g1h->heap_region_iterate(&rcl);
|
||||
out->print_cr("");
|
||||
out->cr();
|
||||
|
||||
ReachablePrinterClosure cl(_prevMarkBitMap, out);
|
||||
out->print_cr("--- REACHABLE OBJECTS ON THE BITMAP");
|
||||
_prevMarkBitMap->iterate(&cl);
|
||||
out->print_cr("");
|
||||
ReachablePrinterClosure cl(bitmap, out, use_prev_marking);
|
||||
out->print_cr("--- ITERATING OVER MARKED OBJECTS ON THE BITMAP");
|
||||
out->cr();
|
||||
bitmap->iterate(&cl);
|
||||
out->cr();
|
||||
|
||||
#if SEND_HEAP_DUMP_TO_FILE
|
||||
fclose(heap_dump_file);
|
||||
heap_dump_file = NULL;
|
||||
#endif // SEND_HEAP_DUMP_TO_FILE
|
||||
gclog_or_tty->print_cr(" done");
|
||||
}
|
||||
|
||||
#endif // PRODUCT
|
||||
|
||||
// This note is for drainAllSATBBuffers and the code in between.
|
||||
// In the future we could reuse a task to do this work during an
|
||||
// evacuation pause (since now tasks are not active and can be claimed
|
||||
|
||||
@ -612,10 +612,11 @@ public:
|
||||
// we do nothing.
|
||||
void markAndGrayObjectIfNecessary(oop p);
|
||||
|
||||
// This iterates over the bitmap of the previous marking and prints
|
||||
// out all objects that are marked on the bitmap and indicates
|
||||
// whether what they point to is also marked or not.
|
||||
void print_prev_bitmap_reachable();
|
||||
// This iterates over the marking bitmap (either prev or next) and
|
||||
// prints out all objects that are marked on the bitmap and indicates
|
||||
// whether what they point to is also marked or not. It also iterates
|
||||
// the objects over TAMS (either prev or next).
|
||||
void print_reachable(bool use_prev_marking, const char* str);
|
||||
|
||||
// Clear the next marking bitmap (will be called concurrently).
|
||||
void clearNextBitmap();
|
||||
|
||||
@ -2371,8 +2371,9 @@ void G1CollectedHeap::verify(bool allow_dirty,
|
||||
gclog_or_tty->print_cr("Heap:");
|
||||
print_on(gclog_or_tty, true /* extended */);
|
||||
gclog_or_tty->print_cr("");
|
||||
if (VerifyDuringGC && G1VerifyConcMarkPrintReachable) {
|
||||
concurrent_mark()->print_prev_bitmap_reachable();
|
||||
if (VerifyDuringGC && G1VerifyDuringGCPrintReachable) {
|
||||
concurrent_mark()->print_reachable(use_prev_marking,
|
||||
"failed-verification");
|
||||
}
|
||||
gclog_or_tty->flush();
|
||||
}
|
||||
@ -3135,7 +3136,7 @@ void G1CollectedHeap::finalize_for_evac_failure() {
|
||||
_evac_failure_scan_stack->length() == 0,
|
||||
"Postcondition");
|
||||
assert(!_drain_in_progress, "Postcondition");
|
||||
// Don't have to delete, since the scan stack is a resource object.
|
||||
delete _evac_failure_scan_stack;
|
||||
_evac_failure_scan_stack = NULL;
|
||||
}
|
||||
|
||||
|
||||
@ -1516,7 +1516,8 @@ void G1CollectorPolicy::record_collection_pause_end(bool abandoned) {
|
||||
(end_time_sec - _recent_prev_end_times_for_all_gcs_sec->oldest()) * 1000.0;
|
||||
update_recent_gc_times(end_time_sec, elapsed_ms);
|
||||
_recent_avg_pause_time_ratio = _recent_gc_times_ms->sum()/interval_ms;
|
||||
assert(recent_avg_pause_time_ratio() < 1.00, "All GC?");
|
||||
// using 1.01 to account for floating point inaccuracies
|
||||
assert(recent_avg_pause_time_ratio() < 1.01, "All GC?");
|
||||
}
|
||||
|
||||
if (G1PolicyVerbose > 1) {
|
||||
|
||||
@ -55,8 +55,14 @@
|
||||
develop(intx, G1MarkingVerboseLevel, 0, \
|
||||
"Level (0-4) of verboseness of the marking code") \
|
||||
\
|
||||
develop(bool, G1VerifyConcMarkPrintReachable, false, \
|
||||
"If conc mark verification fails, print reachable objects") \
|
||||
develop(bool, G1PrintReachableAtInitialMark, false, \
|
||||
"Reachable object dump at the initial mark pause") \
|
||||
\
|
||||
develop(bool, G1VerifyDuringGCPrintReachable, false, \
|
||||
"If conc mark verification fails, dump reachable objects") \
|
||||
\
|
||||
develop(ccstr, G1PrintReachableBaseFile, NULL, \
|
||||
"The base file name for the reachable object dumps") \
|
||||
\
|
||||
develop(bool, G1TraceMarkStackOverflow, false, \
|
||||
"If true, extra debugging code for CM restart for ovflw.") \
|
||||
|
||||
@ -135,7 +135,6 @@ RSHashTable::RSHashTable(size_t capacity) :
|
||||
_occupied_entries(0), _occupied_cards(0),
|
||||
_entries(NEW_C_HEAP_ARRAY(SparsePRTEntry, capacity)),
|
||||
_buckets(NEW_C_HEAP_ARRAY(int, capacity)),
|
||||
_next_deleted(NULL), _deleted(false),
|
||||
_free_list(NullEntry), _free_region(0)
|
||||
{
|
||||
clear();
|
||||
@ -296,40 +295,6 @@ void RSHashTable::add_entry(SparsePRTEntry* e) {
|
||||
assert(e2->num_valid_cards() > 0, "Postcondition.");
|
||||
}
|
||||
|
||||
RSHashTable* RSHashTable::_head_deleted_list = NULL;
|
||||
|
||||
void RSHashTable::add_to_deleted_list(RSHashTable* rsht) {
|
||||
assert(!rsht->deleted(), "Should delete only once.");
|
||||
rsht->set_deleted(true);
|
||||
RSHashTable* hd = _head_deleted_list;
|
||||
while (true) {
|
||||
rsht->_next_deleted = hd;
|
||||
RSHashTable* res =
|
||||
(RSHashTable*)
|
||||
Atomic::cmpxchg_ptr(rsht, &_head_deleted_list, hd);
|
||||
if (res == hd) return;
|
||||
else hd = res;
|
||||
}
|
||||
}
|
||||
|
||||
RSHashTable* RSHashTable::get_from_deleted_list() {
|
||||
RSHashTable* hd = _head_deleted_list;
|
||||
while (hd != NULL) {
|
||||
RSHashTable* next = hd->next_deleted();
|
||||
RSHashTable* res =
|
||||
(RSHashTable*)
|
||||
Atomic::cmpxchg_ptr(next, &_head_deleted_list, hd);
|
||||
if (res == hd) {
|
||||
hd->set_next_deleted(NULL);
|
||||
hd->set_deleted(false);
|
||||
return hd;
|
||||
} else {
|
||||
hd = res;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
CardIdx_t /* RSHashTable:: */ RSHashTableIter::find_first_card_in_list() {
|
||||
CardIdx_t res;
|
||||
while (_bl_ind != RSHashTable::NullEntry) {
|
||||
@ -442,15 +407,6 @@ void SparsePRT::cleanup_all() {
|
||||
sprt->cleanup();
|
||||
sprt = get_from_expanded_list();
|
||||
}
|
||||
// Now delete all deleted RSHashTables.
|
||||
RSHashTable* rsht = RSHashTable::get_from_deleted_list();
|
||||
while (rsht != NULL) {
|
||||
#if SPARSE_PRT_VERBOSE
|
||||
gclog_or_tty->print_cr("About to delete RSHT " PTR_FORMAT ".", rsht);
|
||||
#endif
|
||||
delete rsht;
|
||||
rsht = RSHashTable::get_from_deleted_list();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -511,8 +467,10 @@ void SparsePRT::clear() {
|
||||
}
|
||||
|
||||
void SparsePRT::cleanup() {
|
||||
// Make sure that the current and next tables agree. (Another mechanism
|
||||
// takes care of deleting now-unused tables.)
|
||||
// Make sure that the current and next tables agree.
|
||||
if (_cur != _next) {
|
||||
delete _cur;
|
||||
}
|
||||
_cur = _next;
|
||||
set_expanded(false);
|
||||
}
|
||||
@ -535,7 +493,8 @@ void SparsePRT::expand() {
|
||||
_next->add_entry(e);
|
||||
}
|
||||
}
|
||||
if (last != _cur)
|
||||
RSHashTable::add_to_deleted_list(last);
|
||||
if (last != _cur) {
|
||||
delete last;
|
||||
}
|
||||
add_to_expanded_list(this);
|
||||
}
|
||||
|
||||
@ -102,13 +102,6 @@ class RSHashTable : public CHeapObj {
|
||||
int _free_region;
|
||||
int _free_list;
|
||||
|
||||
static RSHashTable* _head_deleted_list;
|
||||
RSHashTable* _next_deleted;
|
||||
RSHashTable* next_deleted() { return _next_deleted; }
|
||||
void set_next_deleted(RSHashTable* rsht) { _next_deleted = rsht; }
|
||||
bool _deleted;
|
||||
void set_deleted(bool b) { _deleted = b; }
|
||||
|
||||
// Requires that the caller hold a lock preventing parallel modifying
|
||||
// operations, and that the the table be less than completely full. If
|
||||
// an entry for "region_ind" is already in the table, finds it and
|
||||
@ -154,14 +147,10 @@ public:
|
||||
size_t occupied_entries() const { return _occupied_entries; }
|
||||
size_t occupied_cards() const { return _occupied_cards; }
|
||||
size_t mem_size() const;
|
||||
bool deleted() { return _deleted; }
|
||||
|
||||
SparsePRTEntry* entry(int i) const { return &_entries[i]; }
|
||||
|
||||
void print();
|
||||
|
||||
static void add_to_deleted_list(RSHashTable* rsht);
|
||||
static RSHashTable* get_from_deleted_list();
|
||||
};
|
||||
|
||||
// ValueObj because will be embedded in HRRS iterator.
|
||||
|
||||
@ -352,15 +352,19 @@ void CompactingPermGenGen::post_compact() {
|
||||
}
|
||||
|
||||
|
||||
// Do not use in time-critical operations due to the possibility of paging
|
||||
// in otherwise untouched or previously unread portions of the perm gen,
|
||||
// for instance, the shared spaces. NOTE: Because CompactingPermGenGen
|
||||
// derives from OneContigSpaceCardGeneration which is supposed to have a
|
||||
// single space, and does not override its object_iterate() method,
|
||||
// object iteration via that interface does not look at the objects in
|
||||
// the shared spaces when using CDS. This should be fixed; see CR 6897798.
|
||||
void CompactingPermGenGen::space_iterate(SpaceClosure* blk, bool usedOnly) {
|
||||
OneContigSpaceCardGeneration::space_iterate(blk, usedOnly);
|
||||
if (spec()->enable_shared_spaces()) {
|
||||
#ifdef PRODUCT
|
||||
// Making the rw_space walkable will page in the entire space, and
|
||||
// is to be avoided. However, this is required for Verify options.
|
||||
ShouldNotReachHere();
|
||||
#endif
|
||||
|
||||
// is to be avoided in the case of time-critical operations.
|
||||
// However, this is required for Verify and heap dump operations.
|
||||
blk->do_space(ro_space());
|
||||
blk->do_space(rw_space());
|
||||
}
|
||||
|
||||
@ -29,6 +29,9 @@
|
||||
class PermanentGenerationSpec;
|
||||
|
||||
// This is the "generation" view of a CompactingPermGen.
|
||||
// NOTE: the shared spaces used for CDS are here handled in
|
||||
// a somewhat awkward and potentially buggy fashion, see CR 6801625.
|
||||
// This infelicity should be fixed, see CR 6897789.
|
||||
class CompactingPermGenGen: public OneContigSpaceCardGeneration {
|
||||
friend class VMStructs;
|
||||
// Abstractly, this is a subtype that gets access to protected fields.
|
||||
@ -47,7 +50,7 @@ private:
|
||||
OffsetTableContigSpace* _ro_space;
|
||||
OffsetTableContigSpace* _rw_space;
|
||||
|
||||
// With shared spaces there is a dicotomy in the use of the
|
||||
// With shared spaces there is a dichotomy in the use of the
|
||||
// _virtual_space of the generation. There is a portion of the
|
||||
// _virtual_space that is used for the unshared part of the
|
||||
// permanent generation and a portion that is reserved for the shared part.
|
||||
|
||||
@ -606,6 +606,13 @@ void OneContigSpaceCardGeneration::shrink_by(size_t bytes) {
|
||||
void OneContigSpaceCardGeneration::prepare_for_verify() {}
|
||||
|
||||
|
||||
// Override for a card-table generation with one contiguous
|
||||
// space. NOTE: For reasons that are lost in the fog of history,
|
||||
// this code is used when you iterate over perm gen objects,
|
||||
// even when one uses CDS, where the perm gen has a couple of
|
||||
// other spaces; this is because CompactingPermGenGen derives
|
||||
// from OneContigSpaceCardGeneration. This should be cleaned up,
|
||||
// see CR 6897789..
|
||||
void OneContigSpaceCardGeneration::object_iterate(ObjectClosure* blk) {
|
||||
_the_space->object_iterate(blk);
|
||||
}
|
||||
|
||||
@ -1900,7 +1900,7 @@ void instanceKlass::release_C_heap_structures() {
|
||||
}
|
||||
}
|
||||
|
||||
char* instanceKlass::signature_name() const {
|
||||
const char* instanceKlass::signature_name() const {
|
||||
const char* src = (const char*) (name()->as_C_string());
|
||||
const int src_length = (int)strlen(src);
|
||||
char* dest = NEW_RESOURCE_ARRAY(char, src_length + 3);
|
||||
@ -2259,6 +2259,10 @@ void instanceKlass::oop_print_on(oop obj, outputStream* st) {
|
||||
st->print(BULLET"fake entry for array: ");
|
||||
array_klass->print_value_on(st);
|
||||
st->cr();
|
||||
} else if (as_klassOop() == SystemDictionary::MethodType_klass()) {
|
||||
st->print(BULLET"signature: ");
|
||||
java_dyn_MethodType::print_signature(obj, st);
|
||||
st->cr();
|
||||
}
|
||||
}
|
||||
|
||||
@ -2284,6 +2288,9 @@ void instanceKlass::oop_print_value_on(oop obj, outputStream* st) {
|
||||
const char* tname = type2name(java_lang_Class::primitive_type(obj));
|
||||
st->print("%s", tname ? tname : "type?");
|
||||
}
|
||||
} else if (as_klassOop() == SystemDictionary::MethodType_klass()) {
|
||||
st->print(" = ");
|
||||
java_dyn_MethodType::print_signature(obj, st);
|
||||
} else if (java_lang_boxing_object::is_instance(obj)) {
|
||||
st->print(" = ");
|
||||
java_lang_boxing_object::print(obj, st);
|
||||
|
||||
@ -722,7 +722,7 @@ class instanceKlass: public Klass {
|
||||
#endif // SERIALGC
|
||||
|
||||
// Naming
|
||||
char* signature_name() const;
|
||||
const char* signature_name() const;
|
||||
|
||||
// Iterators
|
||||
int oop_oop_iterate(oop obj, OopClosure* blk) {
|
||||
|
||||
@ -496,11 +496,13 @@ const char* Klass::external_name() const {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
if (name() == NULL) return "<unknown>";
|
||||
return name()->as_klass_external_name();
|
||||
}
|
||||
|
||||
|
||||
char* Klass::signature_name() const {
|
||||
const char* Klass::signature_name() const {
|
||||
if (name() == NULL) return "<unknown>";
|
||||
return name()->as_C_string();
|
||||
}
|
||||
|
||||
|
||||
@ -546,7 +546,7 @@ class Klass : public Klass_vtbl {
|
||||
// For arrays, this returns the name of the element with a leading '['.
|
||||
// For classes, this returns the name with a leading 'L' and a trailing ';'
|
||||
// and the package separators as '/'.
|
||||
virtual char* signature_name() const;
|
||||
virtual const char* signature_name() const;
|
||||
|
||||
// garbage collection support
|
||||
virtual void oop_follow_contents(oop obj) = 0;
|
||||
|
||||
@ -31,8 +31,9 @@ void markOopDesc::print_on(outputStream* st) const {
|
||||
st->print("locked(0x%lx)->", value());
|
||||
markOop(*(markOop*)value())->print_on(st);
|
||||
} else {
|
||||
assert(is_unlocked(), "just checking");
|
||||
assert(is_unlocked() || has_bias_pattern(), "just checking");
|
||||
st->print("mark(");
|
||||
if (has_bias_pattern()) st->print("biased,");
|
||||
st->print("hash %#lx,", hash());
|
||||
st->print("age %d)", age());
|
||||
}
|
||||
|
||||
@ -881,7 +881,7 @@ methodHandle methodOopDesc::make_invoke_method(KlassHandle holder,
|
||||
assert((oop)p == method_type(), "pointer chase is correct");
|
||||
#endif
|
||||
|
||||
if (TraceMethodHandles)
|
||||
if (TraceMethodHandles && (Verbose || WizardMode))
|
||||
m->print_on(tty);
|
||||
|
||||
return m;
|
||||
|
||||
@ -421,21 +421,23 @@ void JVMState::format(PhaseRegAlloc *regalloc, const Node *n, outputStream* st)
|
||||
iklass = cik->as_instance_klass();
|
||||
} else if (cik->is_type_array_klass()) {
|
||||
cik->as_array_klass()->base_element_type()->print_name_on(st);
|
||||
st->print("[%d]=", spobj->n_fields());
|
||||
st->print("[%d]", spobj->n_fields());
|
||||
} else if (cik->is_obj_array_klass()) {
|
||||
ciType* cie = cik->as_array_klass()->base_element_type();
|
||||
int ndim = 1;
|
||||
while (cie->is_obj_array_klass()) {
|
||||
ndim += 1;
|
||||
cie = cie->as_array_klass()->base_element_type();
|
||||
ciKlass* cie = cik->as_obj_array_klass()->base_element_klass();
|
||||
if (cie->is_instance_klass()) {
|
||||
cie->print_name_on(st);
|
||||
} else if (cie->is_type_array_klass()) {
|
||||
cie->as_array_klass()->base_element_type()->print_name_on(st);
|
||||
} else {
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
cie->print_name_on(st);
|
||||
st->print("[%d]", spobj->n_fields());
|
||||
int ndim = cik->as_array_klass()->dimension() - 1;
|
||||
while (ndim-- > 0) {
|
||||
st->print("[]");
|
||||
}
|
||||
st->print("[%d]=", spobj->n_fields());
|
||||
}
|
||||
st->print("{");
|
||||
st->print("={");
|
||||
uint nf = spobj->n_fields();
|
||||
if (nf > 0) {
|
||||
uint first_ind = spobj->first_index();
|
||||
|
||||
@ -2116,7 +2116,7 @@ JNI_ENTRY(jobject, jni_GetObjectArrayElement(JNIEnv *env, jobjectArray array, js
|
||||
DT_RETURN_MARK(GetObjectArrayElement, jobject, (const jobject&)ret);
|
||||
objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array));
|
||||
if (a->is_within_bounds(index)) {
|
||||
jobject ret = JNIHandles::make_local(env, a->obj_at(index));
|
||||
ret = JNIHandles::make_local(env, a->obj_at(index));
|
||||
return ret;
|
||||
} else {
|
||||
char buf[jintAsStringSize];
|
||||
@ -2150,14 +2150,14 @@ JNI_END
|
||||
|
||||
#define DEFINE_NEWSCALARARRAY(Return,Allocator,Result) \
|
||||
\
|
||||
DT_RETURN_MARK_DECL_FOR(Result, New##Result##Array, Return);\
|
||||
DT_RETURN_MARK_DECL(New##Result##Array, Return);\
|
||||
\
|
||||
JNI_ENTRY(Return, \
|
||||
jni_New##Result##Array(JNIEnv *env, jsize len)) \
|
||||
JNIWrapper("New" XSTR(Result) "Array"); \
|
||||
DTRACE_PROBE2(hotspot_jni, New##Result##Array__entry, env, len);\
|
||||
Return ret = NULL;\
|
||||
DT_RETURN_MARK_FOR(Result, New##Result##Array, Return, (const Return&)ret);\
|
||||
DT_RETURN_MARK(New##Result##Array, Return, (const Return&)ret);\
|
||||
\
|
||||
oop obj= oopFactory::Allocator(len, CHECK_0); \
|
||||
ret = (Return) JNIHandles::make_local(env, obj); \
|
||||
|
||||
@ -33,8 +33,7 @@ bool MethodHandles::_enabled = false; // set true after successful native linkag
|
||||
|
||||
MethodHandleEntry* MethodHandles::_entries[MethodHandles::_EK_LIMIT] = {NULL};
|
||||
const char* MethodHandles::_entry_names[_EK_LIMIT+1] = {
|
||||
"check_mtype",
|
||||
"wrong_method_type", // what happens when there is a type mismatch
|
||||
"raise_exception",
|
||||
"invokestatic", // how a MH emulates invokestatic
|
||||
"invokespecial", // ditto for the other invokes...
|
||||
"invokevirtual",
|
||||
@ -48,6 +47,7 @@ const char* MethodHandles::_entry_names[_EK_LIMIT+1] = {
|
||||
|
||||
// starting at _adapter_mh_first:
|
||||
"adapter_retype_only", // these are for AMH...
|
||||
"adapter_retype_raw",
|
||||
"adapter_check_cast",
|
||||
"adapter_prim_to_prim",
|
||||
"adapter_ref_to_prim",
|
||||
@ -82,6 +82,8 @@ const char* MethodHandles::_entry_names[_EK_LIMIT+1] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
jobject MethodHandles::_raise_exception_method;
|
||||
|
||||
#ifdef ASSERT
|
||||
bool MethodHandles::spot_check_entry_names() {
|
||||
assert(!strcmp(entry_name(_invokestatic_mh), "invokestatic"), "");
|
||||
@ -157,7 +159,8 @@ methodOop MethodHandles::decode_DirectMethodHandle(oop mh, klassOop& receiver_li
|
||||
}
|
||||
|
||||
methodOop MethodHandles::decode_BoundMethodHandle(oop mh, klassOop& receiver_limit_result, int& decode_flags_result) {
|
||||
assert(mh->klass() == SystemDictionary::BoundMethodHandle_klass(), "");
|
||||
assert(sun_dyn_BoundMethodHandle::is_instance(mh), "");
|
||||
assert(mh->klass() != SystemDictionary::AdapterMethodHandle_klass(), "");
|
||||
for (oop bmh = mh;;) {
|
||||
// Bound MHs can be stacked to bind several arguments.
|
||||
oop target = java_dyn_MethodHandle::vmtarget(bmh);
|
||||
@ -174,10 +177,9 @@ methodOop MethodHandles::decode_BoundMethodHandle(oop mh, klassOop& receiver_lim
|
||||
} else {
|
||||
// Optimized case: binding a receiver to a non-dispatched DMH
|
||||
// short-circuits directly to the methodOop.
|
||||
// (It might be another argument besides a receiver also.)
|
||||
assert(target->is_method(), "must be a simple method");
|
||||
methodOop m = (methodOop) target;
|
||||
DEBUG_ONLY(int argslot = sun_dyn_BoundMethodHandle::vmargslot(bmh));
|
||||
assert(argslot == m->size_of_parameters() - 1, "must be initial argument (receiver)");
|
||||
decode_flags_result |= MethodHandles::_dmf_binds_method;
|
||||
return m;
|
||||
}
|
||||
@ -214,6 +216,9 @@ methodOop MethodHandles::decode_MethodHandle(oop mh, klassOop& receiver_limit_re
|
||||
return decode_BoundMethodHandle(mh, receiver_limit_result, decode_flags_result);
|
||||
} else if (mhk == SystemDictionary::AdapterMethodHandle_klass()) {
|
||||
return decode_AdapterMethodHandle(mh, receiver_limit_result, decode_flags_result);
|
||||
} else if (sun_dyn_BoundMethodHandle::is_subclass(mhk)) {
|
||||
// could be a JavaMethodHandle (but not an adapter MH)
|
||||
return decode_BoundMethodHandle(mh, receiver_limit_result, decode_flags_result);
|
||||
} else {
|
||||
assert(false, "cannot parse this MH");
|
||||
return NULL; // random MH?
|
||||
@ -366,7 +371,13 @@ methodOop MethodHandles::decode_MemberName(oop mname, klassOop& receiver_limit_r
|
||||
oop vmtarget = sun_dyn_MemberName::vmtarget(mname);
|
||||
int vmindex = sun_dyn_MemberName::vmindex(mname);
|
||||
if (vmindex == VM_INDEX_UNINITIALIZED) return NULL; // not resolved
|
||||
return decode_vmtarget(vmtarget, vmindex, NULL, receiver_limit_result, decode_flags_result);
|
||||
methodOop m = decode_vmtarget(vmtarget, vmindex, NULL, receiver_limit_result, decode_flags_result);
|
||||
oop clazz = sun_dyn_MemberName::clazz(mname);
|
||||
if (clazz != NULL && java_lang_Class::is_instance(clazz)) {
|
||||
klassOop klass = java_lang_Class::as_klassOop(clazz);
|
||||
if (klass != NULL) receiver_limit_result = klass;
|
||||
}
|
||||
return m;
|
||||
}
|
||||
|
||||
// An unresolved member name is a mere symbolic reference.
|
||||
@ -789,6 +800,30 @@ oop MethodHandles::encode_target(Handle mh, int format, TRAPS) {
|
||||
THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), msg);
|
||||
}
|
||||
|
||||
static const char* always_null_names[] = {
|
||||
"java/lang/Void",
|
||||
"java/lang/Null",
|
||||
//"java/lang/Nothing",
|
||||
"sun/dyn/empty/Empty",
|
||||
NULL
|
||||
};
|
||||
|
||||
static bool is_always_null_type(klassOop klass) {
|
||||
if (!Klass::cast(klass)->oop_is_instance()) return false;
|
||||
instanceKlass* ik = instanceKlass::cast(klass);
|
||||
// Must be on the boot class path:
|
||||
if (ik->class_loader() != NULL) return false;
|
||||
// Check the name.
|
||||
symbolOop name = ik->name();
|
||||
for (int i = 0; ; i++) {
|
||||
const char* test_name = always_null_names[i];
|
||||
if (test_name == NULL) break;
|
||||
if (name->equals(test_name, (int) strlen(test_name)))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MethodHandles::class_cast_needed(klassOop src, klassOop dst) {
|
||||
if (src == dst || dst == SystemDictionary::object_klass())
|
||||
return false; // quickest checks
|
||||
@ -805,6 +840,12 @@ bool MethodHandles::class_cast_needed(klassOop src, klassOop dst) {
|
||||
//srck = Klass::cast(SystemDictionary::object_klass());
|
||||
return true;
|
||||
}
|
||||
if (is_always_null_type(src)) {
|
||||
// some source types are known to be never instantiated;
|
||||
// they represent references which are always null
|
||||
// such null references never fail to convert safely
|
||||
return false;
|
||||
}
|
||||
return !srck->is_subclass_of(dstk->as_klassOop());
|
||||
}
|
||||
|
||||
@ -814,9 +855,15 @@ static oop object_java_mirror() {
|
||||
|
||||
bool MethodHandles::same_basic_type_for_arguments(BasicType src,
|
||||
BasicType dst,
|
||||
bool raw,
|
||||
bool for_return) {
|
||||
// return values can always be forgotten:
|
||||
if (for_return && dst == T_VOID) return true;
|
||||
if (for_return) {
|
||||
// return values can always be forgotten:
|
||||
if (dst == T_VOID) return true;
|
||||
if (src == T_VOID) return raw && (dst == T_INT);
|
||||
// We allow caller to receive a garbage int, which is harmless.
|
||||
// This trick is pulled by trusted code (see VerifyType.canPassRaw).
|
||||
}
|
||||
assert(src != T_VOID && dst != T_VOID, "should not be here");
|
||||
if (src == dst) return true;
|
||||
if (type2size[src] != type2size[dst]) return false;
|
||||
@ -929,8 +976,8 @@ void MethodHandles::verify_method_type(methodHandle m,
|
||||
const char* err = NULL;
|
||||
|
||||
int first_ptype_pos = m_needs_receiver ? 1 : 0;
|
||||
if (has_bound_recv && err == NULL) {
|
||||
first_ptype_pos -= 1;
|
||||
if (has_bound_recv) {
|
||||
first_ptype_pos -= 1; // ptypes do not include the bound argument; start earlier in them
|
||||
if (m_needs_receiver && bound_recv_type.is_null())
|
||||
{ err = "bound receiver is not an object"; goto die; }
|
||||
}
|
||||
@ -939,10 +986,10 @@ void MethodHandles::verify_method_type(methodHandle m,
|
||||
objArrayOop ptypes = java_dyn_MethodType::ptypes(mtype());
|
||||
if (ptypes->length() < first_ptype_pos)
|
||||
{ err = "receiver argument is missing"; goto die; }
|
||||
if (first_ptype_pos == -1)
|
||||
if (has_bound_recv)
|
||||
err = check_method_receiver(m(), bound_recv_type->as_klassOop());
|
||||
else
|
||||
err = check_method_receiver(m(), java_lang_Class::as_klassOop(ptypes->obj_at(0)));
|
||||
err = check_method_receiver(m(), java_lang_Class::as_klassOop(ptypes->obj_at(first_ptype_pos-1)));
|
||||
if (err != NULL) goto die;
|
||||
}
|
||||
|
||||
@ -983,7 +1030,8 @@ const char* MethodHandles::check_method_type_change(oop src_mtype, int src_beg,
|
||||
int insert_argnum, oop insert_type,
|
||||
int change_argnum, oop change_type,
|
||||
int delete_argnum,
|
||||
oop dst_mtype, int dst_beg, int dst_end) {
|
||||
oop dst_mtype, int dst_beg, int dst_end,
|
||||
bool raw) {
|
||||
objArrayOop src_ptypes = java_dyn_MethodType::ptypes(src_mtype);
|
||||
objArrayOop dst_ptypes = java_dyn_MethodType::ptypes(dst_mtype);
|
||||
|
||||
@ -1042,7 +1090,7 @@ const char* MethodHandles::check_method_type_change(oop src_mtype, int src_beg,
|
||||
if (src_type != dst_type) {
|
||||
if (src_type == NULL) return "not enough arguments";
|
||||
if (dst_type == NULL) return "too many arguments";
|
||||
err = check_argument_type_change(src_type, dst_type, dst_idx);
|
||||
err = check_argument_type_change(src_type, dst_type, dst_idx, raw);
|
||||
if (err != NULL) return err;
|
||||
}
|
||||
}
|
||||
@ -1051,7 +1099,7 @@ const char* MethodHandles::check_method_type_change(oop src_mtype, int src_beg,
|
||||
oop src_rtype = java_dyn_MethodType::rtype(src_mtype);
|
||||
oop dst_rtype = java_dyn_MethodType::rtype(dst_mtype);
|
||||
if (src_rtype != dst_rtype) {
|
||||
err = check_return_type_change(dst_rtype, src_rtype); // note reversal!
|
||||
err = check_return_type_change(dst_rtype, src_rtype, raw); // note reversal!
|
||||
if (err != NULL) return err;
|
||||
}
|
||||
|
||||
@ -1061,38 +1109,45 @@ const char* MethodHandles::check_method_type_change(oop src_mtype, int src_beg,
|
||||
|
||||
|
||||
const char* MethodHandles::check_argument_type_change(BasicType src_type,
|
||||
klassOop src_klass,
|
||||
BasicType dst_type,
|
||||
klassOop dst_klass,
|
||||
int argnum) {
|
||||
klassOop src_klass,
|
||||
BasicType dst_type,
|
||||
klassOop dst_klass,
|
||||
int argnum,
|
||||
bool raw) {
|
||||
const char* err = NULL;
|
||||
bool for_return = (argnum < 0);
|
||||
|
||||
// just in case:
|
||||
if (src_type == T_ARRAY) src_type = T_OBJECT;
|
||||
if (dst_type == T_ARRAY) dst_type = T_OBJECT;
|
||||
|
||||
// Produce some nice messages if VerifyMethodHandles is turned on:
|
||||
if (!same_basic_type_for_arguments(src_type, dst_type, (argnum < 0))) {
|
||||
if (!same_basic_type_for_arguments(src_type, dst_type, raw, for_return)) {
|
||||
if (src_type == T_OBJECT) {
|
||||
if (raw && dst_type == T_INT && is_always_null_type(src_klass))
|
||||
return NULL; // OK to convert a null pointer to a garbage int
|
||||
err = ((argnum >= 0)
|
||||
? "type mismatch: passing a %s for method argument #%d, which expects primitive %s"
|
||||
: "type mismatch: returning a %s, but caller expects primitive %s");
|
||||
} else if (dst_type == T_OBJECT) {
|
||||
err = ((argnum < 0)
|
||||
err = ((argnum >= 0)
|
||||
? "type mismatch: passing a primitive %s for method argument #%d, which expects %s"
|
||||
: "type mismatch: returning a primitive %s, but caller expects %s");
|
||||
} else {
|
||||
err = ((argnum < 0)
|
||||
err = ((argnum >= 0)
|
||||
? "type mismatch: passing a %s for method argument #%d, which expects %s"
|
||||
: "type mismatch: returning a %s, but caller expects %s");
|
||||
}
|
||||
} else if (src_type == T_OBJECT && class_cast_needed(src_klass, dst_klass)) {
|
||||
} else if (src_type == T_OBJECT && dst_type == T_OBJECT &&
|
||||
class_cast_needed(src_klass, dst_klass)) {
|
||||
if (!class_cast_needed(dst_klass, src_klass)) {
|
||||
err = ((argnum < 0)
|
||||
if (raw)
|
||||
return NULL; // reverse cast is OK; the MH target is trusted to enforce it
|
||||
err = ((argnum >= 0)
|
||||
? "cast required: passing a %s for method argument #%d, which expects %s"
|
||||
: "cast required: returning a %s, but caller expects %s");
|
||||
} else {
|
||||
err = ((argnum < 0)
|
||||
err = ((argnum >= 0)
|
||||
? "reference mismatch: passing a %s for method argument #%d, which expects %s"
|
||||
: "reference mismatch: returning a %s, but caller expects %s");
|
||||
}
|
||||
@ -1429,10 +1484,10 @@ void MethodHandles::verify_BoundMethodHandle(Handle mh, Handle target, int argnu
|
||||
assert(this_pushes == slots_pushed, "BMH pushes one or two stack slots");
|
||||
assert(slots_pushed <= MethodHandlePushLimit, "");
|
||||
} else {
|
||||
int prev_pushes = decode_MethodHandle_stack_pushes(target());
|
||||
assert(this_pushes == slots_pushed + prev_pushes, "BMH stack motion must be correct");
|
||||
int target_pushes = decode_MethodHandle_stack_pushes(target());
|
||||
assert(this_pushes == slots_pushed + target_pushes, "BMH stack motion must be correct");
|
||||
// do not blow the stack; use a Java-based adapter if this limit is exceeded
|
||||
if (slots_pushed + prev_pushes > MethodHandlePushLimit)
|
||||
if (slots_pushed + target_pushes > MethodHandlePushLimit)
|
||||
err = "too many bound parameters";
|
||||
}
|
||||
}
|
||||
@ -1588,6 +1643,11 @@ void MethodHandles::verify_AdapterMethodHandle(Handle mh, int argnum, TRAPS) {
|
||||
if (err == NULL) {
|
||||
// Check that the src/dest types are supplied if needed.
|
||||
switch (ek) {
|
||||
case _adapter_check_cast:
|
||||
if (src != T_OBJECT || dest != T_OBJECT) {
|
||||
err = "adapter requires object src/dest conversion subfields";
|
||||
}
|
||||
break;
|
||||
case _adapter_prim_to_prim:
|
||||
if (!is_java_primitive(src) || !is_java_primitive(dest) || src == dest) {
|
||||
err = "adapter requires primitive src/dest conversion subfields"; break;
|
||||
@ -1616,9 +1676,9 @@ void MethodHandles::verify_AdapterMethodHandle(Handle mh, int argnum, TRAPS) {
|
||||
err = "adapter requires src/dest conversion subfields for swap"; break;
|
||||
}
|
||||
int swap_size = type2size[src];
|
||||
oop src_mtype = sun_dyn_AdapterMethodHandle::type(target());
|
||||
oop dest_mtype = sun_dyn_AdapterMethodHandle::type(mh());
|
||||
int slot_limit = sun_dyn_AdapterMethodHandle::vmslots(src_mtype);
|
||||
oop src_mtype = sun_dyn_AdapterMethodHandle::type(mh());
|
||||
oop dest_mtype = sun_dyn_AdapterMethodHandle::type(target());
|
||||
int slot_limit = sun_dyn_AdapterMethodHandle::vmslots(target());
|
||||
int src_slot = argslot;
|
||||
int dest_slot = vminfo;
|
||||
bool rotate_up = (src_slot > dest_slot); // upward rotation
|
||||
@ -1729,22 +1789,22 @@ void MethodHandles::verify_AdapterMethodHandle(Handle mh, int argnum, TRAPS) {
|
||||
// Make sure this adapter does not push too deeply.
|
||||
int slots_pushed = stack_move / stack_move_unit();
|
||||
int this_vmslots = java_dyn_MethodHandle::vmslots(mh());
|
||||
int prev_vmslots = java_dyn_MethodHandle::vmslots(target());
|
||||
if (slots_pushed != (this_vmslots - prev_vmslots)) {
|
||||
int target_vmslots = java_dyn_MethodHandle::vmslots(target());
|
||||
if (slots_pushed != (target_vmslots - this_vmslots)) {
|
||||
err = "stack_move inconsistent with previous and current MethodType vmslots";
|
||||
} else if (slots_pushed > 0) {
|
||||
// verify stack_move against MethodHandlePushLimit
|
||||
int prev_pushes = decode_MethodHandle_stack_pushes(target());
|
||||
int target_pushes = decode_MethodHandle_stack_pushes(target());
|
||||
// do not blow the stack; use a Java-based adapter if this limit is exceeded
|
||||
if (slots_pushed + prev_pushes > MethodHandlePushLimit) {
|
||||
if (slots_pushed + target_pushes > MethodHandlePushLimit) {
|
||||
err = "adapter pushes too many parameters";
|
||||
}
|
||||
}
|
||||
|
||||
// While we're at it, check that the stack motion decoder works:
|
||||
DEBUG_ONLY(int prev_pushes = decode_MethodHandle_stack_pushes(target()));
|
||||
DEBUG_ONLY(int target_pushes = decode_MethodHandle_stack_pushes(target()));
|
||||
DEBUG_ONLY(int this_pushes = decode_MethodHandle_stack_pushes(mh()));
|
||||
assert(this_pushes == slots_pushed + prev_pushes, "AMH stack motion must be correct");
|
||||
assert(this_pushes == slots_pushed + target_pushes, "AMH stack motion must be correct");
|
||||
}
|
||||
|
||||
if (err == NULL && vminfo != 0) {
|
||||
@ -1761,7 +1821,11 @@ void MethodHandles::verify_AdapterMethodHandle(Handle mh, int argnum, TRAPS) {
|
||||
if (err == NULL) {
|
||||
switch (ek) {
|
||||
case _adapter_retype_only:
|
||||
err = check_method_type_passthrough(src_mtype(), dst_mtype());
|
||||
err = check_method_type_passthrough(src_mtype(), dst_mtype(), false);
|
||||
break;
|
||||
|
||||
case _adapter_retype_raw:
|
||||
err = check_method_type_passthrough(src_mtype(), dst_mtype(), true);
|
||||
break;
|
||||
|
||||
case _adapter_check_cast:
|
||||
@ -1821,6 +1885,7 @@ void MethodHandles::init_AdapterMethodHandle(Handle mh, Handle target, int argnu
|
||||
// Now it's time to finish the case analysis and pick a MethodHandleEntry.
|
||||
switch (ek_orig) {
|
||||
case _adapter_retype_only:
|
||||
case _adapter_retype_raw:
|
||||
case _adapter_check_cast:
|
||||
case _adapter_dup_args:
|
||||
case _adapter_drop_args:
|
||||
@ -1888,8 +1953,7 @@ void MethodHandles::init_AdapterMethodHandle(Handle mh, Handle target, int argnu
|
||||
case _adapter_rot_args:
|
||||
{
|
||||
int swap_slots = type2size[src];
|
||||
oop mtype = sun_dyn_AdapterMethodHandle::type(mh());
|
||||
int slot_limit = sun_dyn_AdapterMethodHandle::vmslots(mtype);
|
||||
int slot_limit = sun_dyn_AdapterMethodHandle::vmslots(mh());
|
||||
int src_slot = argslot;
|
||||
int dest_slot = vminfo;
|
||||
int rotate = (ek_orig == _adapter_swap_args) ? 0 : (src_slot > dest_slot) ? 1 : -1;
|
||||
@ -2133,7 +2197,7 @@ JVM_ENTRY(jint, MHI_getConstant(JNIEnv *env, jobject igcls, jint which)) {
|
||||
guarantee(MethodHandlePushLimit >= 2 && MethodHandlePushLimit <= 0xFF,
|
||||
"MethodHandlePushLimit parameter must be in valid range");
|
||||
return MethodHandlePushLimit;
|
||||
case MethodHandles::GC_JVM_STACK_MOVE_LIMIT:
|
||||
case MethodHandles::GC_JVM_STACK_MOVE_UNIT:
|
||||
// return number of words per slot, signed according to stack direction
|
||||
return MethodHandles::stack_move_unit();
|
||||
}
|
||||
@ -2144,7 +2208,7 @@ JVM_END
|
||||
#ifndef PRODUCT
|
||||
#define EACH_NAMED_CON(template) \
|
||||
template(MethodHandles,GC_JVM_PUSH_LIMIT) \
|
||||
template(MethodHandles,GC_JVM_STACK_MOVE_LIMIT) \
|
||||
template(MethodHandles,GC_JVM_STACK_MOVE_UNIT) \
|
||||
template(MethodHandles,ETF_HANDLE_OR_METHOD_NAME) \
|
||||
template(MethodHandles,ETF_DIRECT_HANDLE) \
|
||||
template(MethodHandles,ETF_METHOD_NAME) \
|
||||
@ -2157,6 +2221,7 @@ JVM_END
|
||||
template(sun_dyn_MemberName,MN_SEARCH_INTERFACES) \
|
||||
template(sun_dyn_MemberName,VM_INDEX_UNINITIALIZED) \
|
||||
template(sun_dyn_AdapterMethodHandle,OP_RETYPE_ONLY) \
|
||||
template(sun_dyn_AdapterMethodHandle,OP_RETYPE_RAW) \
|
||||
template(sun_dyn_AdapterMethodHandle,OP_CHECK_CAST) \
|
||||
template(sun_dyn_AdapterMethodHandle,OP_PRIM_TO_PRIM) \
|
||||
template(sun_dyn_AdapterMethodHandle,OP_REF_TO_PRIM) \
|
||||
@ -2345,10 +2410,12 @@ JVM_ENTRY(void, JVM_RegisterMethodHandleMethods(JNIEnv *env, jclass MHN_class))
|
||||
// note: this explicit warning-producing stuff will be replaced by auto-detection of the JSR 292 classes
|
||||
|
||||
if (!EnableMethodHandles) {
|
||||
warning("JSR 292 method handles are disabled in this JVM. Use -XX:+EnableMethodHandles to enable.");
|
||||
warning("JSR 292 method handles are disabled in this JVM. Use -XX:+UnlockExperimentalVMOptions -XX:+EnableMethodHandles to enable.");
|
||||
return; // bind nothing
|
||||
}
|
||||
|
||||
bool enable_MH = true;
|
||||
|
||||
{
|
||||
ThreadToNativeFromVM ttnfv(thread);
|
||||
|
||||
@ -2356,14 +2423,33 @@ JVM_ENTRY(void, JVM_RegisterMethodHandleMethods(JNIEnv *env, jclass MHN_class))
|
||||
if (env->ExceptionOccurred()) {
|
||||
MethodHandles::set_enabled(false);
|
||||
warning("JSR 292 method handle code is mismatched to this JVM. Disabling support.");
|
||||
enable_MH = false;
|
||||
env->ExceptionClear();
|
||||
} else {
|
||||
MethodHandles::set_enabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
if (enable_MH) {
|
||||
KlassHandle MHI_klass = SystemDictionaryHandles::MethodHandleImpl_klass();
|
||||
if (MHI_klass.not_null()) {
|
||||
symbolHandle raiseException_name = oopFactory::new_symbol_handle("raiseException", CHECK);
|
||||
symbolHandle raiseException_sig = oopFactory::new_symbol_handle("(ILjava/lang/Object;Ljava/lang/Object;)V", CHECK);
|
||||
methodOop raiseException_method = instanceKlass::cast(MHI_klass->as_klassOop())
|
||||
->find_method(raiseException_name(), raiseException_sig());
|
||||
if (raiseException_method != NULL && raiseException_method->is_static()) {
|
||||
MethodHandles::set_raise_exception_method(raiseException_method);
|
||||
} else {
|
||||
warning("JSR 292 method handle code is mismatched to this JVM. Disabling support.");
|
||||
enable_MH = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (enable_MH) {
|
||||
MethodHandles::set_enabled(true);
|
||||
}
|
||||
|
||||
if (!EnableInvokeDynamic) {
|
||||
warning("JSR 292 invokedynamic is disabled in this JVM. Use -XX:+EnableInvokeDynamic to enable.");
|
||||
warning("JSR 292 invokedynamic is disabled in this JVM. Use -XX:+UnlockExperimentalVMOptions -XX:+EnableInvokeDynamic to enable.");
|
||||
return; // bind nothing
|
||||
}
|
||||
|
||||
|
||||
@ -32,8 +32,7 @@ class MethodHandles: AllStatic {
|
||||
// See also javaClasses for layouts java_dyn_Method{Handle,Type,Type::Form}.
|
||||
public:
|
||||
enum EntryKind {
|
||||
_check_mtype, // how a caller calls a MH
|
||||
_wrong_method_type, // what happens when there is a type mismatch
|
||||
_raise_exception, // stub for error generation from other stubs
|
||||
_invokestatic_mh, // how a MH emulates invokestatic
|
||||
_invokespecial_mh, // ditto for the other invokes...
|
||||
_invokevirtual_mh,
|
||||
@ -47,6 +46,7 @@ class MethodHandles: AllStatic {
|
||||
|
||||
_adapter_mh_first, // adapter sequence goes here...
|
||||
_adapter_retype_only = _adapter_mh_first + sun_dyn_AdapterMethodHandle::OP_RETYPE_ONLY,
|
||||
_adapter_retype_raw = _adapter_mh_first + sun_dyn_AdapterMethodHandle::OP_RETYPE_RAW,
|
||||
_adapter_check_cast = _adapter_mh_first + sun_dyn_AdapterMethodHandle::OP_CHECK_CAST,
|
||||
_adapter_prim_to_prim = _adapter_mh_first + sun_dyn_AdapterMethodHandle::OP_PRIM_TO_PRIM,
|
||||
_adapter_ref_to_prim = _adapter_mh_first + sun_dyn_AdapterMethodHandle::OP_REF_TO_PRIM,
|
||||
@ -113,6 +113,8 @@ class MethodHandles: AllStatic {
|
||||
static bool _enabled;
|
||||
static MethodHandleEntry* _entries[_EK_LIMIT];
|
||||
static const char* _entry_names[_EK_LIMIT+1];
|
||||
static jobject _raise_exception_method;
|
||||
|
||||
static bool ek_valid(EntryKind ek) { return (uint)ek < (uint)_EK_LIMIT; }
|
||||
static bool conv_op_valid(int op) { return (uint)op < (uint)CONV_OP_LIMIT; }
|
||||
|
||||
@ -131,6 +133,16 @@ class MethodHandles: AllStatic {
|
||||
_entries[ek] = me;
|
||||
}
|
||||
|
||||
static methodOop raise_exception_method() {
|
||||
oop rem = JNIHandles::resolve(_raise_exception_method);
|
||||
assert(rem == NULL || rem->is_method(), "");
|
||||
return (methodOop) rem;
|
||||
}
|
||||
static void set_raise_exception_method(methodOop rem) {
|
||||
assert(_raise_exception_method == NULL, "");
|
||||
_raise_exception_method = JNIHandles::make_global(Handle(rem));
|
||||
}
|
||||
|
||||
static jint adapter_conversion(int conv_op, BasicType src, BasicType dest,
|
||||
int stack_move = 0, int vminfo = 0) {
|
||||
assert(conv_op_valid(conv_op), "oob");
|
||||
@ -243,7 +255,7 @@ class MethodHandles: AllStatic {
|
||||
enum {
|
||||
// format of query to getConstant:
|
||||
GC_JVM_PUSH_LIMIT = 0,
|
||||
GC_JVM_STACK_MOVE_LIMIT = 1,
|
||||
GC_JVM_STACK_MOVE_UNIT = 1,
|
||||
|
||||
// format of result from getTarget / encode_target:
|
||||
ETF_HANDLE_OR_METHOD_NAME = 0, // all available data (immediate MH or method)
|
||||
@ -261,7 +273,8 @@ class MethodHandles: AllStatic {
|
||||
int insert_argnum, oop insert_type,
|
||||
int change_argnum, oop change_type,
|
||||
int delete_argnum,
|
||||
oop dst_mtype, int dst_beg, int dst_end);
|
||||
oop dst_mtype, int dst_beg, int dst_end,
|
||||
bool raw = false);
|
||||
static const char* check_method_type_insertion(oop src_mtype,
|
||||
int insert_argnum, oop insert_type,
|
||||
oop dst_mtype) {
|
||||
@ -278,29 +291,29 @@ class MethodHandles: AllStatic {
|
||||
change_argnum, change_type,
|
||||
-1, dst_mtype, 0, -1);
|
||||
}
|
||||
static const char* check_method_type_passthrough(oop src_mtype, oop dst_mtype) {
|
||||
static const char* check_method_type_passthrough(oop src_mtype, oop dst_mtype, bool raw) {
|
||||
oop no_ref = NULL;
|
||||
return check_method_type_change(src_mtype, 0, -1,
|
||||
-1, no_ref, -1, no_ref, -1,
|
||||
dst_mtype, 0, -1);
|
||||
dst_mtype, 0, -1, raw);
|
||||
}
|
||||
|
||||
// These checkers operate on pairs of argument or return types:
|
||||
static const char* check_argument_type_change(BasicType src_type, klassOop src_klass,
|
||||
BasicType dst_type, klassOop dst_klass,
|
||||
int argnum);
|
||||
int argnum, bool raw = false);
|
||||
|
||||
static const char* check_argument_type_change(oop src_type, oop dst_type,
|
||||
int argnum) {
|
||||
int argnum, bool raw = false) {
|
||||
klassOop src_klass = NULL, dst_klass = NULL;
|
||||
BasicType src_bt = java_lang_Class::as_BasicType(src_type, &src_klass);
|
||||
BasicType dst_bt = java_lang_Class::as_BasicType(dst_type, &dst_klass);
|
||||
return check_argument_type_change(src_bt, src_klass,
|
||||
dst_bt, dst_klass, argnum);
|
||||
dst_bt, dst_klass, argnum, raw);
|
||||
}
|
||||
|
||||
static const char* check_return_type_change(oop src_type, oop dst_type) {
|
||||
return check_argument_type_change(src_type, dst_type, -1);
|
||||
static const char* check_return_type_change(oop src_type, oop dst_type, bool raw = false) {
|
||||
return check_argument_type_change(src_type, dst_type, -1, raw);
|
||||
}
|
||||
|
||||
static const char* check_return_type_change(BasicType src_type, klassOop src_klass,
|
||||
@ -357,9 +370,10 @@ class MethodHandles: AllStatic {
|
||||
TRAPS);
|
||||
|
||||
static bool same_basic_type_for_arguments(BasicType src, BasicType dst,
|
||||
bool raw = false,
|
||||
bool for_return = false);
|
||||
static bool same_basic_type_for_returns(BasicType src, BasicType dst) {
|
||||
return same_basic_type_for_arguments(src, dst, true);
|
||||
static bool same_basic_type_for_returns(BasicType src, BasicType dst, bool raw = false) {
|
||||
return same_basic_type_for_arguments(src, dst, raw, true);
|
||||
}
|
||||
|
||||
enum { // arg_mask values
|
||||
|
||||
@ -594,6 +594,7 @@ static inline uint64_t cast_uint64_t(size_t x)
|
||||
\
|
||||
nonstatic_field(PcDesc, _pc_offset, int) \
|
||||
nonstatic_field(PcDesc, _scope_decode_offset, int) \
|
||||
nonstatic_field(PcDesc, _obj_decode_offset, int) \
|
||||
nonstatic_field(PcDesc, _flags, PcDesc::PcDescFlags) \
|
||||
\
|
||||
/***************************************************/ \
|
||||
|
||||
@ -1913,8 +1913,9 @@ void HeapDumper::dump_heap() {
|
||||
if (use_default_filename) {
|
||||
char fn[32];
|
||||
sprintf(fn, "java_pid%d", os::current_process_id());
|
||||
assert(strlen(base_path) + strlen(fn) < sizeof(base_path), "HeapDumpPath too long");
|
||||
assert(strlen(base_path) + strlen(fn) + strlen(".hprof") < sizeof(base_path), "HeapDumpPath too long");
|
||||
strcat(base_path, fn);
|
||||
strcat(base_path, ".hprof");
|
||||
}
|
||||
assert(strlen(base_path) < sizeof(my_path), "Buffer too small");
|
||||
strcpy(my_path, base_path);
|
||||
@ -1927,8 +1928,6 @@ void HeapDumper::dump_heap() {
|
||||
strcat(my_path, fn);
|
||||
}
|
||||
dump_file_seq++; // increment seq number for next time we dump
|
||||
assert(strlen(".hprof") + strlen(my_path) < sizeof(my_path), "HeapDumpPath too long");
|
||||
strcat(my_path, ".hprof");
|
||||
|
||||
HeapDumper dumper(false /* no GC before heap dump */,
|
||||
true /* send to tty */);
|
||||
|
||||
108
hotspot/test/compiler/6891750/Test6891750.java
Normal file
108
hotspot/test/compiler/6891750/Test6891750.java
Normal file
@ -0,0 +1,108 @@
|
||||
/*
|
||||
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 6891750
|
||||
* @summary deopt blob kills values in O5
|
||||
*
|
||||
* @run main Test6891750
|
||||
*/
|
||||
|
||||
abstract class Base6891750 extends Thread {
|
||||
abstract public long m();
|
||||
}
|
||||
class Other6891750 extends Base6891750 {
|
||||
public long m() {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public class Test6891750 extends Base6891750 {
|
||||
Base6891750 d;
|
||||
volatile long value = 9;
|
||||
|
||||
static int limit = 400000;
|
||||
|
||||
Test6891750() {
|
||||
d = this;
|
||||
|
||||
}
|
||||
public long m() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public long test(boolean doit) {
|
||||
if (doit) {
|
||||
long total0 = 0;
|
||||
long total1 = 0;
|
||||
long total2 = 0;
|
||||
long total3 = 0;
|
||||
long total4 = 0;
|
||||
long total5 = 0;
|
||||
long total6 = 0;
|
||||
long total7 = 0;
|
||||
long total8 = 0;
|
||||
long total9 = 0;
|
||||
for (int i = 0; i < limit; i++) {
|
||||
total0 += d.m();
|
||||
total1 += d.m();
|
||||
total2 += d.m();
|
||||
total3 += d.m();
|
||||
total4 += d.m();
|
||||
total5 += d.m();
|
||||
total6 += d.m();
|
||||
total7 += d.m();
|
||||
total8 += d.m();
|
||||
total9 += d.m();
|
||||
}
|
||||
return total0 + total1 + total2 + total3 + total4 + total5 + total6 + total7 + total8 + total9;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
long result = test(true);
|
||||
for (int i = 0; i < 300; i++) {
|
||||
long result2 = test(true);
|
||||
if (result != result2) {
|
||||
throw new InternalError(result + " != " + result2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
Test6891750 Test6891750 = new Test6891750();
|
||||
// warm it up
|
||||
for (int i = 0; i < 200000; i++) {
|
||||
Test6891750.test(false);
|
||||
}
|
||||
// set in off running
|
||||
Test6891750.start();
|
||||
Thread.sleep(2000);
|
||||
|
||||
// Load a class to invalidate CHA
|
||||
new Other6891750();
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,6 @@
|
||||
^build/
|
||||
^dist/
|
||||
^drop/
|
||||
^drop_included/
|
||||
^webrev/
|
||||
^nbproject/private/
|
||||
|
||||
@ -49,3 +49,4 @@ ff94d8ce0daded647bb326630e643d010357afce jdk7-b71
|
||||
37c805b6156fd492c12301688b54a6bcca39e729 jdk7-b72
|
||||
feb05980f9f2964e6bc2b3a8532f9b3054c2289b jdk7-b73
|
||||
ea7b88c676dd8b269bc858a4a17c14dc96c8aed1 jdk7-b74
|
||||
555fb78ee4cebed082ca7ddabff46d2e5b4c9026 jdk7-b75
|
||||
|
||||
@ -68,32 +68,14 @@
|
||||
</replaceregexp>
|
||||
</target>
|
||||
|
||||
<!-- Try to get drop sources, set property use.orig.src.dir if no drops. -->
|
||||
<!-- Try to get drop sources. -->
|
||||
<target name="-set-props"
|
||||
depends="init,
|
||||
jaxp_src-update">
|
||||
<condition property="use.orig.src.dir">
|
||||
<and>
|
||||
<available file="${orig.src.dir}" type="dir"/>
|
||||
<not>
|
||||
<and>
|
||||
<available file="${jaxp_src.src.dir}" type="dir"/>
|
||||
</and>
|
||||
</not>
|
||||
</and>
|
||||
</condition>
|
||||
</target>
|
||||
|
||||
<!-- Set up source to use orig.src.dir, if use.orig.src.dir defined. -->
|
||||
<target name="-use-orig" depends="-set-props" if="use.orig.src.dir">
|
||||
<property name="primary.src.dir" value="${orig.src.dir}"/>
|
||||
<path id="src.dir.id">
|
||||
<pathelement path="${primary.src.dir}"/>
|
||||
</path>
|
||||
</target>
|
||||
|
||||
<!-- Set up source to use drop.dir, if use.orig.src.dir not defined. -->
|
||||
<target name="-use-drop" depends="-set-props" unless="use.orig.src.dir">
|
||||
<!-- Set up source to use drop.dir. -->
|
||||
<target name="-use-drop" depends="-set-props">
|
||||
<property name="primary.src.dir" value="${jaxp_src.src.dir}"/>
|
||||
<path id="src.dir.id">
|
||||
<pathelement path="${primary.src.dir}"/>
|
||||
@ -102,24 +84,19 @@
|
||||
|
||||
<!-- Source directory selection. -->
|
||||
<target name="-init-src-dirs"
|
||||
depends="init, -use-orig, -use-drop">
|
||||
depends="init, -use-drop">
|
||||
<echo message="Using primary.src.dir=${primary.src.dir}"/>
|
||||
<pathconvert property="src.list.id" refid="src.dir.id"/>
|
||||
<echo message="Using src.dir.id=${src.list.id}"/>
|
||||
</target>
|
||||
|
||||
<!-- Create orig src.zip. -->
|
||||
<target name="-orig-src-zip" depends="init, -set-props" if="use.orig.src.dir">
|
||||
<zip file="${dist.src.zip}" basedir="${primary.src.dir}"/>
|
||||
</target>
|
||||
|
||||
<!-- Create drop src.zip. -->
|
||||
<target name="-drop-src-zip" depends="init, -set-props" unless="use.orig.src.dir">
|
||||
<target name="-drop-src-zip" depends="init, -set-props">
|
||||
<zip file="${dist.src.zip}" basedir="${primary.src.dir}"/>
|
||||
</target>
|
||||
|
||||
<!-- Create src.zip. -->
|
||||
<target name="-dist-src-zip" depends="init, -orig-src-zip, -drop-src-zip">
|
||||
<target name="-dist-src-zip" depends="init, -drop-src-zip">
|
||||
</target>
|
||||
|
||||
</project>
|
||||
|
||||
@ -34,7 +34,7 @@
|
||||
|
||||
<!-- Location where the copied bundle lands. -->
|
||||
<property name="@DROP@.bundle.copy"
|
||||
value="${drop.dir}/bundles/${@DROP@.bundle.name}"/>
|
||||
value="${drop.expanded.dir}/bundles/${@DROP@.bundle.name}"/>
|
||||
|
||||
<!-- Root of exploded area. -->
|
||||
<property name="@DROP@.root.dir" value="${drop.dir}/@DROP@"/>
|
||||
@ -43,10 +43,13 @@
|
||||
<!-- To see if the drop areas are ready. (ignoring bundles) -->
|
||||
<target name="-@DROP@-ready">
|
||||
<condition property="@DROP@.ready">
|
||||
<and>
|
||||
<available file="${@DROP@.root.dir}" type="dir"/>
|
||||
<available file="${@DROP@.root.dir}/PATCHED" type="file"/>
|
||||
</and>
|
||||
<or>
|
||||
<available file="${drop.included.dir}" type="dir"/>
|
||||
<and>
|
||||
<available file="${@DROP@.root.dir}" type="dir"/>
|
||||
<available file="${@DROP@.root.dir}/PATCHED" type="file"/>
|
||||
</and>
|
||||
</or>
|
||||
</condition>
|
||||
</target>
|
||||
|
||||
@ -72,7 +75,6 @@
|
||||
<target name="-@DROP@-url-should-be-used" unless="@DROP@.url.should.be.used">
|
||||
<condition property="@DROP@.url.should.be.used">
|
||||
<and>
|
||||
<http url="${@DROP@.master.bundle.url.base}"/>
|
||||
<not>
|
||||
<isset property="@DROP@.master.bundle.copy.exists"/>
|
||||
</not>
|
||||
@ -106,6 +108,16 @@
|
||||
<delete dir="${@DROP@.root.dir}"/>
|
||||
<delete dir="${@DROP@.root.dir}-temp"/>
|
||||
<mkdir dir="${@DROP@.root.dir}-temp"/>
|
||||
<checksum file="${@DROP@.bundle.copy}"
|
||||
property="@DROP@.bundle.md5.checksum.is"/>
|
||||
<condition property="@DROP@.bundle.md5.checksum.good">
|
||||
<equals arg1="${@DROP@.bundle.md5.checksum}"
|
||||
arg2="${@DROP@.bundle.md5.checksum.is}"/>
|
||||
</condition>
|
||||
<fail unless="@DROP@.bundle.md5.checksum.good">
|
||||
Checksum on file ${@DROP@.bundle.copy} is
|
||||
${@DROP@.bundle.md5.checksum.is}, not ${@DROP@.bundle.md5.checksum}
|
||||
</fail>
|
||||
<unzip src="${@DROP@.bundle.copy}" dest="${@DROP@.root.dir}-temp"/>
|
||||
<move file="${@DROP@.root.dir}-temp" tofile="${@DROP@.root.dir}"/>
|
||||
<touch>
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
|
||||
# Base locations where bundles are located
|
||||
slashjava=/java
|
||||
devtools=${slashjava}/devtools
|
||||
drops.dir=${slashjava}/devtools/share/jdk7-drops
|
||||
|
||||
# This is the JDK used to build and run the bootstrap version of javac.
|
||||
# The bootstrap javac is used to compile both boostrap versions of the
|
||||
@ -64,16 +64,15 @@ dist.lib.dir=${dist.dir}/lib
|
||||
dist.classes.jar=${dist.lib.dir}/classes.jar
|
||||
dist.src.zip=${dist.lib.dir}/src.zip
|
||||
|
||||
# Where all drop sources live
|
||||
drop.dir=./drop
|
||||
# Where all drop sources get placed when downloaded and unzipped
|
||||
drop.expanded.dir=${output.dir}/drop
|
||||
|
||||
# Location if the sources were included already
|
||||
drop.included.dir=./drop_included
|
||||
|
||||
# Where patches to drop bundle sources live
|
||||
patches.dir=patches
|
||||
|
||||
# Original source area
|
||||
orig.dir=src
|
||||
orig.src.dir=${orig.dir}/share/classes
|
||||
|
||||
# Sanity information
|
||||
sanity.info= Sanity Settings:${line.separator}\
|
||||
ant.home=${ant.home}${line.separator}\
|
||||
@ -98,6 +97,7 @@ sanity.info= Sanity Settings:${line.separator}\
|
||||
build.dir=${build.dir}${line.separator}\
|
||||
dist.dir=${dist.dir}${line.separator}\
|
||||
drop.dir=${drop.dir}${line.separator}\
|
||||
drops.dir=${drops.dir}${line.separator}\
|
||||
${line.separator}
|
||||
|
||||
#------------------------------------------------------------
|
||||
|
||||
@ -49,6 +49,13 @@
|
||||
<!-- Project build properties. -->
|
||||
<property file="build.properties"/>
|
||||
|
||||
<!-- See if drop sources were included. -->
|
||||
<condition property="drop.dir"
|
||||
value="${drop.included.dir}"
|
||||
else="${drop.expanded.dir}">
|
||||
<available file="${drop.included.dir}" type="dir"/>
|
||||
</condition>
|
||||
|
||||
<!-- Get shared targets. -->
|
||||
<import file="build-defs.xml"/>
|
||||
|
||||
@ -131,6 +138,16 @@
|
||||
description="Populate all source file directories">
|
||||
</target>
|
||||
|
||||
<!-- Populate drop_included area. -->
|
||||
<target name="drop_included"
|
||||
depends="clobber"
|
||||
description="Populate all source file directories">
|
||||
<delete dir="${drop.included.dir}"/>
|
||||
<antcall target="source"/>
|
||||
<move file="${drop.expanded.dir}" tofile="${drop.included.dir}"/>
|
||||
<delete dir="${drop.included.dir}/bundles"/>
|
||||
</target>
|
||||
|
||||
<!-- Clean up compiled files. -->
|
||||
<target name="clean"
|
||||
description="Delete all generated files">
|
||||
@ -142,7 +159,7 @@
|
||||
<target name="clobber"
|
||||
depends="clean"
|
||||
description="Delete all generated files, including imported sources">
|
||||
<delete dir="${drop.dir}"/>
|
||||
<delete dir="${drop.expanded.dir}"/>
|
||||
</target>
|
||||
|
||||
<target name="-banner">
|
||||
|
||||
@ -23,12 +23,12 @@
|
||||
# have any questions.
|
||||
#
|
||||
|
||||
drops.master.copy.base=${devtools}/share/jdk7-drops
|
||||
drops.master.url.base=http://kenai.com/projects/jdk7-drops/downloads/download
|
||||
drops.master.copy.base=${drops.dir}
|
||||
drops.master.url.base=https://jaxp.dev.java.net/files/documents/913/144160
|
||||
|
||||
jaxp_src.bundle.name=jdk7-jaxp-2009_09_28.zip
|
||||
jaxp_src.bundle.name=jdk7-jaxp-m5.zip
|
||||
jaxp_src.bundle.md5.checksum=8b58ce7919cda8e32a9afc5cb4b58bb1
|
||||
jaxp_src.master.bundle.dir=${drops.master.copy.base}
|
||||
#jaxp_src.bundle.url.base=https://jaxp.dev.java.net/files/documents/913/142147
|
||||
jaxp_src.master.bundle.url.base=${drops.master.url.base}
|
||||
|
||||
jaxp_tests.bundle.name=jdk7-jaxp-tests-2009_08_28.zip
|
||||
|
||||
@ -86,15 +86,22 @@ else
|
||||
endif
|
||||
endif
|
||||
|
||||
# Where is /java/devtools in case we need it
|
||||
ifdef ALT_JDK_DEVTOOLS_DIR
|
||||
_DEVTOOLS = $(ALT_JDK_DEVTOOLS_DIR)
|
||||
# Do we have the drops already downloaded?
|
||||
# Check ALT_DROPS_DIR for a full path first,
|
||||
# before trying to use the devtools path,
|
||||
# either via ALT_JDK_DEVTOOLS_DIR or /java/devtools.
|
||||
ifdef ALT_DROPS_DIR
|
||||
DROPS_DIR = $(ALT_DROPS_DIR)
|
||||
else
|
||||
_DEVTOOLS = $(_SLASHJAVA)/devtools
|
||||
ifdef ALT_JDK_DEVTOOLS_DIR
|
||||
DROPS_DIR = $(ALT_JDK_DEVTOOLS_DIR)/share/jdk7-drops
|
||||
else
|
||||
DROPS_DIR = $(_SLASHJAVA)/devtools/share/jdk7-drops
|
||||
endif
|
||||
endif
|
||||
|
||||
# Add in path to devtools
|
||||
ANT_OPTIONS += -Ddevtools=$(_DEVTOOLS)
|
||||
# Add in path to drops already downloaded
|
||||
ANT_OPTIONS += -Ddrops.dir=$(DROPS_DIR)
|
||||
|
||||
ifdef ALT_OUTPUTDIR
|
||||
OUTPUTDIR = $(ALT_OUTPUTDIR)
|
||||
@ -130,7 +137,7 @@ endif
|
||||
default: all
|
||||
|
||||
# All ant targets of interest
|
||||
ANT_TARGETS = all source build dist clobber clean sanity
|
||||
ANT_TARGETS = all source drop_included build dist clobber clean sanity
|
||||
|
||||
# Create a make target for each
|
||||
$(ANT_TARGETS):
|
||||
|
||||
@ -1,45 +0,0 @@
|
||||
/*
|
||||
* Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package com.sun.java_cup.internal.runtime;
|
||||
|
||||
/**
|
||||
* Defines the Scanner interface, which CUP uses in the default
|
||||
* implementation of <code>lr_parser.scan()</code>. Integration
|
||||
* of scanners implementing <code>Scanner</code> is facilitated.
|
||||
*
|
||||
* @author David MacMahon <davidm@smartsc.com>
|
||||
*/
|
||||
|
||||
/* *************************************************
|
||||
Interface Scanner
|
||||
|
||||
Declares the next_token() method that should be
|
||||
implemented by scanners. This method is typically
|
||||
called by lr_parser.scan().
|
||||
***************************************************/
|
||||
public interface Scanner {
|
||||
public Symbol next_token() throws java.lang.Exception;
|
||||
}
|
||||
@ -1,129 +0,0 @@
|
||||
/*
|
||||
* Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package com.sun.java_cup.internal.runtime;
|
||||
|
||||
/**
|
||||
* Defines the Symbol class, which is used to represent all terminals
|
||||
* and nonterminals while parsing. The lexer should pass CUP Symbols
|
||||
* and CUP returns a Symbol.
|
||||
*
|
||||
* @author Frank Flannery
|
||||
*/
|
||||
|
||||
/* ****************************************************************
|
||||
Class Symbol
|
||||
what the parser expects to receive from the lexer.
|
||||
the token is identified as follows:
|
||||
sym: the symbol type
|
||||
parse_state: the parse state.
|
||||
value: is the lexical value of type Object
|
||||
left : is the left position in the original input file
|
||||
right: is the right position in the original input file
|
||||
******************************************************************/
|
||||
|
||||
public class Symbol {
|
||||
|
||||
/*******************************
|
||||
Constructor for l,r values
|
||||
*******************************/
|
||||
|
||||
public Symbol(int id, int l, int r, Object o) {
|
||||
this(id);
|
||||
left = l;
|
||||
right = r;
|
||||
value = o;
|
||||
}
|
||||
|
||||
/*******************************
|
||||
Constructor for no l,r values
|
||||
********************************/
|
||||
|
||||
public Symbol(int id, Object o) {
|
||||
this(id);
|
||||
left = -1;
|
||||
right = -1;
|
||||
value = o;
|
||||
}
|
||||
|
||||
/*****************************
|
||||
Constructor for no value
|
||||
***************************/
|
||||
|
||||
public Symbol(int sym_num, int l, int r) {
|
||||
sym = sym_num;
|
||||
left = l;
|
||||
right = r;
|
||||
value = null;
|
||||
}
|
||||
|
||||
/***********************************
|
||||
Constructor for no value or l,r
|
||||
***********************************/
|
||||
|
||||
public Symbol(int sym_num) {
|
||||
this(sym_num, -1);
|
||||
left = -1;
|
||||
right = -1;
|
||||
value = null;
|
||||
}
|
||||
|
||||
/***********************************
|
||||
Constructor to give a start state
|
||||
***********************************/
|
||||
public Symbol(int sym_num, int state)
|
||||
{
|
||||
sym = sym_num;
|
||||
parse_state = state;
|
||||
}
|
||||
|
||||
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
|
||||
|
||||
/** The symbol number of the terminal or non terminal being represented */
|
||||
public int sym;
|
||||
|
||||
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
|
||||
|
||||
/** The parse state to be recorded on the parse stack with this symbol.
|
||||
* This field is for the convenience of the parser and shouldn't be
|
||||
* modified except by the parser.
|
||||
*/
|
||||
public int parse_state;
|
||||
/** This allows us to catch some errors caused by scanners recycling
|
||||
* symbols. For the use of the parser only. [CSA, 23-Jul-1999] */
|
||||
boolean used_by_parser = false;
|
||||
|
||||
/*******************************
|
||||
The data passed to parser
|
||||
*******************************/
|
||||
|
||||
public int left, right;
|
||||
public Object value;
|
||||
|
||||
/*****************************
|
||||
Printing this token out. (Override for pretty-print).
|
||||
****************************/
|
||||
public String toString() { return "#"+sym; }
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,169 +0,0 @@
|
||||
/*
|
||||
* Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
|
||||
package com.sun.java_cup.internal.runtime;
|
||||
|
||||
import java.util.Stack;
|
||||
|
||||
/** This class implements a temporary or "virtual" parse stack that
|
||||
* replaces the top portion of the actual parse stack (the part that
|
||||
* has been changed by some set of operations) while maintaining its
|
||||
* original contents. This data structure is used when the parse needs
|
||||
* to "parse ahead" to determine if a given error recovery attempt will
|
||||
* allow the parse to continue far enough to consider it successful. Once
|
||||
* success or failure of parse ahead is determined the system then
|
||||
* reverts to the original parse stack (which has not actually been
|
||||
* modified). Since parse ahead does not execute actions, only parse
|
||||
* state is maintained on the virtual stack, not full Symbol objects.
|
||||
*
|
||||
* @see com.sun.java_cup.internal.runtime.lr_parser
|
||||
* @author Frank Flannery
|
||||
*/
|
||||
|
||||
public class virtual_parse_stack {
|
||||
/*-----------------------------------------------------------*/
|
||||
/*--- Constructor(s) ----------------------------------------*/
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/** Constructor to build a virtual stack out of a real stack. */
|
||||
public virtual_parse_stack(Stack shadowing_stack) throws java.lang.Exception
|
||||
{
|
||||
/* sanity check */
|
||||
if (shadowing_stack == null)
|
||||
throw new Exception(
|
||||
"Internal parser error: attempt to create null virtual stack");
|
||||
|
||||
/* set up our internals */
|
||||
real_stack = shadowing_stack;
|
||||
vstack = new Stack();
|
||||
real_next = 0;
|
||||
|
||||
/* get one element onto the virtual portion of the stack */
|
||||
get_from_real();
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
/*--- (Access to) Instance Variables ------------------------*/
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/** The real stack that we shadow. This is accessed when we move off
|
||||
* the bottom of the virtual portion of the stack, but is always left
|
||||
* unmodified.
|
||||
*/
|
||||
protected Stack real_stack;
|
||||
|
||||
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
|
||||
|
||||
/** Top of stack indicator for where we leave off in the real stack.
|
||||
* This is measured from top of stack, so 0 would indicate that no
|
||||
* elements have been "moved" from the real to virtual stack.
|
||||
*/
|
||||
protected int real_next;
|
||||
|
||||
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
|
||||
|
||||
/** The virtual top portion of the stack. This stack contains Integer
|
||||
* objects with state numbers. This stack shadows the top portion
|
||||
* of the real stack within the area that has been modified (via operations
|
||||
* on the virtual stack). When this portion of the stack becomes empty we
|
||||
* transfer elements from the underlying stack onto this stack.
|
||||
*/
|
||||
protected Stack vstack;
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
/*--- General Methods ---------------------------------------*/
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/** Transfer an element from the real to the virtual stack. This assumes
|
||||
* that the virtual stack is currently empty.
|
||||
*/
|
||||
protected void get_from_real()
|
||||
{
|
||||
Symbol stack_sym;
|
||||
|
||||
/* don't transfer if the real stack is empty */
|
||||
if (real_next >= real_stack.size()) return;
|
||||
|
||||
/* get a copy of the first Symbol we have not transfered */
|
||||
stack_sym = (Symbol)real_stack.elementAt(real_stack.size()-1-real_next);
|
||||
|
||||
/* record the transfer */
|
||||
real_next++;
|
||||
|
||||
/* put the state number from the Symbol onto the virtual stack */
|
||||
vstack.push(new Integer(stack_sym.parse_state));
|
||||
}
|
||||
|
||||
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
|
||||
|
||||
/** Indicate whether the stack is empty. */
|
||||
public boolean empty()
|
||||
{
|
||||
/* if vstack is empty then we were unable to transfer onto it and
|
||||
the whole thing is empty. */
|
||||
return vstack.empty();
|
||||
}
|
||||
|
||||
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
|
||||
|
||||
/** Return value on the top of the stack (without popping it). */
|
||||
public int top() throws java.lang.Exception
|
||||
{
|
||||
if (vstack.empty())
|
||||
throw new Exception(
|
||||
"Internal parser error: top() called on empty virtual stack");
|
||||
|
||||
return ((Integer)vstack.peek()).intValue();
|
||||
}
|
||||
|
||||
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
|
||||
|
||||
/** Pop the stack. */
|
||||
public void pop() throws java.lang.Exception
|
||||
{
|
||||
if (vstack.empty())
|
||||
throw new Exception(
|
||||
"Internal parser error: pop from empty virtual stack");
|
||||
|
||||
/* pop it */
|
||||
vstack.pop();
|
||||
|
||||
/* if we are now empty transfer an element (if there is one) */
|
||||
if (vstack.empty())
|
||||
get_from_real();
|
||||
}
|
||||
|
||||
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
|
||||
|
||||
/** Push a state number onto the stack. */
|
||||
public void push(int state_num)
|
||||
{
|
||||
vstack.push(new Integer(state_num));
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
}
|
||||
@ -1,788 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Constants for the project, mostly defined in the JVM specification.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
*/
|
||||
public interface Constants {
|
||||
/** Major and minor version of the code.
|
||||
*/
|
||||
public final static short MAJOR_1_1 = 45;
|
||||
public final static short MINOR_1_1 = 3;
|
||||
public final static short MAJOR_1_2 = 46;
|
||||
public final static short MINOR_1_2 = 0;
|
||||
public final static short MAJOR_1_3 = 47;
|
||||
public final static short MINOR_1_3 = 0;
|
||||
public final static short MAJOR = MAJOR_1_1; // Defaults
|
||||
public final static short MINOR = MINOR_1_1;
|
||||
|
||||
/** Maximum value for an unsigned short.
|
||||
*/
|
||||
public final static int MAX_SHORT = 65535; // 2^16 - 1
|
||||
|
||||
/** Maximum value for an unsigned byte.
|
||||
*/
|
||||
public final static int MAX_BYTE = 255; // 2^8 - 1
|
||||
|
||||
/** Access flags for classes, fields and methods.
|
||||
*/
|
||||
public final static short ACC_PUBLIC = 0x0001;
|
||||
public final static short ACC_PRIVATE = 0x0002;
|
||||
public final static short ACC_PROTECTED = 0x0004;
|
||||
public final static short ACC_STATIC = 0x0008;
|
||||
|
||||
public final static short ACC_FINAL = 0x0010;
|
||||
public final static short ACC_SYNCHRONIZED = 0x0020;
|
||||
public final static short ACC_VOLATILE = 0x0040;
|
||||
public final static short ACC_TRANSIENT = 0x0080;
|
||||
|
||||
public final static short ACC_NATIVE = 0x0100;
|
||||
public final static short ACC_INTERFACE = 0x0200;
|
||||
public final static short ACC_ABSTRACT = 0x0400;
|
||||
public final static short ACC_STRICT = 0x0800;
|
||||
|
||||
// Applies to classes compiled by new compilers only
|
||||
public final static short ACC_SUPER = 0x0020;
|
||||
|
||||
public final static short MAX_ACC_FLAG = ACC_STRICT;
|
||||
|
||||
public final static String[] ACCESS_NAMES = {
|
||||
"public", "private", "protected", "static", "final", "synchronized",
|
||||
"volatile", "transient", "native", "interface", "abstract", "strictfp"
|
||||
};
|
||||
|
||||
/** Tags in constant pool to denote type of constant.
|
||||
*/
|
||||
public final static byte CONSTANT_Utf8 = 1;
|
||||
public final static byte CONSTANT_Integer = 3;
|
||||
public final static byte CONSTANT_Float = 4;
|
||||
public final static byte CONSTANT_Long = 5;
|
||||
public final static byte CONSTANT_Double = 6;
|
||||
public final static byte CONSTANT_Class = 7;
|
||||
public final static byte CONSTANT_Fieldref = 9;
|
||||
public final static byte CONSTANT_String = 8;
|
||||
public final static byte CONSTANT_Methodref = 10;
|
||||
public final static byte CONSTANT_InterfaceMethodref = 11;
|
||||
public final static byte CONSTANT_NameAndType = 12;
|
||||
|
||||
public final static String[] CONSTANT_NAMES = {
|
||||
"", "CONSTANT_Utf8", "", "CONSTANT_Integer",
|
||||
"CONSTANT_Float", "CONSTANT_Long", "CONSTANT_Double",
|
||||
"CONSTANT_Class", "CONSTANT_String", "CONSTANT_Fieldref",
|
||||
"CONSTANT_Methodref", "CONSTANT_InterfaceMethodref",
|
||||
"CONSTANT_NameAndType" };
|
||||
|
||||
/** The name of the static initializer, also called "class
|
||||
* initialization method" or "interface initialization
|
||||
* method". This is "<clinit>".
|
||||
*/
|
||||
public final static String STATIC_INITIALIZER_NAME = "<clinit>";
|
||||
|
||||
/** The name of every constructor method in a class, also called
|
||||
* "instance initialization method". This is "<init>".
|
||||
*/
|
||||
public final static String CONSTRUCTOR_NAME = "<init>";
|
||||
|
||||
/** The names of the interfaces implemented by arrays */
|
||||
public final static String[] INTERFACES_IMPLEMENTED_BY_ARRAYS = {"java.lang.Cloneable", "java.io.Serializable"};
|
||||
|
||||
/**
|
||||
* Limitations of the Java Virtual Machine.
|
||||
* See The Java Virtual Machine Specification, Second Edition, page 152, chapter 4.10.
|
||||
*/
|
||||
public static final int MAX_CP_ENTRIES = 65535;
|
||||
public static final int MAX_CODE_SIZE = 65536; //bytes
|
||||
|
||||
/** Java VM opcodes.
|
||||
*/
|
||||
public static final short NOP = 0;
|
||||
public static final short ACONST_NULL = 1;
|
||||
public static final short ICONST_M1 = 2;
|
||||
public static final short ICONST_0 = 3;
|
||||
public static final short ICONST_1 = 4;
|
||||
public static final short ICONST_2 = 5;
|
||||
public static final short ICONST_3 = 6;
|
||||
public static final short ICONST_4 = 7;
|
||||
public static final short ICONST_5 = 8;
|
||||
public static final short LCONST_0 = 9;
|
||||
public static final short LCONST_1 = 10;
|
||||
public static final short FCONST_0 = 11;
|
||||
public static final short FCONST_1 = 12;
|
||||
public static final short FCONST_2 = 13;
|
||||
public static final short DCONST_0 = 14;
|
||||
public static final short DCONST_1 = 15;
|
||||
public static final short BIPUSH = 16;
|
||||
public static final short SIPUSH = 17;
|
||||
public static final short LDC = 18;
|
||||
public static final short LDC_W = 19;
|
||||
public static final short LDC2_W = 20;
|
||||
public static final short ILOAD = 21;
|
||||
public static final short LLOAD = 22;
|
||||
public static final short FLOAD = 23;
|
||||
public static final short DLOAD = 24;
|
||||
public static final short ALOAD = 25;
|
||||
public static final short ILOAD_0 = 26;
|
||||
public static final short ILOAD_1 = 27;
|
||||
public static final short ILOAD_2 = 28;
|
||||
public static final short ILOAD_3 = 29;
|
||||
public static final short LLOAD_0 = 30;
|
||||
public static final short LLOAD_1 = 31;
|
||||
public static final short LLOAD_2 = 32;
|
||||
public static final short LLOAD_3 = 33;
|
||||
public static final short FLOAD_0 = 34;
|
||||
public static final short FLOAD_1 = 35;
|
||||
public static final short FLOAD_2 = 36;
|
||||
public static final short FLOAD_3 = 37;
|
||||
public static final short DLOAD_0 = 38;
|
||||
public static final short DLOAD_1 = 39;
|
||||
public static final short DLOAD_2 = 40;
|
||||
public static final short DLOAD_3 = 41;
|
||||
public static final short ALOAD_0 = 42;
|
||||
public static final short ALOAD_1 = 43;
|
||||
public static final short ALOAD_2 = 44;
|
||||
public static final short ALOAD_3 = 45;
|
||||
public static final short IALOAD = 46;
|
||||
public static final short LALOAD = 47;
|
||||
public static final short FALOAD = 48;
|
||||
public static final short DALOAD = 49;
|
||||
public static final short AALOAD = 50;
|
||||
public static final short BALOAD = 51;
|
||||
public static final short CALOAD = 52;
|
||||
public static final short SALOAD = 53;
|
||||
public static final short ISTORE = 54;
|
||||
public static final short LSTORE = 55;
|
||||
public static final short FSTORE = 56;
|
||||
public static final short DSTORE = 57;
|
||||
public static final short ASTORE = 58;
|
||||
public static final short ISTORE_0 = 59;
|
||||
public static final short ISTORE_1 = 60;
|
||||
public static final short ISTORE_2 = 61;
|
||||
public static final short ISTORE_3 = 62;
|
||||
public static final short LSTORE_0 = 63;
|
||||
public static final short LSTORE_1 = 64;
|
||||
public static final short LSTORE_2 = 65;
|
||||
public static final short LSTORE_3 = 66;
|
||||
public static final short FSTORE_0 = 67;
|
||||
public static final short FSTORE_1 = 68;
|
||||
public static final short FSTORE_2 = 69;
|
||||
public static final short FSTORE_3 = 70;
|
||||
public static final short DSTORE_0 = 71;
|
||||
public static final short DSTORE_1 = 72;
|
||||
public static final short DSTORE_2 = 73;
|
||||
public static final short DSTORE_3 = 74;
|
||||
public static final short ASTORE_0 = 75;
|
||||
public static final short ASTORE_1 = 76;
|
||||
public static final short ASTORE_2 = 77;
|
||||
public static final short ASTORE_3 = 78;
|
||||
public static final short IASTORE = 79;
|
||||
public static final short LASTORE = 80;
|
||||
public static final short FASTORE = 81;
|
||||
public static final short DASTORE = 82;
|
||||
public static final short AASTORE = 83;
|
||||
public static final short BASTORE = 84;
|
||||
public static final short CASTORE = 85;
|
||||
public static final short SASTORE = 86;
|
||||
public static final short POP = 87;
|
||||
public static final short POP2 = 88;
|
||||
public static final short DUP = 89;
|
||||
public static final short DUP_X1 = 90;
|
||||
public static final short DUP_X2 = 91;
|
||||
public static final short DUP2 = 92;
|
||||
public static final short DUP2_X1 = 93;
|
||||
public static final short DUP2_X2 = 94;
|
||||
public static final short SWAP = 95;
|
||||
public static final short IADD = 96;
|
||||
public static final short LADD = 97;
|
||||
public static final short FADD = 98;
|
||||
public static final short DADD = 99;
|
||||
public static final short ISUB = 100;
|
||||
public static final short LSUB = 101;
|
||||
public static final short FSUB = 102;
|
||||
public static final short DSUB = 103;
|
||||
public static final short IMUL = 104;
|
||||
public static final short LMUL = 105;
|
||||
public static final short FMUL = 106;
|
||||
public static final short DMUL = 107;
|
||||
public static final short IDIV = 108;
|
||||
public static final short LDIV = 109;
|
||||
public static final short FDIV = 110;
|
||||
public static final short DDIV = 111;
|
||||
public static final short IREM = 112;
|
||||
public static final short LREM = 113;
|
||||
public static final short FREM = 114;
|
||||
public static final short DREM = 115;
|
||||
public static final short INEG = 116;
|
||||
public static final short LNEG = 117;
|
||||
public static final short FNEG = 118;
|
||||
public static final short DNEG = 119;
|
||||
public static final short ISHL = 120;
|
||||
public static final short LSHL = 121;
|
||||
public static final short ISHR = 122;
|
||||
public static final short LSHR = 123;
|
||||
public static final short IUSHR = 124;
|
||||
public static final short LUSHR = 125;
|
||||
public static final short IAND = 126;
|
||||
public static final short LAND = 127;
|
||||
public static final short IOR = 128;
|
||||
public static final short LOR = 129;
|
||||
public static final short IXOR = 130;
|
||||
public static final short LXOR = 131;
|
||||
public static final short IINC = 132;
|
||||
public static final short I2L = 133;
|
||||
public static final short I2F = 134;
|
||||
public static final short I2D = 135;
|
||||
public static final short L2I = 136;
|
||||
public static final short L2F = 137;
|
||||
public static final short L2D = 138;
|
||||
public static final short F2I = 139;
|
||||
public static final short F2L = 140;
|
||||
public static final short F2D = 141;
|
||||
public static final short D2I = 142;
|
||||
public static final short D2L = 143;
|
||||
public static final short D2F = 144;
|
||||
public static final short I2B = 145;
|
||||
public static final short INT2BYTE = 145; // Old notion
|
||||
public static final short I2C = 146;
|
||||
public static final short INT2CHAR = 146; // Old notion
|
||||
public static final short I2S = 147;
|
||||
public static final short INT2SHORT = 147; // Old notion
|
||||
public static final short LCMP = 148;
|
||||
public static final short FCMPL = 149;
|
||||
public static final short FCMPG = 150;
|
||||
public static final short DCMPL = 151;
|
||||
public static final short DCMPG = 152;
|
||||
public static final short IFEQ = 153;
|
||||
public static final short IFNE = 154;
|
||||
public static final short IFLT = 155;
|
||||
public static final short IFGE = 156;
|
||||
public static final short IFGT = 157;
|
||||
public static final short IFLE = 158;
|
||||
public static final short IF_ICMPEQ = 159;
|
||||
public static final short IF_ICMPNE = 160;
|
||||
public static final short IF_ICMPLT = 161;
|
||||
public static final short IF_ICMPGE = 162;
|
||||
public static final short IF_ICMPGT = 163;
|
||||
public static final short IF_ICMPLE = 164;
|
||||
public static final short IF_ACMPEQ = 165;
|
||||
public static final short IF_ACMPNE = 166;
|
||||
public static final short GOTO = 167;
|
||||
public static final short JSR = 168;
|
||||
public static final short RET = 169;
|
||||
public static final short TABLESWITCH = 170;
|
||||
public static final short LOOKUPSWITCH = 171;
|
||||
public static final short IRETURN = 172;
|
||||
public static final short LRETURN = 173;
|
||||
public static final short FRETURN = 174;
|
||||
public static final short DRETURN = 175;
|
||||
public static final short ARETURN = 176;
|
||||
public static final short RETURN = 177;
|
||||
public static final short GETSTATIC = 178;
|
||||
public static final short PUTSTATIC = 179;
|
||||
public static final short GETFIELD = 180;
|
||||
public static final short PUTFIELD = 181;
|
||||
public static final short INVOKEVIRTUAL = 182;
|
||||
public static final short INVOKESPECIAL = 183;
|
||||
public static final short INVOKENONVIRTUAL = 183; // Old name in JDK 1.0
|
||||
public static final short INVOKESTATIC = 184;
|
||||
public static final short INVOKEINTERFACE = 185;
|
||||
public static final short NEW = 187;
|
||||
public static final short NEWARRAY = 188;
|
||||
public static final short ANEWARRAY = 189;
|
||||
public static final short ARRAYLENGTH = 190;
|
||||
public static final short ATHROW = 191;
|
||||
public static final short CHECKCAST = 192;
|
||||
public static final short INSTANCEOF = 193;
|
||||
public static final short MONITORENTER = 194;
|
||||
public static final short MONITOREXIT = 195;
|
||||
public static final short WIDE = 196;
|
||||
public static final short MULTIANEWARRAY = 197;
|
||||
public static final short IFNULL = 198;
|
||||
public static final short IFNONNULL = 199;
|
||||
public static final short GOTO_W = 200;
|
||||
public static final short JSR_W = 201;
|
||||
|
||||
/**
|
||||
* Non-legal opcodes, may be used by JVM internally.
|
||||
*/
|
||||
public static final short BREAKPOINT = 202;
|
||||
public static final short LDC_QUICK = 203;
|
||||
public static final short LDC_W_QUICK = 204;
|
||||
public static final short LDC2_W_QUICK = 205;
|
||||
public static final short GETFIELD_QUICK = 206;
|
||||
public static final short PUTFIELD_QUICK = 207;
|
||||
public static final short GETFIELD2_QUICK = 208;
|
||||
public static final short PUTFIELD2_QUICK = 209;
|
||||
public static final short GETSTATIC_QUICK = 210;
|
||||
public static final short PUTSTATIC_QUICK = 211;
|
||||
public static final short GETSTATIC2_QUICK = 212;
|
||||
public static final short PUTSTATIC2_QUICK = 213;
|
||||
public static final short INVOKEVIRTUAL_QUICK = 214;
|
||||
public static final short INVOKENONVIRTUAL_QUICK = 215;
|
||||
public static final short INVOKESUPER_QUICK = 216;
|
||||
public static final short INVOKESTATIC_QUICK = 217;
|
||||
public static final short INVOKEINTERFACE_QUICK = 218;
|
||||
public static final short INVOKEVIRTUALOBJECT_QUICK = 219;
|
||||
public static final short NEW_QUICK = 221;
|
||||
public static final short ANEWARRAY_QUICK = 222;
|
||||
public static final short MULTIANEWARRAY_QUICK = 223;
|
||||
public static final short CHECKCAST_QUICK = 224;
|
||||
public static final short INSTANCEOF_QUICK = 225;
|
||||
public static final short INVOKEVIRTUAL_QUICK_W = 226;
|
||||
public static final short GETFIELD_QUICK_W = 227;
|
||||
public static final short PUTFIELD_QUICK_W = 228;
|
||||
public static final short IMPDEP1 = 254;
|
||||
public static final short IMPDEP2 = 255;
|
||||
|
||||
/**
|
||||
* For internal purposes only.
|
||||
*/
|
||||
public static final short PUSH = 4711;
|
||||
public static final short SWITCH = 4712;
|
||||
|
||||
/**
|
||||
* Illegal codes
|
||||
*/
|
||||
public static final short UNDEFINED = -1;
|
||||
public static final short UNPREDICTABLE = -2;
|
||||
public static final short RESERVED = -3;
|
||||
public static final String ILLEGAL_OPCODE = "<illegal opcode>";
|
||||
public static final String ILLEGAL_TYPE = "<illegal type>";
|
||||
|
||||
public static final byte T_BOOLEAN = 4;
|
||||
public static final byte T_CHAR = 5;
|
||||
public static final byte T_FLOAT = 6;
|
||||
public static final byte T_DOUBLE = 7;
|
||||
public static final byte T_BYTE = 8;
|
||||
public static final byte T_SHORT = 9;
|
||||
public static final byte T_INT = 10;
|
||||
public static final byte T_LONG = 11;
|
||||
|
||||
public static final byte T_VOID = 12; // Non-standard
|
||||
public static final byte T_ARRAY = 13;
|
||||
public static final byte T_OBJECT = 14;
|
||||
public static final byte T_REFERENCE = 14; // Deprecated
|
||||
public static final byte T_UNKNOWN = 15;
|
||||
public static final byte T_ADDRESS = 16;
|
||||
|
||||
/** The primitive type names corresponding to the T_XX constants,
|
||||
* e.g., TYPE_NAMES[T_INT] = "int"
|
||||
*/
|
||||
public static final String[] TYPE_NAMES = {
|
||||
ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE,
|
||||
"boolean", "char", "float", "double", "byte", "short", "int", "long",
|
||||
"void", "array", "object", "unknown" // Non-standard
|
||||
};
|
||||
|
||||
/** The primitive class names corresponding to the T_XX constants,
|
||||
* e.g., CLASS_TYPE_NAMES[T_INT] = "java.lang.Integer"
|
||||
*/
|
||||
public static final String[] CLASS_TYPE_NAMES = {
|
||||
ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE,
|
||||
"java.lang.Boolean", "java.lang.Character", "java.lang.Float",
|
||||
"java.lang.Double", "java.lang.Byte", "java.lang.Short",
|
||||
"java.lang.Integer", "java.lang.Long", "java.lang.Void",
|
||||
ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE
|
||||
};
|
||||
|
||||
/** The signature characters corresponding to primitive types,
|
||||
* e.g., SHORT_TYPE_NAMES[T_INT] = "I"
|
||||
*/
|
||||
public static final String[] SHORT_TYPE_NAMES = {
|
||||
ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE,
|
||||
"Z", "C", "F", "D", "B", "S", "I", "J",
|
||||
"V", ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE
|
||||
};
|
||||
|
||||
/**
|
||||
* Number of byte code operands, i.e., number of bytes after the tag byte
|
||||
* itself.
|
||||
*/
|
||||
public static final short[] NO_OF_OPERANDS = {
|
||||
0/*nop*/, 0/*aconst_null*/, 0/*iconst_m1*/, 0/*iconst_0*/,
|
||||
0/*iconst_1*/, 0/*iconst_2*/, 0/*iconst_3*/, 0/*iconst_4*/,
|
||||
0/*iconst_5*/, 0/*lconst_0*/, 0/*lconst_1*/, 0/*fconst_0*/,
|
||||
0/*fconst_1*/, 0/*fconst_2*/, 0/*dconst_0*/, 0/*dconst_1*/,
|
||||
1/*bipush*/, 2/*sipush*/, 1/*ldc*/, 2/*ldc_w*/, 2/*ldc2_w*/,
|
||||
1/*iload*/, 1/*lload*/, 1/*fload*/, 1/*dload*/, 1/*aload*/,
|
||||
0/*iload_0*/, 0/*iload_1*/, 0/*iload_2*/, 0/*iload_3*/,
|
||||
0/*lload_0*/, 0/*lload_1*/, 0/*lload_2*/, 0/*lload_3*/,
|
||||
0/*fload_0*/, 0/*fload_1*/, 0/*fload_2*/, 0/*fload_3*/,
|
||||
0/*dload_0*/, 0/*dload_1*/, 0/*dload_2*/, 0/*dload_3*/,
|
||||
0/*aload_0*/, 0/*aload_1*/, 0/*aload_2*/, 0/*aload_3*/,
|
||||
0/*iaload*/, 0/*laload*/, 0/*faload*/, 0/*daload*/,
|
||||
0/*aaload*/, 0/*baload*/, 0/*caload*/, 0/*saload*/,
|
||||
1/*istore*/, 1/*lstore*/, 1/*fstore*/, 1/*dstore*/,
|
||||
1/*astore*/, 0/*istore_0*/, 0/*istore_1*/, 0/*istore_2*/,
|
||||
0/*istore_3*/, 0/*lstore_0*/, 0/*lstore_1*/, 0/*lstore_2*/,
|
||||
0/*lstore_3*/, 0/*fstore_0*/, 0/*fstore_1*/, 0/*fstore_2*/,
|
||||
0/*fstore_3*/, 0/*dstore_0*/, 0/*dstore_1*/, 0/*dstore_2*/,
|
||||
0/*dstore_3*/, 0/*astore_0*/, 0/*astore_1*/, 0/*astore_2*/,
|
||||
0/*astore_3*/, 0/*iastore*/, 0/*lastore*/, 0/*fastore*/,
|
||||
0/*dastore*/, 0/*aastore*/, 0/*bastore*/, 0/*castore*/,
|
||||
0/*sastore*/, 0/*pop*/, 0/*pop2*/, 0/*dup*/, 0/*dup_x1*/,
|
||||
0/*dup_x2*/, 0/*dup2*/, 0/*dup2_x1*/, 0/*dup2_x2*/, 0/*swap*/,
|
||||
0/*iadd*/, 0/*ladd*/, 0/*fadd*/, 0/*dadd*/, 0/*isub*/,
|
||||
0/*lsub*/, 0/*fsub*/, 0/*dsub*/, 0/*imul*/, 0/*lmul*/,
|
||||
0/*fmul*/, 0/*dmul*/, 0/*idiv*/, 0/*ldiv*/, 0/*fdiv*/,
|
||||
0/*ddiv*/, 0/*irem*/, 0/*lrem*/, 0/*frem*/, 0/*drem*/,
|
||||
0/*ineg*/, 0/*lneg*/, 0/*fneg*/, 0/*dneg*/, 0/*ishl*/,
|
||||
0/*lshl*/, 0/*ishr*/, 0/*lshr*/, 0/*iushr*/, 0/*lushr*/,
|
||||
0/*iand*/, 0/*land*/, 0/*ior*/, 0/*lor*/, 0/*ixor*/, 0/*lxor*/,
|
||||
2/*iinc*/, 0/*i2l*/, 0/*i2f*/, 0/*i2d*/, 0/*l2i*/, 0/*l2f*/,
|
||||
0/*l2d*/, 0/*f2i*/, 0/*f2l*/, 0/*f2d*/, 0/*d2i*/, 0/*d2l*/,
|
||||
0/*d2f*/, 0/*i2b*/, 0/*i2c*/, 0/*i2s*/, 0/*lcmp*/, 0/*fcmpl*/,
|
||||
0/*fcmpg*/, 0/*dcmpl*/, 0/*dcmpg*/, 2/*ifeq*/, 2/*ifne*/,
|
||||
2/*iflt*/, 2/*ifge*/, 2/*ifgt*/, 2/*ifle*/, 2/*if_icmpeq*/,
|
||||
2/*if_icmpne*/, 2/*if_icmplt*/, 2/*if_icmpge*/, 2/*if_icmpgt*/,
|
||||
2/*if_icmple*/, 2/*if_acmpeq*/, 2/*if_acmpne*/, 2/*goto*/,
|
||||
2/*jsr*/, 1/*ret*/, UNPREDICTABLE/*tableswitch*/, UNPREDICTABLE/*lookupswitch*/,
|
||||
0/*ireturn*/, 0/*lreturn*/, 0/*freturn*/,
|
||||
0/*dreturn*/, 0/*areturn*/, 0/*return*/,
|
||||
2/*getstatic*/, 2/*putstatic*/, 2/*getfield*/,
|
||||
2/*putfield*/, 2/*invokevirtual*/, 2/*invokespecial*/, 2/*invokestatic*/,
|
||||
4/*invokeinterface*/, UNDEFINED, 2/*new*/,
|
||||
1/*newarray*/, 2/*anewarray*/,
|
||||
0/*arraylength*/, 0/*athrow*/, 2/*checkcast*/,
|
||||
2/*instanceof*/, 0/*monitorenter*/,
|
||||
0/*monitorexit*/, UNPREDICTABLE/*wide*/, 3/*multianewarray*/,
|
||||
2/*ifnull*/, 2/*ifnonnull*/, 4/*goto_w*/,
|
||||
4/*jsr_w*/, 0/*breakpoint*/, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, RESERVED/*impdep1*/, RESERVED/*impdep2*/
|
||||
};
|
||||
|
||||
/**
|
||||
* How the byte code operands are to be interpreted.
|
||||
*/
|
||||
public static final short[][] TYPE_OF_OPERANDS = {
|
||||
{}/*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*/,
|
||||
{T_BYTE}/*bipush*/, {T_SHORT}/*sipush*/, {T_BYTE}/*ldc*/,
|
||||
{T_SHORT}/*ldc_w*/, {T_SHORT}/*ldc2_w*/,
|
||||
{T_BYTE}/*iload*/, {T_BYTE}/*lload*/, {T_BYTE}/*fload*/,
|
||||
{T_BYTE}/*dload*/, {T_BYTE}/*aload*/, {}/*iload_0*/,
|
||||
{}/*iload_1*/, {}/*iload_2*/, {}/*iload_3*/, {}/*lload_0*/,
|
||||
{}/*lload_1*/, {}/*lload_2*/, {}/*lload_3*/, {}/*fload_0*/,
|
||||
{}/*fload_1*/, {}/*fload_2*/, {}/*fload_3*/, {}/*dload_0*/,
|
||||
{}/*dload_1*/, {}/*dload_2*/, {}/*dload_3*/, {}/*aload_0*/,
|
||||
{}/*aload_1*/, {}/*aload_2*/, {}/*aload_3*/, {}/*iaload*/,
|
||||
{}/*laload*/, {}/*faload*/, {}/*daload*/, {}/*aaload*/,
|
||||
{}/*baload*/, {}/*caload*/, {}/*saload*/, {T_BYTE}/*istore*/,
|
||||
{T_BYTE}/*lstore*/, {T_BYTE}/*fstore*/, {T_BYTE}/*dstore*/,
|
||||
{T_BYTE}/*astore*/, {}/*istore_0*/, {}/*istore_1*/,
|
||||
{}/*istore_2*/, {}/*istore_3*/, {}/*lstore_0*/, {}/*lstore_1*/,
|
||||
{}/*lstore_2*/, {}/*lstore_3*/, {}/*fstore_0*/, {}/*fstore_1*/,
|
||||
{}/*fstore_2*/, {}/*fstore_3*/, {}/*dstore_0*/, {}/*dstore_1*/,
|
||||
{}/*dstore_2*/, {}/*dstore_3*/, {}/*astore_0*/, {}/*astore_1*/,
|
||||
{}/*astore_2*/, {}/*astore_3*/, {}/*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*/, {T_BYTE, T_BYTE}/*iinc*/,
|
||||
{}/*i2l*/, {}/*i2f*/, {}/*i2d*/, {}/*l2i*/, {}/*l2f*/, {}/*l2d*/,
|
||||
{}/*f2i*/, {}/*f2l*/, {}/*f2d*/, {}/*d2i*/, {}/*d2l*/, {}/*d2f*/,
|
||||
{}/*i2b*/, {}/*i2c*/,{}/*i2s*/, {}/*lcmp*/, {}/*fcmpl*/,
|
||||
{}/*fcmpg*/, {}/*dcmpl*/, {}/*dcmpg*/, {T_SHORT}/*ifeq*/,
|
||||
{T_SHORT}/*ifne*/, {T_SHORT}/*iflt*/, {T_SHORT}/*ifge*/,
|
||||
{T_SHORT}/*ifgt*/, {T_SHORT}/*ifle*/, {T_SHORT}/*if_icmpeq*/,
|
||||
{T_SHORT}/*if_icmpne*/, {T_SHORT}/*if_icmplt*/,
|
||||
{T_SHORT}/*if_icmpge*/, {T_SHORT}/*if_icmpgt*/,
|
||||
{T_SHORT}/*if_icmple*/, {T_SHORT}/*if_acmpeq*/,
|
||||
{T_SHORT}/*if_acmpne*/, {T_SHORT}/*goto*/, {T_SHORT}/*jsr*/,
|
||||
{T_BYTE}/*ret*/, {}/*tableswitch*/, {}/*lookupswitch*/,
|
||||
{}/*ireturn*/, {}/*lreturn*/, {}/*freturn*/, {}/*dreturn*/,
|
||||
{}/*areturn*/, {}/*return*/, {T_SHORT}/*getstatic*/,
|
||||
{T_SHORT}/*putstatic*/, {T_SHORT}/*getfield*/,
|
||||
{T_SHORT}/*putfield*/, {T_SHORT}/*invokevirtual*/,
|
||||
{T_SHORT}/*invokespecial*/, {T_SHORT}/*invokestatic*/,
|
||||
{T_SHORT, T_BYTE, T_BYTE}/*invokeinterface*/, {},
|
||||
{T_SHORT}/*new*/, {T_BYTE}/*newarray*/,
|
||||
{T_SHORT}/*anewarray*/, {}/*arraylength*/, {}/*athrow*/,
|
||||
{T_SHORT}/*checkcast*/, {T_SHORT}/*instanceof*/,
|
||||
{}/*monitorenter*/, {}/*monitorexit*/, {T_BYTE}/*wide*/,
|
||||
{T_SHORT, T_BYTE}/*multianewarray*/, {T_SHORT}/*ifnull*/,
|
||||
{T_SHORT}/*ifnonnull*/, {T_INT}/*goto_w*/, {T_INT}/*jsr_w*/,
|
||||
{}/*breakpoint*/, {}, {}, {}, {}, {}, {}, {},
|
||||
{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {},
|
||||
{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {},
|
||||
{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {},
|
||||
{}/*impdep1*/, {}/*impdep2*/
|
||||
};
|
||||
|
||||
/**
|
||||
* Names of opcodes.
|
||||
*/
|
||||
public static final String[] OPCODE_NAMES = {
|
||||
"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", "bipush", "sipush", "ldc", "ldc_w", "ldc2_w", "iload",
|
||||
"lload", "fload", "dload", "aload", "iload_0", "iload_1", "iload_2",
|
||||
"iload_3", "lload_0", "lload_1", "lload_2", "lload_3", "fload_0",
|
||||
"fload_1", "fload_2", "fload_3", "dload_0", "dload_1", "dload_2",
|
||||
"dload_3", "aload_0", "aload_1", "aload_2", "aload_3", "iaload",
|
||||
"laload", "faload", "daload", "aaload", "baload", "caload", "saload",
|
||||
"istore", "lstore", "fstore", "dstore", "astore", "istore_0",
|
||||
"istore_1", "istore_2", "istore_3", "lstore_0", "lstore_1",
|
||||
"lstore_2", "lstore_3", "fstore_0", "fstore_1", "fstore_2",
|
||||
"fstore_3", "dstore_0", "dstore_1", "dstore_2", "dstore_3",
|
||||
"astore_0", "astore_1", "astore_2", "astore_3", "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", "iinc", "i2l", "i2f",
|
||||
"i2d", "l2i", "l2f", "l2d", "f2i", "f2l", "f2d", "d2i", "d2l", "d2f",
|
||||
"i2b", "i2c", "i2s", "lcmp", "fcmpl", "fcmpg",
|
||||
"dcmpl", "dcmpg", "ifeq", "ifne", "iflt", "ifge", "ifgt", "ifle",
|
||||
"if_icmpeq", "if_icmpne", "if_icmplt", "if_icmpge", "if_icmpgt",
|
||||
"if_icmple", "if_acmpeq", "if_acmpne", "goto", "jsr", "ret",
|
||||
"tableswitch", "lookupswitch", "ireturn", "lreturn", "freturn",
|
||||
"dreturn", "areturn", "return", "getstatic", "putstatic", "getfield",
|
||||
"putfield", "invokevirtual", "invokespecial", "invokestatic",
|
||||
"invokeinterface", ILLEGAL_OPCODE, "new", "newarray", "anewarray",
|
||||
"arraylength", "athrow", "checkcast", "instanceof", "monitorenter",
|
||||
"monitorexit", "wide", "multianewarray", "ifnull", "ifnonnull",
|
||||
"goto_w", "jsr_w", "breakpoint", ILLEGAL_OPCODE, ILLEGAL_OPCODE,
|
||||
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
|
||||
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
|
||||
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
|
||||
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
|
||||
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
|
||||
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
|
||||
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
|
||||
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
|
||||
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
|
||||
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
|
||||
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
|
||||
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
|
||||
ILLEGAL_OPCODE, "impdep1", "impdep2"
|
||||
};
|
||||
|
||||
/**
|
||||
* Number of words consumed on operand stack by instructions.
|
||||
*/
|
||||
public static final int[] CONSUME_STACK = {
|
||||
0/*nop*/, 0/*aconst_null*/, 0/*iconst_m1*/, 0/*iconst_0*/, 0/*iconst_1*/,
|
||||
0/*iconst_2*/, 0/*iconst_3*/, 0/*iconst_4*/, 0/*iconst_5*/, 0/*lconst_0*/,
|
||||
0/*lconst_1*/, 0/*fconst_0*/, 0/*fconst_1*/, 0/*fconst_2*/, 0/*dconst_0*/,
|
||||
0/*dconst_1*/, 0/*bipush*/, 0/*sipush*/, 0/*ldc*/, 0/*ldc_w*/, 0/*ldc2_w*/, 0/*iload*/,
|
||||
0/*lload*/, 0/*fload*/, 0/*dload*/, 0/*aload*/, 0/*iload_0*/, 0/*iload_1*/, 0/*iload_2*/,
|
||||
0/*iload_3*/, 0/*lload_0*/, 0/*lload_1*/, 0/*lload_2*/, 0/*lload_3*/, 0/*fload_0*/,
|
||||
0/*fload_1*/, 0/*fload_2*/, 0/*fload_3*/, 0/*dload_0*/, 0/*dload_1*/, 0/*dload_2*/,
|
||||
0/*dload_3*/, 0/*aload_0*/, 0/*aload_1*/, 0/*aload_2*/, 0/*aload_3*/, 2/*iaload*/,
|
||||
2/*laload*/, 2/*faload*/, 2/*daload*/, 2/*aaload*/, 2/*baload*/, 2/*caload*/, 2/*saload*/,
|
||||
1/*istore*/, 2/*lstore*/, 1/*fstore*/, 2/*dstore*/, 1/*astore*/, 1/*istore_0*/,
|
||||
1/*istore_1*/, 1/*istore_2*/, 1/*istore_3*/, 2/*lstore_0*/, 2/*lstore_1*/,
|
||||
2/*lstore_2*/, 2/*lstore_3*/, 1/*fstore_0*/, 1/*fstore_1*/, 1/*fstore_2*/,
|
||||
1/*fstore_3*/, 2/*dstore_0*/, 2/*dstore_1*/, 2/*dstore_2*/, 2/*dstore_3*/,
|
||||
1/*astore_0*/, 1/*astore_1*/, 1/*astore_2*/, 1/*astore_3*/, 3/*iastore*/, 4/*lastore*/,
|
||||
3/*fastore*/, 4/*dastore*/, 3/*aastore*/, 3/*bastore*/, 3/*castore*/, 3/*sastore*/,
|
||||
1/*pop*/, 2/*pop2*/, 1/*dup*/, 2/*dup_x1*/, 3/*dup_x2*/, 2/*dup2*/, 3/*dup2_x1*/,
|
||||
4/*dup2_x2*/, 2/*swap*/, 2/*iadd*/, 4/*ladd*/, 2/*fadd*/, 4/*dadd*/, 2/*isub*/, 4/*lsub*/,
|
||||
2/*fsub*/, 4/*dsub*/, 2/*imul*/, 4/*lmul*/, 2/*fmul*/, 4/*dmul*/, 2/*idiv*/, 4/*ldiv*/,
|
||||
2/*fdiv*/, 4/*ddiv*/, 2/*irem*/, 4/*lrem*/, 2/*frem*/, 4/*drem*/, 1/*ineg*/, 2/*lneg*/,
|
||||
1/*fneg*/, 2/*dneg*/, 2/*ishl*/, 3/*lshl*/, 2/*ishr*/, 3/*lshr*/, 2/*iushr*/, 3/*lushr*/,
|
||||
2/*iand*/, 4/*land*/, 2/*ior*/, 4/*lor*/, 2/*ixor*/, 4/*lxor*/, 0/*iinc*/,
|
||||
1/*i2l*/, 1/*i2f*/, 1/*i2d*/, 2/*l2i*/, 2/*l2f*/, 2/*l2d*/, 1/*f2i*/, 1/*f2l*/,
|
||||
1/*f2d*/, 2/*d2i*/, 2/*d2l*/, 2/*d2f*/, 1/*i2b*/, 1/*i2c*/, 1/*i2s*/,
|
||||
4/*lcmp*/, 2/*fcmpl*/, 2/*fcmpg*/, 4/*dcmpl*/, 4/*dcmpg*/, 1/*ifeq*/, 1/*ifne*/,
|
||||
1/*iflt*/, 1/*ifge*/, 1/*ifgt*/, 1/*ifle*/, 2/*if_icmpeq*/, 2/*if_icmpne*/, 2/*if_icmplt*/,
|
||||
2 /*if_icmpge*/, 2/*if_icmpgt*/, 2/*if_icmple*/, 2/*if_acmpeq*/, 2/*if_acmpne*/,
|
||||
0/*goto*/, 0/*jsr*/, 0/*ret*/, 1/*tableswitch*/, 1/*lookupswitch*/, 1/*ireturn*/,
|
||||
2/*lreturn*/, 1/*freturn*/, 2/*dreturn*/, 1/*areturn*/, 0/*return*/, 0/*getstatic*/,
|
||||
UNPREDICTABLE/*putstatic*/, 1/*getfield*/, UNPREDICTABLE/*putfield*/,
|
||||
UNPREDICTABLE/*invokevirtual*/, UNPREDICTABLE/*invokespecial*/,
|
||||
UNPREDICTABLE/*invokestatic*/,
|
||||
UNPREDICTABLE/*invokeinterface*/, UNDEFINED, 0/*new*/, 1/*newarray*/, 1/*anewarray*/,
|
||||
1/*arraylength*/, 1/*athrow*/, 1/*checkcast*/, 1/*instanceof*/, 1/*monitorenter*/,
|
||||
1/*monitorexit*/, 0/*wide*/, UNPREDICTABLE/*multianewarray*/, 1/*ifnull*/, 1/*ifnonnull*/,
|
||||
0/*goto_w*/, 0/*jsr_w*/, 0/*breakpoint*/, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNPREDICTABLE/*impdep1*/, UNPREDICTABLE/*impdep2*/
|
||||
};
|
||||
|
||||
/**
|
||||
* Number of words produced onto operand stack by instructions.
|
||||
*/
|
||||
public static final int[] PRODUCE_STACK = {
|
||||
0/*nop*/, 1/*aconst_null*/, 1/*iconst_m1*/, 1/*iconst_0*/, 1/*iconst_1*/,
|
||||
1/*iconst_2*/, 1/*iconst_3*/, 1/*iconst_4*/, 1/*iconst_5*/, 2/*lconst_0*/,
|
||||
2/*lconst_1*/, 1/*fconst_0*/, 1/*fconst_1*/, 1/*fconst_2*/, 2/*dconst_0*/,
|
||||
2/*dconst_1*/, 1/*bipush*/, 1/*sipush*/, 1/*ldc*/, 1/*ldc_w*/, 2/*ldc2_w*/, 1/*iload*/,
|
||||
2/*lload*/, 1/*fload*/, 2/*dload*/, 1/*aload*/, 1/*iload_0*/, 1/*iload_1*/, 1/*iload_2*/,
|
||||
1/*iload_3*/, 2/*lload_0*/, 2/*lload_1*/, 2/*lload_2*/, 2/*lload_3*/, 1/*fload_0*/,
|
||||
1/*fload_1*/, 1/*fload_2*/, 1/*fload_3*/, 2/*dload_0*/, 2/*dload_1*/, 2/*dload_2*/,
|
||||
2/*dload_3*/, 1/*aload_0*/, 1/*aload_1*/, 1/*aload_2*/, 1/*aload_3*/, 1/*iaload*/,
|
||||
2/*laload*/, 1/*faload*/, 2/*daload*/, 1/*aaload*/, 1/*baload*/, 1/*caload*/, 1/*saload*/,
|
||||
0/*istore*/, 0/*lstore*/, 0/*fstore*/, 0/*dstore*/, 0/*astore*/, 0/*istore_0*/,
|
||||
0/*istore_1*/, 0/*istore_2*/, 0/*istore_3*/, 0/*lstore_0*/, 0/*lstore_1*/,
|
||||
0/*lstore_2*/, 0/*lstore_3*/, 0/*fstore_0*/, 0/*fstore_1*/, 0/*fstore_2*/,
|
||||
0/*fstore_3*/, 0/*dstore_0*/, 0/*dstore_1*/, 0/*dstore_2*/, 0/*dstore_3*/,
|
||||
0/*astore_0*/, 0/*astore_1*/, 0/*astore_2*/, 0/*astore_3*/, 0/*iastore*/, 0/*lastore*/,
|
||||
0/*fastore*/, 0/*dastore*/, 0/*aastore*/, 0/*bastore*/, 0/*castore*/, 0/*sastore*/,
|
||||
0/*pop*/, 0/*pop2*/, 2/*dup*/, 3/*dup_x1*/, 4/*dup_x2*/, 4/*dup2*/, 5/*dup2_x1*/,
|
||||
6/*dup2_x2*/, 2/*swap*/, 1/*iadd*/, 2/*ladd*/, 1/*fadd*/, 2/*dadd*/, 1/*isub*/, 2/*lsub*/,
|
||||
1/*fsub*/, 2/*dsub*/, 1/*imul*/, 2/*lmul*/, 1/*fmul*/, 2/*dmul*/, 1/*idiv*/, 2/*ldiv*/,
|
||||
1/*fdiv*/, 2/*ddiv*/, 1/*irem*/, 2/*lrem*/, 1/*frem*/, 2/*drem*/, 1/*ineg*/, 2/*lneg*/,
|
||||
1/*fneg*/, 2/*dneg*/, 1/*ishl*/, 2/*lshl*/, 1/*ishr*/, 2/*lshr*/, 1/*iushr*/, 2/*lushr*/,
|
||||
1/*iand*/, 2/*land*/, 1/*ior*/, 2/*lor*/, 1/*ixor*/, 2/*lxor*/,
|
||||
0/*iinc*/, 2/*i2l*/, 1/*i2f*/, 2/*i2d*/, 1/*l2i*/, 1/*l2f*/, 2/*l2d*/, 1/*f2i*/,
|
||||
2/*f2l*/, 2/*f2d*/, 1/*d2i*/, 2/*d2l*/, 1/*d2f*/,
|
||||
1/*i2b*/, 1/*i2c*/, 1/*i2s*/, 1/*lcmp*/, 1/*fcmpl*/, 1/*fcmpg*/,
|
||||
1/*dcmpl*/, 1/*dcmpg*/, 0/*ifeq*/, 0/*ifne*/, 0/*iflt*/, 0/*ifge*/, 0/*ifgt*/, 0/*ifle*/,
|
||||
0/*if_icmpeq*/, 0/*if_icmpne*/, 0/*if_icmplt*/, 0/*if_icmpge*/, 0/*if_icmpgt*/,
|
||||
0/*if_icmple*/, 0/*if_acmpeq*/, 0/*if_acmpne*/, 0/*goto*/, 1/*jsr*/, 0/*ret*/,
|
||||
0/*tableswitch*/, 0/*lookupswitch*/, 0/*ireturn*/, 0/*lreturn*/, 0/*freturn*/,
|
||||
0/*dreturn*/, 0/*areturn*/, 0/*return*/, UNPREDICTABLE/*getstatic*/, 0/*putstatic*/,
|
||||
UNPREDICTABLE/*getfield*/, 0/*putfield*/, UNPREDICTABLE/*invokevirtual*/,
|
||||
UNPREDICTABLE/*invokespecial*/, UNPREDICTABLE/*invokestatic*/,
|
||||
UNPREDICTABLE/*invokeinterface*/, UNDEFINED, 1/*new*/, 1/*newarray*/, 1/*anewarray*/,
|
||||
1/*arraylength*/, 1/*athrow*/, 1/*checkcast*/, 1/*instanceof*/, 0/*monitorenter*/,
|
||||
0/*monitorexit*/, 0/*wide*/, 1/*multianewarray*/, 0/*ifnull*/, 0/*ifnonnull*/,
|
||||
0/*goto_w*/, 1/*jsr_w*/, 0/*breakpoint*/, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED,
|
||||
UNDEFINED, UNPREDICTABLE/*impdep1*/, UNPREDICTABLE/*impdep2*/
|
||||
};
|
||||
|
||||
/** Attributes and their corresponding names.
|
||||
*/
|
||||
public static final byte ATTR_UNKNOWN = -1;
|
||||
public static final byte ATTR_SOURCE_FILE = 0;
|
||||
public static final byte ATTR_CONSTANT_VALUE = 1;
|
||||
public static final byte ATTR_CODE = 2;
|
||||
public static final byte ATTR_EXCEPTIONS = 3;
|
||||
public static final byte ATTR_LINE_NUMBER_TABLE = 4;
|
||||
public static final byte ATTR_LOCAL_VARIABLE_TABLE = 5;
|
||||
public static final byte ATTR_INNER_CLASSES = 6;
|
||||
public static final byte ATTR_SYNTHETIC = 7;
|
||||
public static final byte ATTR_DEPRECATED = 8;
|
||||
public static final byte ATTR_PMG = 9;
|
||||
public static final byte ATTR_SIGNATURE = 10;
|
||||
public static final byte ATTR_STACK_MAP = 11;
|
||||
|
||||
public static final short KNOWN_ATTRIBUTES = 12;
|
||||
|
||||
public static final String[] ATTRIBUTE_NAMES = {
|
||||
"SourceFile", "ConstantValue", "Code", "Exceptions",
|
||||
"LineNumberTable", "LocalVariableTable",
|
||||
"InnerClasses", "Synthetic", "Deprecated",
|
||||
"PMGClass", "Signature", "StackMap"
|
||||
};
|
||||
|
||||
/** Constants used in the StackMap attribute.
|
||||
*/
|
||||
public static final byte ITEM_Bogus = 0;
|
||||
public static final byte ITEM_Integer = 1;
|
||||
public static final byte ITEM_Float = 2;
|
||||
public static final byte ITEM_Double = 3;
|
||||
public static final byte ITEM_Long = 4;
|
||||
public static final byte ITEM_Null = 5;
|
||||
public static final byte ITEM_InitObject = 6;
|
||||
public static final byte ITEM_Object = 7;
|
||||
public static final byte ITEM_NewObject = 8;
|
||||
|
||||
public static final String[] ITEM_NAMES = {
|
||||
"Bogus", "Integer", "Float", "Double", "Long",
|
||||
"Null", "InitObject", "Object", "NewObject"
|
||||
};
|
||||
}
|
||||
@ -1,126 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Exception constants.
|
||||
*
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~ehaase">E. Haase</A>
|
||||
*/
|
||||
public interface ExceptionConstants {
|
||||
/** The mother of all exceptions
|
||||
*/
|
||||
public static final Class THROWABLE = Throwable.class;
|
||||
|
||||
/** Super class of any run-time exception
|
||||
*/
|
||||
public static final Class RUNTIME_EXCEPTION = RuntimeException.class;
|
||||
|
||||
/** Super class of any linking exception (aka Linkage Error)
|
||||
*/
|
||||
public static final Class LINKING_EXCEPTION = LinkageError.class;
|
||||
|
||||
/** Linking Exceptions
|
||||
*/
|
||||
public static final Class CLASS_CIRCULARITY_ERROR = ClassCircularityError.class;
|
||||
public static final Class CLASS_FORMAT_ERROR = ClassFormatError.class;
|
||||
public static final Class EXCEPTION_IN_INITIALIZER_ERROR = ExceptionInInitializerError.class;
|
||||
public static final Class INCOMPATIBLE_CLASS_CHANGE_ERROR = IncompatibleClassChangeError.class;
|
||||
public static final Class ABSTRACT_METHOD_ERROR = AbstractMethodError.class;
|
||||
public static final Class ILLEGAL_ACCESS_ERROR = IllegalAccessError.class;
|
||||
public static final Class INSTANTIATION_ERROR = InstantiationError.class;
|
||||
public static final Class NO_SUCH_FIELD_ERROR = NoSuchFieldError.class;
|
||||
public static final Class NO_SUCH_METHOD_ERROR = NoSuchMethodError.class;
|
||||
public static final Class NO_CLASS_DEF_FOUND_ERROR = NoClassDefFoundError.class;
|
||||
public static final Class UNSATISFIED_LINK_ERROR = UnsatisfiedLinkError.class;
|
||||
public static final Class VERIFY_ERROR = VerifyError.class;
|
||||
|
||||
/* UnsupportedClassVersionError is new in JDK 1.2 */
|
||||
//public static final Class UnsupportedClassVersionError = UnsupportedClassVersionError.class;
|
||||
|
||||
/** Run-Time Exceptions
|
||||
*/
|
||||
public static final Class NULL_POINTER_EXCEPTION = NullPointerException.class;
|
||||
public static final Class ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION = ArrayIndexOutOfBoundsException.class;
|
||||
public static final Class ARITHMETIC_EXCEPTION = ArithmeticException.class;
|
||||
public static final Class NEGATIVE_ARRAY_SIZE_EXCEPTION = NegativeArraySizeException.class;
|
||||
public static final Class CLASS_CAST_EXCEPTION = ClassCastException.class;
|
||||
public static final Class ILLEGAL_MONITOR_STATE = IllegalMonitorStateException.class;
|
||||
|
||||
/** Pre-defined exception arrays according to chapters 5.1-5.4 of the Java Virtual
|
||||
* Machine Specification
|
||||
*/
|
||||
public static final Class[] EXCS_CLASS_AND_INTERFACE_RESOLUTION = {
|
||||
NO_CLASS_DEF_FOUND_ERROR, CLASS_FORMAT_ERROR, VERIFY_ERROR, ABSTRACT_METHOD_ERROR,
|
||||
EXCEPTION_IN_INITIALIZER_ERROR, ILLEGAL_ACCESS_ERROR
|
||||
}; // Chapter 5.1
|
||||
|
||||
public static final Class[] EXCS_FIELD_AND_METHOD_RESOLUTION = {
|
||||
NO_SUCH_FIELD_ERROR, ILLEGAL_ACCESS_ERROR, NO_SUCH_METHOD_ERROR
|
||||
}; // Chapter 5.2
|
||||
|
||||
public static final Class[] EXCS_INTERFACE_METHOD_RESOLUTION = new Class[0]; // Chapter 5.3 (as below)
|
||||
public static final Class[] EXCS_STRING_RESOLUTION = new Class[0];
|
||||
// Chapter 5.4 (no errors but the ones that _always_ could happen! How stupid.)
|
||||
|
||||
public static final Class[] EXCS_ARRAY_EXCEPTION = {
|
||||
NULL_POINTER_EXCEPTION, ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION
|
||||
};
|
||||
|
||||
}
|
||||
@ -1,250 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.classfile.JavaClass;
|
||||
import com.sun.org.apache.bcel.internal.util.*;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* The repository maintains informations about class interdependencies, e.g.,
|
||||
* whether a class is a sub-class of another. Delegates actual class loading
|
||||
* to SyntheticRepository with current class path by default.
|
||||
*
|
||||
* @see com.sun.org.apache.bcel.internal.util.Repository
|
||||
* @see com.sun.org.apache.bcel.internal.util.SyntheticRepository
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
*/
|
||||
public abstract class Repository {
|
||||
private static com.sun.org.apache.bcel.internal.util.Repository _repository =
|
||||
SyntheticRepository.getInstance();
|
||||
|
||||
/** @return currently used repository instance
|
||||
*/
|
||||
public static com.sun.org.apache.bcel.internal.util.Repository getRepository() {
|
||||
return _repository;
|
||||
}
|
||||
|
||||
/** Set repository instance to be used for class loading
|
||||
*/
|
||||
public static void setRepository(com.sun.org.apache.bcel.internal.util.Repository rep) {
|
||||
_repository = rep;
|
||||
}
|
||||
|
||||
/** Lookup class somewhere found on your CLASSPATH, or whereever the
|
||||
* repository instance looks for it.
|
||||
*
|
||||
* @return class object for given fully qualified class name, or null
|
||||
* if the class could not be found or parsed correctly
|
||||
*/
|
||||
public static JavaClass lookupClass(String class_name) {
|
||||
try {
|
||||
JavaClass clazz = _repository.findClass(class_name);
|
||||
|
||||
if(clazz == null) {
|
||||
return _repository.loadClass(class_name);
|
||||
} else {
|
||||
return clazz;
|
||||
}
|
||||
} catch(ClassNotFoundException ex) { return null; }
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to find class source via getResourceAsStream().
|
||||
* @see Class
|
||||
* @return JavaClass object for given runtime class
|
||||
*/
|
||||
public static JavaClass lookupClass(Class clazz) {
|
||||
try {
|
||||
return _repository.loadClass(clazz);
|
||||
} catch(ClassNotFoundException ex) { return null; }
|
||||
}
|
||||
|
||||
/** @return class file object for given Java class.
|
||||
*/
|
||||
public static ClassPath.ClassFile lookupClassFile(String class_name) {
|
||||
try {
|
||||
return ClassPath.SYSTEM_CLASS_PATH.getClassFile(class_name);
|
||||
} catch(IOException e) { return null; }
|
||||
}
|
||||
|
||||
/** Clear the repository.
|
||||
*/
|
||||
public static void clearCache() {
|
||||
_repository.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Add clazz to repository if there isn't an equally named class already in there.
|
||||
*
|
||||
* @return old entry in repository
|
||||
*/
|
||||
public static JavaClass addClass(JavaClass clazz) {
|
||||
JavaClass old = _repository.findClass(clazz.getClassName());
|
||||
_repository.storeClass(clazz);
|
||||
return old;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove class with given (fully qualified) name from repository.
|
||||
*/
|
||||
public static void removeClass(String clazz) {
|
||||
_repository.removeClass(_repository.findClass(clazz));
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove given class from repository.
|
||||
*/
|
||||
public static void removeClass(JavaClass clazz) {
|
||||
_repository.removeClass(clazz);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return list of super classes of clazz in ascending order, i.e.,
|
||||
* Object is always the last element
|
||||
*/
|
||||
public static JavaClass[] getSuperClasses(JavaClass clazz) {
|
||||
return clazz.getSuperClasses();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return list of super classes of clazz in ascending order, i.e.,
|
||||
* Object is always the last element. return "null", if class
|
||||
* cannot be found.
|
||||
*/
|
||||
public static JavaClass[] getSuperClasses(String class_name) {
|
||||
JavaClass jc = lookupClass(class_name);
|
||||
return (jc == null? null : getSuperClasses(jc));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return all interfaces implemented by class and its super
|
||||
* classes and the interfaces that those interfaces extend, and so on.
|
||||
* (Some people call this a transitive hull).
|
||||
*/
|
||||
public static JavaClass[] getInterfaces(JavaClass clazz) {
|
||||
return clazz.getAllInterfaces();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return all interfaces implemented by class and its super
|
||||
* classes and the interfaces that extend those interfaces, and so on
|
||||
*/
|
||||
public static JavaClass[] getInterfaces(String class_name) {
|
||||
return getInterfaces(lookupClass(class_name));
|
||||
}
|
||||
|
||||
/**
|
||||
* Equivalent to runtime "instanceof" operator.
|
||||
* @return true, if clazz is an instance of super_class
|
||||
*/
|
||||
public static boolean instanceOf(JavaClass clazz, JavaClass super_class) {
|
||||
return clazz.instanceOf(super_class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true, if clazz is an instance of super_class
|
||||
*/
|
||||
public static boolean instanceOf(String clazz, String super_class) {
|
||||
return instanceOf(lookupClass(clazz), lookupClass(super_class));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true, if clazz is an instance of super_class
|
||||
*/
|
||||
public static boolean instanceOf(JavaClass clazz, String super_class) {
|
||||
return instanceOf(clazz, lookupClass(super_class));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true, if clazz is an instance of super_class
|
||||
*/
|
||||
public static boolean instanceOf(String clazz, JavaClass super_class) {
|
||||
return instanceOf(lookupClass(clazz), super_class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true, if clazz is an implementation of interface inter
|
||||
*/
|
||||
public static boolean implementationOf(JavaClass clazz, JavaClass inter) {
|
||||
return clazz.implementationOf(inter);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true, if clazz is an implementation of interface inter
|
||||
*/
|
||||
public static boolean implementationOf(String clazz, String inter) {
|
||||
return implementationOf(lookupClass(clazz), lookupClass(inter));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true, if clazz is an implementation of interface inter
|
||||
*/
|
||||
public static boolean implementationOf(JavaClass clazz, String inter) {
|
||||
return implementationOf(clazz, lookupClass(inter));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true, if clazz is an implementation of interface inter
|
||||
*/
|
||||
public static boolean implementationOf(String clazz, JavaClass inter) {
|
||||
return implementationOf(lookupClass(clazz), inter);
|
||||
}
|
||||
}
|
||||
@ -1,174 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
|
||||
/**
|
||||
* Super class for all objects that have modifiers like private, final, ...
|
||||
* I.e. classes, fields, and methods.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
*/
|
||||
public abstract class AccessFlags implements java.io.Serializable {
|
||||
protected int access_flags;
|
||||
|
||||
public AccessFlags() {}
|
||||
|
||||
/**
|
||||
* @param a inital access flags
|
||||
*/
|
||||
public AccessFlags(int a) {
|
||||
access_flags = a;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Access flags of the object aka. "modifiers".
|
||||
*/
|
||||
public final int getAccessFlags() { return access_flags; }
|
||||
|
||||
/**
|
||||
* @return Access flags of the object aka. "modifiers".
|
||||
*/
|
||||
public final int getModifiers() { return access_flags; }
|
||||
|
||||
/** Set access flags aka "modifiers".
|
||||
* @param access_flags Access flags of the object.
|
||||
*/
|
||||
public final void setAccessFlags(int access_flags) {
|
||||
this.access_flags = access_flags;
|
||||
}
|
||||
|
||||
/** Set access flags aka "modifiers".
|
||||
* @param access_flags Access flags of the object.
|
||||
*/
|
||||
public final void setModifiers(int access_flags) {
|
||||
setAccessFlags(access_flags);
|
||||
}
|
||||
|
||||
private final void setFlag(int flag, boolean set) {
|
||||
if((access_flags & flag) != 0) { // Flag is set already
|
||||
if(!set) // Delete flag ?
|
||||
access_flags ^= flag;
|
||||
} else { // Flag not set
|
||||
if(set) // Set flag ?
|
||||
access_flags |= flag;
|
||||
}
|
||||
}
|
||||
|
||||
public final void isPublic(boolean flag) { setFlag(Constants.ACC_PUBLIC, flag); }
|
||||
public final boolean isPublic() {
|
||||
return (access_flags & Constants.ACC_PUBLIC) != 0;
|
||||
}
|
||||
|
||||
public final void isPrivate(boolean flag) { setFlag(Constants.ACC_PRIVATE, flag); }
|
||||
public final boolean isPrivate() {
|
||||
return (access_flags & Constants.ACC_PRIVATE) != 0;
|
||||
}
|
||||
|
||||
public final void isProtected(boolean flag) { setFlag(Constants.ACC_PROTECTED, flag); }
|
||||
public final boolean isProtected() {
|
||||
return (access_flags & Constants.ACC_PROTECTED) != 0;
|
||||
}
|
||||
|
||||
public final void isStatic(boolean flag) { setFlag(Constants.ACC_STATIC, flag); }
|
||||
public final boolean isStatic() {
|
||||
return (access_flags & Constants.ACC_STATIC) != 0;
|
||||
}
|
||||
|
||||
public final void isFinal(boolean flag) { setFlag(Constants.ACC_FINAL, flag); }
|
||||
public final boolean isFinal() {
|
||||
return (access_flags & Constants.ACC_FINAL) != 0;
|
||||
}
|
||||
|
||||
public final void isSynchronized(boolean flag) { setFlag(Constants.ACC_SYNCHRONIZED, flag); }
|
||||
public final boolean isSynchronized() {
|
||||
return (access_flags & Constants.ACC_SYNCHRONIZED) != 0;
|
||||
}
|
||||
|
||||
public final void isVolatile(boolean flag) { setFlag(Constants.ACC_VOLATILE, flag); }
|
||||
public final boolean isVolatile() {
|
||||
return (access_flags & Constants.ACC_VOLATILE) != 0;
|
||||
}
|
||||
|
||||
public final void isTransient(boolean flag) { setFlag(Constants.ACC_TRANSIENT, flag); }
|
||||
public final boolean isTransient() {
|
||||
return (access_flags & Constants.ACC_TRANSIENT) != 0;
|
||||
}
|
||||
|
||||
public final void isNative(boolean flag) { setFlag(Constants.ACC_NATIVE, flag); }
|
||||
public final boolean isNative() {
|
||||
return (access_flags & Constants.ACC_NATIVE) != 0;
|
||||
}
|
||||
|
||||
public final void isInterface(boolean flag) { setFlag(Constants.ACC_INTERFACE, flag); }
|
||||
public final boolean isInterface() {
|
||||
return (access_flags & Constants.ACC_INTERFACE) != 0;
|
||||
}
|
||||
|
||||
public final void isAbstract(boolean flag) { setFlag(Constants.ACC_ABSTRACT, flag); }
|
||||
public final boolean isAbstract() {
|
||||
return (access_flags & Constants.ACC_ABSTRACT) != 0;
|
||||
}
|
||||
|
||||
public final void isStrictfp(boolean flag) { setFlag(Constants.ACC_STRICT, flag); }
|
||||
public final boolean isStrictfp() {
|
||||
return (access_flags & Constants.ACC_STRICT) != 0;
|
||||
}
|
||||
}
|
||||
@ -1,305 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* Abstract super class for <em>Attribute</em> objects. Currently the
|
||||
* <em>ConstantValue</em>, <em>SourceFile</em>, <em>Code</em>,
|
||||
* <em>Exceptiontable</em>, <em>LineNumberTable</em>,
|
||||
* <em>LocalVariableTable</em>, <em>InnerClasses</em> and
|
||||
* <em>Synthetic</em> attributes are supported. The
|
||||
* <em>Unknown</em> attribute stands for non-standard-attributes.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see ConstantValue
|
||||
* @see SourceFile
|
||||
* @see Code
|
||||
* @see Unknown
|
||||
* @see ExceptionTable
|
||||
* @see LineNumberTable
|
||||
* @see LocalVariableTable
|
||||
* @see InnerClasses
|
||||
* @see Synthetic
|
||||
* @see Deprecated
|
||||
* @see Signature
|
||||
*/
|
||||
public abstract class Attribute implements Cloneable, Node, Serializable {
|
||||
protected int name_index; // Points to attribute name in constant pool
|
||||
protected int length; // Content length of attribute field
|
||||
protected byte tag; // Tag to distiguish subclasses
|
||||
protected ConstantPool constant_pool;
|
||||
|
||||
protected Attribute(byte tag, int name_index, int length,
|
||||
ConstantPool constant_pool) {
|
||||
this.tag = tag;
|
||||
this.name_index = name_index;
|
||||
this.length = length;
|
||||
this.constant_pool = constant_pool;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public abstract void accept(Visitor v);
|
||||
|
||||
/**
|
||||
* Dump attribute to file stream in binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
file.writeShort(name_index);
|
||||
file.writeInt(length);
|
||||
}
|
||||
|
||||
private static HashMap readers = new HashMap();
|
||||
|
||||
/** Add an Attribute reader capable of parsing (user-defined) attributes
|
||||
* named "name". You should not add readers for the standard attributes
|
||||
* such as "LineNumberTable", because those are handled internally.
|
||||
*
|
||||
* @param name the name of the attribute as stored in the class file
|
||||
* @param r the reader object
|
||||
*/
|
||||
public static void addAttributeReader(String name, AttributeReader r) {
|
||||
readers.put(name, r);
|
||||
}
|
||||
|
||||
/** Remove attribute reader
|
||||
*
|
||||
* @param name the name of the attribute as stored in the class file
|
||||
*/
|
||||
public static void removeAttributeReader(String name) {
|
||||
readers.remove(name);
|
||||
}
|
||||
|
||||
/* Class method reads one attribute from the input data stream.
|
||||
* This method must not be accessible from the outside. It is
|
||||
* called by the Field and Method constructor methods.
|
||||
*
|
||||
* @see Field
|
||||
* @see Method
|
||||
* @param file Input stream
|
||||
* @param constant_pool Array of constants
|
||||
* @return Attribute
|
||||
* @throws IOException
|
||||
* @throws ClassFormatException
|
||||
*/
|
||||
public static final Attribute readAttribute(DataInputStream file,
|
||||
ConstantPool constant_pool)
|
||||
throws IOException, ClassFormatException
|
||||
{
|
||||
ConstantUtf8 c;
|
||||
String name;
|
||||
int name_index;
|
||||
int length;
|
||||
byte tag = Constants.ATTR_UNKNOWN; // Unknown attribute
|
||||
|
||||
// Get class name from constant pool via `name_index' indirection
|
||||
name_index = (int)file.readUnsignedShort();
|
||||
c = (ConstantUtf8)constant_pool.getConstant(name_index,
|
||||
Constants.CONSTANT_Utf8);
|
||||
name = c.getBytes();
|
||||
|
||||
// Length of data in bytes
|
||||
length = file.readInt();
|
||||
|
||||
// Compare strings to find known attribute
|
||||
for(byte i=0; i < Constants.KNOWN_ATTRIBUTES; i++) {
|
||||
if(name.equals(Constants.ATTRIBUTE_NAMES[i])) {
|
||||
tag = i; // found!
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Call proper constructor, depending on `tag'
|
||||
switch(tag) {
|
||||
case Constants.ATTR_UNKNOWN:
|
||||
AttributeReader r = (AttributeReader)readers.get(name);
|
||||
|
||||
if(r != null)
|
||||
return r.createAttribute(name_index, length, file, constant_pool);
|
||||
else
|
||||
return new Unknown(name_index, length, file, constant_pool);
|
||||
|
||||
case Constants.ATTR_CONSTANT_VALUE:
|
||||
return new ConstantValue(name_index, length, file, constant_pool);
|
||||
|
||||
case Constants.ATTR_SOURCE_FILE:
|
||||
return new SourceFile(name_index, length, file, constant_pool);
|
||||
|
||||
case Constants.ATTR_CODE:
|
||||
return new Code(name_index, length, file, constant_pool);
|
||||
|
||||
case Constants.ATTR_EXCEPTIONS:
|
||||
return new ExceptionTable(name_index, length, file, constant_pool);
|
||||
|
||||
case Constants.ATTR_LINE_NUMBER_TABLE:
|
||||
return new LineNumberTable(name_index, length, file, constant_pool);
|
||||
|
||||
case Constants.ATTR_LOCAL_VARIABLE_TABLE:
|
||||
return new LocalVariableTable(name_index, length, file, constant_pool);
|
||||
|
||||
case Constants.ATTR_INNER_CLASSES:
|
||||
return new InnerClasses(name_index, length, file, constant_pool);
|
||||
|
||||
case Constants.ATTR_SYNTHETIC:
|
||||
return new Synthetic(name_index, length, file, constant_pool);
|
||||
|
||||
case Constants.ATTR_DEPRECATED:
|
||||
return new Deprecated(name_index, length, file, constant_pool);
|
||||
|
||||
case Constants.ATTR_PMG:
|
||||
return new PMGClass(name_index, length, file, constant_pool);
|
||||
|
||||
case Constants.ATTR_SIGNATURE:
|
||||
return new Signature(name_index, length, file, constant_pool);
|
||||
|
||||
case Constants.ATTR_STACK_MAP:
|
||||
return new StackMap(name_index, length, file, constant_pool);
|
||||
|
||||
default: // Never reached
|
||||
throw new IllegalStateException("Ooops! default case reached.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Length of attribute field in bytes.
|
||||
*/
|
||||
public final int getLength() { return length; }
|
||||
|
||||
/**
|
||||
* @param Attribute length in bytes.
|
||||
*/
|
||||
public final void setLength(int length) {
|
||||
this.length = length;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name_index of attribute.
|
||||
*/
|
||||
public final void setNameIndex(int name_index) {
|
||||
this.name_index = name_index;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Name index in constant pool of attribute name.
|
||||
*/
|
||||
public final int getNameIndex() { return name_index; }
|
||||
|
||||
/**
|
||||
* @return Tag of attribute, i.e., its type. Value may not be altered, thus
|
||||
* there is no setTag() method.
|
||||
*/
|
||||
public final byte getTag() { return tag; }
|
||||
|
||||
/**
|
||||
* @return Constant pool used by this object.
|
||||
* @see ConstantPool
|
||||
*/
|
||||
public final ConstantPool getConstantPool() { return constant_pool; }
|
||||
|
||||
/**
|
||||
* @param constant_pool Constant pool to be used for this object.
|
||||
* @see ConstantPool
|
||||
*/
|
||||
public final void setConstantPool(ConstantPool constant_pool) {
|
||||
this.constant_pool = constant_pool;
|
||||
}
|
||||
|
||||
/**
|
||||
* Use copy() if you want to have a deep copy(), i.e., with all references
|
||||
* copied correctly.
|
||||
*
|
||||
* @return shallow copy of this attribute
|
||||
*/
|
||||
public Object clone() {
|
||||
Object o = null;
|
||||
|
||||
try {
|
||||
o = super.clone();
|
||||
} catch(CloneNotSupportedException e) {
|
||||
e.printStackTrace(); // Never occurs
|
||||
}
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return deep copy of this attribute
|
||||
*/
|
||||
public abstract Attribute copy(ConstantPool constant_pool);
|
||||
|
||||
/**
|
||||
* @return attribute name.
|
||||
*/
|
||||
public String toString() {
|
||||
return Constants.ATTRIBUTE_NAMES[tag];
|
||||
}
|
||||
}
|
||||
@ -1,100 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Unknown (non-standard) attributes may be read via user-defined factory
|
||||
* objects that can be registered with the Attribute.addAttributeReader
|
||||
* method. These factory objects should implement this interface.
|
||||
|
||||
* @see Attribute
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
*/
|
||||
public interface AttributeReader {
|
||||
/**
|
||||
When this attribute reader is added via the static method
|
||||
Attribute.addAttributeReader, an attribute name is associated with it.
|
||||
As the class file parser parses attributes, it will call various
|
||||
AttributeReaders based on the name of the attributes it is
|
||||
constructing.
|
||||
|
||||
@param name_index An index into the constant pool, indexing a
|
||||
ConstantUtf8 that represents the name of the attribute.
|
||||
|
||||
@param length The length of the data contained in the attribute. This
|
||||
is written into the constant pool and should agree with what the
|
||||
factory expects the length to be.
|
||||
|
||||
@param file This is the data input stream that the factory needs to read
|
||||
its data from.
|
||||
|
||||
@param constant_pool This is the constant pool associated with the
|
||||
Attribute that we are constructing.
|
||||
|
||||
@return The user-defined AttributeReader should take this data and use
|
||||
it to construct an attribute. In the case of errors, a null can be
|
||||
returned which will cause the parsing of the class file to fail.
|
||||
|
||||
@see Attribute#addAttributeReader( String, AttributeReader )
|
||||
*/
|
||||
public Attribute createAttribute(int name_index,
|
||||
int length,
|
||||
java.io.DataInputStream file,
|
||||
ConstantPool constant_pool);
|
||||
}
|
||||
@ -1,71 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Thrown when the BCEL attempts to read a class file and determines
|
||||
* that the file is malformed or otherwise cannot be interpreted as a
|
||||
* class file.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
*/
|
||||
public class ClassFormatException extends RuntimeException {
|
||||
public ClassFormatException() { super(); }
|
||||
public ClassFormatException(String s) { super(s); }
|
||||
}
|
||||
@ -1,331 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
import java.util.zip.*;
|
||||
|
||||
/**
|
||||
* Wrapper class that parses a given Java .class file. The method <A
|
||||
* href ="#parse">parse</A> returns a <A href ="JavaClass.html">
|
||||
* JavaClass</A> object on success. When an I/O error or an
|
||||
* inconsistency occurs an appropiate exception is propagated back to
|
||||
* the caller.
|
||||
*
|
||||
* The structure and the names comply, except for a few conveniences,
|
||||
* exactly with the <A href="ftp://java.sun.com/docs/specs/vmspec.ps">
|
||||
* JVM specification 1.0</a>. See this paper for
|
||||
* further details about the structure of a bytecode file.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
*/
|
||||
public final class ClassParser {
|
||||
private DataInputStream file;
|
||||
private ZipFile zip;
|
||||
private String file_name;
|
||||
private int class_name_index, superclass_name_index;
|
||||
private int major, minor; // Compiler version
|
||||
private int access_flags; // Access rights of parsed class
|
||||
private int[] interfaces; // Names of implemented interfaces
|
||||
private ConstantPool constant_pool; // collection of constants
|
||||
private Field[] fields; // class fields, i.e., its variables
|
||||
private Method[] methods; // methods defined in the class
|
||||
private Attribute[] attributes; // attributes defined in the class
|
||||
private boolean is_zip; // Loaded from zip file
|
||||
|
||||
private static final int BUFSIZE = 8192;
|
||||
|
||||
/**
|
||||
* Parse class from the given stream.
|
||||
*
|
||||
* @param file Input stream
|
||||
* @param file_name File name
|
||||
*/
|
||||
public ClassParser(InputStream file, String file_name) {
|
||||
this.file_name = file_name;
|
||||
|
||||
String clazz = file.getClass().getName(); // Not a very clean solution ...
|
||||
is_zip = clazz.startsWith("java.util.zip.") || clazz.startsWith("java.util.jar.");
|
||||
|
||||
if(file instanceof DataInputStream) // Is already a data stream
|
||||
this.file = (DataInputStream)file;
|
||||
else
|
||||
this.file = new DataInputStream(new BufferedInputStream(file, BUFSIZE));
|
||||
}
|
||||
|
||||
/** Parse class from given .class file.
|
||||
*
|
||||
* @param file_name file name
|
||||
* @throws IOException
|
||||
*/
|
||||
public ClassParser(String file_name) throws IOException
|
||||
{
|
||||
is_zip = false;
|
||||
this.file_name = file_name;
|
||||
file = new DataInputStream(new BufferedInputStream
|
||||
(new FileInputStream(file_name), BUFSIZE));
|
||||
}
|
||||
|
||||
/** Parse class from given .class file in a ZIP-archive
|
||||
*
|
||||
* @param file_name file name
|
||||
* @throws IOException
|
||||
*/
|
||||
public ClassParser(String zip_file, String file_name) throws IOException
|
||||
{
|
||||
is_zip = true;
|
||||
zip = new ZipFile(zip_file);
|
||||
ZipEntry entry = zip.getEntry(file_name);
|
||||
|
||||
this.file_name = file_name;
|
||||
|
||||
file = new DataInputStream(new BufferedInputStream(zip.getInputStream(entry),
|
||||
BUFSIZE));
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the given Java class file and return an object that represents
|
||||
* the contained data, i.e., constants, methods, fields and commands.
|
||||
* A <em>ClassFormatException</em> is raised, if the file is not a valid
|
||||
* .class file. (This does not include verification of the byte code as it
|
||||
* is performed by the java interpreter).
|
||||
*
|
||||
* @return Class object representing the parsed class file
|
||||
* @throws IOException
|
||||
* @throws ClassFormatException
|
||||
*/
|
||||
public JavaClass parse() throws IOException, ClassFormatException
|
||||
{
|
||||
/****************** Read headers ********************************/
|
||||
// Check magic tag of class file
|
||||
readID();
|
||||
|
||||
// Get compiler version
|
||||
readVersion();
|
||||
|
||||
/****************** Read constant pool and related **************/
|
||||
// Read constant pool entries
|
||||
readConstantPool();
|
||||
|
||||
// Get class information
|
||||
readClassInfo();
|
||||
|
||||
// Get interface information, i.e., implemented interfaces
|
||||
readInterfaces();
|
||||
|
||||
/****************** Read class fields and methods ***************/
|
||||
// Read class fields, i.e., the variables of the class
|
||||
readFields();
|
||||
|
||||
// Read class methods, i.e., the functions in the class
|
||||
readMethods();
|
||||
|
||||
// Read class attributes
|
||||
readAttributes();
|
||||
|
||||
// Check for unknown variables
|
||||
//Unknown[] u = Unknown.getUnknownAttributes();
|
||||
//for(int i=0; i < u.length; i++)
|
||||
// System.err.println("WARNING: " + u[i]);
|
||||
|
||||
// Everything should have been read now
|
||||
// if(file.available() > 0) {
|
||||
// int bytes = file.available();
|
||||
// byte[] buf = new byte[bytes];
|
||||
// file.read(buf);
|
||||
|
||||
// if(!(is_zip && (buf.length == 1))) {
|
||||
// System.err.println("WARNING: Trailing garbage at end of " + file_name);
|
||||
// System.err.println(bytes + " extra bytes: " + Utility.toHexString(buf));
|
||||
// }
|
||||
// }
|
||||
|
||||
// Read everything of interest, so close the file
|
||||
file.close();
|
||||
if(zip != null)
|
||||
zip.close();
|
||||
|
||||
// Return the information we have gathered in a new object
|
||||
return new JavaClass(class_name_index, superclass_name_index,
|
||||
file_name, major, minor, access_flags,
|
||||
constant_pool, interfaces, fields,
|
||||
methods, attributes, is_zip? JavaClass.ZIP : JavaClass.FILE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read information about the attributes of the class.
|
||||
* @throws IOException
|
||||
* @throws ClassFormatException
|
||||
*/
|
||||
private final void readAttributes() throws IOException, ClassFormatException
|
||||
{
|
||||
int attributes_count;
|
||||
|
||||
attributes_count = file.readUnsignedShort();
|
||||
attributes = new Attribute[attributes_count];
|
||||
|
||||
for(int i=0; i < attributes_count; i++)
|
||||
attributes[i] = Attribute.readAttribute(file, constant_pool);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read information about the class and its super class.
|
||||
* @throws IOException
|
||||
* @throws ClassFormatException
|
||||
*/
|
||||
private final void readClassInfo() throws IOException, ClassFormatException
|
||||
{
|
||||
access_flags = file.readUnsignedShort();
|
||||
|
||||
/* Interfaces are implicitely abstract, the flag should be set
|
||||
* according to the JVM specification.
|
||||
*/
|
||||
if((access_flags & Constants.ACC_INTERFACE) != 0)
|
||||
access_flags |= Constants.ACC_ABSTRACT;
|
||||
|
||||
if(((access_flags & Constants.ACC_ABSTRACT) != 0) &&
|
||||
((access_flags & Constants.ACC_FINAL) != 0 ))
|
||||
throw new ClassFormatException("Class can't be both final and abstract");
|
||||
|
||||
class_name_index = file.readUnsignedShort();
|
||||
superclass_name_index = file.readUnsignedShort();
|
||||
}
|
||||
/**
|
||||
* Read constant pool entries.
|
||||
* @throws IOException
|
||||
* @throws ClassFormatException
|
||||
*/
|
||||
private final void readConstantPool() throws IOException, ClassFormatException
|
||||
{
|
||||
constant_pool = new ConstantPool(file);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read information about the fields of the class, i.e., its variables.
|
||||
* @throws IOException
|
||||
* @throws ClassFormatException
|
||||
*/
|
||||
private final void readFields() throws IOException, ClassFormatException
|
||||
{
|
||||
int fields_count;
|
||||
|
||||
fields_count = file.readUnsignedShort();
|
||||
fields = new Field[fields_count];
|
||||
|
||||
for(int i=0; i < fields_count; i++)
|
||||
fields[i] = new Field(file, constant_pool);
|
||||
}
|
||||
|
||||
/******************** Private utility methods **********************/
|
||||
|
||||
/**
|
||||
* Check whether the header of the file is ok.
|
||||
* Of course, this has to be the first action on successive file reads.
|
||||
* @throws IOException
|
||||
* @throws ClassFormatException
|
||||
*/
|
||||
private final void readID() throws IOException, ClassFormatException
|
||||
{
|
||||
int magic = 0xCAFEBABE;
|
||||
|
||||
if(file.readInt() != magic)
|
||||
throw new ClassFormatException(file_name + " is not a Java .class file");
|
||||
}
|
||||
/**
|
||||
* Read information about the interfaces implemented by this class.
|
||||
* @throws IOException
|
||||
* @throws ClassFormatException
|
||||
*/
|
||||
private final void readInterfaces() throws IOException, ClassFormatException
|
||||
{
|
||||
int interfaces_count;
|
||||
|
||||
interfaces_count = file.readUnsignedShort();
|
||||
interfaces = new int[interfaces_count];
|
||||
|
||||
for(int i=0; i < interfaces_count; i++)
|
||||
interfaces[i] = file.readUnsignedShort();
|
||||
}
|
||||
/**
|
||||
* Read information about the methods of the class.
|
||||
* @throws IOException
|
||||
* @throws ClassFormatException
|
||||
*/
|
||||
private final void readMethods() throws IOException, ClassFormatException
|
||||
{
|
||||
int methods_count;
|
||||
|
||||
methods_count = file.readUnsignedShort();
|
||||
methods = new Method[methods_count];
|
||||
|
||||
for(int i=0; i < methods_count; i++)
|
||||
methods[i] = new Method(file, constant_pool);
|
||||
}
|
||||
/**
|
||||
* Read major and minor version of compiler which created the file.
|
||||
* @throws IOException
|
||||
* @throws ClassFormatException
|
||||
*/
|
||||
private final void readVersion() throws IOException, ClassFormatException
|
||||
{
|
||||
minor = file.readUnsignedShort();
|
||||
major = file.readUnsignedShort();
|
||||
}
|
||||
}
|
||||
@ -1,376 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class represents a chunk of Java byte code contained in a
|
||||
* method. It is instantiated by the
|
||||
* <em>Attribute.readAttribute()</em> method. A <em>Code</em>
|
||||
* attribute contains informations about operand stack, local
|
||||
* variables, byte code and the exceptions handled within this
|
||||
* method.
|
||||
*
|
||||
* This attribute has attributes itself, namely <em>LineNumberTable</em> which
|
||||
* is used for debugging purposes and <em>LocalVariableTable</em> which
|
||||
* contains information about the local variables.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see Attribute
|
||||
* @see CodeException
|
||||
* @see LineNumberTable
|
||||
* @see LocalVariableTable
|
||||
*/
|
||||
public final class Code extends Attribute {
|
||||
private int max_stack; // Maximum size of stack used by this method
|
||||
private int max_locals; // Number of local variables
|
||||
private int code_length; // Length of code in bytes
|
||||
private byte[] code; // Actual byte code
|
||||
|
||||
private int exception_table_length;
|
||||
private CodeException[] exception_table; // Table of handled exceptions
|
||||
private int attributes_count; // Attributes of code: LineNumber
|
||||
private Attribute[] attributes; // or LocalVariable
|
||||
|
||||
/**
|
||||
* Initialize from another object. Note that both objects use the same
|
||||
* references (shallow copy). Use copy() for a physical copy.
|
||||
*/
|
||||
public Code(Code c) {
|
||||
this(c.getNameIndex(), c.getLength(), c.getMaxStack(), c.getMaxLocals(),
|
||||
c.getCode(), c.getExceptionTable(), c.getAttributes(),
|
||||
c.getConstantPool());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name_index Index pointing to the name <em>Code</em>
|
||||
* @param length Content length in bytes
|
||||
* @param file Input stream
|
||||
* @param constant_pool Array of constants
|
||||
*/
|
||||
Code(int name_index, int length, DataInputStream file,
|
||||
ConstantPool constant_pool) throws IOException
|
||||
{
|
||||
// Initialize with some default values which will be overwritten later
|
||||
this(name_index, length,
|
||||
file.readUnsignedShort(), file.readUnsignedShort(),
|
||||
(byte[])null, (CodeException[])null, (Attribute[])null,
|
||||
constant_pool);
|
||||
|
||||
code_length = file.readInt();
|
||||
code = new byte[code_length]; // Read byte code
|
||||
file.readFully(code);
|
||||
|
||||
/* Read exception table that contains all regions where an exception
|
||||
* handler is active, i.e., a try { ... } catch() block.
|
||||
*/
|
||||
exception_table_length = file.readUnsignedShort();
|
||||
exception_table = new CodeException[exception_table_length];
|
||||
|
||||
for(int i=0; i < exception_table_length; i++)
|
||||
exception_table[i] = new CodeException(file);
|
||||
|
||||
/* Read all attributes, currently `LineNumberTable' and
|
||||
* `LocalVariableTable'
|
||||
*/
|
||||
attributes_count = file.readUnsignedShort();
|
||||
attributes = new Attribute[attributes_count];
|
||||
for(int i=0; i < attributes_count; i++)
|
||||
attributes[i] = Attribute.readAttribute(file, constant_pool);
|
||||
|
||||
/* Adjust length, because of setAttributes in this(), s.b. length
|
||||
* is incorrect, because it didn't take the internal attributes
|
||||
* into account yet! Very subtle bug, fixed in 3.1.1.
|
||||
*/
|
||||
this.length = length;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name_index Index pointing to the name <em>Code</em>
|
||||
* @param length Content length in bytes
|
||||
* @param max_stack Maximum size of stack
|
||||
* @param max_locals Number of local variables
|
||||
* @param code Actual byte code
|
||||
* @param exception_table Table of handled exceptions
|
||||
* @param attributes Attributes of code: LineNumber or LocalVariable
|
||||
* @param constant_pool Array of constants
|
||||
*/
|
||||
public Code(int name_index, int length,
|
||||
int max_stack, int max_locals,
|
||||
byte[] code,
|
||||
CodeException[] exception_table,
|
||||
Attribute[] attributes,
|
||||
ConstantPool constant_pool)
|
||||
{
|
||||
super(Constants.ATTR_CODE, name_index, length, constant_pool);
|
||||
|
||||
this.max_stack = max_stack;
|
||||
this.max_locals = max_locals;
|
||||
|
||||
setCode(code);
|
||||
setExceptionTable(exception_table);
|
||||
setAttributes(attributes); // Overwrites length!
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitCode(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump code attribute to file stream in binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
super.dump(file);
|
||||
|
||||
file.writeShort(max_stack);
|
||||
file.writeShort(max_locals);
|
||||
file.writeInt(code_length);
|
||||
file.write(code, 0, code_length);
|
||||
|
||||
file.writeShort(exception_table_length);
|
||||
for(int i=0; i < exception_table_length; i++)
|
||||
exception_table[i].dump(file);
|
||||
|
||||
file.writeShort(attributes_count);
|
||||
for(int i=0; i < attributes_count; i++)
|
||||
attributes[i].dump(file);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Collection of code attributes.
|
||||
* @see Attribute
|
||||
*/
|
||||
public final Attribute[] getAttributes() { return attributes; }
|
||||
|
||||
/**
|
||||
* @return LineNumberTable of Code, if it has one
|
||||
*/
|
||||
public LineNumberTable getLineNumberTable() {
|
||||
for(int i=0; i < attributes_count; i++)
|
||||
if(attributes[i] instanceof LineNumberTable)
|
||||
return (LineNumberTable)attributes[i];
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return LocalVariableTable of Code, if it has one
|
||||
*/
|
||||
public LocalVariableTable getLocalVariableTable() {
|
||||
for(int i=0; i < attributes_count; i++)
|
||||
if(attributes[i] instanceof LocalVariableTable)
|
||||
return (LocalVariableTable)attributes[i];
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Actual byte code of the method.
|
||||
*/
|
||||
public final byte[] getCode() { return code; }
|
||||
|
||||
/**
|
||||
* @return Table of handled exceptions.
|
||||
* @see CodeException
|
||||
*/
|
||||
public final CodeException[] getExceptionTable() { return exception_table; }
|
||||
|
||||
/**
|
||||
* @return Number of local variables.
|
||||
*/
|
||||
public final int getMaxLocals() { return max_locals; }
|
||||
|
||||
/**
|
||||
* @return Maximum size of stack used by this method.
|
||||
*/
|
||||
|
||||
public final int getMaxStack() { return max_stack; }
|
||||
|
||||
/**
|
||||
* @return the internal length of this code attribute (minus the first 6 bytes)
|
||||
* and excluding all its attributes
|
||||
*/
|
||||
private final int getInternalLength() {
|
||||
return 2 /*max_stack*/ + 2 /*max_locals*/ + 4 /*code length*/
|
||||
+ code_length /*byte-code*/
|
||||
+ 2 /*exception-table length*/
|
||||
+ 8 * exception_table_length /* exception table */
|
||||
+ 2 /* attributes count */;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the full size of this code attribute, minus its first 6 bytes,
|
||||
* including the size of all its contained attributes
|
||||
*/
|
||||
private final int calculateLength() {
|
||||
int len = 0;
|
||||
|
||||
for(int i=0; i < attributes_count; i++)
|
||||
len += attributes[i].length + 6 /*attribute header size*/;
|
||||
|
||||
return len + getInternalLength();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param attributes.
|
||||
*/
|
||||
public final void setAttributes(Attribute[] attributes) {
|
||||
this.attributes = attributes;
|
||||
attributes_count = (attributes == null)? 0 : attributes.length;
|
||||
length = calculateLength(); // Adjust length
|
||||
}
|
||||
|
||||
/**
|
||||
* @param code byte code
|
||||
*/
|
||||
public final void setCode(byte[] code) {
|
||||
this.code = code;
|
||||
code_length = (code == null)? 0 : code.length;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param exception_table exception table
|
||||
*/
|
||||
public final void setExceptionTable(CodeException[] exception_table) {
|
||||
this.exception_table = exception_table;
|
||||
exception_table_length = (exception_table == null)? 0 :
|
||||
exception_table.length;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param max_locals maximum number of local variables
|
||||
*/
|
||||
public final void setMaxLocals(int max_locals) {
|
||||
this.max_locals = max_locals;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param max_stack maximum stack size
|
||||
*/
|
||||
public final void setMaxStack(int max_stack) {
|
||||
this.max_stack = max_stack;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return String representation of code chunk.
|
||||
*/
|
||||
public final String toString(boolean verbose) {
|
||||
StringBuffer buf;
|
||||
|
||||
buf = new StringBuffer("Code(max_stack = " + max_stack +
|
||||
", max_locals = " + max_locals +
|
||||
", code_length = " + code_length + ")\n" +
|
||||
Utility.codeToString(code, constant_pool, 0, -1, verbose));
|
||||
|
||||
if(exception_table_length > 0) {
|
||||
buf.append("\nException handler(s) = \n" + "From\tTo\tHandler\tType\n");
|
||||
|
||||
for(int i=0; i < exception_table_length; i++)
|
||||
buf.append(exception_table[i].toString(constant_pool, verbose) + "\n");
|
||||
}
|
||||
|
||||
if(attributes_count > 0) {
|
||||
buf.append("\nAttribute(s) = \n");
|
||||
|
||||
for(int i=0; i < attributes_count; i++)
|
||||
buf.append(attributes[i].toString() + "\n");
|
||||
}
|
||||
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return String representation of code chunk.
|
||||
*/
|
||||
public final String toString() {
|
||||
return toString(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return deep copy of this attribute
|
||||
*/
|
||||
public Attribute copy(ConstantPool constant_pool) {
|
||||
Code c = (Code)clone();
|
||||
c.code = (byte[])code.clone();
|
||||
c.constant_pool = constant_pool;
|
||||
|
||||
c.exception_table = new CodeException[exception_table_length];
|
||||
for(int i=0; i < exception_table_length; i++)
|
||||
c.exception_table[i] = exception_table[i].copy();
|
||||
|
||||
c.attributes = new Attribute[attributes_count];
|
||||
for(int i=0; i < attributes_count; i++)
|
||||
c.attributes[i] = attributes[i].copy(constant_pool);
|
||||
|
||||
return c;
|
||||
}
|
||||
}
|
||||
@ -1,232 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class represents an entry in the exception table of the <em>Code</em>
|
||||
* attribute and is used only there. It contains a range in which a
|
||||
* particular exception handler is active.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see Code
|
||||
*/
|
||||
public final class CodeException
|
||||
implements Cloneable, Constants, Node, Serializable
|
||||
{
|
||||
private int start_pc; // Range in the code the exception handler is
|
||||
private int end_pc; // active. start_pc is inclusive, end_pc exclusive
|
||||
private int handler_pc; /* Starting address of exception handler, i.e.,
|
||||
* an offset from start of code.
|
||||
*/
|
||||
private int catch_type; /* If this is zero the handler catches any
|
||||
* exception, otherwise it points to the
|
||||
* exception class which is to be caught.
|
||||
*/
|
||||
/**
|
||||
* Initialize from another object.
|
||||
*/
|
||||
public CodeException(CodeException c) {
|
||||
this(c.getStartPC(), c.getEndPC(), c.getHandlerPC(), c.getCatchType());
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct object from file stream.
|
||||
* @param file Input stream
|
||||
* @throws IOException
|
||||
*/
|
||||
CodeException(DataInputStream file) throws IOException
|
||||
{
|
||||
this(file.readUnsignedShort(), file.readUnsignedShort(),
|
||||
file.readUnsignedShort(), file.readUnsignedShort());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param start_pc Range in the code the exception handler is active,
|
||||
* start_pc is inclusive while
|
||||
* @param end_pc is exclusive
|
||||
* @param handler_pc Starting address of exception handler, i.e.,
|
||||
* an offset from start of code.
|
||||
* @param catch_type If zero the handler catches any
|
||||
* exception, otherwise it points to the exception class which is
|
||||
* to be caught.
|
||||
*/
|
||||
public CodeException(int start_pc, int end_pc, int handler_pc,
|
||||
int catch_type)
|
||||
{
|
||||
this.start_pc = start_pc;
|
||||
this.end_pc = end_pc;
|
||||
this.handler_pc = handler_pc;
|
||||
this.catch_type = catch_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitCodeException(this);
|
||||
}
|
||||
/**
|
||||
* Dump code exception to file stream in binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
file.writeShort(start_pc);
|
||||
file.writeShort(end_pc);
|
||||
file.writeShort(handler_pc);
|
||||
file.writeShort(catch_type);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return 0, if the handler catches any exception, otherwise it points to
|
||||
* the exception class which is to be caught.
|
||||
*/
|
||||
public final int getCatchType() { return catch_type; }
|
||||
|
||||
/**
|
||||
* @return Exclusive end index of the region where the handler is active.
|
||||
*/
|
||||
public final int getEndPC() { return end_pc; }
|
||||
|
||||
/**
|
||||
* @return Starting address of exception handler, relative to the code.
|
||||
*/
|
||||
public final int getHandlerPC() { return handler_pc; }
|
||||
|
||||
/**
|
||||
* @return Inclusive start index of the region where the handler is active.
|
||||
*/
|
||||
public final int getStartPC() { return start_pc; }
|
||||
|
||||
/**
|
||||
* @param catch_type.
|
||||
*/
|
||||
public final void setCatchType(int catch_type) {
|
||||
this.catch_type = catch_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param end_pc end of handled block
|
||||
*/
|
||||
public final void setEndPC(int end_pc) {
|
||||
this.end_pc = end_pc;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param handler_pc where the actual code is
|
||||
*/
|
||||
public final void setHandlerPC(int handler_pc) {
|
||||
this.handler_pc = handler_pc;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param start_pc start of handled block
|
||||
*/
|
||||
public final void setStartPC(int start_pc) {
|
||||
this.start_pc = start_pc;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return String representation.
|
||||
*/
|
||||
public final String toString() {
|
||||
return "CodeException(start_pc = " + start_pc +
|
||||
", end_pc = " + end_pc +
|
||||
", handler_pc = " + handler_pc + ", catch_type = " + catch_type + ")";
|
||||
}
|
||||
|
||||
/**
|
||||
* @return String representation.
|
||||
*/
|
||||
public final String toString(ConstantPool cp, boolean verbose) {
|
||||
String str;
|
||||
|
||||
if(catch_type == 0)
|
||||
str = "<Any exception>(0)";
|
||||
else
|
||||
str = Utility.compactClassName(cp.getConstantString(catch_type, CONSTANT_Class), false) +
|
||||
(verbose? "(" + catch_type + ")" : "");
|
||||
|
||||
return start_pc + "\t" + end_pc + "\t" + handler_pc + "\t" + str;
|
||||
}
|
||||
|
||||
public final String toString(ConstantPool cp) {
|
||||
return toString(cp, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return deep copy of this object
|
||||
*/
|
||||
public CodeException copy() {
|
||||
try {
|
||||
return (CodeException)clone();
|
||||
} catch(CloneNotSupportedException e) {}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -1,151 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* Abstract superclass for classes to represent the different constant types
|
||||
* in the constant pool of a class file. The classes keep closely to
|
||||
* the JVM specification.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
*/
|
||||
public abstract class Constant implements Cloneable, Node, Serializable {
|
||||
/* In fact this tag is redundant since we can distinguish different
|
||||
* `Constant' objects by their type, i.e., via `instanceof'. In some
|
||||
* places we will use the tag for switch()es anyway.
|
||||
*
|
||||
* First, we want match the specification as closely as possible. Second we
|
||||
* need the tag as an index to select the corresponding class name from the
|
||||
* `CONSTANT_NAMES' array.
|
||||
*/
|
||||
protected byte tag;
|
||||
|
||||
Constant(byte tag) { this.tag = tag; }
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public abstract void accept(Visitor v);
|
||||
|
||||
public abstract void dump(DataOutputStream file) throws IOException;
|
||||
|
||||
/**
|
||||
* @return Tag of constant, i.e., its type. No setTag() method to avoid
|
||||
* confusion.
|
||||
*/
|
||||
public final byte getTag() { return tag; }
|
||||
|
||||
/**
|
||||
* @return String representation.
|
||||
*/
|
||||
public String toString() {
|
||||
return Constants.CONSTANT_NAMES[tag] + "[" + tag + "]";
|
||||
}
|
||||
|
||||
/**
|
||||
* @return deep copy of this constant
|
||||
*/
|
||||
public Constant copy() {
|
||||
try {
|
||||
return (Constant)super.clone();
|
||||
} catch(CloneNotSupportedException e) {}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public Object clone() throws CloneNotSupportedException {
|
||||
return super.clone();
|
||||
}
|
||||
|
||||
/**
|
||||
* Read one constant from the given file, the type depends on a tag byte.
|
||||
*
|
||||
* @param file Input stream
|
||||
* @return Constant object
|
||||
*/
|
||||
static final Constant readConstant(DataInputStream file)
|
||||
throws IOException, ClassFormatException
|
||||
{
|
||||
byte b = file.readByte(); // Read tag byte
|
||||
|
||||
switch(b) {
|
||||
case Constants.CONSTANT_Class: return new ConstantClass(file);
|
||||
case Constants.CONSTANT_Fieldref: return new ConstantFieldref(file);
|
||||
case Constants.CONSTANT_Methodref: return new ConstantMethodref(file);
|
||||
case Constants.CONSTANT_InterfaceMethodref: return new
|
||||
ConstantInterfaceMethodref(file);
|
||||
case Constants.CONSTANT_String: return new ConstantString(file);
|
||||
case Constants.CONSTANT_Integer: return new ConstantInteger(file);
|
||||
case Constants.CONSTANT_Float: return new ConstantFloat(file);
|
||||
case Constants.CONSTANT_Long: return new ConstantLong(file);
|
||||
case Constants.CONSTANT_Double: return new ConstantDouble(file);
|
||||
case Constants.CONSTANT_NameAndType: return new ConstantNameAndType(file);
|
||||
case Constants.CONSTANT_Utf8: return new ConstantUtf8(file);
|
||||
default:
|
||||
throw new ClassFormatException("Invalid byte tag in constant pool: " + b);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,157 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
import java.io.*;
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
|
||||
/**
|
||||
* Abstract super class for Fieldref and Methodref constants.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see ConstantFieldref
|
||||
* @see ConstantMethodref
|
||||
* @see ConstantInterfaceMethodref
|
||||
*/
|
||||
public abstract class ConstantCP extends Constant {
|
||||
/** References to the constants containing the class and the field signature
|
||||
*/
|
||||
protected int class_index, name_and_type_index;
|
||||
|
||||
/**
|
||||
* Initialize from another object.
|
||||
*/
|
||||
public ConstantCP(ConstantCP c) {
|
||||
this(c.getTag(), c.getClassIndex(), c.getNameAndTypeIndex());
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize instance from file data.
|
||||
*
|
||||
* @param tag Constant type tag
|
||||
* @param file Input stream
|
||||
* @throws IOException
|
||||
*/
|
||||
ConstantCP(byte tag, DataInputStream file) throws IOException
|
||||
{
|
||||
this(tag, file.readUnsignedShort(), file.readUnsignedShort());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param class_index Reference to the class containing the field
|
||||
* @param name_and_type_index and the field signature
|
||||
*/
|
||||
protected ConstantCP(byte tag, int class_index,
|
||||
int name_and_type_index) {
|
||||
super(tag);
|
||||
this.class_index = class_index;
|
||||
this.name_and_type_index = name_and_type_index;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump constant field reference to file stream in binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
file.writeByte(tag);
|
||||
file.writeShort(class_index);
|
||||
file.writeShort(name_and_type_index);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Reference (index) to class this field or method belongs to.
|
||||
*/
|
||||
public final int getClassIndex() { return class_index; }
|
||||
|
||||
/**
|
||||
* @return Reference (index) to signature of the field.
|
||||
*/
|
||||
public final int getNameAndTypeIndex() { return name_and_type_index; }
|
||||
|
||||
/**
|
||||
* @param class_index points to Constant_class
|
||||
*/
|
||||
public final void setClassIndex(int class_index) {
|
||||
this.class_index = class_index;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Class this field belongs to.
|
||||
*/
|
||||
public String getClass(ConstantPool cp) {
|
||||
return cp.constantToString(class_index, Constants.CONSTANT_Class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name_and_type_index points to Constant_NameAndType
|
||||
*/
|
||||
public final void setNameAndTypeIndex(int name_and_type_index) {
|
||||
this.name_and_type_index = name_and_type_index;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return String representation.
|
||||
*/
|
||||
public final String toString() {
|
||||
return super.toString() + "(class_index = " + class_index +
|
||||
", name_and_type_index = " + name_and_type_index + ")";
|
||||
}
|
||||
}
|
||||
@ -1,157 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class is derived from the abstract
|
||||
* <A HREF="com.sun.org.apache.bcel.internal.classfile.Constant.html">Constant</A> class
|
||||
* and represents a reference to a (external) class.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see Constant
|
||||
*/
|
||||
public final class ConstantClass extends Constant implements ConstantObject {
|
||||
private int name_index; // Identical to ConstantString except for the name
|
||||
|
||||
/**
|
||||
* Initialize from another object.
|
||||
*/
|
||||
public ConstantClass(ConstantClass c) {
|
||||
this(c.getNameIndex());
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize instance from file data.
|
||||
*
|
||||
* @param file Input stream
|
||||
* @throws IOException
|
||||
*/
|
||||
ConstantClass(DataInputStream file) throws IOException
|
||||
{
|
||||
this(file.readUnsignedShort());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name_index Name index in constant pool. Should refer to a
|
||||
* ConstantUtf8.
|
||||
*/
|
||||
public ConstantClass(int name_index) {
|
||||
super(Constants.CONSTANT_Class);
|
||||
this.name_index = name_index;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitConstantClass(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump constant class to file stream in binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
file.writeByte(tag);
|
||||
file.writeShort(name_index);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Name index in constant pool of class name.
|
||||
*/
|
||||
public final int getNameIndex() { return name_index; }
|
||||
|
||||
/**
|
||||
* @param name_index.
|
||||
*/
|
||||
public final void setNameIndex(int name_index) {
|
||||
this.name_index = name_index;
|
||||
}
|
||||
|
||||
|
||||
/** @return String object
|
||||
*/
|
||||
public Object getConstantValue(ConstantPool cp) {
|
||||
Constant c = cp.getConstant(name_index, Constants.CONSTANT_Utf8);
|
||||
return ((ConstantUtf8)c).getBytes();
|
||||
}
|
||||
|
||||
/** @return dereferenced string
|
||||
*/
|
||||
public String getBytes(ConstantPool cp) {
|
||||
return (String)getConstantValue(cp);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return String representation.
|
||||
*/
|
||||
public final String toString() {
|
||||
return super.toString() + "(name_index = " + name_index + ")";
|
||||
}
|
||||
}
|
||||
@ -1,145 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class is derived from the abstract
|
||||
* <A HREF="com.sun.org.apache.bcel.internal.classfile.Constant.html">Constant</A> class
|
||||
* and represents a reference to a Double object.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see Constant
|
||||
*/
|
||||
public final class ConstantDouble extends Constant implements ConstantObject {
|
||||
private double bytes;
|
||||
|
||||
/**
|
||||
* @param bytes Data
|
||||
*/
|
||||
public ConstantDouble(double bytes) {
|
||||
super(Constants.CONSTANT_Double);
|
||||
this.bytes = bytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize from another object.
|
||||
*/
|
||||
public ConstantDouble(ConstantDouble c) {
|
||||
this(c.getBytes());
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize instance from file data.
|
||||
*
|
||||
* @param file Input stream
|
||||
* @throws IOException
|
||||
*/
|
||||
ConstantDouble(DataInputStream file) throws IOException
|
||||
{
|
||||
this(file.readDouble());
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitConstantDouble(this);
|
||||
}
|
||||
/**
|
||||
* Dump constant double to file stream in binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
file.writeByte(tag);
|
||||
file.writeDouble(bytes);
|
||||
}
|
||||
/**
|
||||
* @return data, i.e., 8 bytes.
|
||||
*/
|
||||
public final double getBytes() { return bytes; }
|
||||
/**
|
||||
* @param bytes.
|
||||
*/
|
||||
public final void setBytes(double bytes) {
|
||||
this.bytes = bytes;
|
||||
}
|
||||
/**
|
||||
* @return String representation.
|
||||
*/
|
||||
public final String toString()
|
||||
{
|
||||
return super.toString() + "(bytes = " + bytes + ")";
|
||||
}
|
||||
|
||||
/** @return Double object
|
||||
*/
|
||||
public Object getConstantValue(ConstantPool cp) {
|
||||
return new Double(bytes);
|
||||
}
|
||||
}
|
||||
@ -1,107 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class represents a constant pool reference to a field.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
*/
|
||||
public final class ConstantFieldref extends ConstantCP {
|
||||
/**
|
||||
* Initialize from another object.
|
||||
*/
|
||||
public ConstantFieldref(ConstantFieldref c) {
|
||||
super(Constants.CONSTANT_Fieldref, c.getClassIndex(), c.getNameAndTypeIndex());
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize instance from file data.
|
||||
*
|
||||
* @param file input stream
|
||||
* @throws IOException
|
||||
*/
|
||||
ConstantFieldref(DataInputStream file) throws IOException
|
||||
{
|
||||
super(Constants.CONSTANT_Fieldref, file);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param class_index Reference to the class containing the Field
|
||||
* @param name_and_type_index and the Field signature
|
||||
*/
|
||||
public ConstantFieldref(int class_index,
|
||||
int name_and_type_index) {
|
||||
super(Constants.CONSTANT_Fieldref, class_index, name_and_type_index);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of Fields,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitConstantFieldref(this);
|
||||
}
|
||||
}
|
||||
@ -1,144 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class is derived from the abstract
|
||||
* <A HREF="com.sun.org.apache.bcel.internal.classfile.Constant.html">Constant</A> class
|
||||
* and represents a reference to a float object.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see Constant
|
||||
*/
|
||||
public final class ConstantFloat extends Constant implements ConstantObject {
|
||||
private float bytes;
|
||||
|
||||
/**
|
||||
* @param bytes Data
|
||||
*/
|
||||
public ConstantFloat(float bytes)
|
||||
{
|
||||
super(Constants.CONSTANT_Float);
|
||||
this.bytes = bytes;
|
||||
}
|
||||
/**
|
||||
* Initialize from another object. Note that both objects use the same
|
||||
* references (shallow copy). Use clone() for a physical copy.
|
||||
*/
|
||||
public ConstantFloat(ConstantFloat c) {
|
||||
this(c.getBytes());
|
||||
}
|
||||
/**
|
||||
* Initialize instance from file data.
|
||||
*
|
||||
* @param file Input stream
|
||||
* @throws IOException
|
||||
*/
|
||||
ConstantFloat(DataInputStream file) throws IOException
|
||||
{
|
||||
this(file.readFloat());
|
||||
}
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitConstantFloat(this);
|
||||
}
|
||||
/**
|
||||
* Dump constant float to file stream in binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
file.writeByte(tag);
|
||||
file.writeFloat(bytes);
|
||||
}
|
||||
/**
|
||||
* @return data, i.e., 4 bytes.
|
||||
*/
|
||||
public final float getBytes() { return bytes; }
|
||||
/**
|
||||
* @param bytes.
|
||||
*/
|
||||
public final void setBytes(float bytes) {
|
||||
this.bytes = bytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return String representation.
|
||||
*/
|
||||
public final String toString() {
|
||||
return super.toString() + "(bytes = " + bytes + ")";
|
||||
}
|
||||
|
||||
/** @return Float object
|
||||
*/
|
||||
public Object getConstantValue(ConstantPool cp) {
|
||||
return new Float(bytes);
|
||||
}
|
||||
}
|
||||
@ -1,151 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class is derived from the abstract
|
||||
* <A HREF="com.sun.org.apache.bcel.internal.classfile.Constant.html">Constant</A> class
|
||||
* and represents a reference to an int object.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see Constant
|
||||
*/
|
||||
public final class ConstantInteger extends Constant implements ConstantObject {
|
||||
private int bytes;
|
||||
|
||||
/**
|
||||
* @param bytes Data
|
||||
*/
|
||||
public ConstantInteger(int bytes)
|
||||
{
|
||||
super(Constants.CONSTANT_Integer);
|
||||
this.bytes = bytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize from another object.
|
||||
*/
|
||||
public ConstantInteger(ConstantInteger c) {
|
||||
this(c.getBytes());
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize instance from file data.
|
||||
*
|
||||
* @param file Input stream
|
||||
* @throws IOException
|
||||
*/
|
||||
ConstantInteger(DataInputStream file) throws IOException
|
||||
{
|
||||
this(file.readInt());
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitConstantInteger(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump constant integer to file stream in binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
file.writeByte(tag);
|
||||
file.writeInt(bytes);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return data, i.e., 4 bytes.
|
||||
*/
|
||||
public final int getBytes() { return bytes; }
|
||||
|
||||
/**
|
||||
* @param bytes.
|
||||
*/
|
||||
public final void setBytes(int bytes) {
|
||||
this.bytes = bytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return String representation.
|
||||
*/
|
||||
public final String toString() {
|
||||
return super.toString() + "(bytes = " + bytes + ")";
|
||||
}
|
||||
|
||||
/** @return Integer object
|
||||
*/
|
||||
public Object getConstantValue(ConstantPool cp) {
|
||||
return new Integer(bytes);
|
||||
}
|
||||
}
|
||||
@ -1,107 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class represents a constant pool reference to an interface method.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
*/
|
||||
public final class ConstantInterfaceMethodref extends ConstantCP {
|
||||
/**
|
||||
* Initialize from another object.
|
||||
*/
|
||||
public ConstantInterfaceMethodref(ConstantInterfaceMethodref c) {
|
||||
super(Constants.CONSTANT_InterfaceMethodref, c.getClassIndex(), c.getNameAndTypeIndex());
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize instance from file data.
|
||||
*
|
||||
* @param file input stream
|
||||
* @throws IOException
|
||||
*/
|
||||
ConstantInterfaceMethodref(DataInputStream file) throws IOException
|
||||
{
|
||||
super(Constants.CONSTANT_InterfaceMethodref, file);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param class_index Reference to the class containing the method
|
||||
* @param name_and_type_index and the method signature
|
||||
*/
|
||||
public ConstantInterfaceMethodref(int class_index,
|
||||
int name_and_type_index) {
|
||||
super(Constants.CONSTANT_InterfaceMethodref, class_index, name_and_type_index);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitConstantInterfaceMethodref(this);
|
||||
}
|
||||
}
|
||||
@ -1,142 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class is derived from the abstract
|
||||
* <A HREF="com.sun.org.apache.bcel.internal.classfile.Constant.html">Constant</A> class
|
||||
* and represents a reference to a long object.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see Constant
|
||||
*/
|
||||
public final class ConstantLong extends Constant implements ConstantObject {
|
||||
private long bytes;
|
||||
|
||||
/**
|
||||
* @param bytes Data
|
||||
*/
|
||||
public ConstantLong(long bytes)
|
||||
{
|
||||
super(Constants.CONSTANT_Long);
|
||||
this.bytes = bytes;
|
||||
}
|
||||
/**
|
||||
* Initialize from another object.
|
||||
*/
|
||||
public ConstantLong(ConstantLong c) {
|
||||
this(c.getBytes());
|
||||
}
|
||||
/**
|
||||
* Initialize instance from file data.
|
||||
*
|
||||
* @param file Input stream
|
||||
* @throws IOException
|
||||
*/
|
||||
ConstantLong(DataInputStream file) throws IOException
|
||||
{
|
||||
this(file.readLong());
|
||||
}
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitConstantLong(this);
|
||||
}
|
||||
/**
|
||||
* Dump constant long to file stream in binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
file.writeByte(tag);
|
||||
file.writeLong(bytes);
|
||||
}
|
||||
/**
|
||||
* @return data, i.e., 8 bytes.
|
||||
*/
|
||||
public final long getBytes() { return bytes; }
|
||||
/**
|
||||
* @param bytes.
|
||||
*/
|
||||
public final void setBytes(long bytes) {
|
||||
this.bytes = bytes;
|
||||
}
|
||||
/**
|
||||
* @return String representation.
|
||||
*/
|
||||
public final String toString() {
|
||||
return super.toString() + "(bytes = " + bytes + ")";
|
||||
}
|
||||
|
||||
/** @return Long object
|
||||
*/
|
||||
public Object getConstantValue(ConstantPool cp) {
|
||||
return new Long(bytes);
|
||||
}
|
||||
}
|
||||
@ -1,107 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class represents a constant pool reference to a method.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
*/
|
||||
public final class ConstantMethodref extends ConstantCP {
|
||||
/**
|
||||
* Initialize from another object.
|
||||
*/
|
||||
public ConstantMethodref(ConstantMethodref c) {
|
||||
super(Constants.CONSTANT_Methodref, c.getClassIndex(), c.getNameAndTypeIndex());
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize instance from file data.
|
||||
*
|
||||
* @param file input stream
|
||||
* @throws IOException
|
||||
*/
|
||||
ConstantMethodref(DataInputStream file) throws IOException
|
||||
{
|
||||
super(Constants.CONSTANT_Methodref, file);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param class_index Reference to the class containing the method
|
||||
* @param name_and_type_index and the method signature
|
||||
*/
|
||||
public ConstantMethodref(int class_index,
|
||||
int name_and_type_index) {
|
||||
super(Constants.CONSTANT_Methodref, class_index, name_and_type_index);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitConstantMethodref(this);
|
||||
}
|
||||
}
|
||||
@ -1,174 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class is derived from the abstract
|
||||
* <A HREF="com.sun.org.apache.bcel.internal.classfile.Constant.html">Constant</A> class
|
||||
* and represents a reference to the name and signature
|
||||
* of a field or method.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see Constant
|
||||
*/
|
||||
public final class ConstantNameAndType extends Constant {
|
||||
private int name_index; // Name of field/method
|
||||
private int signature_index; // and its signature.
|
||||
|
||||
/**
|
||||
* Initialize from another object.
|
||||
*/
|
||||
public ConstantNameAndType(ConstantNameAndType c) {
|
||||
this(c.getNameIndex(), c.getSignatureIndex());
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize instance from file data.
|
||||
*
|
||||
* @param file Input stream
|
||||
* @throws IOException
|
||||
*/
|
||||
ConstantNameAndType(DataInputStream file) throws IOException
|
||||
{
|
||||
this((int)file.readUnsignedShort(), (int)file.readUnsignedShort());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name_index Name of field/method
|
||||
* @param signature_index and its signature
|
||||
*/
|
||||
public ConstantNameAndType(int name_index,
|
||||
int signature_index)
|
||||
{
|
||||
super(Constants.CONSTANT_NameAndType);
|
||||
this.name_index = name_index;
|
||||
this.signature_index = signature_index;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitConstantNameAndType(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump name and signature index to file stream in binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
file.writeByte(tag);
|
||||
file.writeShort(name_index);
|
||||
file.writeShort(signature_index);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Name index in constant pool of field/method name.
|
||||
*/
|
||||
public final int getNameIndex() { return name_index; }
|
||||
|
||||
/** @return name
|
||||
*/
|
||||
public final String getName(ConstantPool cp) {
|
||||
return cp.constantToString(getNameIndex(), Constants.CONSTANT_Utf8);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Index in constant pool of field/method signature.
|
||||
*/
|
||||
public final int getSignatureIndex() { return signature_index; }
|
||||
|
||||
/** @return signature
|
||||
*/
|
||||
public final String getSignature(ConstantPool cp) {
|
||||
return cp.constantToString(getSignatureIndex(), Constants.CONSTANT_Utf8);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name_index.
|
||||
*/
|
||||
public final void setNameIndex(int name_index) {
|
||||
this.name_index = name_index;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param signature_index.
|
||||
*/
|
||||
public final void setSignatureIndex(int signature_index) {
|
||||
this.signature_index = signature_index;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return String representation
|
||||
*/
|
||||
public final String toString() {
|
||||
return super.toString() + "(name_index = " + name_index +
|
||||
", signature_index = " + signature_index + ")";
|
||||
}
|
||||
}
|
||||
@ -1,72 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* This interface denotes those constants that have a "natural" value,
|
||||
* such as ConstantLong, ConstantString, etc..
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see Constant
|
||||
*/
|
||||
public interface ConstantObject {
|
||||
/** @return object representing the constant, e.g., Long for ConstantLong
|
||||
*/
|
||||
public abstract Object getConstantValue(ConstantPool cp);
|
||||
}
|
||||
@ -1,375 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class represents the constant pool, i.e., a table of constants, of
|
||||
* a parsed classfile. It may contain null references, due to the JVM
|
||||
* specification that skips an entry after an 8-byte constant (double,
|
||||
* long) entry. Those interested in generating constant pools
|
||||
* programatically should see <a href="../generic/ConstantPoolGen.html">
|
||||
* ConstantPoolGen</a>.
|
||||
|
||||
* @see Constant
|
||||
* @see com.sun.org.apache.bcel.internal.generic.ConstantPoolGen
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
*/
|
||||
public class ConstantPool implements Cloneable, Node, Serializable {
|
||||
private int constant_pool_count;
|
||||
private Constant[] constant_pool;
|
||||
|
||||
/**
|
||||
* @param constant_pool Array of constants
|
||||
*/
|
||||
public ConstantPool(Constant[] constant_pool)
|
||||
{
|
||||
setConstantPool(constant_pool);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read constants from given file stream.
|
||||
*
|
||||
* @param file Input stream
|
||||
* @throws IOException
|
||||
* @throws ClassFormatException
|
||||
*/
|
||||
ConstantPool(DataInputStream file) throws IOException, ClassFormatException
|
||||
{
|
||||
byte tag;
|
||||
|
||||
constant_pool_count = file.readUnsignedShort();
|
||||
constant_pool = new Constant[constant_pool_count];
|
||||
|
||||
/* constant_pool[0] is unused by the compiler and may be used freely
|
||||
* by the implementation.
|
||||
*/
|
||||
for(int i=1; i < constant_pool_count; i++) {
|
||||
constant_pool[i] = Constant.readConstant(file);
|
||||
|
||||
/* Quote from the JVM specification:
|
||||
* "All eight byte constants take up two spots in the constant pool.
|
||||
* If this is the n'th byte in the constant pool, then the next item
|
||||
* will be numbered n+2"
|
||||
*
|
||||
* Thus we have to increment the index counter.
|
||||
*/
|
||||
tag = constant_pool[i].getTag();
|
||||
if((tag == Constants.CONSTANT_Double) || (tag == Constants.CONSTANT_Long))
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitConstantPool(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve constant to a string representation.
|
||||
*
|
||||
* @param constant Constant to be printed
|
||||
* @return String representation
|
||||
*/
|
||||
public String constantToString(Constant c)
|
||||
throws ClassFormatException
|
||||
{
|
||||
String str;
|
||||
int i;
|
||||
byte tag = c.getTag();
|
||||
|
||||
switch(tag) {
|
||||
case Constants.CONSTANT_Class:
|
||||
i = ((ConstantClass)c).getNameIndex();
|
||||
c = getConstant(i, Constants.CONSTANT_Utf8);
|
||||
str = Utility.compactClassName(((ConstantUtf8)c).getBytes(), false);
|
||||
break;
|
||||
|
||||
case Constants.CONSTANT_String:
|
||||
i = ((ConstantString)c).getStringIndex();
|
||||
c = getConstant(i, Constants.CONSTANT_Utf8);
|
||||
str = "\"" + escape(((ConstantUtf8)c).getBytes()) + "\"";
|
||||
break;
|
||||
|
||||
case Constants.CONSTANT_Utf8: str = ((ConstantUtf8)c).getBytes(); break;
|
||||
case Constants.CONSTANT_Double: str = "" + ((ConstantDouble)c).getBytes(); break;
|
||||
case Constants.CONSTANT_Float: str = "" + ((ConstantFloat)c).getBytes(); break;
|
||||
case Constants.CONSTANT_Long: str = "" + ((ConstantLong)c).getBytes(); break;
|
||||
case Constants.CONSTANT_Integer: str = "" + ((ConstantInteger)c).getBytes(); break;
|
||||
|
||||
case Constants.CONSTANT_NameAndType:
|
||||
str = (constantToString(((ConstantNameAndType)c).getNameIndex(),
|
||||
Constants.CONSTANT_Utf8) + " " +
|
||||
constantToString(((ConstantNameAndType)c).getSignatureIndex(),
|
||||
Constants.CONSTANT_Utf8));
|
||||
break;
|
||||
|
||||
case Constants.CONSTANT_InterfaceMethodref: case Constants.CONSTANT_Methodref:
|
||||
case Constants.CONSTANT_Fieldref:
|
||||
str = (constantToString(((ConstantCP)c).getClassIndex(),
|
||||
Constants.CONSTANT_Class) + "." +
|
||||
constantToString(((ConstantCP)c).getNameAndTypeIndex(),
|
||||
Constants.CONSTANT_NameAndType));
|
||||
break;
|
||||
|
||||
default: // Never reached
|
||||
throw new RuntimeException("Unknown constant type " + tag);
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
private static final String escape(String str) {
|
||||
int len = str.length();
|
||||
StringBuffer buf = new StringBuffer(len + 5);
|
||||
char[] ch = str.toCharArray();
|
||||
|
||||
for(int i=0; i < len; i++) {
|
||||
switch(ch[i]) {
|
||||
case '\n' : buf.append("\\n"); break;
|
||||
case '\r' : buf.append("\\r"); break;
|
||||
case '\t' : buf.append("\\t"); break;
|
||||
case '\b' : buf.append("\\b"); break;
|
||||
case '"' : buf.append("\\\""); break;
|
||||
default: buf.append(ch[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Retrieve constant at `index' from constant pool and resolve it to
|
||||
* a string representation.
|
||||
*
|
||||
* @param index of constant in constant pool
|
||||
* @param tag expected type
|
||||
* @return String representation
|
||||
*/
|
||||
public String constantToString(int index, byte tag)
|
||||
throws ClassFormatException
|
||||
{
|
||||
Constant c = getConstant(index, tag);
|
||||
return constantToString(c);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump constant pool to file stream in binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
file.writeShort(constant_pool_count);
|
||||
|
||||
for(int i=1; i < constant_pool_count; i++)
|
||||
if(constant_pool[i] != null)
|
||||
constant_pool[i].dump(file);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get constant from constant pool.
|
||||
*
|
||||
* @param index Index in constant pool
|
||||
* @return Constant value
|
||||
* @see Constant
|
||||
*/
|
||||
public Constant getConstant(int index) {
|
||||
if (index >= constant_pool.length || index < 0)
|
||||
throw new ClassFormatException("Invalid constant pool reference: " +
|
||||
index + ". Constant pool size is: " +
|
||||
constant_pool.length);
|
||||
return constant_pool[index];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get constant from constant pool and check whether it has the
|
||||
* expected type.
|
||||
*
|
||||
* @param index Index in constant pool
|
||||
* @param tag Tag of expected constant, i.e., its type
|
||||
* @return Constant value
|
||||
* @see Constant
|
||||
* @throws ClassFormatException
|
||||
*/
|
||||
public Constant getConstant(int index, byte tag)
|
||||
throws ClassFormatException
|
||||
{
|
||||
Constant c;
|
||||
|
||||
c = getConstant(index);
|
||||
|
||||
if(c == null)
|
||||
throw new ClassFormatException("Constant pool at index " + index + " is null.");
|
||||
|
||||
if(c.getTag() == tag)
|
||||
return c;
|
||||
else
|
||||
throw new ClassFormatException("Expected class `" + Constants.CONSTANT_NAMES[tag] +
|
||||
"' at index " + index + " and got " + c);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Array of constants.
|
||||
* @see Constant
|
||||
*/
|
||||
public Constant[] getConstantPool() { return constant_pool; }
|
||||
/**
|
||||
* Get string from constant pool and bypass the indirection of
|
||||
* `ConstantClass' and `ConstantString' objects. I.e. these classes have
|
||||
* an index field that points to another entry of the constant pool of
|
||||
* type `ConstantUtf8' which contains the real data.
|
||||
*
|
||||
* @param index Index in constant pool
|
||||
* @param tag Tag of expected constant, either ConstantClass or ConstantString
|
||||
* @return Contents of string reference
|
||||
* @see ConstantClass
|
||||
* @see ConstantString
|
||||
* @throws ClassFormatException
|
||||
*/
|
||||
public String getConstantString(int index, byte tag)
|
||||
throws ClassFormatException
|
||||
{
|
||||
Constant c;
|
||||
int i;
|
||||
|
||||
c = getConstant(index, tag);
|
||||
|
||||
/* This switch() is not that elegant, since the two classes have the
|
||||
* same contents, they just differ in the name of the index
|
||||
* field variable.
|
||||
* But we want to stick to the JVM naming conventions closely though
|
||||
* we could have solved these more elegantly by using the same
|
||||
* variable name or by subclassing.
|
||||
*/
|
||||
switch(tag) {
|
||||
case Constants.CONSTANT_Class: i = ((ConstantClass)c).getNameIndex(); break;
|
||||
case Constants.CONSTANT_String: i = ((ConstantString)c).getStringIndex(); break;
|
||||
default:
|
||||
throw new RuntimeException("getConstantString called with illegal tag " + tag);
|
||||
}
|
||||
|
||||
// Finally get the string from the constant pool
|
||||
c = getConstant(i, Constants.CONSTANT_Utf8);
|
||||
return ((ConstantUtf8)c).getBytes();
|
||||
}
|
||||
/**
|
||||
* @return Length of constant pool.
|
||||
*/
|
||||
public int getLength()
|
||||
{
|
||||
return constant_pool_count;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param constant Constant to set
|
||||
*/
|
||||
public void setConstant(int index, Constant constant) {
|
||||
constant_pool[index] = constant;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param constant_pool
|
||||
*/
|
||||
public void setConstantPool(Constant[] constant_pool) {
|
||||
this.constant_pool = constant_pool;
|
||||
constant_pool_count = (constant_pool == null)? 0 : constant_pool.length;
|
||||
}
|
||||
/**
|
||||
* @return String representation.
|
||||
*/
|
||||
public String toString() {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
|
||||
for(int i=1; i < constant_pool_count; i++)
|
||||
buf.append(i + ")" + constant_pool[i] + "\n");
|
||||
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return deep copy of this constant pool
|
||||
*/
|
||||
public ConstantPool copy() {
|
||||
ConstantPool c = null;
|
||||
|
||||
try {
|
||||
c = (ConstantPool)clone();
|
||||
} catch(CloneNotSupportedException e) {}
|
||||
|
||||
c.constant_pool = new Constant[constant_pool_count];
|
||||
|
||||
for(int i=1; i < constant_pool_count; i++) {
|
||||
if(constant_pool[i] != null)
|
||||
c.constant_pool[i] = constant_pool[i].copy();
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
}
|
||||
@ -1,150 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class is derived from the abstract
|
||||
* <A HREF="com.sun.org.apache.bcel.internal.classfile.Constant.html">Constant</A> class
|
||||
* and represents a reference to a String object.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see Constant
|
||||
*/
|
||||
public final class ConstantString extends Constant implements ConstantObject {
|
||||
private int string_index; // Identical to ConstantClass except for this name
|
||||
|
||||
/**
|
||||
* Initialize from another object.
|
||||
*/
|
||||
public ConstantString(ConstantString c) {
|
||||
this(c.getStringIndex());
|
||||
}
|
||||
/**
|
||||
* Initialize instance from file data.
|
||||
*
|
||||
* @param file Input stream
|
||||
* @throws IOException
|
||||
*/
|
||||
ConstantString(DataInputStream file) throws IOException
|
||||
{
|
||||
this((int)file.readUnsignedShort());
|
||||
}
|
||||
/**
|
||||
* @param string_index Index of Constant_Utf8 in constant pool
|
||||
*/
|
||||
public ConstantString(int string_index)
|
||||
{
|
||||
super(Constants.CONSTANT_String);
|
||||
this.string_index = string_index;
|
||||
}
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitConstantString(this);
|
||||
}
|
||||
/**
|
||||
* Dump constant field reference to file stream in binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
file.writeByte(tag);
|
||||
file.writeShort(string_index);
|
||||
}
|
||||
/**
|
||||
* @return Index in constant pool of the string (ConstantUtf8).
|
||||
*/
|
||||
public final int getStringIndex() { return string_index; }
|
||||
/**
|
||||
* @param string_index.
|
||||
*/
|
||||
public final void setStringIndex(int string_index) {
|
||||
this.string_index = string_index;
|
||||
}
|
||||
/**
|
||||
* @return String representation.
|
||||
*/
|
||||
public final String toString()
|
||||
{
|
||||
return super.toString() + "(string_index = " + string_index + ")";
|
||||
}
|
||||
|
||||
/** @return String object
|
||||
*/
|
||||
public Object getConstantValue(ConstantPool cp) {
|
||||
Constant c = cp.getConstant(string_index, Constants.CONSTANT_Utf8);
|
||||
return ((ConstantUtf8)c).getBytes();
|
||||
}
|
||||
|
||||
/** @return dereferenced string
|
||||
*/
|
||||
public String getBytes(ConstantPool cp) {
|
||||
return (String)getConstantValue(cp);
|
||||
}
|
||||
}
|
||||
@ -1,150 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class is derived from the abstract
|
||||
* <A HREF="com.sun.org.apache.bcel.internal.classfile.Constant.html">Constant</A> class
|
||||
* and represents a reference to a Utf8 encoded string.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see Constant
|
||||
*/
|
||||
public final class ConstantUtf8 extends Constant {
|
||||
private String bytes;
|
||||
|
||||
/**
|
||||
* Initialize from another object.
|
||||
*/
|
||||
public ConstantUtf8(ConstantUtf8 c) {
|
||||
this(c.getBytes());
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize instance from file data.
|
||||
*
|
||||
* @param file Input stream
|
||||
* @throws IOException
|
||||
*/
|
||||
ConstantUtf8(DataInputStream file) throws IOException
|
||||
{
|
||||
super(Constants.CONSTANT_Utf8);
|
||||
|
||||
bytes = file.readUTF();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bytes Data
|
||||
*/
|
||||
public ConstantUtf8(String bytes)
|
||||
{
|
||||
super(Constants.CONSTANT_Utf8);
|
||||
|
||||
if(bytes == null)
|
||||
throw new IllegalArgumentException("bytes must not be null!");
|
||||
|
||||
this.bytes = bytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitConstantUtf8(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump String in Utf8 format to file stream.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
file.writeByte(tag);
|
||||
file.writeUTF(bytes);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Data converted to string.
|
||||
*/
|
||||
public final String getBytes() { return bytes; }
|
||||
|
||||
/**
|
||||
* @param bytes.
|
||||
*/
|
||||
public final void setBytes(String bytes) {
|
||||
this.bytes = bytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return String representation
|
||||
*/
|
||||
public final String toString()
|
||||
{
|
||||
return super.toString() + "(\"" + Utility.replace(bytes, "\n", "\\n") + "\")";
|
||||
}
|
||||
}
|
||||
@ -1,181 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class is derived from <em>Attribute</em> and represents a constant
|
||||
* value, i.e., a default value for initializing a class field.
|
||||
* This class is instantiated by the <em>Attribute.readAttribute()</em> method.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see Attribute
|
||||
*/
|
||||
public final class ConstantValue extends Attribute {
|
||||
private int constantvalue_index;
|
||||
|
||||
/**
|
||||
* Initialize from another object. Note that both objects use the same
|
||||
* references (shallow copy). Use clone() for a physical copy.
|
||||
*/
|
||||
public ConstantValue(ConstantValue c) {
|
||||
this(c.getNameIndex(), c.getLength(), c.getConstantValueIndex(),
|
||||
c.getConstantPool());
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct object from file stream.
|
||||
* @param name_index Name index in constant pool
|
||||
* @param length Content length in bytes
|
||||
* @param file Input stream
|
||||
* @param constant_pool Array of constants
|
||||
* @throw IOException
|
||||
*/
|
||||
ConstantValue(int name_index, int length, DataInputStream file,
|
||||
ConstantPool constant_pool) throws IOException
|
||||
{
|
||||
this(name_index, length, (int)file.readUnsignedShort(), constant_pool);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name_index Name index in constant pool
|
||||
* @param length Content length in bytes
|
||||
* @param constantvalue_index Index in constant pool
|
||||
* @param constant_pool Array of constants
|
||||
*/
|
||||
public ConstantValue(int name_index, int length,
|
||||
int constantvalue_index,
|
||||
ConstantPool constant_pool)
|
||||
{
|
||||
super(Constants.ATTR_CONSTANT_VALUE, name_index, length, constant_pool);
|
||||
this.constantvalue_index = constantvalue_index;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitConstantValue(this);
|
||||
}
|
||||
/**
|
||||
* Dump constant value attribute to file stream on binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
super.dump(file);
|
||||
file.writeShort(constantvalue_index);
|
||||
}
|
||||
/**
|
||||
* @return Index in constant pool of constant value.
|
||||
*/
|
||||
public final int getConstantValueIndex() { return constantvalue_index; }
|
||||
|
||||
/**
|
||||
* @param constantvalue_index.
|
||||
*/
|
||||
public final void setConstantValueIndex(int constantvalue_index) {
|
||||
this.constantvalue_index = constantvalue_index;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return String representation of constant value.
|
||||
*/
|
||||
public final String toString() {
|
||||
Constant c = constant_pool.getConstant(constantvalue_index);
|
||||
|
||||
String buf;
|
||||
int i;
|
||||
|
||||
// Print constant to string depending on its type
|
||||
switch(c.getTag()) {
|
||||
case Constants.CONSTANT_Long: buf = "" + ((ConstantLong)c).getBytes(); break;
|
||||
case Constants.CONSTANT_Float: buf = "" + ((ConstantFloat)c).getBytes(); break;
|
||||
case Constants.CONSTANT_Double: buf = "" + ((ConstantDouble)c).getBytes(); break;
|
||||
case Constants.CONSTANT_Integer: buf = "" + ((ConstantInteger)c).getBytes(); break;
|
||||
case Constants.CONSTANT_String:
|
||||
i = ((ConstantString)c).getStringIndex();
|
||||
c = constant_pool.getConstant(i, Constants.CONSTANT_Utf8);
|
||||
buf = "\"" + Utility.convertString(((ConstantUtf8)c).getBytes()) + "\"";
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new IllegalStateException("Type of ConstValue invalid: " + c);
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return deep copy of this attribute
|
||||
*/
|
||||
public Attribute copy(ConstantPool constant_pool) {
|
||||
ConstantValue c = (ConstantValue)clone();
|
||||
c.constant_pool = constant_pool;
|
||||
return c;
|
||||
}
|
||||
}
|
||||
@ -1,172 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class is derived from <em>Attribute</em> and denotes that this is a
|
||||
* deprecated method.
|
||||
* It is instantiated from the <em>Attribute.readAttribute()</em> method.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see Attribute
|
||||
*/
|
||||
public final class Deprecated extends Attribute {
|
||||
private byte[] bytes;
|
||||
|
||||
/**
|
||||
* Initialize from another object. Note that both objects use the same
|
||||
* references (shallow copy). Use clone() for a physical copy.
|
||||
*/
|
||||
public Deprecated(Deprecated c) {
|
||||
this(c.getNameIndex(), c.getLength(), c.getBytes(), c.getConstantPool());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name_index Index in constant pool to CONSTANT_Utf8
|
||||
* @param length Content length in bytes
|
||||
* @param bytes Attribute contents
|
||||
* @param constant_pool Array of constants
|
||||
*/
|
||||
public Deprecated(int name_index, int length, byte[] bytes,
|
||||
ConstantPool constant_pool)
|
||||
{
|
||||
super(Constants.ATTR_DEPRECATED, name_index, length, constant_pool);
|
||||
this.bytes = bytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct object from file stream.
|
||||
* @param name_index Index in constant pool to CONSTANT_Utf8
|
||||
* @param length Content length in bytes
|
||||
* @param file Input stream
|
||||
* @param constant_pool Array of constants
|
||||
* @throws IOException
|
||||
*/
|
||||
Deprecated(int name_index, int length, DataInputStream file,
|
||||
ConstantPool constant_pool) throws IOException
|
||||
{
|
||||
this(name_index, length, (byte [])null, constant_pool);
|
||||
|
||||
if(length > 0) {
|
||||
bytes = new byte[length];
|
||||
file.readFully(bytes);
|
||||
System.err.println("Deprecated attribute with length > 0");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitDeprecated(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump source file attribute to file stream in binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
super.dump(file);
|
||||
|
||||
if(length > 0)
|
||||
file.write(bytes, 0, length);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return data bytes.
|
||||
*/
|
||||
public final byte[] getBytes() { return bytes; }
|
||||
|
||||
/**
|
||||
* @param bytes.
|
||||
*/
|
||||
public final void setBytes(byte[] bytes) {
|
||||
this.bytes = bytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return attribute name
|
||||
*/
|
||||
public final String toString() {
|
||||
return Constants.ATTRIBUTE_NAMES[Constants.ATTR_DEPRECATED];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return deep copy of this attribute
|
||||
*/
|
||||
public Attribute copy(ConstantPool constant_pool) {
|
||||
Deprecated c = (Deprecated)clone();
|
||||
|
||||
if(bytes != null)
|
||||
c.bytes = (byte[])bytes.clone();
|
||||
|
||||
c.constant_pool = constant_pool;
|
||||
return c;
|
||||
}
|
||||
}
|
||||
@ -1,360 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
import java.util.Stack;
|
||||
|
||||
/**
|
||||
* Traverses a JavaClass with another Visitor object 'piggy-backed'
|
||||
* that is applied to all components of a JavaClass object. I.e. this
|
||||
* class supplies the traversal strategy, other classes can make use
|
||||
* of it.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
*/
|
||||
public class DescendingVisitor implements Visitor {
|
||||
private JavaClass clazz;
|
||||
private Visitor visitor;
|
||||
private Stack stack = new Stack();
|
||||
|
||||
/** @return container of current entitity, i.e., predecessor during traversal
|
||||
*/
|
||||
public Object predecessor() {
|
||||
return predecessor(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param level nesting level, i.e., 0 returns the direct predecessor
|
||||
* @return container of current entitity, i.e., predecessor during traversal
|
||||
*/
|
||||
public Object predecessor(int level) {
|
||||
int size = stack.size();
|
||||
|
||||
if((size < 2) || (level < 0))
|
||||
return null;
|
||||
else
|
||||
return stack.elementAt(size - (level + 2)); // size - 1 == current
|
||||
}
|
||||
|
||||
/** @return current object
|
||||
*/
|
||||
public Object current() {
|
||||
return stack.peek();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param clazz Class to traverse
|
||||
* @param visitor visitor object to apply to all components
|
||||
*/
|
||||
public DescendingVisitor(JavaClass clazz, Visitor visitor) {
|
||||
this.clazz = clazz;
|
||||
this.visitor = visitor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Start traversal.
|
||||
*/
|
||||
public void visit() { clazz.accept(this); }
|
||||
|
||||
public void visitJavaClass(JavaClass clazz) {
|
||||
stack.push(clazz);
|
||||
clazz.accept(visitor);
|
||||
|
||||
Field[] fields = clazz.getFields();
|
||||
for(int i=0; i < fields.length; i++)
|
||||
fields[i].accept(this);
|
||||
|
||||
Method[] methods = clazz.getMethods();
|
||||
for(int i=0; i < methods.length; i++)
|
||||
methods[i].accept(this);
|
||||
|
||||
Attribute[] attributes = clazz.getAttributes();
|
||||
for(int i=0; i < attributes.length; i++)
|
||||
attributes[i].accept(this);
|
||||
|
||||
clazz.getConstantPool().accept(this);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitField(Field field) {
|
||||
stack.push(field);
|
||||
field.accept(visitor);
|
||||
|
||||
Attribute[] attributes = field.getAttributes();
|
||||
for(int i=0; i < attributes.length; i++)
|
||||
attributes[i].accept(this);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitConstantValue(ConstantValue cv) {
|
||||
stack.push(cv);
|
||||
cv.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitMethod(Method method) {
|
||||
stack.push(method);
|
||||
method.accept(visitor);
|
||||
|
||||
Attribute[] attributes = method.getAttributes();
|
||||
for(int i=0; i < attributes.length; i++)
|
||||
attributes[i].accept(this);
|
||||
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitExceptionTable(ExceptionTable table) {
|
||||
stack.push(table);
|
||||
table.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitCode(Code code) {
|
||||
stack.push(code);
|
||||
code.accept(visitor);
|
||||
|
||||
CodeException[] table = code.getExceptionTable();
|
||||
for(int i=0; i < table.length; i++)
|
||||
table[i].accept(this);
|
||||
|
||||
Attribute[] attributes = code.getAttributes();
|
||||
for(int i=0; i < attributes.length; i++)
|
||||
attributes[i].accept(this);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitCodeException(CodeException ce) {
|
||||
stack.push(ce);
|
||||
ce.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitLineNumberTable(LineNumberTable table) {
|
||||
stack.push(table);
|
||||
table.accept(visitor);
|
||||
|
||||
LineNumber[] numbers = table.getLineNumberTable();
|
||||
for(int i=0; i < numbers.length; i++)
|
||||
numbers[i].accept(this);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitLineNumber(LineNumber number) {
|
||||
stack.push(number);
|
||||
number.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitLocalVariableTable(LocalVariableTable table) {
|
||||
stack.push(table);
|
||||
table.accept(visitor);
|
||||
|
||||
LocalVariable[] vars = table.getLocalVariableTable();
|
||||
for(int i=0; i < vars.length; i++)
|
||||
vars[i].accept(this);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitStackMap(StackMap table) {
|
||||
stack.push(table);
|
||||
table.accept(visitor);
|
||||
|
||||
StackMapEntry[] vars = table.getStackMap();
|
||||
|
||||
for(int i=0; i < vars.length; i++)
|
||||
vars[i].accept(this);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitStackMapEntry(StackMapEntry var) {
|
||||
stack.push(var);
|
||||
var.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitLocalVariable(LocalVariable var) {
|
||||
stack.push(var);
|
||||
var.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitConstantPool(ConstantPool cp) {
|
||||
stack.push(cp);
|
||||
cp.accept(visitor);
|
||||
|
||||
Constant[] constants = cp.getConstantPool();
|
||||
for(int i=1; i < constants.length; i++) {
|
||||
if(constants[i] != null)
|
||||
constants[i].accept(this);
|
||||
}
|
||||
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitConstantClass(ConstantClass constant) {
|
||||
stack.push(constant);
|
||||
constant.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitConstantDouble(ConstantDouble constant) {
|
||||
stack.push(constant);
|
||||
constant.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitConstantFieldref(ConstantFieldref constant) {
|
||||
stack.push(constant);
|
||||
constant.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitConstantFloat(ConstantFloat constant) {
|
||||
stack.push(constant);
|
||||
constant.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitConstantInteger(ConstantInteger constant) {
|
||||
stack.push(constant);
|
||||
constant.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref constant) {
|
||||
stack.push(constant);
|
||||
constant.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitConstantLong(ConstantLong constant) {
|
||||
stack.push(constant);
|
||||
constant.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitConstantMethodref(ConstantMethodref constant) {
|
||||
stack.push(constant);
|
||||
constant.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitConstantNameAndType(ConstantNameAndType constant) {
|
||||
stack.push(constant);
|
||||
constant.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitConstantString(ConstantString constant) {
|
||||
stack.push(constant);
|
||||
constant.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitConstantUtf8(ConstantUtf8 constant) {
|
||||
stack.push(constant);
|
||||
constant.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitInnerClasses(InnerClasses ic) {
|
||||
stack.push(ic);
|
||||
ic.accept(visitor);
|
||||
|
||||
InnerClass[] ics = ic.getInnerClasses();
|
||||
for(int i=0; i < ics.length; i++)
|
||||
ics[i].accept(this);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitInnerClass(InnerClass inner) {
|
||||
stack.push(inner);
|
||||
inner.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitDeprecated(Deprecated attribute) {
|
||||
stack.push(attribute);
|
||||
attribute.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitSignature(Signature attribute) {
|
||||
stack.push(attribute);
|
||||
attribute.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitSourceFile(SourceFile attribute) {
|
||||
stack.push(attribute);
|
||||
attribute.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitSynthetic(Synthetic attribute) {
|
||||
stack.push(attribute);
|
||||
attribute.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitUnknown(Unknown attribute) {
|
||||
stack.push(attribute);
|
||||
attribute.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
}
|
||||
@ -1,108 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.classfile.*;
|
||||
import com.sun.org.apache.bcel.internal.*;
|
||||
|
||||
/**
|
||||
* Visitor with empty method bodies, can be extended and used in conjunction with the
|
||||
* DescendingVisitor class, e.g.
|
||||
*
|
||||
* By courtesy of David Spencer.
|
||||
*
|
||||
* @see DescendingVisitor
|
||||
*
|
||||
*/
|
||||
public class EmptyVisitor implements Visitor {
|
||||
protected EmptyVisitor() { }
|
||||
|
||||
public void visitCode(Code obj) {}
|
||||
public void visitCodeException(CodeException obj) {}
|
||||
public void visitConstantClass(ConstantClass obj) {}
|
||||
public void visitConstantDouble(ConstantDouble obj) {}
|
||||
public void visitConstantFieldref(ConstantFieldref obj) {}
|
||||
public void visitConstantFloat(ConstantFloat obj) {}
|
||||
public void visitConstantInteger(ConstantInteger obj) {}
|
||||
public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) {}
|
||||
public void visitConstantLong(ConstantLong obj) {}
|
||||
public void visitConstantMethodref(ConstantMethodref obj) {}
|
||||
public void visitConstantNameAndType(ConstantNameAndType obj) {}
|
||||
public void visitConstantPool(ConstantPool obj) {}
|
||||
public void visitConstantString(ConstantString obj) {}
|
||||
public void visitConstantUtf8(ConstantUtf8 obj) {}
|
||||
public void visitConstantValue(ConstantValue obj) {}
|
||||
public void visitDeprecated(Deprecated obj) {}
|
||||
public void visitExceptionTable(ExceptionTable obj) {}
|
||||
public void visitField(Field obj) {}
|
||||
public void visitInnerClass(InnerClass obj) {}
|
||||
public void visitInnerClasses(InnerClasses obj) {}
|
||||
public void visitJavaClass(JavaClass obj) {}
|
||||
public void visitLineNumber(LineNumber obj) {}
|
||||
public void visitLineNumberTable(LineNumberTable obj) {}
|
||||
public void visitLocalVariable(LocalVariable obj) {}
|
||||
public void visitLocalVariableTable(LocalVariableTable obj) {}
|
||||
public void visitMethod(Method obj) {}
|
||||
public void visitSignature(Signature obj) {}
|
||||
public void visitSourceFile(SourceFile obj) {}
|
||||
public void visitSynthetic(Synthetic obj) {}
|
||||
public void visitUnknown(Unknown obj) {}
|
||||
public void visitStackMap(StackMap obj) {}
|
||||
public void visitStackMapEntry(StackMapEntry obj) {}
|
||||
}
|
||||
@ -1,205 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class represents the table of exceptions that are thrown by a
|
||||
* method. This attribute may be used once per method. The name of
|
||||
* this class is <em>ExceptionTable</em> for historical reasons; The
|
||||
* Java Virtual Machine Specification, Second Edition defines this
|
||||
* attribute using the name <em>Exceptions</em> (which is inconsistent
|
||||
* with the other classes).
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see Code
|
||||
*/
|
||||
public final class ExceptionTable extends Attribute {
|
||||
private int number_of_exceptions; // Table of indices into
|
||||
private int[] exception_index_table; // constant pool
|
||||
|
||||
/**
|
||||
* Initialize from another object. Note that both objects use the same
|
||||
* references (shallow copy). Use copy() for a physical copy.
|
||||
*/
|
||||
public ExceptionTable(ExceptionTable c) {
|
||||
this(c.getNameIndex(), c.getLength(), c.getExceptionIndexTable(),
|
||||
c.getConstantPool());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name_index Index in constant pool
|
||||
* @param length Content length in bytes
|
||||
* @param exception_index_table Table of indices in constant pool
|
||||
* @param constant_pool Array of constants
|
||||
*/
|
||||
public ExceptionTable(int name_index, int length,
|
||||
int[] exception_index_table,
|
||||
ConstantPool constant_pool)
|
||||
{
|
||||
super(Constants.ATTR_EXCEPTIONS, name_index, length, constant_pool);
|
||||
setExceptionIndexTable(exception_index_table);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct object from file stream.
|
||||
* @param name_index Index in constant pool
|
||||
* @param length Content length in bytes
|
||||
* @param file Input stream
|
||||
* @param constant_pool Array of constants
|
||||
* @throws IOException
|
||||
*/
|
||||
ExceptionTable(int name_index, int length, DataInputStream file,
|
||||
ConstantPool constant_pool) throws IOException
|
||||
{
|
||||
this(name_index, length, (int[])null, constant_pool);
|
||||
|
||||
number_of_exceptions = file.readUnsignedShort();
|
||||
exception_index_table = new int[number_of_exceptions];
|
||||
|
||||
for(int i=0; i < number_of_exceptions; i++)
|
||||
exception_index_table[i] = file.readUnsignedShort();
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitExceptionTable(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump exceptions attribute to file stream in binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
super.dump(file);
|
||||
file.writeShort(number_of_exceptions);
|
||||
for(int i=0; i < number_of_exceptions; i++)
|
||||
file.writeShort(exception_index_table[i]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Array of indices into constant pool of thrown exceptions.
|
||||
*/
|
||||
public final int[] getExceptionIndexTable() {return exception_index_table;}
|
||||
/**
|
||||
* @return Length of exception table.
|
||||
*/
|
||||
public final int getNumberOfExceptions() { return number_of_exceptions; }
|
||||
|
||||
/**
|
||||
* @return class names of thrown exceptions
|
||||
*/
|
||||
public final String[] getExceptionNames() {
|
||||
String[] names = new String[number_of_exceptions];
|
||||
for(int i=0; i < number_of_exceptions; i++)
|
||||
names[i] = constant_pool.getConstantString(exception_index_table[i],
|
||||
Constants.CONSTANT_Class).
|
||||
replace('/', '.');
|
||||
return names;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param exception_index_table.
|
||||
* Also redefines number_of_exceptions according to table length.
|
||||
*/
|
||||
public final void setExceptionIndexTable(int[] exception_index_table) {
|
||||
this.exception_index_table = exception_index_table;
|
||||
number_of_exceptions = (exception_index_table == null)? 0 :
|
||||
exception_index_table.length;
|
||||
}
|
||||
/**
|
||||
* @return String representation, i.e., a list of thrown exceptions.
|
||||
*/
|
||||
public final String toString() {
|
||||
StringBuffer buf = new StringBuffer("");
|
||||
String str;
|
||||
|
||||
for(int i=0; i < number_of_exceptions; i++) {
|
||||
str = constant_pool.getConstantString(exception_index_table[i],
|
||||
Constants.CONSTANT_Class);
|
||||
buf.append(Utility.compactClassName(str, false));
|
||||
|
||||
if(i < number_of_exceptions - 1)
|
||||
buf.append(", ");
|
||||
}
|
||||
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return deep copy of this attribute
|
||||
*/
|
||||
public Attribute copy(ConstantPool constant_pool) {
|
||||
ExceptionTable c = (ExceptionTable)clone();
|
||||
c.exception_index_table = (int[])exception_index_table.clone();
|
||||
c.constant_pool = constant_pool;
|
||||
return c;
|
||||
}
|
||||
}
|
||||
@ -1,168 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import com.sun.org.apache.bcel.internal.generic.Type;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class represents the field info structure, i.e., the representation
|
||||
* for a variable in the class. See JVM specification for details.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
*/
|
||||
public final class Field extends FieldOrMethod {
|
||||
/**
|
||||
* Initialize from another object. Note that both objects use the same
|
||||
* references (shallow copy). Use clone() for a physical copy.
|
||||
*/
|
||||
public Field(Field c) {
|
||||
super(c);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct object from file stream.
|
||||
* @param file Input stream
|
||||
*/
|
||||
Field(DataInputStream file, ConstantPool constant_pool)
|
||||
throws IOException, ClassFormatException
|
||||
{
|
||||
super(file, constant_pool);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param access_flags Access rights of field
|
||||
* @param name_index Points to field name in constant pool
|
||||
* @param signature_index Points to encoded signature
|
||||
* @param attributes Collection of attributes
|
||||
* @param constant_pool Array of constants
|
||||
*/
|
||||
public Field(int access_flags, int name_index, int signature_index,
|
||||
Attribute[] attributes, ConstantPool constant_pool)
|
||||
{
|
||||
super(access_flags, name_index, signature_index, attributes, constant_pool);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitField(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return constant value associated with this field (may be null)
|
||||
*/
|
||||
public final ConstantValue getConstantValue() {
|
||||
for(int i=0; i < attributes_count; i++)
|
||||
if(attributes[i].getTag() == Constants.ATTR_CONSTANT_VALUE)
|
||||
return (ConstantValue)attributes[i];
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return string representation close to declaration format,
|
||||
* `public static final short MAX = 100', e.g..
|
||||
*
|
||||
* @return String representation of field, including the signature.
|
||||
*/
|
||||
public final String toString() {
|
||||
String name, signature, access; // Short cuts to constant pool
|
||||
|
||||
// Get names from constant pool
|
||||
access = Utility.accessToString(access_flags);
|
||||
access = access.equals("")? "" : (access + " ");
|
||||
signature = Utility.signatureToString(getSignature());
|
||||
name = getName();
|
||||
|
||||
StringBuffer buf = new StringBuffer(access + signature + " " + name);
|
||||
ConstantValue cv = getConstantValue();
|
||||
|
||||
if(cv != null)
|
||||
buf.append(" = " + cv);
|
||||
|
||||
for(int i=0; i < attributes_count; i++) {
|
||||
Attribute a = attributes[i];
|
||||
|
||||
if(!(a instanceof ConstantValue))
|
||||
buf.append(" [" + a.toString() + "]");
|
||||
}
|
||||
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return deep copy of this field
|
||||
*/
|
||||
public final Field copy(ConstantPool constant_pool) {
|
||||
return (Field)copy_(constant_pool);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return type of field
|
||||
*/
|
||||
public Type getType() {
|
||||
return Type.getReturnType(getSignature());
|
||||
}
|
||||
}
|
||||
@ -1,226 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* Abstract super class for fields and methods.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
*/
|
||||
public abstract class FieldOrMethod extends AccessFlags implements Cloneable, Node {
|
||||
protected int name_index; // Points to field name in constant pool
|
||||
protected int signature_index; // Points to encoded signature
|
||||
protected int attributes_count;// No. of attributes
|
||||
protected Attribute[] attributes; // Collection of attributes
|
||||
protected ConstantPool constant_pool;
|
||||
|
||||
FieldOrMethod() {}
|
||||
|
||||
/**
|
||||
* Initialize from another object. Note that both objects use the same
|
||||
* references (shallow copy). Use clone() for a physical copy.
|
||||
*/
|
||||
protected FieldOrMethod(FieldOrMethod c) {
|
||||
this(c.getAccessFlags(), c.getNameIndex(), c.getSignatureIndex(),
|
||||
c.getAttributes(), c.getConstantPool());
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct object from file stream.
|
||||
* @param file Input stream
|
||||
* @throws IOException
|
||||
* @throws ClassFormatException
|
||||
*/
|
||||
protected FieldOrMethod(DataInputStream file, ConstantPool constant_pool)
|
||||
throws IOException, ClassFormatException
|
||||
{
|
||||
this(file.readUnsignedShort(), file.readUnsignedShort(),
|
||||
file.readUnsignedShort(), null, constant_pool);
|
||||
|
||||
attributes_count = file.readUnsignedShort();
|
||||
attributes = new Attribute[attributes_count];
|
||||
for(int i=0; i < attributes_count; i++)
|
||||
attributes[i] = Attribute.readAttribute(file, constant_pool);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param access_flags Access rights of method
|
||||
* @param name_index Points to field name in constant pool
|
||||
* @param signature_index Points to encoded signature
|
||||
* @param attributes Collection of attributes
|
||||
* @param constant_pool Array of constants
|
||||
*/
|
||||
protected FieldOrMethod(int access_flags, int name_index, int signature_index,
|
||||
Attribute[] attributes, ConstantPool constant_pool)
|
||||
{
|
||||
this.access_flags = access_flags;
|
||||
this.name_index = name_index;
|
||||
this.signature_index = signature_index;
|
||||
this.constant_pool = constant_pool;
|
||||
|
||||
setAttributes(attributes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump object to file stream on binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
file.writeShort(access_flags);
|
||||
file.writeShort(name_index);
|
||||
file.writeShort(signature_index);
|
||||
file.writeShort(attributes_count);
|
||||
|
||||
for(int i=0; i < attributes_count; i++)
|
||||
attributes[i].dump(file);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Collection of object attributes.
|
||||
*/
|
||||
public final Attribute[] getAttributes() { return attributes; }
|
||||
|
||||
/**
|
||||
* @param attributes Collection of object attributes.
|
||||
*/
|
||||
public final void setAttributes(Attribute[] attributes) {
|
||||
this.attributes = attributes;
|
||||
attributes_count = (attributes == null)? 0 : attributes.length;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Constant pool used by this object.
|
||||
*/
|
||||
public final ConstantPool getConstantPool() { return constant_pool; }
|
||||
|
||||
/**
|
||||
* @param constant_pool Constant pool to be used for this object.
|
||||
*/
|
||||
public final void setConstantPool(ConstantPool constant_pool) {
|
||||
this.constant_pool = constant_pool;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Index in constant pool of object's name.
|
||||
*/
|
||||
public final int getNameIndex() { return name_index; }
|
||||
|
||||
/**
|
||||
* @param name_index Index in constant pool of object's name.
|
||||
*/
|
||||
public final void setNameIndex(int name_index) {
|
||||
this.name_index = name_index;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Index in constant pool of field signature.
|
||||
*/
|
||||
public final int getSignatureIndex() { return signature_index; }
|
||||
|
||||
/**
|
||||
* @param signature_index Index in constant pool of field signature.
|
||||
*/
|
||||
public final void setSignatureIndex(int signature_index) {
|
||||
this.signature_index = signature_index;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Name of object, i.e., method name or field name
|
||||
*/
|
||||
public final String getName() {
|
||||
ConstantUtf8 c;
|
||||
c = (ConstantUtf8)constant_pool.getConstant(name_index,
|
||||
Constants.CONSTANT_Utf8);
|
||||
return c.getBytes();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return String representation of object's type signature (java style)
|
||||
*/
|
||||
public final String getSignature() {
|
||||
ConstantUtf8 c;
|
||||
c = (ConstantUtf8)constant_pool.getConstant(signature_index,
|
||||
Constants.CONSTANT_Utf8);
|
||||
return c.getBytes();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return deep copy of this field
|
||||
*/
|
||||
protected FieldOrMethod copy_(ConstantPool constant_pool) {
|
||||
FieldOrMethod c = null;
|
||||
|
||||
try {
|
||||
c = (FieldOrMethod)clone();
|
||||
} catch(CloneNotSupportedException e) {}
|
||||
|
||||
c.constant_pool = constant_pool;
|
||||
c.attributes = new Attribute[attributes_count];
|
||||
|
||||
for(int i=0; i < attributes_count; i++)
|
||||
c.attributes[i] = attributes[i].copy(constant_pool);
|
||||
|
||||
return c;
|
||||
}
|
||||
}
|
||||
@ -1,224 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class represents a inner class attribute, i.e., the class
|
||||
* indices of the inner and outer classes, the name and the attributes
|
||||
* of the inner class.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see InnerClasses
|
||||
*/
|
||||
public final class InnerClass implements Cloneable, Node {
|
||||
private int inner_class_index;
|
||||
private int outer_class_index;
|
||||
private int inner_name_index;
|
||||
private int inner_access_flags;
|
||||
|
||||
/**
|
||||
* Initialize from another object.
|
||||
*/
|
||||
public InnerClass(InnerClass c) {
|
||||
this(c.getInnerClassIndex(), c.getOuterClassIndex(), c.getInnerNameIndex(),
|
||||
c.getInnerAccessFlags());
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct object from file stream.
|
||||
* @param file Input stream
|
||||
* @throws IOException
|
||||
*/
|
||||
InnerClass(DataInputStream file) throws IOException
|
||||
{
|
||||
this(file.readUnsignedShort(), file.readUnsignedShort(),
|
||||
file.readUnsignedShort(), file.readUnsignedShort());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param inner_class_index Class index in constant pool of inner class
|
||||
* @param outer_class_index Class index in constant pool of outer class
|
||||
* @param inner_name_index Name index in constant pool of inner class
|
||||
* @param inner_access_flags Access flags of inner class
|
||||
*/
|
||||
public InnerClass(int inner_class_index, int outer_class_index,
|
||||
int inner_name_index, int inner_access_flags)
|
||||
{
|
||||
this.inner_class_index = inner_class_index;
|
||||
this.outer_class_index = outer_class_index;
|
||||
this.inner_name_index = inner_name_index;
|
||||
this.inner_access_flags = inner_access_flags;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitInnerClass(this);
|
||||
}
|
||||
/**
|
||||
* Dump inner class attribute to file stream in binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
file.writeShort(inner_class_index);
|
||||
file.writeShort(outer_class_index);
|
||||
file.writeShort(inner_name_index);
|
||||
file.writeShort(inner_access_flags);
|
||||
}
|
||||
/**
|
||||
* @return access flags of inner class.
|
||||
*/
|
||||
public final int getInnerAccessFlags() { return inner_access_flags; }
|
||||
/**
|
||||
* @return class index of inner class.
|
||||
*/
|
||||
public final int getInnerClassIndex() { return inner_class_index; }
|
||||
/**
|
||||
* @return name index of inner class.
|
||||
*/
|
||||
public final int getInnerNameIndex() { return inner_name_index; }
|
||||
/**
|
||||
* @return class index of outer class.
|
||||
*/
|
||||
public final int getOuterClassIndex() { return outer_class_index; }
|
||||
/**
|
||||
* @param inner_access_flags.
|
||||
*/
|
||||
public final void setInnerAccessFlags(int inner_access_flags) {
|
||||
this.inner_access_flags = inner_access_flags;
|
||||
}
|
||||
/**
|
||||
* @param inner_class_index.
|
||||
*/
|
||||
public final void setInnerClassIndex(int inner_class_index) {
|
||||
this.inner_class_index = inner_class_index;
|
||||
}
|
||||
/**
|
||||
* @param inner_name_index.
|
||||
*/
|
||||
public final void setInnerNameIndex(int inner_name_index) {
|
||||
this.inner_name_index = inner_name_index;
|
||||
}
|
||||
/**
|
||||
* @param outer_class_index.
|
||||
*/
|
||||
public final void setOuterClassIndex(int outer_class_index) {
|
||||
this.outer_class_index = outer_class_index;
|
||||
}
|
||||
/**
|
||||
* @return String representation.
|
||||
*/
|
||||
public final String toString() {
|
||||
return "InnerClass(" + inner_class_index + ", " + outer_class_index +
|
||||
", " + inner_name_index + ", " + inner_access_flags + ")";
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Resolved string representation
|
||||
*/
|
||||
public final String toString(ConstantPool constant_pool) {
|
||||
String inner_class_name, outer_class_name, inner_name, access;
|
||||
|
||||
inner_class_name = constant_pool.getConstantString(inner_class_index,
|
||||
Constants.CONSTANT_Class);
|
||||
inner_class_name = Utility.compactClassName(inner_class_name);
|
||||
|
||||
if (outer_class_index != 0) {
|
||||
outer_class_name = constant_pool.getConstantString(outer_class_index,
|
||||
Constants.CONSTANT_Class);
|
||||
outer_class_name = Utility.compactClassName(outer_class_name);
|
||||
}
|
||||
else
|
||||
outer_class_name = "<not a member>";
|
||||
|
||||
if(inner_name_index != 0)
|
||||
inner_name = ((ConstantUtf8)constant_pool.
|
||||
getConstant(inner_name_index, Constants.CONSTANT_Utf8)).getBytes();
|
||||
else
|
||||
inner_name = "<anonymous>";
|
||||
|
||||
access = Utility.accessToString(inner_access_flags, true);
|
||||
access = access.equals("")? "" : (access + " ");
|
||||
|
||||
return "InnerClass:" + access + inner_class_name +
|
||||
"(\"" + outer_class_name + "\", \"" + inner_name + "\")";
|
||||
}
|
||||
|
||||
/**
|
||||
* @return deep copy of this object
|
||||
*/
|
||||
public InnerClass copy() {
|
||||
try {
|
||||
return (InnerClass)clone();
|
||||
} catch(CloneNotSupportedException e) {}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -1,184 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class is derived from <em>Attribute</em> and denotes that this class
|
||||
* is an Inner class of another.
|
||||
* to the source file of this class.
|
||||
* It is instantiated from the <em>Attribute.readAttribute()</em> method.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see Attribute
|
||||
*/
|
||||
public final class InnerClasses extends Attribute {
|
||||
private InnerClass[] inner_classes;
|
||||
private int number_of_classes;
|
||||
|
||||
/**
|
||||
* Initialize from another object. Note that both objects use the same
|
||||
* references (shallow copy). Use clone() for a physical copy.
|
||||
*/
|
||||
public InnerClasses(InnerClasses c) {
|
||||
this(c.getNameIndex(), c.getLength(), c.getInnerClasses(),
|
||||
c.getConstantPool());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name_index Index in constant pool to CONSTANT_Utf8
|
||||
* @param length Content length in bytes
|
||||
* @param inner_classes array of inner classes attributes
|
||||
* @param constant_pool Array of constants
|
||||
* @param sourcefile_index Index in constant pool to CONSTANT_Utf8
|
||||
*/
|
||||
public InnerClasses(int name_index, int length,
|
||||
InnerClass[] inner_classes,
|
||||
ConstantPool constant_pool)
|
||||
{
|
||||
super(Constants.ATTR_INNER_CLASSES, name_index, length, constant_pool);
|
||||
setInnerClasses(inner_classes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct object from file stream.
|
||||
*
|
||||
* @param name_index Index in constant pool to CONSTANT_Utf8
|
||||
* @param length Content length in bytes
|
||||
* @param file Input stream
|
||||
* @param constant_pool Array of constants
|
||||
* @throws IOException
|
||||
*/
|
||||
InnerClasses(int name_index, int length, DataInputStream file,
|
||||
ConstantPool constant_pool) throws IOException
|
||||
{
|
||||
this(name_index, length, (InnerClass[])null, constant_pool);
|
||||
|
||||
number_of_classes = file.readUnsignedShort();
|
||||
inner_classes = new InnerClass[number_of_classes];
|
||||
|
||||
for(int i=0; i < number_of_classes; i++)
|
||||
inner_classes[i] = new InnerClass(file);
|
||||
}
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitInnerClasses(this);
|
||||
}
|
||||
/**
|
||||
* Dump source file attribute to file stream in binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
super.dump(file);
|
||||
file.writeShort(number_of_classes);
|
||||
|
||||
for(int i=0; i < number_of_classes; i++)
|
||||
inner_classes[i].dump(file);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array of inner class "records"
|
||||
*/
|
||||
public final InnerClass[] getInnerClasses() { return inner_classes; }
|
||||
|
||||
/**
|
||||
* @param inner_classes.
|
||||
*/
|
||||
public final void setInnerClasses(InnerClass[] inner_classes) {
|
||||
this.inner_classes = inner_classes;
|
||||
number_of_classes = (inner_classes == null)? 0 : inner_classes.length;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return String representation.
|
||||
*/
|
||||
public final String toString() {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
|
||||
for(int i=0; i < number_of_classes; i++)
|
||||
buf.append(inner_classes[i].toString(constant_pool) + "\n");
|
||||
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return deep copy of this attribute
|
||||
*/
|
||||
public Attribute copy(ConstantPool constant_pool) {
|
||||
InnerClasses c = (InnerClasses)clone();
|
||||
|
||||
c.inner_classes = new InnerClass[number_of_classes];
|
||||
for(int i=0; i < number_of_classes; i++)
|
||||
c.inner_classes[i] = inner_classes[i].copy();
|
||||
|
||||
c.constant_pool = constant_pool;
|
||||
return c;
|
||||
}
|
||||
}
|
||||
@ -1,824 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import com.sun.org.apache.bcel.internal.util.SyntheticRepository;
|
||||
import com.sun.org.apache.bcel.internal.util.ClassVector;
|
||||
import com.sun.org.apache.bcel.internal.util.ClassQueue;
|
||||
import com.sun.org.apache.bcel.internal.generic.Type;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
/**
|
||||
* Represents a Java class, i.e., the data structures, constant pool,
|
||||
* fields, methods and commands contained in a Java .class file.
|
||||
* See <a href="ftp://java.sun.com/docs/specs/">JVM
|
||||
* specification</a> for details.
|
||||
|
||||
* The intent of this class is to represent a parsed or otherwise existing
|
||||
* class file. Those interested in programatically generating classes
|
||||
* should see the <a href="../generic/ClassGen.html">ClassGen</a> class.
|
||||
|
||||
* @see com.sun.org.apache.bcel.internal.generic.ClassGen
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
*/
|
||||
public class JavaClass extends AccessFlags implements Cloneable, Node {
|
||||
private String file_name;
|
||||
private String package_name;
|
||||
private String source_file_name = "<Unknown>";
|
||||
private int class_name_index;
|
||||
private int superclass_name_index;
|
||||
private String class_name;
|
||||
private String superclass_name;
|
||||
private int major, minor; // Compiler version
|
||||
private ConstantPool constant_pool; // Constant pool
|
||||
private int[] interfaces; // implemented interfaces
|
||||
private String[] interface_names;
|
||||
private Field[] fields; // Fields, i.e., variables of class
|
||||
private Method[] methods; // methods defined in the class
|
||||
private Attribute[] attributes; // attributes defined in the class
|
||||
private byte source = HEAP; // Generated in memory
|
||||
|
||||
public static final byte HEAP = 1;
|
||||
public static final byte FILE = 2;
|
||||
public static final byte ZIP = 3;
|
||||
|
||||
static boolean debug = false; // Debugging on/off
|
||||
static char sep = '/'; // directory separator
|
||||
|
||||
/**
|
||||
* In cases where we go ahead and create something,
|
||||
* use the default SyntheticRepository, because we
|
||||
* don't know any better.
|
||||
*/
|
||||
private transient com.sun.org.apache.bcel.internal.util.Repository repository =
|
||||
SyntheticRepository.getInstance();
|
||||
|
||||
/**
|
||||
* Constructor gets all contents as arguments.
|
||||
*
|
||||
* @param class_name_index Index into constant pool referencing a
|
||||
* ConstantClass that represents this class.
|
||||
* @param superclass_name_index Index into constant pool referencing a
|
||||
* ConstantClass that represents this class's superclass.
|
||||
* @param file_name File name
|
||||
* @param major Major compiler version
|
||||
* @param minor Minor compiler version
|
||||
* @param access_flags Access rights defined by bit flags
|
||||
* @param constant_pool Array of constants
|
||||
* @param interfaces Implemented interfaces
|
||||
* @param fields Class fields
|
||||
* @param methods Class methods
|
||||
* @param attributes Class attributes
|
||||
* @param source Read from file or generated in memory?
|
||||
*/
|
||||
public JavaClass(int class_name_index,
|
||||
int superclass_name_index,
|
||||
String file_name,
|
||||
int major,
|
||||
int minor,
|
||||
int access_flags,
|
||||
ConstantPool constant_pool,
|
||||
int[] interfaces,
|
||||
Field[] fields,
|
||||
Method[] methods,
|
||||
Attribute[] attributes,
|
||||
byte source)
|
||||
{
|
||||
if(interfaces == null) // Allowed for backward compatibility
|
||||
interfaces = new int[0];
|
||||
if(attributes == null)
|
||||
this.attributes = new Attribute[0];
|
||||
if(fields == null)
|
||||
fields = new Field[0];
|
||||
if(methods == null)
|
||||
methods = new Method[0];
|
||||
|
||||
this.class_name_index = class_name_index;
|
||||
this.superclass_name_index = superclass_name_index;
|
||||
this.file_name = file_name;
|
||||
this.major = major;
|
||||
this.minor = minor;
|
||||
this.access_flags = access_flags;
|
||||
this.constant_pool = constant_pool;
|
||||
this.interfaces = interfaces;
|
||||
this.fields = fields;
|
||||
this.methods = methods;
|
||||
this.attributes = attributes;
|
||||
this.source = source;
|
||||
|
||||
// Get source file name if available
|
||||
for(int i=0; i < attributes.length; i++) {
|
||||
if(attributes[i] instanceof SourceFile) {
|
||||
source_file_name = ((SourceFile)attributes[i]).getSourceFileName();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* According to the specification the following entries must be of type
|
||||
* `ConstantClass' but we check that anyway via the
|
||||
* `ConstPool.getConstant' method.
|
||||
*/
|
||||
class_name = constant_pool.getConstantString(class_name_index,
|
||||
Constants.CONSTANT_Class);
|
||||
class_name = Utility.compactClassName(class_name, false);
|
||||
|
||||
int index = class_name.lastIndexOf('.');
|
||||
if(index < 0)
|
||||
package_name = "";
|
||||
else
|
||||
package_name = class_name.substring(0, index);
|
||||
|
||||
if(superclass_name_index > 0) { // May be zero -> class is java.lang.Object
|
||||
superclass_name = constant_pool.getConstantString(superclass_name_index,
|
||||
Constants.CONSTANT_Class);
|
||||
superclass_name = Utility.compactClassName(superclass_name, false);
|
||||
}
|
||||
else
|
||||
superclass_name = "java.lang.Object";
|
||||
|
||||
interface_names = new String[interfaces.length];
|
||||
for(int i=0; i < interfaces.length; i++) {
|
||||
String str = constant_pool.getConstantString(interfaces[i], Constants.CONSTANT_Class);
|
||||
interface_names[i] = Utility.compactClassName(str, false);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor gets all contents as arguments.
|
||||
*
|
||||
* @param class_name_index Class name
|
||||
* @param superclass_name_index Superclass name
|
||||
* @param file_name File name
|
||||
* @param major Major compiler version
|
||||
* @param minor Minor compiler version
|
||||
* @param access_flags Access rights defined by bit flags
|
||||
* @param constant_pool Array of constants
|
||||
* @param interfaces Implemented interfaces
|
||||
* @param fields Class fields
|
||||
* @param methods Class methods
|
||||
* @param attributes Class attributes
|
||||
*/
|
||||
public JavaClass(int class_name_index,
|
||||
int superclass_name_index,
|
||||
String file_name,
|
||||
int major,
|
||||
int minor,
|
||||
int access_flags,
|
||||
ConstantPool constant_pool,
|
||||
int[] interfaces,
|
||||
Field[] fields,
|
||||
Method[] methods,
|
||||
Attribute[] attributes) {
|
||||
this(class_name_index, superclass_name_index, file_name, major, minor, access_flags,
|
||||
constant_pool, interfaces, fields, methods, attributes, HEAP);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitJavaClass(this);
|
||||
}
|
||||
|
||||
/* Print debug information depending on `JavaClass.debug'
|
||||
*/
|
||||
static final void Debug(String str) {
|
||||
if(debug)
|
||||
System.out.println(str);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump class to a file.
|
||||
*
|
||||
* @param file Output file
|
||||
* @throws IOException
|
||||
*/
|
||||
public void dump(File file) throws IOException
|
||||
{
|
||||
String parent = file.getParent();
|
||||
|
||||
if(parent != null) {
|
||||
File dir = new File(parent);
|
||||
|
||||
if(dir != null)
|
||||
dir.mkdirs();
|
||||
}
|
||||
|
||||
dump(new DataOutputStream(new FileOutputStream(file)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump class to a file named file_name.
|
||||
*
|
||||
* @param file_name Output file name
|
||||
* @exception IOException
|
||||
*/
|
||||
public void dump(String file_name) throws IOException
|
||||
{
|
||||
dump(new File(file_name));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return class in binary format
|
||||
*/
|
||||
public byte[] getBytes() {
|
||||
ByteArrayOutputStream s = new ByteArrayOutputStream();
|
||||
DataOutputStream ds = new DataOutputStream(s);
|
||||
|
||||
try {
|
||||
dump(ds);
|
||||
} catch(IOException e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
try { ds.close(); } catch(IOException e2) { e2.printStackTrace(); }
|
||||
}
|
||||
|
||||
return s.toByteArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump Java class to output stream in binary format.
|
||||
*
|
||||
* @param file Output stream
|
||||
* @exception IOException
|
||||
*/
|
||||
public void dump(OutputStream file) throws IOException {
|
||||
dump(new DataOutputStream(file));
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump Java class to output stream in binary format.
|
||||
*
|
||||
* @param file Output stream
|
||||
* @exception IOException
|
||||
*/
|
||||
public void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
file.writeInt(0xcafebabe);
|
||||
file.writeShort(minor);
|
||||
file.writeShort(major);
|
||||
|
||||
constant_pool.dump(file);
|
||||
|
||||
file.writeShort(access_flags);
|
||||
file.writeShort(class_name_index);
|
||||
file.writeShort(superclass_name_index);
|
||||
|
||||
file.writeShort(interfaces.length);
|
||||
for(int i=0; i < interfaces.length; i++)
|
||||
file.writeShort(interfaces[i]);
|
||||
|
||||
file.writeShort(fields.length);
|
||||
for(int i=0; i < fields.length; i++)
|
||||
fields[i].dump(file);
|
||||
|
||||
file.writeShort(methods.length);
|
||||
for(int i=0; i < methods.length; i++)
|
||||
methods[i].dump(file);
|
||||
|
||||
if(attributes != null) {
|
||||
file.writeShort(attributes.length);
|
||||
for(int i=0; i < attributes.length; i++)
|
||||
attributes[i].dump(file);
|
||||
}
|
||||
else
|
||||
file.writeShort(0);
|
||||
|
||||
file.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Attributes of the class.
|
||||
*/
|
||||
public Attribute[] getAttributes() { return attributes; }
|
||||
|
||||
/**
|
||||
* @return Class name.
|
||||
*/
|
||||
public String getClassName() { return class_name; }
|
||||
|
||||
/**
|
||||
* @return Package name.
|
||||
*/
|
||||
public String getPackageName() { return package_name; }
|
||||
|
||||
/**
|
||||
* @return Class name index.
|
||||
*/
|
||||
public int getClassNameIndex() { return class_name_index; }
|
||||
|
||||
/**
|
||||
* @return Constant pool.
|
||||
*/
|
||||
public ConstantPool getConstantPool() { return constant_pool; }
|
||||
|
||||
/**
|
||||
* @return Fields, i.e., variables of the class. Like the JVM spec
|
||||
* mandates for the classfile format, these fields are those specific to
|
||||
* this class, and not those of the superclass or superinterfaces.
|
||||
*/
|
||||
public Field[] getFields() { return fields; }
|
||||
|
||||
/**
|
||||
* @return File name of class, aka SourceFile attribute value
|
||||
*/
|
||||
public String getFileName() { return file_name; }
|
||||
|
||||
/**
|
||||
* @return Names of implemented interfaces.
|
||||
*/
|
||||
public String[] getInterfaceNames() { return interface_names; }
|
||||
|
||||
/**
|
||||
* @return Indices in constant pool of implemented interfaces.
|
||||
*/
|
||||
public int[] getInterfaceIndices() { return interfaces; }
|
||||
|
||||
/**
|
||||
* @return Major number of class file version.
|
||||
*/
|
||||
public int getMajor() { return major; }
|
||||
|
||||
/**
|
||||
* @return Methods of the class.
|
||||
*/
|
||||
public Method[] getMethods() { return methods; }
|
||||
|
||||
/**
|
||||
* @return A com.sun.org.apache.bcel.internal.classfile.Method corresponding to
|
||||
* java.lang.reflect.Method if any
|
||||
*/
|
||||
public Method getMethod(java.lang.reflect.Method m) {
|
||||
for(int i = 0; i < methods.length; i++) {
|
||||
Method method = methods[i];
|
||||
|
||||
if(m.getName().equals(method.getName()) &&
|
||||
(m.getModifiers() == method.getModifiers()) &&
|
||||
Type.getSignature(m).equals(method.getSignature())) {
|
||||
return method;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Minor number of class file version.
|
||||
*/
|
||||
public int getMinor() { return minor; }
|
||||
|
||||
/**
|
||||
* @return sbsolute path to file where this class was read from
|
||||
*/
|
||||
public String getSourceFileName() { return source_file_name; }
|
||||
|
||||
/**
|
||||
* @return Superclass name.
|
||||
*/
|
||||
public String getSuperclassName() { return superclass_name; }
|
||||
|
||||
/**
|
||||
* @return Class name index.
|
||||
*/
|
||||
public int getSuperclassNameIndex() { return superclass_name_index; }
|
||||
|
||||
static {
|
||||
// Debugging ... on/off
|
||||
String debug = null, sep = null;
|
||||
|
||||
try {
|
||||
debug = System.getProperty("JavaClass.debug");
|
||||
// Get path separator either / or \ usually
|
||||
sep = System.getProperty("file.separator");
|
||||
}
|
||||
catch (SecurityException e) {
|
||||
// falls through
|
||||
}
|
||||
|
||||
if(debug != null)
|
||||
JavaClass.debug = new Boolean(debug).booleanValue();
|
||||
|
||||
if(sep != null)
|
||||
try {
|
||||
JavaClass.sep = sep.charAt(0);
|
||||
} catch(StringIndexOutOfBoundsException e) {} // Never reached
|
||||
}
|
||||
|
||||
/**
|
||||
* @param attributes .
|
||||
*/
|
||||
public void setAttributes(Attribute[] attributes) {
|
||||
this.attributes = attributes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param class_name .
|
||||
*/
|
||||
public void setClassName(String class_name) {
|
||||
this.class_name = class_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param class_name_index .
|
||||
*/
|
||||
public void setClassNameIndex(int class_name_index) {
|
||||
this.class_name_index = class_name_index;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param constant_pool .
|
||||
*/
|
||||
public void setConstantPool(ConstantPool constant_pool) {
|
||||
this.constant_pool = constant_pool;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param fields .
|
||||
*/
|
||||
public void setFields(Field[] fields) {
|
||||
this.fields = fields;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set File name of class, aka SourceFile attribute value
|
||||
*/
|
||||
public void setFileName(String file_name) {
|
||||
this.file_name = file_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param interface_names .
|
||||
*/
|
||||
public void setInterfaceNames(String[] interface_names) {
|
||||
this.interface_names = interface_names;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param interfaces .
|
||||
*/
|
||||
public void setInterfaces(int[] interfaces) {
|
||||
this.interfaces = interfaces;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param major .
|
||||
*/
|
||||
public void setMajor(int major) {
|
||||
this.major = major;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param methods .
|
||||
*/
|
||||
public void setMethods(Method[] methods) {
|
||||
this.methods = methods;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param minor .
|
||||
*/
|
||||
public void setMinor(int minor) {
|
||||
this.minor = minor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set absolute path to file this class was read from.
|
||||
*/
|
||||
public void setSourceFileName(String source_file_name) {
|
||||
this.source_file_name = source_file_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param superclass_name .
|
||||
*/
|
||||
public void setSuperclassName(String superclass_name) {
|
||||
this.superclass_name = superclass_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param superclass_name_index .
|
||||
*/
|
||||
public void setSuperclassNameIndex(int superclass_name_index) {
|
||||
this.superclass_name_index = superclass_name_index;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return String representing class contents.
|
||||
*/
|
||||
public String toString() {
|
||||
String access = Utility.accessToString(access_flags, true);
|
||||
access = access.equals("")? "" : (access + " ");
|
||||
|
||||
StringBuffer buf = new StringBuffer(access +
|
||||
Utility.classOrInterface(access_flags) +
|
||||
" " +
|
||||
class_name + " extends " +
|
||||
Utility.compactClassName(superclass_name,
|
||||
false) + '\n');
|
||||
int size = interfaces.length;
|
||||
|
||||
if(size > 0) {
|
||||
buf.append("implements\t\t");
|
||||
|
||||
for(int i=0; i < size; i++) {
|
||||
buf.append(interface_names[i]);
|
||||
if(i < size - 1)
|
||||
buf.append(", ");
|
||||
}
|
||||
|
||||
buf.append('\n');
|
||||
}
|
||||
|
||||
buf.append("filename\t\t" + file_name + '\n');
|
||||
buf.append("compiled from\t\t" + source_file_name + '\n');
|
||||
buf.append("compiler version\t" + major + "." + minor + '\n');
|
||||
buf.append("access flags\t\t" + access_flags + '\n');
|
||||
buf.append("constant pool\t\t" + constant_pool.getLength() + " entries\n");
|
||||
buf.append("ACC_SUPER flag\t\t" + isSuper() + "\n");
|
||||
|
||||
if(attributes.length > 0) {
|
||||
buf.append("\nAttribute(s):\n");
|
||||
for(int i=0; i < attributes.length; i++)
|
||||
buf.append(indent(attributes[i]));
|
||||
}
|
||||
|
||||
if(fields.length > 0) {
|
||||
buf.append("\n" + fields.length + " fields:\n");
|
||||
for(int i=0; i < fields.length; i++)
|
||||
buf.append("\t" + fields[i] + '\n');
|
||||
}
|
||||
|
||||
if(methods.length > 0) {
|
||||
buf.append("\n" + methods.length + " methods:\n");
|
||||
for(int i=0; i < methods.length; i++)
|
||||
buf.append("\t" + methods[i] + '\n');
|
||||
}
|
||||
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
private static final String indent(Object obj) {
|
||||
StringTokenizer tok = new StringTokenizer(obj.toString(), "\n");
|
||||
StringBuffer buf = new StringBuffer();
|
||||
|
||||
while(tok.hasMoreTokens())
|
||||
buf.append("\t" + tok.nextToken() + "\n");
|
||||
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return deep copy of this class
|
||||
*/
|
||||
public JavaClass copy() {
|
||||
JavaClass c = null;
|
||||
|
||||
try {
|
||||
c = (JavaClass)clone();
|
||||
} catch(CloneNotSupportedException e) {}
|
||||
|
||||
c.constant_pool = constant_pool.copy();
|
||||
c.interfaces = (int[])interfaces.clone();
|
||||
c.interface_names = (String[])interface_names.clone();
|
||||
|
||||
c.fields = new Field[fields.length];
|
||||
for(int i=0; i < fields.length; i++)
|
||||
c.fields[i] = fields[i].copy(c.constant_pool);
|
||||
|
||||
c.methods = new Method[methods.length];
|
||||
for(int i=0; i < methods.length; i++)
|
||||
c.methods[i] = methods[i].copy(c.constant_pool);
|
||||
|
||||
c.attributes = new Attribute[attributes.length];
|
||||
for(int i=0; i < attributes.length; i++)
|
||||
c.attributes[i] = attributes[i].copy(c.constant_pool);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
public final boolean isSuper() {
|
||||
return (access_flags & Constants.ACC_SUPER) != 0;
|
||||
}
|
||||
|
||||
public final boolean isClass() {
|
||||
return (access_flags & Constants.ACC_INTERFACE) == 0;
|
||||
}
|
||||
|
||||
/** @return returns either HEAP (generated), FILE, or ZIP
|
||||
*/
|
||||
public final byte getSource() {
|
||||
return source;
|
||||
}
|
||||
|
||||
/********************* New repository functionality *********************/
|
||||
|
||||
/**
|
||||
* Gets the ClassRepository which holds its definition. By default
|
||||
* this is the same as SyntheticRepository.getInstance();
|
||||
*/
|
||||
public com.sun.org.apache.bcel.internal.util.Repository getRepository() {
|
||||
return repository;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the ClassRepository which loaded the JavaClass.
|
||||
* Should be called immediately after parsing is done.
|
||||
*/
|
||||
public void setRepository(com.sun.org.apache.bcel.internal.util.Repository repository) {
|
||||
this.repository = repository;
|
||||
}
|
||||
|
||||
/** Equivalent to runtime "instanceof" operator.
|
||||
*
|
||||
* @return true if this JavaClass is derived from teh super class
|
||||
*/
|
||||
public final boolean instanceOf(JavaClass super_class) {
|
||||
if(this.equals(super_class))
|
||||
return true;
|
||||
|
||||
JavaClass[] super_classes = getSuperClasses();
|
||||
|
||||
for(int i=0; i < super_classes.length; i++) {
|
||||
if(super_classes[i].equals(super_class)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if(super_class.isInterface()) {
|
||||
return implementationOf(super_class);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true, if clazz is an implementation of interface inter
|
||||
*/
|
||||
public boolean implementationOf(JavaClass inter) {
|
||||
if(!inter.isInterface()) {
|
||||
throw new IllegalArgumentException(inter.getClassName() + " is no interface");
|
||||
}
|
||||
|
||||
if(this.equals(inter)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
JavaClass[] super_interfaces = getAllInterfaces();
|
||||
|
||||
for(int i=0; i < super_interfaces.length; i++) {
|
||||
if(super_interfaces[i].equals(inter)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the superclass for this JavaClass object, or null if this
|
||||
* is java.lang.Object
|
||||
*/
|
||||
public JavaClass getSuperClass() {
|
||||
if("java.lang.Object".equals(getClassName())) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return repository.loadClass(getSuperclassName());
|
||||
} catch(ClassNotFoundException e) {
|
||||
System.err.println(e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return list of super classes of this class in ascending order, i.e.,
|
||||
* java.lang.Object is always the last element
|
||||
*/
|
||||
public JavaClass[] getSuperClasses() {
|
||||
JavaClass clazz = this;
|
||||
ClassVector vec = new ClassVector();
|
||||
|
||||
for(clazz = clazz.getSuperClass(); clazz != null;
|
||||
clazz = clazz.getSuperClass())
|
||||
{
|
||||
vec.addElement(clazz);
|
||||
}
|
||||
|
||||
return vec.toArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get interfaces directly implemented by this JavaClass.
|
||||
*/
|
||||
public JavaClass[] getInterfaces() {
|
||||
String[] interfaces = getInterfaceNames();
|
||||
JavaClass[] classes = new JavaClass[interfaces.length];
|
||||
|
||||
try {
|
||||
for(int i = 0; i < interfaces.length; i++) {
|
||||
classes[i] = repository.loadClass(interfaces[i]);
|
||||
}
|
||||
} catch(ClassNotFoundException e) {
|
||||
System.err.println(e);
|
||||
return null;
|
||||
}
|
||||
|
||||
return classes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all interfaces implemented by this JavaClass (transitively).
|
||||
*/
|
||||
public JavaClass[] getAllInterfaces() {
|
||||
ClassQueue queue = new ClassQueue();
|
||||
ClassVector vec = new ClassVector();
|
||||
|
||||
queue.enqueue(this);
|
||||
|
||||
while(!queue.empty()) {
|
||||
JavaClass clazz = queue.dequeue();
|
||||
|
||||
JavaClass souper = clazz.getSuperClass();
|
||||
JavaClass[] interfaces = clazz.getInterfaces();
|
||||
|
||||
if(clazz.isInterface()) {
|
||||
vec.addElement(clazz);
|
||||
} else {
|
||||
if(souper != null) {
|
||||
queue.enqueue(souper);
|
||||
}
|
||||
}
|
||||
|
||||
for(int i = 0; i < interfaces.length; i++) {
|
||||
queue.enqueue(interfaces[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return vec.toArray();
|
||||
}
|
||||
}
|
||||
@ -1,167 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class represents a (PC offset, line number) pair, i.e., a line number in
|
||||
* the source that corresponds to a relative address in the byte code. This
|
||||
* is used for debugging purposes.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see LineNumberTable
|
||||
*/
|
||||
public final class LineNumber implements Cloneable, Node, Serializable {
|
||||
private int start_pc; // Program Counter (PC) corresponds to line
|
||||
private int line_number; // number in source file
|
||||
|
||||
/**
|
||||
* Initialize from another object.
|
||||
*/
|
||||
public LineNumber(LineNumber c) {
|
||||
this(c.getStartPC(), c.getLineNumber());
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct object from file stream.
|
||||
* @param file Input stream
|
||||
* @throws IOException
|
||||
*/
|
||||
LineNumber(DataInputStream file) throws IOException
|
||||
{
|
||||
this(file.readUnsignedShort(), file.readUnsignedShort());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param start_pc Program Counter (PC) corresponds to
|
||||
* @param line_number line number in source file
|
||||
*/
|
||||
public LineNumber(int start_pc, int line_number)
|
||||
{
|
||||
this.start_pc = start_pc;
|
||||
this.line_number = line_number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitLineNumber(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump line number/pc pair to file stream in binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
file.writeShort(start_pc);
|
||||
file.writeShort(line_number);
|
||||
|
||||
}
|
||||
/**
|
||||
* @return Corresponding source line
|
||||
*/
|
||||
public final int getLineNumber() { return line_number; }
|
||||
|
||||
/**
|
||||
* @return PC in code
|
||||
*/
|
||||
public final int getStartPC() { return start_pc; }
|
||||
|
||||
/**
|
||||
* @param line_number.
|
||||
*/
|
||||
public final void setLineNumber(int line_number) {
|
||||
this.line_number = line_number;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param start_pc.
|
||||
*/
|
||||
public final void setStartPC(int start_pc) {
|
||||
this.start_pc = start_pc;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return String representation
|
||||
*/
|
||||
public final String toString() {
|
||||
return "LineNumber(" + start_pc + ", " + line_number + ")";
|
||||
}
|
||||
|
||||
/**
|
||||
* @return deep copy of this object
|
||||
*/
|
||||
public LineNumber copy() {
|
||||
try {
|
||||
return (LineNumber)clone();
|
||||
} catch(CloneNotSupportedException e) {}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -1,243 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class represents a table of line numbers for debugging
|
||||
* purposes. This attribute is used by the <em>Code</em> attribute. It
|
||||
* contains pairs of PCs and line numbers.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see Code
|
||||
* @see LineNumber
|
||||
*/
|
||||
public final class LineNumberTable extends Attribute {
|
||||
private int line_number_table_length;
|
||||
private LineNumber[] line_number_table; // Table of line/numbers pairs
|
||||
|
||||
/*
|
||||
* Initialize from another object. Note that both objects use the same
|
||||
* references (shallow copy). Use copy() for a physical copy.
|
||||
*/
|
||||
public LineNumberTable(LineNumberTable c) {
|
||||
this(c.getNameIndex(), c.getLength(), c.getLineNumberTable(),
|
||||
c.getConstantPool());
|
||||
}
|
||||
|
||||
/*
|
||||
* @param name_index Index of name
|
||||
* @param length Content length in bytes
|
||||
* @param line_number_table Table of line/numbers pairs
|
||||
* @param constant_pool Array of constants
|
||||
*/
|
||||
public LineNumberTable(int name_index, int length,
|
||||
LineNumber[] line_number_table,
|
||||
ConstantPool constant_pool)
|
||||
{
|
||||
super(Constants.ATTR_LINE_NUMBER_TABLE, name_index, length, constant_pool);
|
||||
setLineNumberTable(line_number_table);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct object from file stream.
|
||||
* @param name_index Index of name
|
||||
* @param length Content length in bytes
|
||||
* @param file Input stream
|
||||
* @throws IOException
|
||||
* @param constant_pool Array of constants
|
||||
*/
|
||||
LineNumberTable(int name_index, int length, DataInputStream file,
|
||||
ConstantPool constant_pool) throws IOException
|
||||
{
|
||||
this(name_index, length, (LineNumber[])null, constant_pool);
|
||||
line_number_table_length = (file.readUnsignedShort());
|
||||
line_number_table = new LineNumber[line_number_table_length];
|
||||
|
||||
for(int i=0; i < line_number_table_length; i++)
|
||||
line_number_table[i] = new LineNumber(file);
|
||||
}
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitLineNumberTable(this);
|
||||
}
|
||||
/**
|
||||
* Dump line number table attribute to file stream in binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
super.dump(file);
|
||||
file.writeShort(line_number_table_length);
|
||||
for(int i=0; i < line_number_table_length; i++)
|
||||
line_number_table[i].dump(file);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Array of (pc offset, line number) pairs.
|
||||
*/
|
||||
public final LineNumber[] getLineNumberTable() { return line_number_table; }
|
||||
|
||||
/**
|
||||
* @param line_number_table.
|
||||
*/
|
||||
public final void setLineNumberTable(LineNumber[] line_number_table) {
|
||||
this.line_number_table = line_number_table;
|
||||
|
||||
line_number_table_length = (line_number_table == null)? 0 :
|
||||
line_number_table.length;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return String representation.
|
||||
*/
|
||||
public final String toString() {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
StringBuffer line = new StringBuffer();
|
||||
|
||||
for(int i=0; i < line_number_table_length; i++) {
|
||||
line.append(line_number_table[i].toString());
|
||||
|
||||
if(i < line_number_table_length - 1)
|
||||
line.append(", ");
|
||||
|
||||
if(line.length() > 72) {
|
||||
line.append('\n');
|
||||
buf.append(line);
|
||||
line.setLength(0);
|
||||
}
|
||||
}
|
||||
|
||||
buf.append(line);
|
||||
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Map byte code positions to source code lines.
|
||||
*
|
||||
* @param pos byte code offset
|
||||
* @return corresponding line in source code
|
||||
*/
|
||||
public int getSourceLine(int pos) {
|
||||
int l = 0, r = line_number_table_length-1;
|
||||
|
||||
if(r < 0) // array is empty
|
||||
return -1;
|
||||
|
||||
int min_index = -1, min=-1;
|
||||
|
||||
/* Do a binary search since the array is ordered.
|
||||
*/
|
||||
do {
|
||||
int i = (l + r) / 2;
|
||||
int j = line_number_table[i].getStartPC();
|
||||
|
||||
if(j == pos)
|
||||
return line_number_table[i].getLineNumber();
|
||||
else if(pos < j) // else constrain search area
|
||||
r = i - 1;
|
||||
else // pos > j
|
||||
l = i + 1;
|
||||
|
||||
/* If exact match can't be found (which is the most common case)
|
||||
* return the line number that corresponds to the greatest index less
|
||||
* than pos.
|
||||
*/
|
||||
if(j < pos && j > min) {
|
||||
min = j;
|
||||
min_index = i;
|
||||
}
|
||||
} while(l <= r);
|
||||
|
||||
/* It's possible that we did not find any valid entry for the bytecode
|
||||
* offset we were looking for.
|
||||
*/
|
||||
if (min_index < 0)
|
||||
return -1;
|
||||
|
||||
return line_number_table[min_index].getLineNumber();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return deep copy of this attribute
|
||||
*/
|
||||
public Attribute copy(ConstantPool constant_pool) {
|
||||
LineNumberTable c = (LineNumberTable)clone();
|
||||
|
||||
c.line_number_table = new LineNumber[line_number_table_length];
|
||||
for(int i=0; i < line_number_table_length; i++)
|
||||
c.line_number_table[i] = line_number_table[i].copy();
|
||||
|
||||
c.constant_pool = constant_pool;
|
||||
return c;
|
||||
}
|
||||
|
||||
public final int getTableLength() { return line_number_table_length; }
|
||||
}
|
||||
@ -1,262 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class represents a local variable within a method. It contains its
|
||||
* scope, name, signature and index on the method's frame.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see LocalVariableTable
|
||||
*/
|
||||
public final class LocalVariable
|
||||
implements Constants, Cloneable, Node, Serializable
|
||||
{
|
||||
private int start_pc; // Range in which the variable is valid
|
||||
private int length;
|
||||
private int name_index; // Index in constant pool of variable name
|
||||
private int signature_index; // Index of variable signature
|
||||
private int index; /* Variable is `index'th local variable on
|
||||
* this method's frame.
|
||||
*/
|
||||
|
||||
private ConstantPool constant_pool;
|
||||
|
||||
/**
|
||||
* Initialize from another object. Note that both objects use the same
|
||||
* references (shallow copy). Use copy() for a physical copy.
|
||||
*/
|
||||
public LocalVariable(LocalVariable c) {
|
||||
this(c.getStartPC(), c.getLength(), c.getNameIndex(),
|
||||
c.getSignatureIndex(), c.getIndex(), c.getConstantPool());
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct object from file stream.
|
||||
* @param file Input stream
|
||||
* @throws IOException
|
||||
*/
|
||||
LocalVariable(DataInputStream file, ConstantPool constant_pool)
|
||||
throws IOException
|
||||
{
|
||||
this(file.readUnsignedShort(), file.readUnsignedShort(),
|
||||
file.readUnsignedShort(), file.readUnsignedShort(),
|
||||
file.readUnsignedShort(), constant_pool);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param start_pc Range in which the variable
|
||||
* @param length ... is valid
|
||||
* @param name_index Index in constant pool of variable name
|
||||
* @param signature_index Index of variable's signature
|
||||
* @param index Variable is `index'th local variable on the method's frame
|
||||
* @param constant_pool Array of constants
|
||||
*/
|
||||
public LocalVariable(int start_pc, int length, int name_index,
|
||||
int signature_index, int index,
|
||||
ConstantPool constant_pool)
|
||||
{
|
||||
this.start_pc = start_pc;
|
||||
this.length = length;
|
||||
this.name_index = name_index;
|
||||
this.signature_index = signature_index;
|
||||
this.index = index;
|
||||
this.constant_pool = constant_pool;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitLocalVariable(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump local variable to file stream in binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
file.writeShort(start_pc);
|
||||
file.writeShort(length);
|
||||
file.writeShort(name_index);
|
||||
file.writeShort(signature_index);
|
||||
file.writeShort(index);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Constant pool used by this object.
|
||||
*/
|
||||
public final ConstantPool getConstantPool() { return constant_pool; }
|
||||
|
||||
/**
|
||||
* @return Variable is valid within getStartPC() .. getStartPC()+getLength()
|
||||
*/
|
||||
public final int getLength() { return length; }
|
||||
|
||||
/**
|
||||
* @return Variable name.
|
||||
*/
|
||||
public final String getName() {
|
||||
ConstantUtf8 c;
|
||||
|
||||
c = (ConstantUtf8)constant_pool.getConstant(name_index, CONSTANT_Utf8);
|
||||
return c.getBytes();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Index in constant pool of variable name.
|
||||
*/
|
||||
public final int getNameIndex() { return name_index; }
|
||||
|
||||
/**
|
||||
* @return Signature.
|
||||
*/
|
||||
public final String getSignature() {
|
||||
ConstantUtf8 c;
|
||||
c = (ConstantUtf8)constant_pool.getConstant(signature_index,
|
||||
CONSTANT_Utf8);
|
||||
return c.getBytes();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Index in constant pool of variable signature.
|
||||
*/
|
||||
public final int getSignatureIndex() { return signature_index; }
|
||||
|
||||
/**
|
||||
* @return index of register where variable is stored
|
||||
*/
|
||||
public final int getIndex() { return index; }
|
||||
|
||||
/**
|
||||
* @return Start of range where he variable is valid
|
||||
*/
|
||||
public final int getStartPC() { return start_pc; }
|
||||
|
||||
/**
|
||||
* @param constant_pool Constant pool to be used for this object.
|
||||
*/
|
||||
public final void setConstantPool(ConstantPool constant_pool) {
|
||||
this.constant_pool = constant_pool;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param length.
|
||||
*/
|
||||
public final void setLength(int length) {
|
||||
this.length = length;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name_index.
|
||||
*/
|
||||
public final void setNameIndex(int name_index) {
|
||||
this.name_index = name_index;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param signature_index.
|
||||
*/
|
||||
public final void setSignatureIndex(int signature_index) {
|
||||
this.signature_index = signature_index;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param index.
|
||||
*/
|
||||
public final void setIndex(int index) { this.index = index; }
|
||||
|
||||
/**
|
||||
* @param start_pc Specify range where the local variable is valid.
|
||||
*/
|
||||
public final void setStartPC(int start_pc) {
|
||||
this.start_pc = start_pc;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string representation.
|
||||
*/
|
||||
public final String toString() {
|
||||
String name = getName(), signature = Utility.signatureToString(getSignature());
|
||||
|
||||
return "LocalVariable(start_pc = " + start_pc + ", length = " + length +
|
||||
", index = " + index + ":" + signature + " " + name + ")";
|
||||
}
|
||||
|
||||
/**
|
||||
* @return deep copy of this object
|
||||
*/
|
||||
public LocalVariable copy() {
|
||||
try {
|
||||
return (LocalVariable)clone();
|
||||
} catch(CloneNotSupportedException e) {}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -1,199 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class represents colection of local variables in a
|
||||
* method. This attribute is contained in the <em>Code</em> attribute.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
* @see Code
|
||||
* @see LocalVariable
|
||||
*/
|
||||
public class LocalVariableTable extends Attribute {
|
||||
private int local_variable_table_length; // Table of local
|
||||
private LocalVariable[] local_variable_table; // variables
|
||||
|
||||
/**
|
||||
* Initialize from another object. Note that both objects use the same
|
||||
* references (shallow copy). Use copy() for a physical copy.
|
||||
*/
|
||||
public LocalVariableTable(LocalVariableTable c) {
|
||||
this(c.getNameIndex(), c.getLength(), c.getLocalVariableTable(),
|
||||
c.getConstantPool());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name_index Index in constant pool to `LocalVariableTable'
|
||||
* @param length Content length in bytes
|
||||
* @param local_variable_table Table of local variables
|
||||
* @param constant_pool Array of constants
|
||||
*/
|
||||
public LocalVariableTable(int name_index, int length,
|
||||
LocalVariable[] local_variable_table,
|
||||
ConstantPool constant_pool)
|
||||
{
|
||||
super(Constants.ATTR_LOCAL_VARIABLE_TABLE, name_index, length, constant_pool);
|
||||
setLocalVariableTable(local_variable_table);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct object from file stream.
|
||||
* @param name_index Index in constant pool
|
||||
* @param length Content length in bytes
|
||||
* @param file Input stream
|
||||
* @param constant_pool Array of constants
|
||||
* @throws IOException
|
||||
*/
|
||||
LocalVariableTable(int name_index, int length, DataInputStream file,
|
||||
ConstantPool constant_pool) throws IOException
|
||||
{
|
||||
this(name_index, length, (LocalVariable[])null, constant_pool);
|
||||
|
||||
local_variable_table_length = (file.readUnsignedShort());
|
||||
local_variable_table = new LocalVariable[local_variable_table_length];
|
||||
|
||||
for(int i=0; i < local_variable_table_length; i++)
|
||||
local_variable_table[i] = new LocalVariable(file, constant_pool);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitLocalVariableTable(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump local variable table attribute to file stream in binary format.
|
||||
*
|
||||
* @param file Output file stream
|
||||
* @throws IOException
|
||||
*/
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
super.dump(file);
|
||||
file.writeShort(local_variable_table_length);
|
||||
for(int i=0; i < local_variable_table_length; i++)
|
||||
local_variable_table[i].dump(file);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Array of local variables of method.
|
||||
*/
|
||||
public final LocalVariable[] getLocalVariableTable() {
|
||||
return local_variable_table;
|
||||
}
|
||||
|
||||
/** @return first matching variable using index
|
||||
*/
|
||||
public final LocalVariable getLocalVariable(int index) {
|
||||
for(int i=0; i < local_variable_table_length; i++)
|
||||
if(local_variable_table[i].getIndex() == index)
|
||||
return local_variable_table[i];
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public final void setLocalVariableTable(LocalVariable[] local_variable_table)
|
||||
{
|
||||
this.local_variable_table = local_variable_table;
|
||||
local_variable_table_length = (local_variable_table == null)? 0 :
|
||||
local_variable_table.length;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return String representation.
|
||||
*/
|
||||
public final String toString() {
|
||||
StringBuffer buf = new StringBuffer("");
|
||||
|
||||
for(int i=0; i < local_variable_table_length; i++) {
|
||||
buf.append(local_variable_table[i].toString());
|
||||
|
||||
if(i < local_variable_table_length - 1)
|
||||
buf.append('\n');
|
||||
}
|
||||
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return deep copy of this attribute
|
||||
*/
|
||||
public Attribute copy(ConstantPool constant_pool) {
|
||||
LocalVariableTable c = (LocalVariableTable)clone();
|
||||
|
||||
c.local_variable_table = new LocalVariable[local_variable_table_length];
|
||||
for(int i=0; i < local_variable_table_length; i++)
|
||||
c.local_variable_table[i] = local_variable_table[i].copy();
|
||||
|
||||
c.constant_pool = constant_pool;
|
||||
return c;
|
||||
}
|
||||
|
||||
public final int getTableLength() { return local_variable_table_length; }
|
||||
}
|
||||
@ -1,231 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS 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 consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import com.sun.org.apache.bcel.internal.generic.Type;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* This class represents the method info structure, i.e., the representation
|
||||
* for a method in the class. See JVM specification for details.
|
||||
* A method has access flags, a name, a signature and a number of attributes.
|
||||
*
|
||||
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
|
||||
*/
|
||||
public final class Method extends FieldOrMethod {
|
||||
/**
|
||||
* Empty constructor, all attributes have to be defined via `setXXX'
|
||||
* methods. Use at your own risk.
|
||||
*/
|
||||
public Method() {}
|
||||
|
||||
/**
|
||||
* Initialize from another object. Note that both objects use the same
|
||||
* references (shallow copy). Use clone() for a physical copy.
|
||||
*/
|
||||
public Method(Method c) {
|
||||
super(c);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct object from file stream.
|
||||
* @param file Input stream
|
||||
* @throws IOException
|
||||
* @throws ClassFormatException
|
||||
*/
|
||||
Method(DataInputStream file, ConstantPool constant_pool)
|
||||
throws IOException, ClassFormatException
|
||||
{
|
||||
super(file, constant_pool);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param access_flags Access rights of method
|
||||
* @param name_index Points to field name in constant pool
|
||||
* @param signature_index Points to encoded signature
|
||||
* @param attributes Collection of attributes
|
||||
* @param constant_pool Array of constants
|
||||
*/
|
||||
public Method(int access_flags, int name_index, int signature_index,
|
||||
Attribute[] attributes, ConstantPool constant_pool)
|
||||
{
|
||||
super(access_flags, name_index, signature_index, attributes, constant_pool);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by objects that are traversing the nodes of the tree implicitely
|
||||
* defined by the contents of a Java class. I.e., the hierarchy of methods,
|
||||
* fields, attributes, etc. spawns a tree of objects.
|
||||
*
|
||||
* @param v Visitor object
|
||||
*/
|
||||
public void accept(Visitor v) {
|
||||
v.visitMethod(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Code attribute of method, if any
|
||||
*/
|
||||
public final Code getCode() {
|
||||
for(int i=0; i < attributes_count; i++)
|
||||
if(attributes[i] instanceof Code)
|
||||
return (Code)attributes[i];
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ExceptionTable attribute of method, if any, i.e., list all
|
||||
* exceptions the method may throw not exception handlers!
|
||||
*/
|
||||
public final ExceptionTable getExceptionTable() {
|
||||
for(int i=0; i < attributes_count; i++)
|
||||
if(attributes[i] instanceof ExceptionTable)
|
||||
return (ExceptionTable)attributes[i];
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/** @return LocalVariableTable of code attribute if any, i.e. the call is forwarded
|
||||
* to the Code atribute.
|
||||
*/
|
||||
public final LocalVariableTable getLocalVariableTable() {
|
||||
Code code = getCode();
|
||||
|
||||
if(code != null)
|
||||
return code.getLocalVariableTable();
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
/** @return LineNumberTable of code attribute if any, i.e. the call is forwarded
|
||||
* to the Code atribute.
|
||||
*/
|
||||
public final LineNumberTable getLineNumberTable() {
|
||||
Code code = getCode();
|
||||
|
||||
if(code != null)
|
||||
return code.getLineNumberTable();
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return string representation close to declaration format,
|
||||
* `public static void _main(String[] args) throws IOException', e.g.
|
||||
*
|
||||
* @return String representation of the method.
|
||||
*/
|
||||
public final String toString() {
|
||||
ConstantUtf8 c;
|
||||
String name, signature, access; // Short cuts to constant pool
|
||||
StringBuffer buf;
|
||||
|
||||
access = Utility.accessToString(access_flags);
|
||||
|
||||
// Get name and signature from constant pool
|
||||
c = (ConstantUtf8)constant_pool.getConstant(signature_index,
|
||||
Constants.CONSTANT_Utf8);
|
||||
signature = c.getBytes();
|
||||
|
||||
c = (ConstantUtf8)constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8);
|
||||
name = c.getBytes();
|
||||
|
||||
signature = Utility.methodSignatureToString(signature, name, access, true,
|
||||
getLocalVariableTable());
|
||||
buf = new StringBuffer(signature);
|
||||
|
||||
for(int i=0; i < attributes_count; i++) {
|
||||
Attribute a = attributes[i];
|
||||
|
||||
if(!((a instanceof Code) || (a instanceof ExceptionTable)))
|
||||
buf.append(" [" + a.toString() + "]");
|
||||
}
|
||||
|
||||
ExceptionTable e = getExceptionTable();
|
||||
if(e != null) {
|
||||
String str = e.toString();
|
||||
if(!str.equals(""))
|
||||
buf.append("\n\t\tthrows " + str);
|
||||
}
|
||||
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return deep copy of this method
|
||||
*/
|
||||
public final Method copy(ConstantPool constant_pool) {
|
||||
return (Method)copy_(constant_pool);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return return type of method
|
||||
*/
|
||||
public Type getReturnType() {
|
||||
return Type.getReturnType(getSignature());
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array of method argument types
|
||||
*/
|
||||
public Type[] getArgumentTypes() {
|
||||
return Type.getArgumentTypes(getSignature());
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user