summaryrefslogtreecommitdiff
path: root/test/1939-proxy-frames/src
diff options
context:
space:
mode:
author Vladimir Marko <vmarko@google.com> 2017-10-11 10:29:19 +0000
committer Vladimir Marko <vmarko@google.com> 2017-10-11 10:29:19 +0000
commitd108d9eaae26df9e4480cf46d26e8c75f142bd6a (patch)
tree9a9566b73bd916befb9ce1c31c2ff309d63ff28e /test/1939-proxy-frames/src
parenta03a9eeb9d1b2ebca17cc326f52c84a5abca6707 (diff)
Revert "Ensure Proxy frames work with JVMTI stack frame functions"
Reason for revert: gcstress 1914-get-local-instance failures, object-inl.h:163] Check failed: GetClass<kVerifyNone>() != nullptr Bug: 66903662 This reverts commit a03a9eeb9d1b2ebca17cc326f52c84a5abca6707. Change-Id: I5c68616d61566dd4ade713c4dad5e462b76d9af7
Diffstat (limited to 'test/1939-proxy-frames/src')
-rw-r--r--test/1939-proxy-frames/src/Main.java21
-rw-r--r--test/1939-proxy-frames/src/art/Breakpoint.java202
-rw-r--r--test/1939-proxy-frames/src/art/Locals.java121
-rw-r--r--test/1939-proxy-frames/src/art/StackTrace.java68
-rw-r--r--test/1939-proxy-frames/src/art/Suspension.java30
-rw-r--r--test/1939-proxy-frames/src/art/Test1939.java178
6 files changed, 0 insertions, 620 deletions
diff --git a/test/1939-proxy-frames/src/Main.java b/test/1939-proxy-frames/src/Main.java
deleted file mode 100644
index 85cab34d53..0000000000
--- a/test/1939-proxy-frames/src/Main.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-public class Main {
- public static void main(String[] args) throws Exception {
- art.Test1939.run();
- }
-}
diff --git a/test/1939-proxy-frames/src/art/Breakpoint.java b/test/1939-proxy-frames/src/art/Breakpoint.java
deleted file mode 100644
index bbb89f707f..0000000000
--- a/test/1939-proxy-frames/src/art/Breakpoint.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package art;
-
-import java.lang.reflect.Executable;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.Objects;
-
-public class Breakpoint {
- public static class Manager {
- public static class BP {
- public final Executable method;
- public final long location;
-
- public BP(Executable method) {
- this(method, getStartLocation(method));
- }
-
- public BP(Executable method, long location) {
- this.method = method;
- this.location = location;
- }
-
- @Override
- public boolean equals(Object other) {
- return (other instanceof BP) &&
- method.equals(((BP)other).method) &&
- location == ((BP)other).location;
- }
-
- @Override
- public String toString() {
- return method.toString() + " @ " + getLine();
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(method, location);
- }
-
- public int getLine() {
- try {
- LineNumber[] lines = getLineNumberTable(method);
- int best = -1;
- for (LineNumber l : lines) {
- if (l.location > location) {
- break;
- } else {
- best = l.line;
- }
- }
- return best;
- } catch (Exception e) {
- return -1;
- }
- }
- }
-
- private Set<BP> breaks = new HashSet<>();
-
- public void setBreakpoints(BP... bs) {
- for (BP b : bs) {
- if (breaks.add(b)) {
- Breakpoint.setBreakpoint(b.method, b.location);
- }
- }
- }
- public void setBreakpoint(Executable method, long location) {
- setBreakpoints(new BP(method, location));
- }
-
- public void clearBreakpoints(BP... bs) {
- for (BP b : bs) {
- if (breaks.remove(b)) {
- Breakpoint.clearBreakpoint(b.method, b.location);
- }
- }
- }
- public void clearBreakpoint(Executable method, long location) {
- clearBreakpoints(new BP(method, location));
- }
-
- public void clearAllBreakpoints() {
- clearBreakpoints(breaks.toArray(new BP[0]));
- }
- }
-
- public static void startBreakpointWatch(Class<?> methodClass,
- Executable breakpointReached,
- Thread thr) {
- startBreakpointWatch(methodClass, breakpointReached, false, thr);
- }
-
- /**
- * Enables the trapping of breakpoint events.
- *
- * If allowRecursive == true then breakpoints will be sent even if one is currently being handled.
- */
- public static native void startBreakpointWatch(Class<?> methodClass,
- Executable breakpointReached,
- boolean allowRecursive,
- Thread thr);
- public static native void stopBreakpointWatch(Thread thr);
-
- public static final class LineNumber implements Comparable<LineNumber> {
- public final long location;
- public final int line;
-
- private LineNumber(long loc, int line) {
- this.location = loc;
- this.line = line;
- }
-
- public boolean equals(Object other) {
- return other instanceof LineNumber && ((LineNumber)other).line == line &&
- ((LineNumber)other).location == location;
- }
-
- public int compareTo(LineNumber other) {
- int v = Integer.valueOf(line).compareTo(Integer.valueOf(other.line));
- if (v != 0) {
- return v;
- } else {
- return Long.valueOf(location).compareTo(Long.valueOf(other.location));
- }
- }
- }
-
- public static native void setBreakpoint(Executable m, long loc);
- public static void setBreakpoint(Executable m, LineNumber l) {
- setBreakpoint(m, l.location);
- }
-
- public static native void clearBreakpoint(Executable m, long loc);
- public static void clearBreakpoint(Executable m, LineNumber l) {
- clearBreakpoint(m, l.location);
- }
-
- private static native Object[] getLineNumberTableNative(Executable m);
- public static LineNumber[] getLineNumberTable(Executable m) {
- Object[] nativeTable = getLineNumberTableNative(m);
- long[] location = (long[])(nativeTable[0]);
- int[] lines = (int[])(nativeTable[1]);
- if (lines.length != location.length) {
- throw new Error("Lines and locations have different lengths!");
- }
- LineNumber[] out = new LineNumber[lines.length];
- for (int i = 0; i < lines.length; i++) {
- out[i] = new LineNumber(location[i], lines[i]);
- }
- return out;
- }
-
- public static native long getStartLocation(Executable m);
-
- public static int locationToLine(Executable m, long location) {
- try {
- Breakpoint.LineNumber[] lines = Breakpoint.getLineNumberTable(m);
- int best = -1;
- for (Breakpoint.LineNumber l : lines) {
- if (l.location > location) {
- break;
- } else {
- best = l.line;
- }
- }
- return best;
- } catch (Exception e) {
- return -1;
- }
- }
-
- public static long lineToLocation(Executable m, int line) throws Exception {
- try {
- Breakpoint.LineNumber[] lines = Breakpoint.getLineNumberTable(m);
- for (Breakpoint.LineNumber l : lines) {
- if (l.line == line) {
- return l.location;
- }
- }
- throw new Exception("Unable to find line " + line + " in " + m);
- } catch (Exception e) {
- throw new Exception("Unable to get line number info for " + m, e);
- }
- }
-}
-
diff --git a/test/1939-proxy-frames/src/art/Locals.java b/test/1939-proxy-frames/src/art/Locals.java
deleted file mode 100644
index 22e21be398..0000000000
--- a/test/1939-proxy-frames/src/art/Locals.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package art;
-
-import java.lang.reflect.Executable;
-import java.util.Objects;
-
-public class Locals {
- public static native void EnableLocalVariableAccess();
-
- public static class VariableDescription {
- public final long start_location;
- public final int length;
- public final String name;
- public final String signature;
- public final String generic_signature;
- public final int slot;
-
- public VariableDescription(
- long start, int length, String name, String sig, String gen_sig, int slot) {
- this.start_location = start;
- this.length = length;
- this.name = name;
- this.signature = sig;
- this.generic_signature = gen_sig;
- this.slot = slot;
- }
-
- @Override
- public String toString() {
- return String.format(
- "VariableDescription { " +
- "Sig: '%s', Name: '%s', Gen_sig: '%s', slot: %d, start: %d, len: %d" +
- "}",
- this.signature,
- this.name,
- this.generic_signature,
- this.slot,
- this.start_location,
- this.length);
- }
- public boolean equals(Object other) {
- if (!(other instanceof VariableDescription)) {
- return false;
- } else {
- VariableDescription v = (VariableDescription)other;
- return Objects.equals(v.signature, signature) &&
- Objects.equals(v.name, name) &&
- Objects.equals(v.generic_signature, generic_signature) &&
- v.slot == slot &&
- v.start_location == start_location &&
- v.length == length;
- }
- }
- public int hashCode() {
- return Objects.hash(this.signature, this.name, this.generic_signature, this.slot,
- this.start_location, this.length);
- }
- }
-
- public static native VariableDescription[] GetLocalVariableTable(Executable e);
-
- public static VariableDescription GetVariableAtLine(
- Executable e, String name, String sig, int line) throws Exception {
- return GetVariableAtLocation(e, name, sig, Breakpoint.lineToLocation(e, line));
- }
-
- public static VariableDescription GetVariableAtLocation(
- Executable e, String name, String sig, long loc) {
- VariableDescription[] vars = GetLocalVariableTable(e);
- for (VariableDescription var : vars) {
- if (var.start_location <= loc &&
- var.length + var.start_location > loc &&
- var.name.equals(name) &&
- var.signature.equals(sig)) {
- return var;
- }
- }
- throw new Error(
- "Unable to find variable " + name + " (sig: " + sig + ") in " + e + " at loc " + loc);
- }
-
- public static native int GetLocalVariableInt(Thread thr, int depth, int slot);
- public static native long GetLocalVariableLong(Thread thr, int depth, int slot);
- public static native float GetLocalVariableFloat(Thread thr, int depth, int slot);
- public static native double GetLocalVariableDouble(Thread thr, int depth, int slot);
- public static native Object GetLocalVariableObject(Thread thr, int depth, int slot);
- public static native Object GetLocalInstance(Thread thr, int depth);
-
- public static void SetLocalVariableInt(Thread thr, int depth, int slot, Object val) {
- SetLocalVariableInt(thr, depth, slot, ((Number)val).intValue());
- }
- public static void SetLocalVariableLong(Thread thr, int depth, int slot, Object val) {
- SetLocalVariableLong(thr, depth, slot, ((Number)val).longValue());
- }
- public static void SetLocalVariableFloat(Thread thr, int depth, int slot, Object val) {
- SetLocalVariableFloat(thr, depth, slot, ((Number)val).floatValue());
- }
- public static void SetLocalVariableDouble(Thread thr, int depth, int slot, Object val) {
- SetLocalVariableDouble(thr, depth, slot, ((Number)val).doubleValue());
- }
- public static native void SetLocalVariableInt(Thread thr, int depth, int slot, int val);
- public static native void SetLocalVariableLong(Thread thr, int depth, int slot, long val);
- public static native void SetLocalVariableFloat(Thread thr, int depth, int slot, float val);
- public static native void SetLocalVariableDouble(Thread thr, int depth, int slot, double val);
- public static native void SetLocalVariableObject(Thread thr, int depth, int slot, Object val);
-}
diff --git a/test/1939-proxy-frames/src/art/StackTrace.java b/test/1939-proxy-frames/src/art/StackTrace.java
deleted file mode 100644
index 2ea2f201e8..0000000000
--- a/test/1939-proxy-frames/src/art/StackTrace.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package art;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Executable;
-
-public class StackTrace {
- public static class StackFrameData {
- public final Thread thr;
- public final Executable method;
- public final long current_location;
- public final int depth;
-
- public StackFrameData(Thread thr, Executable e, long loc, int depth) {
- this.thr = thr;
- this.method = e;
- this.current_location = loc;
- this.depth = depth;
- }
- @Override
- public String toString() {
- return String.format(
- "StackFrameData { thr: '%s', method: '%s', loc: %d, depth: %d }",
- this.thr,
- this.method,
- this.current_location,
- this.depth);
- }
- }
-
- public static native int GetStackDepth(Thread thr);
-
- private static native StackFrameData[] nativeGetStackTrace(Thread thr);
-
- public static StackFrameData[] GetStackTrace(Thread thr) {
- // The RI seems to give inconsistent (and sometimes nonsensical) results if the thread is not
- // suspended. The spec says that not being suspended is fine but since we want this to be
- // consistent we will suspend for the RI.
- boolean suspend_thread =
- !System.getProperty("java.vm.name").equals("Dalvik") &&
- !thr.equals(Thread.currentThread()) &&
- !Suspension.isSuspended(thr);
- if (suspend_thread) {
- Suspension.suspend(thr);
- }
- StackFrameData[] out = nativeGetStackTrace(thr);
- if (suspend_thread) {
- Suspension.resume(thr);
- }
- return out;
- }
-}
-
diff --git a/test/1939-proxy-frames/src/art/Suspension.java b/test/1939-proxy-frames/src/art/Suspension.java
deleted file mode 100644
index 16e62ccac9..0000000000
--- a/test/1939-proxy-frames/src/art/Suspension.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package art;
-
-public class Suspension {
- // Suspends a thread using jvmti.
- public native static void suspend(Thread thr);
-
- // Resumes a thread using jvmti.
- public native static void resume(Thread thr);
-
- public native static boolean isSuspended(Thread thr);
-
- public native static int[] suspendList(Thread... threads);
- public native static int[] resumeList(Thread... threads);
-}
diff --git a/test/1939-proxy-frames/src/art/Test1939.java b/test/1939-proxy-frames/src/art/Test1939.java
deleted file mode 100644
index 6147d1e504..0000000000
--- a/test/1939-proxy-frames/src/art/Test1939.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package art;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Executable;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.nio.ByteBuffer;
-import java.util.concurrent.Semaphore;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-import java.util.function.Function;
-import java.util.function.Predicate;
-import java.util.function.Supplier;
-import java.util.function.Consumer;
-
-public class Test1939 {
- public static interface SafepointFunction {
- public void invoke(
- Thread thread,
- Method target,
- int depth) throws Exception;
- }
-
- public static interface GetterFunction {
- public Object GetVar(Thread t, int depth);
- }
-
- public static SafepointFunction NamedGet(final String type, final GetterFunction get) {
- return new SafepointFunction() {
- public void invoke(Thread t, Method method, int depth) {
- try {
- Object res = get.GetVar(t, depth);
- System.out.println(this + " on " + method + " got value: " + res);
- } catch (Exception e) {
- System.out.println(this + " on " + method + " failed due to " + e.getMessage());
- }
- }
- public String toString() {
- return "\"Get" + type + "\"";
- }
- };
- }
-
- public static class TestCase {
- public final Object thiz;
- public final Method target;
-
- public TestCase(Method target) {
- this(null, target);
- }
- public TestCase(Object thiz, Method target) {
- this.thiz = thiz;
- this.target = target;
- }
-
- public static class ThreadPauser implements Runnable {
- public final Semaphore sem_wakeup_main;
- public final Semaphore sem_wait;
-
- public ThreadPauser() {
- sem_wakeup_main = new Semaphore(0);
- sem_wait = new Semaphore(0);
- }
-
- public void run() {
- try {
- sem_wakeup_main.release();
- sem_wait.acquire();
- } catch (Exception e) {
- throw new Error("Error with semaphores!", e);
- }
- }
-
- public void waitForOtherThreadToPause() throws Exception {
- sem_wakeup_main.acquire();
- }
-
- public void wakeupOtherThread() throws Exception {
- sem_wait.release();
- }
- }
-
- public void exec(final SafepointFunction safepoint) throws Exception {
- System.out.println("Running " + target + " with " + safepoint + " on remote thread.");
- final ThreadPauser pause = new ThreadPauser();
- Thread remote = new Thread(
- () -> {
- try {
- target.invoke(thiz, pause);
- } catch (Exception e) {
- throw new Error("Error invoking remote thread " + Thread.currentThread(), e);
- }
- },
- "remote thread for " + target + " with " + safepoint);
- remote.start();
- pause.waitForOtherThreadToPause();
- try {
- Suspension.suspend(remote);
- StackTrace.StackFrameData frame = findStackFrame(remote);
- safepoint.invoke(remote, target, frame.depth);
- } finally {
- Suspension.resume(remote);
- pause.wakeupOtherThread();
- remote.join();
- }
- }
-
- private StackTrace.StackFrameData findStackFrame(Thread thr) {
- for (StackTrace.StackFrameData frame : StackTrace.GetStackTrace(thr)) {
- if (frame.method.equals(target) ||
- (frame.method.getName().equals(target.getName()) &&
- Arrays.deepEquals(frame.method.getParameterTypes(), target.getParameterTypes()) &&
- ((Method)frame.method).getReturnType().equals(target.getReturnType()))) {
- return frame;
- }
- }
- throw new Error("Unable to find stack frame in method " + target + " on thread " + thr);
- }
- }
-
- public static Method getMethod(Class<?> klass, String name) throws Exception {
- return klass.getDeclaredMethod(name, Runnable.class);
- }
-
- public static interface Foo {
- public void InterfaceProxyMethod(Runnable r);
- }
-
- public static Object getProxyObject(final Class... k) {
- return Proxy.newProxyInstance(
- Test1939.class.getClassLoader(),
- k,
- (p, m, a) -> {
- if (m.getName().equals("toString")) {
- return "Proxy for " + Arrays.toString(k);
- } else {
- ((Runnable)a[0]).run();
- return null;
- }
- });
- }
-
- public static void run() throws Exception {
- Locals.EnableLocalVariableAccess();
- final TestCase[] MAIN_TEST_CASES = new TestCase[] {
- };
-
- TestCase test = new TestCase(
- getProxyObject(Foo.class), getMethod(Foo.class, "InterfaceProxyMethod"));
- test.exec(NamedGet("This", Locals::GetLocalInstance));
- test.exec(NamedGet("LocalReference0", (t, d) -> Locals.GetLocalVariableObject(t, d, 0)));
- test.exec(NamedGet("ProxyFrameLocation", (t, d) -> Long.valueOf(GetFrameLocation(t, d))));
- test.exec(NamedGet("ProxyFrameMethod", Test1939::GetFrameMethod));
- }
-
- public static native long GetFrameLocation(Thread thr, int depth);
- public static native Executable GetFrameMethod(Thread thr, int depth);
-}
-