6945219: minor SA fixes
Reviewed-by: twisti
This commit is contained in:
parent
5e6b418472
commit
166ea7f01c
@ -884,9 +884,12 @@ static bool read_shared_lib_info(struct ps_prochandle* ph) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// read name of the shared object
|
// read name of the shared object
|
||||||
if (read_string(ph, (uintptr_t) lib_name_addr, lib_name, sizeof(lib_name)) != true) {
|
lib_name[0] = '\0';
|
||||||
|
if (lib_name_addr != 0 &&
|
||||||
|
read_string(ph, (uintptr_t) lib_name_addr, lib_name, sizeof(lib_name)) != true) {
|
||||||
print_debug("can't read shared object name\n");
|
print_debug("can't read shared object name\n");
|
||||||
return false;
|
// don't let failure to read the name stop opening the file. If something is really wrong
|
||||||
|
// it will fail later.
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lib_name[0] != '\0') {
|
if (lib_name[0] != '\0') {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 2005-2010 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -494,6 +494,68 @@ public class CommandProcessor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
new Command("revptrs", "revptrs address", false) {
|
||||||
|
public void doit(Tokens t) {
|
||||||
|
int tokens = t.countTokens();
|
||||||
|
if (tokens != 1 && (tokens != 2 || !t.nextToken().equals("-c"))) {
|
||||||
|
usage();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
boolean chase = tokens == 2;
|
||||||
|
ReversePtrs revptrs = VM.getVM().getRevPtrs();
|
||||||
|
if (revptrs == null) {
|
||||||
|
out.println("Computing reverse pointers...");
|
||||||
|
ReversePtrsAnalysis analysis = new ReversePtrsAnalysis();
|
||||||
|
final boolean[] complete = new boolean[1];
|
||||||
|
HeapProgressThunk thunk = new HeapProgressThunk() {
|
||||||
|
public void heapIterationFractionUpdate(double d) {}
|
||||||
|
public synchronized void heapIterationComplete() {
|
||||||
|
complete[0] = true;
|
||||||
|
notify();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
analysis.setHeapProgressThunk(thunk);
|
||||||
|
analysis.run();
|
||||||
|
while (!complete[0]) {
|
||||||
|
synchronized (thunk) {
|
||||||
|
try {
|
||||||
|
thunk.wait();
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
revptrs = VM.getVM().getRevPtrs();
|
||||||
|
out.println("Done.");
|
||||||
|
}
|
||||||
|
Address a = VM.getVM().getDebugger().parseAddress(t.nextToken());
|
||||||
|
if (VM.getVM().getUniverse().heap().isInReserved(a)) {
|
||||||
|
OopHandle handle = a.addOffsetToAsOopHandle(0);
|
||||||
|
Oop oop = VM.getVM().getObjectHeap().newOop(handle);
|
||||||
|
ArrayList ptrs = revptrs.get(oop);
|
||||||
|
if (ptrs == null) {
|
||||||
|
out.println("no live references to " + a);
|
||||||
|
} else {
|
||||||
|
if (chase) {
|
||||||
|
while (ptrs.size() == 1) {
|
||||||
|
LivenessPathElement e = (LivenessPathElement)ptrs.get(0);
|
||||||
|
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||||
|
Oop.printOopValueOn(e.getObj(), new PrintStream(bos));
|
||||||
|
out.println(bos.toString());
|
||||||
|
ptrs = revptrs.get(e.getObj());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < ptrs.size(); i++) {
|
||||||
|
LivenessPathElement e = (LivenessPathElement)ptrs.get(i);
|
||||||
|
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||||
|
Oop.printOopValueOn(e.getObj(), new PrintStream(bos));
|
||||||
|
out.println(bos.toString());
|
||||||
|
oop = e.getObj();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
new Command("inspect", "inspect expression", false) {
|
new Command("inspect", "inspect expression", false) {
|
||||||
public void doit(Tokens t) {
|
public void doit(Tokens t) {
|
||||||
if (t.countTokens() != 1) {
|
if (t.countTokens() != 1) {
|
||||||
@ -816,8 +878,24 @@ public class CommandProcessor {
|
|||||||
dumpType(type);
|
dumpType(type);
|
||||||
} else {
|
} else {
|
||||||
Iterator i = agent.getTypeDataBase().getTypes();
|
Iterator i = agent.getTypeDataBase().getTypes();
|
||||||
|
// Make sure the types are emitted in an order than can be read back in
|
||||||
|
HashSet emitted = new HashSet();
|
||||||
|
Stack pending = new Stack();
|
||||||
while (i.hasNext()) {
|
while (i.hasNext()) {
|
||||||
dumpType((Type)i.next());
|
Type n = (Type)i.next();
|
||||||
|
if (emitted.contains(n.getName())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (n != null && !emitted.contains(n.getName())) {
|
||||||
|
pending.push(n);
|
||||||
|
n = n.getSuperclass();
|
||||||
|
}
|
||||||
|
while (!pending.empty()) {
|
||||||
|
n = (Type)pending.pop();
|
||||||
|
dumpType(n);
|
||||||
|
emitted.add(n.getName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -846,83 +924,105 @@ public class CommandProcessor {
|
|||||||
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
new Command("search", "search [ heap | codecache | threads ] value", false) {
|
new Command("search", "search [ heap | perm | rawheap | codecache | threads ] value", false) {
|
||||||
public void doit(Tokens t) {
|
public void doit(Tokens t) {
|
||||||
if (t.countTokens() != 2) {
|
if (t.countTokens() != 2) {
|
||||||
usage();
|
usage();
|
||||||
} else {
|
return;
|
||||||
String type = t.nextToken();
|
}
|
||||||
final Address value = VM.getVM().getDebugger().parseAddress(t.nextToken());
|
String type = t.nextToken();
|
||||||
final long stride = VM.getVM().getAddressSize();
|
final Address value = VM.getVM().getDebugger().parseAddress(t.nextToken());
|
||||||
if (type.equals("threads")) {
|
final long stride = VM.getVM().getAddressSize();
|
||||||
Threads threads = VM.getVM().getThreads();
|
if (type.equals("threads")) {
|
||||||
for (JavaThread thread = threads.first(); thread != null; thread = thread.next()) {
|
Threads threads = VM.getVM().getThreads();
|
||||||
Address base = thread.getBaseOfStackPointer();
|
for (JavaThread thread = threads.first(); thread != null; thread = thread.next()) {
|
||||||
Address end = thread.getLastJavaSP();
|
Address base = thread.getBaseOfStackPointer();
|
||||||
if (end == null) continue;
|
Address end = thread.getLastJavaSP();
|
||||||
if (end.lessThan(base)) {
|
if (end == null) continue;
|
||||||
Address tmp = base;
|
if (end.lessThan(base)) {
|
||||||
base = end;
|
Address tmp = base;
|
||||||
end = tmp;
|
base = end;
|
||||||
}
|
end = tmp;
|
||||||
out.println("Searching " + base + " " + end);
|
}
|
||||||
while (base != null && base.lessThan(end)) {
|
out.println("Searching " + base + " " + end);
|
||||||
Address val = base.getAddressAt(0);
|
while (base != null && base.lessThan(end)) {
|
||||||
if (AddressOps.equal(val, value)) {
|
Address val = base.getAddressAt(0);
|
||||||
out.println(base);
|
if (AddressOps.equal(val, value)) {
|
||||||
}
|
out.println(base);
|
||||||
base = base.addOffsetTo(stride);
|
}
|
||||||
}
|
base = base.addOffsetTo(stride);
|
||||||
}
|
}
|
||||||
} else if (type.equals("heap")) {
|
|
||||||
RawHeapVisitor iterator = new RawHeapVisitor() {
|
|
||||||
public void prologue(long used) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void visitAddress(Address addr) {
|
|
||||||
Address val = addr.getAddressAt(0);
|
|
||||||
if (AddressOps.equal(val, value)) {
|
|
||||||
out.println("found at " + addr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public void visitCompOopAddress(Address addr) {
|
|
||||||
Address val = addr.getCompOopAddressAt(0);
|
|
||||||
if (AddressOps.equal(val, value)) {
|
|
||||||
out.println("found at " + addr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public void epilogue() {
|
|
||||||
}
|
|
||||||
};
|
|
||||||
VM.getVM().getObjectHeap().iterateRaw(iterator);
|
|
||||||
} else if (type.equals("codecache")) {
|
|
||||||
CodeCacheVisitor v = new CodeCacheVisitor() {
|
|
||||||
public void prologue(Address start, Address end) {
|
|
||||||
}
|
|
||||||
public void visit(CodeBlob blob) {
|
|
||||||
boolean printed = false;
|
|
||||||
Address base = blob.getAddress();
|
|
||||||
Address end = base.addOffsetTo(blob.getSize());
|
|
||||||
while (base != null && base.lessThan(end)) {
|
|
||||||
Address val = base.getAddressAt(0);
|
|
||||||
if (AddressOps.equal(val, value)) {
|
|
||||||
if (!printed) {
|
|
||||||
printed = true;
|
|
||||||
blob.printOn(out);
|
|
||||||
}
|
|
||||||
out.println("found at " + base + "\n");
|
|
||||||
}
|
|
||||||
base = base.addOffsetTo(stride);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public void epilogue() {
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
VM.getVM().getCodeCache().iterate(v);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
} else if (type.equals("rawheap")) {
|
||||||
|
RawHeapVisitor iterator = new RawHeapVisitor() {
|
||||||
|
public void prologue(long used) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void visitAddress(Address addr) {
|
||||||
|
Address val = addr.getAddressAt(0);
|
||||||
|
if (AddressOps.equal(val, value)) {
|
||||||
|
out.println("found at " + addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void visitCompOopAddress(Address addr) {
|
||||||
|
Address val = addr.getCompOopAddressAt(0);
|
||||||
|
if (AddressOps.equal(val, value)) {
|
||||||
|
out.println("found at " + addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void epilogue() {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
VM.getVM().getObjectHeap().iterateRaw(iterator);
|
||||||
|
} else if (type.equals("heap") || type.equals("perm")) {
|
||||||
|
HeapVisitor iterator = new DefaultHeapVisitor() {
|
||||||
|
public boolean doObj(Oop obj) {
|
||||||
|
int index = 0;
|
||||||
|
Address start = obj.getHandle();
|
||||||
|
long end = obj.getObjectSize();
|
||||||
|
while (index < end) {
|
||||||
|
Address val = start.getAddressAt(index);
|
||||||
|
if (AddressOps.equal(val, value)) {
|
||||||
|
out.println("found in " + obj.getHandle());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
index += 4;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if (type.equals("heap")) {
|
||||||
|
VM.getVM().getObjectHeap().iterate(iterator);
|
||||||
|
} else {
|
||||||
|
VM.getVM().getObjectHeap().iteratePerm(iterator);
|
||||||
|
}
|
||||||
|
} else if (type.equals("codecache")) {
|
||||||
|
CodeCacheVisitor v = new CodeCacheVisitor() {
|
||||||
|
public void prologue(Address start, Address end) {
|
||||||
|
}
|
||||||
|
public void visit(CodeBlob blob) {
|
||||||
|
boolean printed = false;
|
||||||
|
Address base = blob.getAddress();
|
||||||
|
Address end = base.addOffsetTo(blob.getSize());
|
||||||
|
while (base != null && base.lessThan(end)) {
|
||||||
|
Address val = base.getAddressAt(0);
|
||||||
|
if (AddressOps.equal(val, value)) {
|
||||||
|
if (!printed) {
|
||||||
|
printed = true;
|
||||||
|
blob.printOn(out);
|
||||||
|
}
|
||||||
|
out.println("found at " + base + "\n");
|
||||||
|
}
|
||||||
|
base = base.addOffsetTo(stride);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void epilogue() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
VM.getVM().getCodeCache().iterate(v);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -957,12 +1057,19 @@ public class CommandProcessor {
|
|||||||
Threads threads = VM.getVM().getThreads();
|
Threads threads = VM.getVM().getThreads();
|
||||||
boolean all = name.equals("-a");
|
boolean all = name.equals("-a");
|
||||||
for (JavaThread thread = threads.first(); thread != null; thread = thread.next()) {
|
for (JavaThread thread = threads.first(); thread != null; thread = thread.next()) {
|
||||||
StringWriter sw = new StringWriter();
|
|
||||||
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||||
thread.printThreadIDOn(new PrintStream(bos));
|
thread.printThreadIDOn(new PrintStream(bos));
|
||||||
if (all || bos.toString().equals(name)) {
|
if (all || bos.toString().equals(name)) {
|
||||||
|
out.println(bos.toString() + " = " + thread.getAddress());
|
||||||
HTMLGenerator gen = new HTMLGenerator(false);
|
HTMLGenerator gen = new HTMLGenerator(false);
|
||||||
out.println(gen.genHTMLForJavaStackTrace(thread));
|
try {
|
||||||
|
out.println(gen.genHTMLForJavaStackTrace(thread));
|
||||||
|
} catch (Exception e) {
|
||||||
|
err.println("Error: " + e);
|
||||||
|
if (verboseExceptions) {
|
||||||
|
e.printStackTrace(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!all) return;
|
if (!all) return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -970,6 +1077,26 @@ public class CommandProcessor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
new Command("thread", "thread { -a | id }", false) {
|
||||||
|
public void doit(Tokens t) {
|
||||||
|
if (t.countTokens() != 1) {
|
||||||
|
usage();
|
||||||
|
} else {
|
||||||
|
String name = t.nextToken();
|
||||||
|
Threads threads = VM.getVM().getThreads();
|
||||||
|
boolean all = name.equals("-a");
|
||||||
|
for (JavaThread thread = threads.first(); thread != null; thread = thread.next()) {
|
||||||
|
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||||
|
thread.printThreadIDOn(new PrintStream(bos));
|
||||||
|
if (all || bos.toString().equals(name)) {
|
||||||
|
out.println(bos.toString() + " = " + thread.getAddress());
|
||||||
|
if (!all) return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out.println("Couldn't find thread " + name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
new Command("threads", false) {
|
new Command("threads", false) {
|
||||||
public void doit(Tokens t) {
|
public void doit(Tokens t) {
|
||||||
@ -1161,7 +1288,7 @@ public class CommandProcessor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Pattern historyPattern = Pattern.compile("((!\\*)|(!\\$)|(!!-?)|(!-?[0-9][0-9]*))");
|
static Pattern historyPattern = Pattern.compile("((!\\*)|(!\\$)|(!!-?)|(!-?[0-9][0-9]*)|(![a-zA-Z][^ ]*))");
|
||||||
|
|
||||||
public void executeCommand(String ln) {
|
public void executeCommand(String ln) {
|
||||||
if (ln.indexOf('!') != -1) {
|
if (ln.indexOf('!') != -1) {
|
||||||
@ -1195,14 +1322,37 @@ public class CommandProcessor {
|
|||||||
result.append(item.at(item.countTokens() - 1));
|
result.append(item.at(item.countTokens() - 1));
|
||||||
} else {
|
} else {
|
||||||
String tail = cmd.substring(1);
|
String tail = cmd.substring(1);
|
||||||
int index = Integer.parseInt(tail);
|
switch (tail.charAt(0)) {
|
||||||
if (index < 0) {
|
case '0':
|
||||||
index = history.size() + index;
|
case '1':
|
||||||
|
case '2':
|
||||||
|
case '3':
|
||||||
|
case '4':
|
||||||
|
case '5':
|
||||||
|
case '6':
|
||||||
|
case '7':
|
||||||
|
case '8':
|
||||||
|
case '9':
|
||||||
|
case '-': {
|
||||||
|
int index = Integer.parseInt(tail);
|
||||||
|
if (index < 0) {
|
||||||
|
index = history.size() + index;
|
||||||
|
}
|
||||||
|
if (index > size) {
|
||||||
|
err.println("No such history item");
|
||||||
|
} else {
|
||||||
|
result.append((String)history.get(index));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
for (int i = history.size() - 1; i >= 0; i--) {
|
||||||
|
String s = (String)history.get(i);
|
||||||
|
if (s.startsWith(tail)) {
|
||||||
|
result.append(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (index > size) {
|
|
||||||
err.println("No such history item");
|
|
||||||
} else {
|
|
||||||
result.append((String)history.get(index));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 2000-2010 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -985,6 +985,12 @@ public class HSDB implements ObjectHistogramPanel.Listener, SAListener {
|
|||||||
annoPanel.addAnnotation(new Annotation(curFrame.addressOfInterpreterFrameExpressionStack(),
|
annoPanel.addAnnotation(new Annotation(curFrame.addressOfInterpreterFrameExpressionStack(),
|
||||||
curFrame.addressOfInterpreterFrameTOS(),
|
curFrame.addressOfInterpreterFrameTOS(),
|
||||||
"Interpreter expression stack"));
|
"Interpreter expression stack"));
|
||||||
|
Address monBegin = curFrame.interpreterFrameMonitorBegin().address();
|
||||||
|
Address monEnd = curFrame.interpreterFrameMonitorEnd().address();
|
||||||
|
if (!monBegin.equals(monEnd)) {
|
||||||
|
annoPanel.addAnnotation(new Annotation(monBegin, monEnd,
|
||||||
|
"BasicObjectLocks"));
|
||||||
|
}
|
||||||
if (interpreterFrameMethod != null) {
|
if (interpreterFrameMethod != null) {
|
||||||
// The offset is just to get the right stack slots highlighted in the output
|
// The offset is just to get the right stack slots highlighted in the output
|
||||||
int offset = 1;
|
int offset = 1;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2001-2003 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 2001-2010 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -294,7 +294,7 @@ public class BugSpot extends JPanel {
|
|||||||
attachDialog.setSize(400, 300);
|
attachDialog.setSize(400, 300);
|
||||||
GraphicsUtilities.centerInContainer(attachDialog.getComponent(),
|
GraphicsUtilities.centerInContainer(attachDialog.getComponent(),
|
||||||
getParentDimension(attachDialog.getComponent()));
|
getParentDimension(attachDialog.getComponent()));
|
||||||
attachDialog.show();
|
attachDialog.setVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showThreadsDialog() {
|
public void showThreadsDialog() {
|
||||||
@ -321,7 +321,7 @@ public class BugSpot extends JPanel {
|
|||||||
getParentDimension(threadsDialog.getComponent()));
|
getParentDimension(threadsDialog.getComponent()));
|
||||||
GraphicsUtilities.centerInContainer(threadsDialog.getComponent(),
|
GraphicsUtilities.centerInContainer(threadsDialog.getComponent(),
|
||||||
getParentDimension(threadsDialog.getComponent()));
|
getParentDimension(threadsDialog.getComponent()));
|
||||||
threadsDialog.show();
|
threadsDialog.setVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showMemoryDialog() {
|
public void showMemoryDialog() {
|
||||||
@ -341,7 +341,7 @@ public class BugSpot extends JPanel {
|
|||||||
getParentDimension(memoryDialog.getComponent()));
|
getParentDimension(memoryDialog.getComponent()));
|
||||||
GraphicsUtilities.centerInContainer(memoryDialog.getComponent(),
|
GraphicsUtilities.centerInContainer(memoryDialog.getComponent(),
|
||||||
getParentDimension(memoryDialog.getComponent()));
|
getParentDimension(memoryDialog.getComponent()));
|
||||||
memoryDialog.show();
|
memoryDialog.setVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Changes the editor factory this debugger uses to display source
|
/** Changes the editor factory this debugger uses to display source
|
||||||
@ -530,7 +530,7 @@ public class BugSpot extends JPanel {
|
|||||||
addFrame(stackFrame);
|
addFrame(stackFrame);
|
||||||
stackFrame.setSize(400, 200);
|
stackFrame.setSize(400, 200);
|
||||||
GraphicsUtilities.moveToInContainer(stackFrame.getComponent(), 0.0f, 1.0f, 0, 20);
|
GraphicsUtilities.moveToInContainer(stackFrame.getComponent(), 0.0f, 1.0f, 0, 20);
|
||||||
stackFrame.show();
|
stackFrame.setVisible(true);
|
||||||
|
|
||||||
// Create register panel
|
// Create register panel
|
||||||
registerPanel = new RegisterPanel();
|
registerPanel = new RegisterPanel();
|
||||||
@ -544,7 +544,7 @@ public class BugSpot extends JPanel {
|
|||||||
registerFrame.setSize(225, 200);
|
registerFrame.setSize(225, 200);
|
||||||
GraphicsUtilities.moveToInContainer(registerFrame.getComponent(),
|
GraphicsUtilities.moveToInContainer(registerFrame.getComponent(),
|
||||||
1.0f, 0.0f, 0, 0);
|
1.0f, 0.0f, 0, 0);
|
||||||
registerFrame.show();
|
registerFrame.setVisible(true);
|
||||||
|
|
||||||
resetCurrentThread();
|
resetCurrentThread();
|
||||||
} catch (DebuggerException e) {
|
} catch (DebuggerException e) {
|
||||||
@ -979,7 +979,7 @@ public class BugSpot extends JPanel {
|
|||||||
1.0f,
|
1.0f,
|
||||||
0.85f,
|
0.85f,
|
||||||
getParentDimension(editorFrame.getComponent()));
|
getParentDimension(editorFrame.getComponent()));
|
||||||
editorFrame.show();
|
editorFrame.setVisible(true);
|
||||||
shown = true;
|
shown = true;
|
||||||
}
|
}
|
||||||
code.showLineNumber(lineNo);
|
code.showLineNumber(lineNo);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 2002-2010 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -96,10 +96,6 @@ public class BytecodeDisassembler {
|
|||||||
addBytecodeClass(Bytecodes._dstore, BytecodeStore.class);
|
addBytecodeClass(Bytecodes._dstore, BytecodeStore.class);
|
||||||
addBytecodeClass(Bytecodes._astore, BytecodeStore.class);
|
addBytecodeClass(Bytecodes._astore, BytecodeStore.class);
|
||||||
addBytecodeClass(Bytecodes._tableswitch, BytecodeTableswitch.class);
|
addBytecodeClass(Bytecodes._tableswitch, BytecodeTableswitch.class);
|
||||||
|
|
||||||
// only special fast_xxx cases. others are handled differently.
|
|
||||||
addBytecodeClass(Bytecodes._fast_iaccess_0, BytecodeFastAAccess0.class);
|
|
||||||
addBytecodeClass(Bytecodes._fast_aaccess_0, BytecodeFastIAccess0.class);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public BytecodeDisassembler(Method method) {
|
public BytecodeDisassembler(Method method) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 2000-2010 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -263,11 +263,12 @@ public class ConstantPool extends Oop implements ClassConstants {
|
|||||||
case JVM_CONSTANT_NameAndType: return "JVM_CONSTANT_NameAndType";
|
case JVM_CONSTANT_NameAndType: return "JVM_CONSTANT_NameAndType";
|
||||||
case JVM_CONSTANT_Invalid: return "JVM_CONSTANT_Invalid";
|
case JVM_CONSTANT_Invalid: return "JVM_CONSTANT_Invalid";
|
||||||
case JVM_CONSTANT_UnresolvedClass: return "JVM_CONSTANT_UnresolvedClass";
|
case JVM_CONSTANT_UnresolvedClass: return "JVM_CONSTANT_UnresolvedClass";
|
||||||
|
case JVM_CONSTANT_UnresolvedClassInError: return "JVM_CONSTANT_UnresolvedClassInError";
|
||||||
case JVM_CONSTANT_ClassIndex: return "JVM_CONSTANT_ClassIndex";
|
case JVM_CONSTANT_ClassIndex: return "JVM_CONSTANT_ClassIndex";
|
||||||
case JVM_CONSTANT_UnresolvedString: return "JVM_CONSTANT_UnresolvedString";
|
case JVM_CONSTANT_UnresolvedString: return "JVM_CONSTANT_UnresolvedString";
|
||||||
case JVM_CONSTANT_StringIndex: return "JVM_CONSTANT_StringIndex";
|
case JVM_CONSTANT_StringIndex: return "JVM_CONSTANT_StringIndex";
|
||||||
}
|
}
|
||||||
throw new InternalError("unknown tag");
|
throw new InternalError("Unknown tag: " + tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void iterateFields(OopVisitor visitor, boolean doVMFields) {
|
public void iterateFields(OopVisitor visitor, boolean doVMFields) {
|
||||||
@ -304,6 +305,7 @@ public class ConstantPool extends Oop implements ClassConstants {
|
|||||||
index++;
|
index++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case JVM_CONSTANT_UnresolvedClassInError:
|
||||||
case JVM_CONSTANT_UnresolvedClass:
|
case JVM_CONSTANT_UnresolvedClass:
|
||||||
case JVM_CONSTANT_Class:
|
case JVM_CONSTANT_Class:
|
||||||
case JVM_CONSTANT_UnresolvedString:
|
case JVM_CONSTANT_UnresolvedString:
|
||||||
@ -409,6 +411,7 @@ public class ConstantPool extends Oop implements ClassConstants {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// case JVM_CONSTANT_ClassIndex:
|
// case JVM_CONSTANT_ClassIndex:
|
||||||
|
case JVM_CONSTANT_UnresolvedClassInError:
|
||||||
case JVM_CONSTANT_UnresolvedClass: {
|
case JVM_CONSTANT_UnresolvedClass: {
|
||||||
dos.writeByte(JVM_CONSTANT_Class);
|
dos.writeByte(JVM_CONSTANT_Class);
|
||||||
String klassName = getSymbolAt(ci).asString();
|
String klassName = getSymbolAt(ci).asString();
|
||||||
@ -464,6 +467,8 @@ public class ConstantPool extends Oop implements ClassConstants {
|
|||||||
+ ", type = " + signatureIndex);
|
+ ", type = " + signatureIndex);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
default:
|
||||||
|
throw new InternalError("unknown tag: " + cpConstType);
|
||||||
} // switch
|
} // switch
|
||||||
}
|
}
|
||||||
dos.flush();
|
dos.flush();
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2009 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 2002-2010 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -58,6 +58,9 @@ public interface ClassConstants
|
|||||||
// Temporary tag while constructing constant pool
|
// Temporary tag while constructing constant pool
|
||||||
public static final int JVM_CONSTANT_StringIndex = 103;
|
public static final int JVM_CONSTANT_StringIndex = 103;
|
||||||
|
|
||||||
|
// Temporary tag while constructing constant pool
|
||||||
|
public static final int JVM_CONSTANT_UnresolvedClassInError = 104;
|
||||||
|
|
||||||
// 1.5 major/minor version numbers from JVM spec. 3rd edition
|
// 1.5 major/minor version numbers from JVM spec. 3rd edition
|
||||||
public static final short MAJOR_VERSION = 49;
|
public static final short MAJOR_VERSION = 49;
|
||||||
public static final short MINOR_VERSION = 0;
|
public static final short MINOR_VERSION = 0;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 2001-2010 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -108,7 +108,7 @@ public abstract class SignatureIterator {
|
|||||||
return BasicTypeSize.getTArraySize();
|
return BasicTypeSize.getTArraySize();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw new RuntimeException("Should not reach here");
|
throw new RuntimeException("Should not reach here: char " + (char)_signature.getByteAt(_index) + " @ " + _index + " in " + _signature.asString());
|
||||||
}
|
}
|
||||||
protected void checkSignatureEnd() {
|
protected void checkSignatureEnd() {
|
||||||
if (_index < _signature.getLength()) {
|
if (_index < _signature.getLength()) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2009 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 2002-2010 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -238,6 +238,7 @@ public class ClassWriter implements /* imports */ ClassConstants
|
|||||||
}
|
}
|
||||||
|
|
||||||
// case JVM_CONSTANT_ClassIndex:
|
// case JVM_CONSTANT_ClassIndex:
|
||||||
|
case JVM_CONSTANT_UnresolvedClassInError:
|
||||||
case JVM_CONSTANT_UnresolvedClass: {
|
case JVM_CONSTANT_UnresolvedClass: {
|
||||||
dos.writeByte(JVM_CONSTANT_Class);
|
dos.writeByte(JVM_CONSTANT_Class);
|
||||||
String klassName = cpool.getSymbolAt(ci).asString();
|
String klassName = cpool.getSymbolAt(ci).asString();
|
||||||
@ -296,6 +297,8 @@ public class ClassWriter implements /* imports */ ClassConstants
|
|||||||
+ ", type = " + signatureIndex);
|
+ ", type = " + signatureIndex);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
default:
|
||||||
|
throw new InternalError("Unknown tag: " + cpConstType);
|
||||||
} // switch
|
} // switch
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 2001-2010 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -39,7 +39,6 @@ public interface FrameWrapper {
|
|||||||
public void setVisible(boolean visible);
|
public void setVisible(boolean visible);
|
||||||
public void setSize(int x, int y);
|
public void setSize(int x, int y);
|
||||||
public void pack();
|
public void pack();
|
||||||
public void show();
|
|
||||||
public void dispose();
|
public void dispose();
|
||||||
public void setBackground(Color color);
|
public void setBackground(Color color);
|
||||||
public void setResizable(boolean resizable);
|
public void setResizable(boolean resizable);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 2002-2010 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -95,8 +95,10 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
|||||||
|
|
||||||
// list tags
|
// list tags
|
||||||
void beginList() { beginTag("ul"); nl(); }
|
void beginList() { beginTag("ul"); nl(); }
|
||||||
void li(String s) { wrap("li", s); nl(); }
|
|
||||||
void endList() { endTag("ul"); nl(); }
|
void endList() { endTag("ul"); nl(); }
|
||||||
|
void beginListItem() { beginTag("li"); }
|
||||||
|
void endListItem() { endTag("li"); nl(); }
|
||||||
|
void li(String s) { wrap("li", s); nl(); }
|
||||||
|
|
||||||
// table tags
|
// table tags
|
||||||
void beginTable(int border) {
|
void beginTable(int border) {
|
||||||
@ -505,6 +507,11 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
|||||||
buf.cell(cpool.getSymbolAt(index).asString());
|
buf.cell(cpool.getSymbolAt(index).asString());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case JVM_CONSTANT_UnresolvedClassInError:
|
||||||
|
buf.cell("JVM_CONSTANT_UnresolvedClassInError");
|
||||||
|
buf.cell(cpool.getSymbolAt(index).asString());
|
||||||
|
break;
|
||||||
|
|
||||||
case JVM_CONSTANT_Class:
|
case JVM_CONSTANT_Class:
|
||||||
buf.cell("JVM_CONSTANT_Class");
|
buf.cell("JVM_CONSTANT_Class");
|
||||||
Klass klass = (Klass) cpool.getObjAt(index);
|
Klass klass = (Klass) cpool.getObjAt(index);
|
||||||
@ -564,6 +571,9 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
|||||||
buf.cell("JVM_CONSTANT_StringIndex");
|
buf.cell("JVM_CONSTANT_StringIndex");
|
||||||
buf.cell(Integer.toString(cpool.getIntAt(index)));
|
buf.cell(Integer.toString(cpool.getIntAt(index)));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new InternalError("unknown tag: " + ctag);
|
||||||
}
|
}
|
||||||
|
|
||||||
buf.endTag("tr");
|
buf.endTag("tr");
|
||||||
@ -671,7 +681,16 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
|||||||
buf.cell(Integer.toString(curBci) + spaces);
|
buf.cell(Integer.toString(curBci) + spaces);
|
||||||
|
|
||||||
buf.beginTag("td");
|
buf.beginTag("td");
|
||||||
String instrStr = escapeHTMLSpecialChars(instr.toString());
|
String instrStr = null;
|
||||||
|
try {
|
||||||
|
instrStr = escapeHTMLSpecialChars(instr.toString());
|
||||||
|
} catch (RuntimeException re) {
|
||||||
|
buf.append("exception during bytecode processing");
|
||||||
|
buf.endTag("td");
|
||||||
|
buf.endTag("tr");
|
||||||
|
re.printStackTrace();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (instr instanceof BytecodeNew) {
|
if (instr instanceof BytecodeNew) {
|
||||||
BytecodeNew newBytecode = (BytecodeNew) instr;
|
BytecodeNew newBytecode = (BytecodeNew) instr;
|
||||||
@ -1396,9 +1415,7 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
|||||||
final SymbolFinder symFinder = createSymbolFinder();
|
final SymbolFinder symFinder = createSymbolFinder();
|
||||||
final Disassembler disasm = createDisassembler(startPc, code);
|
final Disassembler disasm = createDisassembler(startPc, code);
|
||||||
class NMethodVisitor implements InstructionVisitor {
|
class NMethodVisitor implements InstructionVisitor {
|
||||||
boolean prevWasCall;
|
|
||||||
public void prologue() {
|
public void prologue() {
|
||||||
prevWasCall = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void visit(long currentPc, Instruction instr) {
|
public void visit(long currentPc, Instruction instr) {
|
||||||
@ -1418,8 +1435,7 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
|||||||
|
|
||||||
PCDesc pcDesc = (PCDesc) safepoints.get(longToAddress(currentPc));
|
PCDesc pcDesc = (PCDesc) safepoints.get(longToAddress(currentPc));
|
||||||
|
|
||||||
boolean isSafepoint = (pcDesc != null);
|
if (pcDesc != null) {
|
||||||
if (isSafepoint && prevWasCall) {
|
|
||||||
buf.append(genSafepointInfo(nmethod, pcDesc));
|
buf.append(genSafepointInfo(nmethod, pcDesc));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1435,11 +1451,6 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
|||||||
}
|
}
|
||||||
|
|
||||||
buf.br();
|
buf.br();
|
||||||
if (isSafepoint && !prevWasCall) {
|
|
||||||
buf.append(genSafepointInfo(nmethod, pcDesc));
|
|
||||||
}
|
|
||||||
|
|
||||||
prevWasCall = instr.isCall();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void epilogue() {
|
public void epilogue() {
|
||||||
@ -1783,22 +1794,20 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
|||||||
buf.h3("Fields");
|
buf.h3("Fields");
|
||||||
buf.beginList();
|
buf.beginList();
|
||||||
for (int f = 0; f < numFields; f += InstanceKlass.NEXT_OFFSET) {
|
for (int f = 0; f < numFields; f += InstanceKlass.NEXT_OFFSET) {
|
||||||
int nameIndex = fields.getShortAt(f + InstanceKlass.NAME_INDEX_OFFSET);
|
sun.jvm.hotspot.oops.Field field = klass.getFieldByIndex(f);
|
||||||
int sigIndex = fields.getShortAt(f + InstanceKlass.SIGNATURE_INDEX_OFFSET);
|
String f_name = ((NamedFieldIdentifier)field.getID()).getName();
|
||||||
int genSigIndex = fields.getShortAt(f + InstanceKlass.GENERIC_SIGNATURE_INDEX_OFFSET);
|
Symbol f_sig = field.getSignature();
|
||||||
Symbol f_name = cp.getSymbolAt(nameIndex);
|
Symbol f_genSig = field.getGenericSignature();
|
||||||
Symbol f_sig = cp.getSymbolAt(sigIndex);
|
AccessFlags acc = field.getAccessFlagsObj();
|
||||||
Symbol f_genSig = (genSigIndex != 0)? cp.getSymbolAt(genSigIndex) : null;
|
|
||||||
AccessFlags acc = new AccessFlags(fields.getShortAt(f + InstanceKlass.ACCESS_FLAGS_OFFSET));
|
|
||||||
|
|
||||||
buf.beginTag("li");
|
buf.beginListItem();
|
||||||
buf.append(genFieldModifierString(acc));
|
buf.append(genFieldModifierString(acc));
|
||||||
buf.append(' ');
|
buf.append(' ');
|
||||||
Formatter sigBuf = new Formatter(genHTML);
|
Formatter sigBuf = new Formatter(genHTML);
|
||||||
new SignatureConverter(f_sig, sigBuf.getBuffer()).dispatchField();
|
new SignatureConverter(f_sig, sigBuf.getBuffer()).dispatchField();
|
||||||
buf.append(sigBuf.toString().replace('/', '.'));
|
buf.append(sigBuf.toString().replace('/', '.'));
|
||||||
buf.append(' ');
|
buf.append(' ');
|
||||||
buf.append(f_name.asString());
|
buf.append(f_name);
|
||||||
buf.append(';');
|
buf.append(';');
|
||||||
// is it generic?
|
// is it generic?
|
||||||
if (f_genSig != null) {
|
if (f_genSig != null) {
|
||||||
@ -1806,7 +1815,8 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
|
|||||||
buf.append(escapeHTMLSpecialChars(f_genSig.asString()));
|
buf.append(escapeHTMLSpecialChars(f_genSig.asString()));
|
||||||
buf.append("] ");
|
buf.append("] ");
|
||||||
}
|
}
|
||||||
buf.endTag("li");
|
buf.append(" (offset = " + field.getOffset() + ")");
|
||||||
|
buf.endListItem();
|
||||||
}
|
}
|
||||||
buf.endList();
|
buf.endList();
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 2000-2010 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -28,7 +28,7 @@ public class Assert {
|
|||||||
public static boolean ASSERTS_ENABLED = true;
|
public static boolean ASSERTS_ENABLED = true;
|
||||||
|
|
||||||
public static void that(boolean test, String message) {
|
public static void that(boolean test, String message) {
|
||||||
if (!test) {
|
if (ASSERTS_ENABLED && !test) {
|
||||||
throw new AssertionFailure(message);
|
throw new AssertionFailure(message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user