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
diff --git a/openjdkjvmti/ti_method.cc b/openjdkjvmti/ti_method.cc
index 50402a0..f05977a 100644
--- a/openjdkjvmti/ti_method.cc
+++ b/openjdkjvmti/ti_method.cc
@@ -572,9 +572,8 @@
       return;
     }
     art::ArtMethod* method = visitor.GetMethod();
-    // Native and 'art' proxy methods don't have registers.
-    if (method->IsNative() || method->IsProxyMethod()) {
-      // TODO It might be useful to fake up support for get at least on proxy frames.
+    if (method->IsNative()) {
+      // TODO We really should support get/set for non-shadow frames.
       result_ = ERR(OPAQUE_FRAME);
       return;
     } else if (method->GetCodeItem()->registers_size_ <= slot_) {
diff --git a/openjdkjvmti/ti_stack.cc b/openjdkjvmti/ti_stack.cc
index e0c1399..d4cc42a 100644
--- a/openjdkjvmti/ti_stack.cc
+++ b/openjdkjvmti/ti_stack.cc
@@ -789,7 +789,7 @@
   }
 
   *method_ptr = art::jni::EncodeArtMethod(closure.method);
-  if (closure.method->IsNative() || closure.method->IsProxyMethod()) {
+  if (closure.method->IsNative()) {
     *location_ptr = -1;
   } else {
     if (closure.dex_pc == art::dex::kDexNoIndex) {
diff --git a/test/1914-get-local-instance/expected.txt b/test/1914-get-local-instance/expected.txt
index 09f0df1..4117942 100644
--- a/test/1914-get-local-instance/expected.txt
+++ b/test/1914-get-local-instance/expected.txt
@@ -10,6 +10,3 @@
 Running public native void art.Test1914$TargetClass.NativeInstanceMethod(java.lang.Runnable) with "GetThis" on remote thread.
 "GetThis" on public native void art.Test1914$TargetClass.NativeInstanceMethod(java.lang.Runnable) got value: TargetClass("NativeInstanceMethodObject")
 	Value is 'TargetClass("NativeInstanceMethodObject")' (class: class art.Test1914$TargetClass)
-Running public abstract void art.Test1914$Foo.InterfaceProxyMethod(java.lang.Runnable) with "GetThis" on remote thread.
-"GetThis" on public abstract void art.Test1914$Foo.InterfaceProxyMethod(java.lang.Runnable) got value: Proxy for [interface art.Test1914$Foo]
-	Value is 'Proxy for [interface art.Test1914$Foo]' (class: PROXY CLASS)
diff --git a/test/1914-get-local-instance/src/art/Test1914.java b/test/1914-get-local-instance/src/art/Test1914.java
index e47f9cb..c09f519 100644
--- a/test/1914-get-local-instance/src/art/Test1914.java
+++ b/test/1914-get-local-instance/src/art/Test1914.java
@@ -18,9 +18,7 @@
 
 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;
@@ -37,7 +35,7 @@
 
   public static void reportValue(Object val) {
     System.out.println("\tValue is '" + val + "' (class: "
-        + (val != null ? (val instanceof Proxy ? "PROXY CLASS" : val.getClass()) : "NULL") + ")");
+        + (val != null ? val.getClass() : "NULL") + ")");
   }
 
   public static void StaticMethod(Runnable safepoint) {
@@ -153,10 +151,7 @@
 
     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()))) {
+        if (frame.method.equals(target)) {
           return frame;
         }
       }
@@ -168,25 +163,6 @@
     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(
-        Test1914.class.getClassLoader(),
-        k,
-        (p, m, a) -> {
-          if (m.getName().equals("toString")) {
-            return "Proxy for " + Arrays.toString(k);
-          } else {
-            ((Runnable)a[0]).run();
-            reportValue(p);
-            return null;
-          }
-        });
-  }
-
   public static void run() throws Exception {
     Locals.EnableLocalVariableAccess();
     final TestCase[] MAIN_TEST_CASES = new TestCase[] {
@@ -196,8 +172,6 @@
                    getMethod(TargetClass.class, "InstanceMethod")),
       new TestCase(new TargetClass("NativeInstanceMethodObject"),
                    getMethod(TargetClass.class, "NativeInstanceMethod")),
-      new TestCase(getProxyObject(Foo.class),
-                   getMethod(Foo.class, "InterfaceProxyMethod")),
     };
 
     for (TestCase t: MAIN_TEST_CASES) {
diff --git a/test/1939-proxy-frames/expected.txt b/test/1939-proxy-frames/expected.txt
deleted file mode 100644
index a4c97c9..0000000
--- a/test/1939-proxy-frames/expected.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-Running public abstract void art.Test1939$Foo.InterfaceProxyMethod(java.lang.Runnable) with "GetThis" on remote thread.
-"GetThis" on public abstract void art.Test1939$Foo.InterfaceProxyMethod(java.lang.Runnable) got value: Proxy for [interface art.Test1939$Foo]
-Running public abstract void art.Test1939$Foo.InterfaceProxyMethod(java.lang.Runnable) with "GetLocalReference0" on remote thread.
-"GetLocalReference0" on public abstract void art.Test1939$Foo.InterfaceProxyMethod(java.lang.Runnable) failed due to JVMTI_ERROR_OPAQUE_FRAME
-Running public abstract void art.Test1939$Foo.InterfaceProxyMethod(java.lang.Runnable) with "GetProxyFrameLocation" on remote thread.
-"GetProxyFrameLocation" on public abstract void art.Test1939$Foo.InterfaceProxyMethod(java.lang.Runnable) got value: -1
-Running public abstract void art.Test1939$Foo.InterfaceProxyMethod(java.lang.Runnable) with "GetProxyFrameMethod" on remote thread.
-"GetProxyFrameMethod" on public abstract void art.Test1939$Foo.InterfaceProxyMethod(java.lang.Runnable) got value: public final void $Proxy0.InterfaceProxyMethod(java.lang.Runnable)
diff --git a/test/1939-proxy-frames/info.txt b/test/1939-proxy-frames/info.txt
deleted file mode 100644
index 9fc3d62..0000000
--- a/test/1939-proxy-frames/info.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Test for jvmti get local instance
-
diff --git a/test/1939-proxy-frames/local_instance.cc b/test/1939-proxy-frames/local_instance.cc
deleted file mode 100644
index dc833bf..0000000
--- a/test/1939-proxy-frames/local_instance.cc
+++ /dev/null
@@ -1,66 +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.
- */
-
-#include <iostream>
-#include <pthread.h>
-#include <stdio.h>
-#include <vector>
-
-#include "android-base/logging.h"
-#include "jni.h"
-#include "scoped_local_ref.h"
-#include "scoped_primitive_array.h"
-
-#include "jvmti.h"
-
-// Test infrastructure
-#include "jvmti_helper.h"
-#include "test_env.h"
-
-namespace art {
-namespace Test1939ProxyFrames {
-
-extern "C" JNIEXPORT jobject Java_art_Test1939_GetFrameMethod(JNIEnv* env,
-                                                              jclass,
-                                                              jthread thr,
-                                                              jint depth) {
-  jmethodID m = nullptr;
-  jlong loc = -1;
-  if (JvmtiErrorToException(env, jvmti_env, jvmti_env->GetFrameLocation(thr, depth, &m, &loc))) {
-    return nullptr;
-  }
-  jclass klass = nullptr;
-  if (JvmtiErrorToException(env, jvmti_env, jvmti_env->GetMethodDeclaringClass(m, &klass))) {
-    return nullptr;
-  }
-  jobject res = env->ToReflectedMethod(klass, m, false);
-  env->DeleteLocalRef(klass);
-  return res;
-}
-
-extern "C" JNIEXPORT jlong Java_art_Test1939_GetFrameLocation(JNIEnv* env,
-                                                              jclass,
-                                                              jthread thr,
-                                                              jint depth) {
-  jmethodID m = nullptr;
-  jlong loc = -1;
-  JvmtiErrorToException(env, jvmti_env, jvmti_env->GetFrameLocation(thr, depth, &m, &loc));
-  return loc;
-}
-
-}  // namespace Test1939ProxyFrames
-}  // namespace art
-
diff --git a/test/1939-proxy-frames/run b/test/1939-proxy-frames/run
deleted file mode 100755
index 51875a7..0000000
--- a/test/1939-proxy-frames/run
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# Copyright 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.
-
-# Ask for stack traces to be dumped to a file rather than to stdout.
-./default-run "$@" --jvmti
diff --git a/test/1939-proxy-frames/src/Main.java b/test/1939-proxy-frames/src/Main.java
deleted file mode 100644
index 85cab34..0000000
--- 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 bbb89f7..0000000
--- 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 22e21be..0000000
--- 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 2ea2f20..0000000
--- 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 16e62cc..0000000
--- 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 6147d1e..0000000
--- 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);
-}
-
diff --git a/test/Android.bp b/test/Android.bp
index b737345..31474d5 100644
--- a/test/Android.bp
+++ b/test/Android.bp
@@ -277,7 +277,6 @@
         "1930-monitor-info/monitor.cc",
         "1932-monitor-events-misc/monitor_misc.cc",
         "1934-jvmti-signal-thread/signal_threads.cc",
-        "1939-proxy-frames/local_instance.cc",
     ],
     shared_libs: [
         "libbase",
diff --git a/tools/libjdwp_art_failures.txt b/tools/libjdwp_art_failures.txt
index 8d67c45..57d3ce7 100644
--- a/tools/libjdwp_art_failures.txt
+++ b/tools/libjdwp_art_failures.txt
@@ -48,7 +48,7 @@
   name: "org.apache.harmony.jpda.tests.jdwp.Events.VMDeath002Test#testVMDeathRequest"
 },
 {
-  description: "Test fails with OPAQUE_FRAME error due to attempting a GetLocalReference on a proxy frame instead of GetLocalInstance!",
+  description: "Test fails with INTERNAL error due to proxy frame!",
   result: EXEC_FAILED,
   bug: 66903662,
   name: "org.apache.harmony.jpda.tests.jdwp.StackFrame.ProxyThisObjectTest#testThisObject"