提交 5ae2772b 编写于 作者: A amurillo

Merge

# #
# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2013, 2015, Oracle and/or its affiliates. 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
...@@ -77,7 +77,7 @@ fi ...@@ -77,7 +77,7 @@ fi
cat output.log cat output.log
MESG="Exception" MESG="Test failed"
grep "$MESG" output.log grep "$MESG" output.log
result=$? result=$?
if [ "$result" = 0 ]; then if [ "$result" = 0 ]; then
......
/* /*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2015, Oracle and/or its affiliates. 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
...@@ -46,12 +46,15 @@ import sun.management.ManagementFactoryHelper; ...@@ -46,12 +46,15 @@ import sun.management.ManagementFactoryHelper;
* could be freed, since class redefinition didn't know about the backtraces. * could be freed, since class redefinition didn't know about the backtraces.
*/ */
public class RedefineMethodInBacktraceApp { public class RedefineMethodInBacktraceApp {
static boolean failed = false;
public static void main(String args[]) throws Exception { public static void main(String args[]) throws Exception {
System.out.println("Hello from RedefineMethodInBacktraceApp!"); System.out.println("Hello from RedefineMethodInBacktraceApp!");
new RedefineMethodInBacktraceApp().doTest(); new RedefineMethodInBacktraceApp().doTest();
System.exit(0); if (failed) {
throw new Exception("ERROR: RedefineMethodInBacktraceApp failed.");
}
} }
public static CountDownLatch stop = new CountDownLatch(1); public static CountDownLatch stop = new CountDownLatch(1);
...@@ -63,13 +66,18 @@ public class RedefineMethodInBacktraceApp { ...@@ -63,13 +66,18 @@ public class RedefineMethodInBacktraceApp {
} }
private void doMethodInBacktraceTest() throws Exception { private void doMethodInBacktraceTest() throws Exception {
Throwable t = getThrowableFromMethodToRedefine(); Throwable t1 = getThrowableFromMethodToRedefine();
Throwable t2 = getThrowableFromMethodToDelete();
doRedefine(RedefineMethodInBacktraceTarget.class); doRedefine(RedefineMethodInBacktraceTarget.class);
doClassUnloading(); doClassUnloading();
touchRedefinedMethodInBacktrace(t); System.out.println("checking backtrace for throwable from methodToRedefine");
touchRedefinedMethodInBacktrace(t1);
System.out.println("checking backtrace for throwable from methodToDelete");
touchRedefinedMethodInBacktrace(t2);
} }
private void doMethodInBacktraceTestB() throws Exception { private void doMethodInBacktraceTestB() throws Exception {
...@@ -115,6 +123,10 @@ public class RedefineMethodInBacktraceApp { ...@@ -115,6 +123,10 @@ public class RedefineMethodInBacktraceApp {
if (!(thrownFromMethodToRedefine instanceof RuntimeException)) { if (!(thrownFromMethodToRedefine instanceof RuntimeException)) {
throw e; throw e;
} }
} catch (Exception e) {
e.printStackTrace();
System.out.println("\nTest failed: unexpected exception: " + e.toString());
failed = true;
} }
method = null; method = null;
c = null; c = null;
...@@ -122,15 +134,49 @@ public class RedefineMethodInBacktraceApp { ...@@ -122,15 +134,49 @@ public class RedefineMethodInBacktraceApp {
return thrownFromMethodToRedefine; return thrownFromMethodToRedefine;
} }
private static Throwable getThrowableFromMethodToDelete() throws Exception {
Class<RedefineMethodInBacktraceTarget> c =
RedefineMethodInBacktraceTarget.class;
Method method = c.getMethod("callMethodToDelete");
Throwable thrownFromMethodToDelete = null;
try {
method.invoke(null);
} catch (InvocationTargetException e) {
thrownFromMethodToDelete = e.getCause();
if (!(thrownFromMethodToDelete instanceof RuntimeException)) {
throw e;
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("\nTest failed: unexpected exception: " + e.toString());
failed = true;
}
return thrownFromMethodToDelete;
}
private static void doClassUnloading() { private static void doClassUnloading() {
// This will clean out old, unused redefined methods. // This will clean out old, unused redefined methods.
System.gc(); System.gc();
} }
private static void touchRedefinedMethodInBacktrace(Throwable throwable) { private static void touchRedefinedMethodInBacktrace(Throwable throwable) {
throwable.printStackTrace();
// Make sure that we can convert the backtrace, which is referring to // Make sure that we can convert the backtrace, which is referring to
// the redefined method, to a StrackTraceElement[] without crashing. // the redefined method, to a StrackTraceElement[] without crashing.
throwable.getStackTrace(); StackTraceElement[] stackTrace = throwable.getStackTrace();
for (int i = 0; i < stackTrace.length; i++) {
StackTraceElement frame = stackTrace[i];
if (frame.getClassName() == null) {
System.out.println("\nTest failed: trace[" + i + "].getClassName() returned null");
failed = true;
}
if (frame.getMethodName() == null) {
System.out.println("\nTest failed: trace[" + i + "].getMethodName() returned null");
failed = true;
}
}
} }
private static void doRedefine(Class<?> clazz) throws Exception { private static void doRedefine(Class<?> clazz) throws Exception {
......
/* /*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2015, Oracle and/or its affiliates. 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
...@@ -29,4 +29,13 @@ public class RedefineMethodInBacktraceTarget { ...@@ -29,4 +29,13 @@ public class RedefineMethodInBacktraceTarget {
public static void methodToRedefine() { public static void methodToRedefine() {
throw new RuntimeException("Test exception"); throw new RuntimeException("Test exception");
} }
public static void callMethodToDelete() {
methodToDelete();
}
private static void methodToDelete() {
throw new RuntimeException("Test exception in methodToDelete");
}
} }
/* /*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2015, Oracle and/or its affiliates. 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
...@@ -37,4 +37,16 @@ public class RedefineMethodInBacktraceTargetB { ...@@ -37,4 +37,16 @@ public class RedefineMethodInBacktraceTargetB {
// ignore, test will fail // ignore, test will fail
} }
} }
public static void callMethodToDelete() {
try {
// signal that we are here
RedefineMethodInBacktraceApp.called.countDown();
// wait until test is done
RedefineMethodInBacktraceApp.stop.await();
} catch (InterruptedException ex) {
// ignore, test will fail
}
}
} }
/* /*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2015, Oracle and/or its affiliates. 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,4 +28,7 @@ ...@@ -28,4 +28,7 @@
public class RedefineMethodInBacktraceTargetB { public class RedefineMethodInBacktraceTargetB {
public static void methodToRedefine() { public static void methodToRedefine() {
} }
public static void callMethodToDelete() {
}
} }
/* /*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2015, Oracle and/or its affiliates. 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
...@@ -29,4 +29,8 @@ public class RedefineMethodInBacktraceTarget { ...@@ -29,4 +29,8 @@ public class RedefineMethodInBacktraceTarget {
public static void methodToRedefine() { public static void methodToRedefine() {
throw new RuntimeException("Test exception 2"); throw new RuntimeException("Test exception 2");
} }
public static void callMethodToDelete() {
throw new RuntimeException("Test exception 2 in callMethodToDelete");
}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册