diff --git a/openjdkjvmti/ti_method.cc b/openjdkjvmti/ti_method.cc
index 4c6ea21..408ce69 100644
--- a/openjdkjvmti/ti_method.cc
+++ b/openjdkjvmti/ti_method.cc
@@ -31,33 +31,22 @@
 
 #include "ti_method.h"
 
-#include <initializer_list>
 #include <type_traits>
-#include <variant>
 
-#include "android-base/macros.h"
 #include "arch/context.h"
 #include "art_jvmti.h"
 #include "art_method-inl.h"
 #include "base/enums.h"
-#include "base/globals.h"
-#include "base/macros.h"
 #include "base/mutex-inl.h"
 #include "deopt_manager.h"
 #include "dex/code_item_accessors-inl.h"
-#include "dex/code_item_accessors.h"
 #include "dex/dex_file_annotations.h"
 #include "dex/dex_file_types.h"
-#include "dex/dex_instruction.h"
-#include "dex/dex_instruction_iterator.h"
 #include "dex/modifiers.h"
-#include "dex/primitive.h"
 #include "events-inl.h"
 #include "gc_root-inl.h"
-#include "handle.h"
 #include "jit/jit.h"
 #include "jni/jni_internal.h"
-#include "jvmti.h"
 #include "mirror/class-inl.h"
 #include "mirror/class_loader.h"
 #include "mirror/object-inl.h"
@@ -67,18 +56,13 @@
 #include "obj_ptr.h"
 #include "runtime_callbacks.h"
 #include "scoped_thread_state_change-inl.h"
-#include "scoped_thread_state_change.h"
 #include "stack.h"
 #include "thread-current-inl.h"
 #include "thread.h"
 #include "thread_list.h"
-#include "ti_logging.h"
 #include "ti_stack.h"
 #include "ti_thread.h"
 #include "ti_phase.h"
-#include "verifier/register_line-inl.h"
-#include "verifier/reg_type-inl.h"
-#include "verifier/method_verifier-inl.h"
 
 namespace openjdkjvmti {
 
@@ -542,21 +526,10 @@
 
 class CommonLocalVariableClosure : public art::Closure {
  public:
-  // The verifier isn't always able to be as specific as the local-variable-table. We can only get
-  // 32-bit, 64-bit or reference.
-  enum class VerifierPrimitiveType {
-    k32BitValue,  // float, int, short, char, boolean, byte
-    k64BitValue,  // double, long
-    kReferenceValue,  // Object
-    kZeroValue,  // null or zero constant. Might be either k32BitValue or kReferenceValue
-  };
+  CommonLocalVariableClosure(jint depth, jint slot)
+      : result_(ERR(INTERNAL)), depth_(depth), slot_(slot) {}
 
-  using SlotType = std::variant<art::Primitive::Type, VerifierPrimitiveType>;
-
-  CommonLocalVariableClosure(jvmtiEnv* jvmti, jint depth, jint slot)
-      : jvmti_(jvmti), result_(ERR(INTERNAL)), depth_(depth), slot_(slot) {}
-
-  void Run(art::Thread* self) override REQUIRES_SHARED(art::Locks::mutator_lock_) {
+  void Run(art::Thread* self) override REQUIRES(art::Locks::mutator_lock_) {
     art::Locks::mutator_lock_->AssertSharedHeld(art::Thread::Current());
     bool needs_instrument;
     {
@@ -587,7 +560,7 @@
         return;
       }
       std::string descriptor;
-      SlotType slot_type{ art::Primitive::kPrimVoid };
+      art::Primitive::Type slot_type = art::Primitive::kPrimVoid;
       jvmtiError err = GetSlotType(method, pc, &descriptor, &slot_type);
       if (err != OK) {
         result_ = err;
@@ -614,190 +587,56 @@
   virtual jvmtiError Execute(art::ArtMethod* method, art::StackVisitor& visitor)
       REQUIRES_SHARED(art::Locks::mutator_lock_) = 0;
   virtual jvmtiError GetTypeError(art::ArtMethod* method,
-                                  SlotType type,
+                                  art::Primitive::Type type,
                                   const std::string& descriptor)
       REQUIRES_SHARED(art::Locks::mutator_lock_)  = 0;
 
   jvmtiError GetSlotType(art::ArtMethod* method,
                          uint32_t dex_pc,
                          /*out*/std::string* descriptor,
-                         /*out*/SlotType* type)
-      REQUIRES_SHARED(art::Locks::mutator_lock_);
-
-  jvmtiError InferSlotTypeFromVerifier(art::ArtMethod* method,
-                                       uint32_t dex_pc,
-                                       /*out*/ std::string* descriptor,
-                                       /*out*/ SlotType* type)
-      REQUIRES_SHARED(art::Locks::mutator_lock_) {
-    art::Thread* self = art::Thread::Current();
-    art::StackHandleScope<2> hs(self);
-    std::unique_ptr<art::verifier::MethodVerifier> verifier(
-        art::verifier::MethodVerifier::CalculateVerificationInfo(
-            self,
-            method,
-            hs.NewHandle(method->GetDexCache()),
-            hs.NewHandle(method->GetDeclaringClass()->GetClassLoader())));
-    if (verifier == nullptr) {
-      JVMTI_LOG(WARNING, jvmti_) << "Unable to extract verification information from "
-                                 << method->PrettyMethod() << " due to hard verification failures! "
-                                 << "How did this method even get loaded!";
-      return ERR(INTERNAL);
-    }
-    art::verifier::RegisterLine* line = verifier->GetRegLine(dex_pc);
-    if (line == nullptr) {
-      JVMTI_LOG(WARNING, jvmti_) << "Unable to determine register line at dex-pc " << dex_pc
-                                 << " for method " << method->PrettyMethod();
+                         /*out*/art::Primitive::Type* type)
+      REQUIRES(art::Locks::mutator_lock_) {
+    const art::DexFile* dex_file = method->GetDexFile();
+    if (dex_file == nullptr) {
       return ERR(OPAQUE_FRAME);
     }
-    const art::verifier::RegType& rt = line->GetRegisterType(verifier.get(), slot_);
-    if (rt.IsUndefined()) {
-      return ERR(INVALID_SLOT);
-    } else if (rt.IsNonZeroReferenceTypes() || rt.IsNull()) {
-      *descriptor = (rt.HasClass() ? rt.GetDescriptor() : "Ljava/lang/Object;");
-      *type = VerifierPrimitiveType::kReferenceValue;
-      return OK;
-    } else if (rt.IsZero()) {
-      *descriptor = "I";
-      *type = VerifierPrimitiveType::kZeroValue;
-      return OK;
-    } else if (rt.IsCategory1Types()) {
-      *descriptor = "I";
-      *type = VerifierPrimitiveType::k32BitValue;
-      return OK;
-    } else if (rt.IsCategory2Types() && rt.IsLowHalf()) {
-      *descriptor = "J";
-      *type = VerifierPrimitiveType::k64BitValue;
-      return OK;
-    } else {
-      // The slot doesn't have a type. Must not be valid here.
-      return ERR(INVALID_SLOT);
+    art::CodeItemDebugInfoAccessor accessor(method->DexInstructionDebugInfo());
+    if (!accessor.HasCodeItem()) {
+      return ERR(OPAQUE_FRAME);
     }
-  }
-
-  constexpr VerifierPrimitiveType SquashType(SlotType t) {
-    if (std::holds_alternative<art::Primitive::Type>(t)) {
-      switch (std::get<art::Primitive::Type>(t)) {
-        // 32-bit primitives
-        case art::Primitive::kPrimByte:
-        case art::Primitive::kPrimChar:
-        case art::Primitive::kPrimInt:
-        case art::Primitive::kPrimShort:
-        case art::Primitive::kPrimBoolean:
-        case art::Primitive::kPrimFloat:
-          return VerifierPrimitiveType::k32BitValue;
-        // 64-bit primitives
-        case art::Primitive::kPrimLong:
-        case art::Primitive::kPrimDouble:
-          return VerifierPrimitiveType::k64BitValue;
-        case art::Primitive::kPrimNot:
-          return VerifierPrimitiveType::kReferenceValue;
-        case art::Primitive::kPrimVoid:
-          LOG(FATAL) << "Got kPrimVoid";
-          UNREACHABLE();
+    bool found = false;
+    *type = art::Primitive::kPrimVoid;
+    descriptor->clear();
+    auto visitor = [&](const art::DexFile::LocalInfo& entry) {
+      if (!found &&
+          entry.start_address_ <= dex_pc &&
+          entry.end_address_ > dex_pc &&
+          entry.reg_ == slot_) {
+        found = true;
+        *type = art::Primitive::GetType(entry.descriptor_[0]);
+        *descriptor = entry.descriptor_;
       }
-    } else {
-      return std::get<VerifierPrimitiveType>(t);
+    };
+    if (!accessor.DecodeDebugLocalInfo(method->IsStatic(), method->GetDexMethodIndex(), visitor) ||
+        !found) {
+      // Something went wrong with decoding the debug information. It might as well not be there.
+      return ERR(INVALID_SLOT);
     }
+    return OK;
   }
 
-  jvmtiEnv* jvmti_;
   jvmtiError result_;
   jint depth_;
   jint slot_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CommonLocalVariableClosure);
 };
 
-std::ostream& operator<<(std::ostream& os,
-                         CommonLocalVariableClosure::VerifierPrimitiveType state) {
-  switch (state) {
-    case CommonLocalVariableClosure::VerifierPrimitiveType::k32BitValue:
-      return os << "32BitValue";
-    case CommonLocalVariableClosure::VerifierPrimitiveType::k64BitValue:
-      return os << "64BitValue";
-    case CommonLocalVariableClosure::VerifierPrimitiveType::kReferenceValue:
-      return os << "ReferenceValue";
-    case CommonLocalVariableClosure::VerifierPrimitiveType::kZeroValue:
-      return os << "ZeroValue";
-  }
-}
-
-std::ostream& operator<<(std::ostream& os, CommonLocalVariableClosure::SlotType state) {
-  if (std::holds_alternative<art::Primitive::Type>(state)) {
-    return os << "Primitive::Type[" << std::get<art::Primitive::Type>(state) << "]";
-  } else {
-    return os << "VerifierPrimitiveType["
-              << std::get<CommonLocalVariableClosure::VerifierPrimitiveType>(state) << "]";
-  }
-}
-
-jvmtiError CommonLocalVariableClosure::GetSlotType(art::ArtMethod* method,
-                                                   uint32_t dex_pc,
-                                                   /*out*/ std::string* descriptor,
-                                                   /*out*/ SlotType* type) {
-  const art::DexFile* dex_file = method->GetDexFile();
-  if (dex_file == nullptr) {
-    return ERR(OPAQUE_FRAME);
-  }
-  art::CodeItemDebugInfoAccessor accessor(method->DexInstructionDebugInfo());
-  if (!accessor.HasCodeItem()) {
-    return ERR(OPAQUE_FRAME);
-  }
-  bool found = false;
-  *type = art::Primitive::kPrimVoid;
-  descriptor->clear();
-  auto visitor = [&](const art::DexFile::LocalInfo& entry) {
-    if (!found && entry.start_address_ <= dex_pc && entry.end_address_ > dex_pc &&
-        entry.reg_ == slot_) {
-      found = true;
-      *type = art::Primitive::GetType(entry.descriptor_[0]);
-      *descriptor = entry.descriptor_;
-    }
-  };
-  if (!accessor.DecodeDebugLocalInfo(method->IsStatic(), method->GetDexMethodIndex(), visitor) ||
-      !found) {
-    // Something went wrong with decoding the debug information. It might as well not be there.
-    // Try to find the type with the verifier.
-    // TODO This is very slow.
-    return InferSlotTypeFromVerifier(method, dex_pc, descriptor, type);
-  } else if (art::kIsDebugBuild) {
-    std::string type_unused;
-    SlotType verifier_type{ art::Primitive::kPrimVoid };
-    DCHECK_EQ(InferSlotTypeFromVerifier(method, dex_pc, &type_unused, &verifier_type), OK)
-        << method->PrettyMethod() << " failed to verify!";
-    if (*type == SlotType{ art::Primitive::kPrimNot }) {
-      // We cannot distinguish between a constant 0 and a null reference so we return that it is a
-      // 32bit value (Due to the way references are read by the interpreter this is safe even if
-      // it's modified, the value will remain null). This is not ideal since it prevents modifying
-      // locals in some circumstances but generally is not a big deal (since one can just modify it
-      // later once it's been determined to be a reference by a later instruction).
-      DCHECK(verifier_type == SlotType { VerifierPrimitiveType::kZeroValue } ||
-             verifier_type == SlotType { VerifierPrimitiveType::kReferenceValue })
-          << "Verifier disagrees on type of slot! debug: " << *type
-          << " verifier: " << verifier_type;
-    } else if (verifier_type == SlotType { VerifierPrimitiveType::kZeroValue }) {
-      DCHECK(VerifierPrimitiveType::k32BitValue == SquashType(*type) ||
-             VerifierPrimitiveType::kReferenceValue == SquashType(*type))
-          << "Verifier disagrees on type of slot! debug: " << *type
-          << " verifier: " << verifier_type;
-    } else {
-      DCHECK_EQ(SquashType(verifier_type), SquashType(*type))
-          << "Verifier disagrees on type of slot! debug: " << *type
-          << " verifier: " << verifier_type;
-    }
-  }
-  return OK;
-}
-
 class GetLocalVariableClosure : public CommonLocalVariableClosure {
  public:
-  GetLocalVariableClosure(jvmtiEnv* jvmti,
-                          jint depth,
+  GetLocalVariableClosure(jint depth,
                           jint slot,
                           art::Primitive::Type type,
                           jvalue* val)
-      : CommonLocalVariableClosure(jvmti, depth, slot),
+      : CommonLocalVariableClosure(depth, slot),
         type_(type),
         val_(val),
         obj_val_(nullptr) {}
@@ -817,61 +656,22 @@
   }
 
  protected:
-  jvmtiError
-  GetTypeError(art::ArtMethod* method, SlotType slot_type, const std::string& descriptor) override
-      REQUIRES_SHARED(art::Locks::mutator_lock_) {
-    jvmtiError res = GetTypeErrorInner(method, slot_type, descriptor);
-    if (res == ERR(TYPE_MISMATCH)) {
-      JVMTI_LOG(INFO, jvmti_) << "Unable to Get local variable in slot " << slot_ << ". Expected"
-                              << " slot to be of type compatible with " << SlotType { type_ }
-                              << " but slot is " << slot_type;
-    } else if (res != OK) {
-      JVMTI_LOG(INFO, jvmti_) << "Unable to get local variable in slot " << slot_ << ".";
-    }
-    return res;
-  }
-
-  jvmtiError GetTypeErrorInner(art::ArtMethod* method ATTRIBUTE_UNUSED,
-                               SlotType slot_type,
-                               const std::string& descriptor ATTRIBUTE_UNUSED)
-      REQUIRES_SHARED(art::Locks::mutator_lock_) {
-    switch (type_) {
-      case art::Primitive::kPrimFloat:
-      case art::Primitive::kPrimInt: {
-        if (std::holds_alternative<VerifierPrimitiveType>(slot_type)) {
-          return (slot_type == SlotType { VerifierPrimitiveType::k32BitValue } ||
-                  slot_type == SlotType { VerifierPrimitiveType::kZeroValue })
-                     ? OK
-                     : ERR(TYPE_MISMATCH);
-        } else if (type_ == art::Primitive::kPrimFloat ||
-                   slot_type == SlotType { art::Primitive::kPrimFloat }) {
-          // Check that we are actually a float.
-          return (SlotType { type_ } == slot_type) ? OK : ERR(TYPE_MISMATCH);
-        } else {
-          // Some smaller int type.
-          return SquashType(slot_type) == SquashType(SlotType { type_ }) ? OK : ERR(TYPE_MISMATCH);
-        }
-      }
-      case art::Primitive::kPrimLong:
-      case art::Primitive::kPrimDouble: {
-        // todo
-        if (std::holds_alternative<VerifierPrimitiveType>(slot_type)) {
-          return (slot_type == SlotType { VerifierPrimitiveType::k64BitValue })
-                     ? OK
-                     : ERR(TYPE_MISMATCH);
-        } else {
-          return slot_type == SlotType { type_ } ? OK : ERR(TYPE_MISMATCH);
-        }
-      }
-      case art::Primitive::kPrimNot:
-        return (SquashType(slot_type) == VerifierPrimitiveType::kReferenceValue ||
-                SquashType(slot_type) == VerifierPrimitiveType::kZeroValue)
-                   ? OK
-                   : ERR(TYPE_MISMATCH);
-      case art::Primitive::kPrimShort:
-      case art::Primitive::kPrimChar:
+  jvmtiError GetTypeError(art::ArtMethod* method ATTRIBUTE_UNUSED,
+                          art::Primitive::Type slot_type,
+                          const std::string& descriptor ATTRIBUTE_UNUSED)
+      override REQUIRES_SHARED(art::Locks::mutator_lock_) {
+    switch (slot_type) {
       case art::Primitive::kPrimByte:
+      case art::Primitive::kPrimChar:
+      case art::Primitive::kPrimInt:
+      case art::Primitive::kPrimShort:
       case art::Primitive::kPrimBoolean:
+        return type_ == art::Primitive::kPrimInt ? OK : ERR(TYPE_MISMATCH);
+      case art::Primitive::kPrimLong:
+      case art::Primitive::kPrimFloat:
+      case art::Primitive::kPrimDouble:
+      case art::Primitive::kPrimNot:
+        return type_ == slot_type ? OK : ERR(TYPE_MISMATCH);
       case art::Primitive::kPrimVoid:
         LOG(FATAL) << "Unexpected primitive type " << slot_type;
         UNREACHABLE();
@@ -935,7 +735,7 @@
   jobject obj_val_;
 };
 
-jvmtiError MethodUtil::GetLocalVariableGeneric(jvmtiEnv* env,
+jvmtiError MethodUtil::GetLocalVariableGeneric(jvmtiEnv* env ATTRIBUTE_UNUSED,
                                                jthread thread,
                                                jint depth,
                                                jint slot,
@@ -953,7 +753,7 @@
     art::Locks::thread_list_lock_->ExclusiveUnlock(self);
     return err;
   }
-  GetLocalVariableClosure c(env, depth, slot, type, val);
+  GetLocalVariableClosure c(depth, slot, type, val);
   // RequestSynchronousCheckpoint releases the thread_list_lock_ as a part of its execution.
   if (!target->RequestSynchronousCheckpoint(&c)) {
     return ERR(THREAD_NOT_ALIVE);
@@ -964,100 +764,49 @@
 
 class SetLocalVariableClosure : public CommonLocalVariableClosure {
  public:
-  SetLocalVariableClosure(jvmtiEnv* jvmti,
-                          art::Thread* caller,
+  SetLocalVariableClosure(art::Thread* caller,
                           jint depth,
                           jint slot,
                           art::Primitive::Type type,
                           jvalue val)
-      : CommonLocalVariableClosure(jvmti, depth, slot), caller_(caller), type_(type), val_(val) {}
+      : CommonLocalVariableClosure(depth, slot), caller_(caller), type_(type), val_(val) {}
 
  protected:
-  jvmtiError
-  GetTypeError(art::ArtMethod* method, SlotType slot_type, const std::string& descriptor) override
-      REQUIRES_SHARED(art::Locks::mutator_lock_) {
-    jvmtiError res = GetTypeErrorInner(method, slot_type, descriptor);
-    if (res != OK) {
-      if (res == ERR(TYPE_MISMATCH)) {
-        std::ostringstream desc_exp;
-        std::ostringstream desc_set;
-        if (type_ == art::Primitive::kPrimNot) {
-          desc_exp << " (type: " << descriptor << ")";
-          art::ObjPtr<art::mirror::Object> new_val(art::Thread::Current()->DecodeJObject(val_.l));
-          desc_set << " (type: "
-                  << (new_val.IsNull() ? "NULL" : new_val->GetClass()->PrettyDescriptor()) << ")";
-        }
-        JVMTI_LOG(INFO, jvmti_) << "Unable to Set local variable in slot " << slot_ << ". Expected"
-                                << " slot to be of type compatible with " << SlotType{ type_ }
-                                << desc_set.str() << " but slot is " << slot_type << desc_exp.str();
-      } else {
-        JVMTI_LOG(INFO, jvmti_) << "Unable to set local variable in slot " << slot_ << ". "
-                                << err_.str();
-      }
-    }
-    return res;
-  }
-
-  jvmtiError
-  GetTypeErrorInner(art::ArtMethod* method, SlotType slot_type, const std::string& descriptor)
-      REQUIRES_SHARED(art::Locks::mutator_lock_) {
-    switch (SquashType(SlotType{ type_ })) {
-      case VerifierPrimitiveType::k32BitValue: {
-        if (slot_type == SlotType{ VerifierPrimitiveType::kZeroValue }) {
-          if (val_.i == 0) {
-            return OK;
-          } else {
-            err_ << "Cannot determine if slot " << slot_ << " is a null reference or 32bit "
-                 << "constant. Cannot allow writing to slot.";
-            return ERR(INTERNAL);
-          }
-        } else if (SquashType(slot_type) != VerifierPrimitiveType::k32BitValue) {
-          return ERR(TYPE_MISMATCH);
-        } else if (slot_type == SlotType { VerifierPrimitiveType::k32BitValue } ||
-                   slot_type == SlotType { type_ }) {
-          return OK;
-        } else if (type_ == art::Primitive::kPrimFloat ||
-                   slot_type == SlotType { art::Primitive::kPrimFloat }) {
-          // we should have hit the get == type_ above
-          return ERR(TYPE_MISMATCH);
-        } else {
-          // Some smaller type then int.
-          return OK;
-        }
-      }
-      case VerifierPrimitiveType::k64BitValue: {
-        if (slot_type == SlotType { VerifierPrimitiveType::k64BitValue } ||
-            slot_type == SlotType { type_ }) {
-          return OK;
-        } else {
-          return ERR(TYPE_MISMATCH);
-        }
-      }
-      case VerifierPrimitiveType::kReferenceValue: {
-        if (SquashType(slot_type) != VerifierPrimitiveType::kReferenceValue &&
-            SquashType(slot_type) != VerifierPrimitiveType::kZeroValue) {
+  jvmtiError GetTypeError(art::ArtMethod* method,
+                          art::Primitive::Type slot_type,
+                          const std::string& descriptor)
+      override REQUIRES_SHARED(art::Locks::mutator_lock_) {
+    switch (slot_type) {
+      case art::Primitive::kPrimNot: {
+        if (type_ != art::Primitive::kPrimNot) {
           return ERR(TYPE_MISMATCH);
         } else if (val_.l == nullptr) {
           return OK;
-        } else if (slot_type == SlotType { VerifierPrimitiveType::kZeroValue }) {
-          err_ << "Cannot determine if slot " << slot_ << " is a null "
-               << "reference or 32bit constant. Cannot allow writing to slot.";
-          return ERR(INTERNAL);
         } else {
           art::ClassLinker* cl = art::Runtime::Current()->GetClassLinker();
-          art::ObjPtr<art::mirror::Class> set_class = caller_->DecodeJObject(val_.l)->GetClass();
+          art::ObjPtr<art::mirror::Class> set_class =
+              caller_->DecodeJObject(val_.l)->GetClass();
           art::ObjPtr<art::mirror::ClassLoader> loader =
               method->GetDeclaringClass()->GetClassLoader();
           art::ObjPtr<art::mirror::Class> slot_class =
               cl->LookupClass(caller_, descriptor.c_str(), loader);
-          DCHECK(!slot_class.IsNull()) << descriptor << " slot: " << slot_type;
+          DCHECK(!slot_class.IsNull());
           return slot_class->IsAssignableFrom(set_class) ? OK : ERR(TYPE_MISMATCH);
         }
       }
-      case VerifierPrimitiveType::kZeroValue: {
-        LOG(FATAL) << "Illegal result from SquashType of art::Primitive::Type " << type_;
+      case art::Primitive::kPrimByte:
+      case art::Primitive::kPrimChar:
+      case art::Primitive::kPrimInt:
+      case art::Primitive::kPrimShort:
+      case art::Primitive::kPrimBoolean:
+        return type_ == art::Primitive::kPrimInt ? OK : ERR(TYPE_MISMATCH);
+      case art::Primitive::kPrimLong:
+      case art::Primitive::kPrimFloat:
+      case art::Primitive::kPrimDouble:
+        return type_ == slot_type ? OK : ERR(TYPE_MISMATCH);
+      case art::Primitive::kPrimVoid:
+        LOG(FATAL) << "Unexpected primitive type " << slot_type;
         UNREACHABLE();
-      }
     }
   }
 
@@ -1108,10 +857,9 @@
   art::Thread* caller_;
   art::Primitive::Type type_;
   jvalue val_;
-  std::ostringstream err_;
 };
 
-jvmtiError MethodUtil::SetLocalVariableGeneric(jvmtiEnv* env,
+jvmtiError MethodUtil::SetLocalVariableGeneric(jvmtiEnv* env ATTRIBUTE_UNUSED,
                                                jthread thread,
                                                jint depth,
                                                jint slot,
@@ -1132,7 +880,7 @@
     art::Locks::thread_list_lock_->ExclusiveUnlock(self);
     return err;
   }
-  SetLocalVariableClosure c(env, self, depth, slot, type, val);
+  SetLocalVariableClosure c(self, depth, slot, type, val);
   // RequestSynchronousCheckpoint releases the thread_list_lock_ as a part of its execution.
   if (!target->RequestSynchronousCheckpoint(&c)) {
     return ERR(THREAD_NOT_ALIVE);
diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc
index ff44828..73ae8e8 100644
--- a/runtime/verifier/method_verifier.cc
+++ b/runtime/verifier/method_verifier.cc
@@ -63,7 +63,6 @@
 #include "scoped_thread_state_change-inl.h"
 #include "stack.h"
 #include "vdex_file.h"
-#include "verifier/method_verifier.h"
 #include "verifier_compiler_binding.h"
 #include "verifier_deps.h"
 
@@ -153,7 +152,6 @@
                  bool need_precise_constants,
                  bool verify_to_dump,
                  bool allow_thread_suspension,
-                 bool fill_register_lines_,
                  uint32_t api_level)
       REQUIRES_SHARED(Locks::mutator_lock_);
 
@@ -632,9 +630,6 @@
   // Note: this flag is only valid once Verify() has started.
   bool is_constructor_;
 
-  // Whether to attempt to fill all register lines for (ex) debugger use.
-  bool fill_register_lines_;
-
   // API level, for dependent checks. Note: we do not use '0' for unset here, to simplify checks.
   // Instead, unset level should correspond to max().
   const uint32_t api_level_;
@@ -700,7 +695,6 @@
                                                bool need_precise_constants,
                                                bool verify_to_dump,
                                                bool allow_thread_suspension,
-                                               bool fill_register_lines,
                                                uint32_t api_level)
     : art::verifier::MethodVerifier(self,
                                     dex_file,
@@ -722,7 +716,6 @@
       verify_to_dump_(verify_to_dump),
       allow_thread_suspension_(allow_thread_suspension),
       is_constructor_(false),
-      fill_register_lines_(fill_register_lines),
       api_level_(api_level == 0 ? std::numeric_limits<uint32_t>::max() : api_level) {
 }
 
@@ -1585,7 +1578,7 @@
   const uint16_t registers_size = code_item_accessor_.RegistersSize();
 
   /* Create and initialize table holding register status */
-  reg_table_.Init(fill_register_lines_ ? kTrackRegsAll : kTrackCompilerInterestPoints,
+  reg_table_.Init(kTrackCompilerInterestPoints,
                   insn_flags_.get(),
                   code_item_accessor_.InsnsSizeInCodeUnits(),
                   registers_size,
@@ -5207,7 +5200,6 @@
                                                 need_precise_constants,
                                                 /* verify to dump */ false,
                                                 /* allow_thread_suspension= */ true,
-                                                /* fill_register_lines= */ false,
                                                 api_level);
   if (verifier.Verify()) {
     // Verification completed, however failures may be pending that didn't cause the verification
@@ -5330,41 +5322,6 @@
   return result;
 }
 
-MethodVerifier* MethodVerifier::CalculateVerificationInfo(
-      Thread* self,
-      ArtMethod* method,
-      Handle<mirror::DexCache> dex_cache,
-      Handle<mirror::ClassLoader> class_loader) {
-  std::unique_ptr<impl::MethodVerifier<false>> verifier(
-      new impl::MethodVerifier<false>(self,
-                                      method->GetDexFile(),
-                                      dex_cache,
-                                      class_loader,
-                                      *method->GetDeclaringClass()->GetClassDef(),
-                                      method->GetCodeItem(),
-                                      method->GetDexMethodIndex(),
-                                      method,
-                                      method->GetAccessFlags(),
-                                      /* can_load_classes= */ false,
-                                      /* allow_soft_failures= */ true,
-                                      /* need_precise_constants= */ true,
-                                      /* verify_to_dump= */ false,
-                                      /* allow_thread_suspension= */ false,
-                                      /* fill_register_lines= */ true,
-                                      /* api_level = */ 0));
-  verifier->Verify();
-  if (VLOG_IS_ON(verifier)) {
-    verifier->DumpFailures(VLOG_STREAM(verifier));
-    VLOG(verifier) << verifier->info_messages_.str();
-    verifier->Dump(VLOG_STREAM(verifier));
-  }
-  if (verifier->have_pending_hard_failure_) {
-    return nullptr;
-  } else {
-    return verifier.release();
-  }
-}
-
 MethodVerifier* MethodVerifier::VerifyMethodAndDump(Thread* self,
                                                     VariableIndentationOutputStream* vios,
                                                     uint32_t dex_method_idx,
@@ -5391,7 +5348,6 @@
       /* need_precise_constants= */ true,
       /* verify_to_dump= */ true,
       /* allow_thread_suspension= */ true,
-      /* fill_register_lines= */ false,
       api_level);
   verifier->Verify();
   verifier->DumpFailures(vios->Stream());
@@ -5429,7 +5385,6 @@
                                        /* need_precise_constants= */ false,
                                        /* verify_to_dump= */ false,
                                        /* allow_thread_suspension= */ false,
-                                       /* fill_register_lines= */ false,
                                        api_level);
   verifier.interesting_dex_pc_ = dex_pc;
   verifier.monitor_enter_dex_pcs_ = monitor_enter_dex_pcs;
@@ -5465,7 +5420,6 @@
                                          need_precise_constants,
                                          verify_to_dump,
                                          allow_thread_suspension,
-                                         /* fill_register_lines= */ false,
                                          api_level);
 }
 
diff --git a/runtime/verifier/method_verifier.h b/runtime/verifier/method_verifier.h
index bd320ce..0af09c3 100644
--- a/runtime/verifier/method_verifier.h
+++ b/runtime/verifier/method_verifier.h
@@ -118,16 +118,6 @@
                                              uint32_t api_level)
       REQUIRES_SHARED(Locks::mutator_lock_);
 
-  // Calculates the verification information for every instruction of the given method. The given
-  // dex-cache and class-loader will be used for lookups. No classes will be loaded. If verification
-  // fails hard nullptr will be returned. This should only be used if one needs to examine what the
-  // verifier believes about the registers of a given method.
-  static MethodVerifier* CalculateVerificationInfo(Thread* self,
-                                                   ArtMethod* method,
-                                                   Handle<mirror::DexCache> dex_cache,
-                                                   Handle<mirror::ClassLoader> class_loader)
-      REQUIRES_SHARED(Locks::mutator_lock_);
-
   const DexFile& GetDexFile() const {
     DCHECK(dex_file_ != nullptr);
     return *dex_file_;
diff --git a/test/1912-get-set-local-primitive/expected.txt b/test/1912-get-set-local-primitive/expected.txt
index 8a03566..f2c5ce8 100644
--- a/test/1912-get-set-local-primitive/expected.txt
+++ b/test/1912-get-set-local-primitive/expected.txt
@@ -10,9 +10,6 @@
 Running public static void art.Test1912.IntMethod(java.lang.Runnable) with "GetDouble" on remote thread.
 "GetDouble" on public static void art.Test1912.IntMethod(java.lang.Runnable) failed due to JVMTI_ERROR_TYPE_MISMATCH
 	Value is '42' (class: class java.lang.Integer)
-Running public static void art.Test1912.IntMethod(java.lang.Runnable) with "GetObject" on remote thread.
-"GetObject" on public static void art.Test1912.IntMethod(java.lang.Runnable) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '42' (class: class java.lang.Integer)
 Running public static void art.Test1912.IntMethod(java.lang.Runnable) with "SetInt" on remote thread.
 "SetInt" on public static void art.Test1912.IntMethod(java.lang.Runnable) set value: 2147483647
 	Value is '2147483647' (class: class java.lang.Integer)
@@ -25,12 +22,6 @@
 Running public static void art.Test1912.IntMethod(java.lang.Runnable) with "SetDouble" on remote thread.
 "SetDouble" on public static void art.Test1912.IntMethod(java.lang.Runnable) failed to set value 12.4 due to JVMTI_ERROR_TYPE_MISMATCH
 	Value is '42' (class: class java.lang.Integer)
-Running public static void art.Test1912.IntMethod(java.lang.Runnable) with "SetObject" on remote thread.
-"SetObject" on public static void art.Test1912.IntMethod(java.lang.Runnable) failed to set value NEW_VALUE_FOR_SET due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '42' (class: class java.lang.Integer)
-Running public static void art.Test1912.IntMethod(java.lang.Runnable) with "SetNullObject" on remote thread.
-"SetNullObject" on public static void art.Test1912.IntMethod(java.lang.Runnable) failed to set value null due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '42' (class: class java.lang.Integer)
 Running public static void art.Test1912.LongMethod(java.lang.Runnable) with "GetInt" on remote thread.
 "GetInt" on public static void art.Test1912.LongMethod(java.lang.Runnable) failed due to JVMTI_ERROR_TYPE_MISMATCH
 	Value is '9001' (class: class java.lang.Long)
@@ -43,9 +34,6 @@
 Running public static void art.Test1912.LongMethod(java.lang.Runnable) with "GetDouble" on remote thread.
 "GetDouble" on public static void art.Test1912.LongMethod(java.lang.Runnable) failed due to JVMTI_ERROR_TYPE_MISMATCH
 	Value is '9001' (class: class java.lang.Long)
-Running public static void art.Test1912.LongMethod(java.lang.Runnable) with "GetObject" on remote thread.
-"GetObject" on public static void art.Test1912.LongMethod(java.lang.Runnable) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '9001' (class: class java.lang.Long)
 Running public static void art.Test1912.LongMethod(java.lang.Runnable) with "SetInt" on remote thread.
 "SetInt" on public static void art.Test1912.LongMethod(java.lang.Runnable) failed to set value 2147483647 due to JVMTI_ERROR_TYPE_MISMATCH
 	Value is '9001' (class: class java.lang.Long)
@@ -58,12 +46,6 @@
 Running public static void art.Test1912.LongMethod(java.lang.Runnable) with "SetDouble" on remote thread.
 "SetDouble" on public static void art.Test1912.LongMethod(java.lang.Runnable) failed to set value 12.4 due to JVMTI_ERROR_TYPE_MISMATCH
 	Value is '9001' (class: class java.lang.Long)
-Running public static void art.Test1912.LongMethod(java.lang.Runnable) with "SetObject" on remote thread.
-"SetObject" on public static void art.Test1912.LongMethod(java.lang.Runnable) failed to set value NEW_VALUE_FOR_SET due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '9001' (class: class java.lang.Long)
-Running public static void art.Test1912.LongMethod(java.lang.Runnable) with "SetNullObject" on remote thread.
-"SetNullObject" on public static void art.Test1912.LongMethod(java.lang.Runnable) failed to set value null due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '9001' (class: class java.lang.Long)
 Running public static void art.Test1912.FloatMethod(java.lang.Runnable) with "GetInt" on remote thread.
 "GetInt" on public static void art.Test1912.FloatMethod(java.lang.Runnable) failed due to JVMTI_ERROR_TYPE_MISMATCH
 	Value is '1.618' (class: class java.lang.Float)
@@ -76,9 +58,6 @@
 Running public static void art.Test1912.FloatMethod(java.lang.Runnable) with "GetDouble" on remote thread.
 "GetDouble" on public static void art.Test1912.FloatMethod(java.lang.Runnable) failed due to JVMTI_ERROR_TYPE_MISMATCH
 	Value is '1.618' (class: class java.lang.Float)
-Running public static void art.Test1912.FloatMethod(java.lang.Runnable) with "GetObject" on remote thread.
-"GetObject" on public static void art.Test1912.FloatMethod(java.lang.Runnable) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '1.618' (class: class java.lang.Float)
 Running public static void art.Test1912.FloatMethod(java.lang.Runnable) with "SetInt" on remote thread.
 "SetInt" on public static void art.Test1912.FloatMethod(java.lang.Runnable) failed to set value 2147483647 due to JVMTI_ERROR_TYPE_MISMATCH
 	Value is '1.618' (class: class java.lang.Float)
@@ -91,12 +70,6 @@
 Running public static void art.Test1912.FloatMethod(java.lang.Runnable) with "SetDouble" on remote thread.
 "SetDouble" on public static void art.Test1912.FloatMethod(java.lang.Runnable) failed to set value 12.4 due to JVMTI_ERROR_TYPE_MISMATCH
 	Value is '1.618' (class: class java.lang.Float)
-Running public static void art.Test1912.FloatMethod(java.lang.Runnable) with "SetObject" on remote thread.
-"SetObject" on public static void art.Test1912.FloatMethod(java.lang.Runnable) failed to set value NEW_VALUE_FOR_SET due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '1.618' (class: class java.lang.Float)
-Running public static void art.Test1912.FloatMethod(java.lang.Runnable) with "SetNullObject" on remote thread.
-"SetNullObject" on public static void art.Test1912.FloatMethod(java.lang.Runnable) failed to set value null due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '1.618' (class: class java.lang.Float)
 Running public static void art.Test1912.DoubleMethod(java.lang.Runnable) with "GetInt" on remote thread.
 "GetInt" on public static void art.Test1912.DoubleMethod(java.lang.Runnable) failed due to JVMTI_ERROR_TYPE_MISMATCH
 	Value is '3.1415' (class: class java.lang.Double)
@@ -109,9 +82,6 @@
 Running public static void art.Test1912.DoubleMethod(java.lang.Runnable) with "GetDouble" on remote thread.
 "GetDouble" on public static void art.Test1912.DoubleMethod(java.lang.Runnable) got value: 3.1415
 	Value is '3.1415' (class: class java.lang.Double)
-Running public static void art.Test1912.DoubleMethod(java.lang.Runnable) with "GetObject" on remote thread.
-"GetObject" on public static void art.Test1912.DoubleMethod(java.lang.Runnable) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '3.1415' (class: class java.lang.Double)
 Running public static void art.Test1912.DoubleMethod(java.lang.Runnable) with "SetInt" on remote thread.
 "SetInt" on public static void art.Test1912.DoubleMethod(java.lang.Runnable) failed to set value 2147483647 due to JVMTI_ERROR_TYPE_MISMATCH
 	Value is '3.1415' (class: class java.lang.Double)
@@ -124,78 +94,6 @@
 Running public static void art.Test1912.DoubleMethod(java.lang.Runnable) with "SetDouble" on remote thread.
 "SetDouble" on public static void art.Test1912.DoubleMethod(java.lang.Runnable) set value: 12.4
 	Value is '12.4' (class: class java.lang.Double)
-Running public static void art.Test1912.DoubleMethod(java.lang.Runnable) with "SetObject" on remote thread.
-"SetObject" on public static void art.Test1912.DoubleMethod(java.lang.Runnable) failed to set value NEW_VALUE_FOR_SET due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '3.1415' (class: class java.lang.Double)
-Running public static void art.Test1912.DoubleMethod(java.lang.Runnable) with "SetNullObject" on remote thread.
-"SetNullObject" on public static void art.Test1912.DoubleMethod(java.lang.Runnable) failed to set value null due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '3.1415' (class: class java.lang.Double)
-Running public static void art.Test1912.ObjectMethod(java.lang.Runnable) with "GetInt" on remote thread.
-"GetInt" on public static void art.Test1912.ObjectMethod(java.lang.Runnable) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TARGET OBJECT' (class: class java.lang.String)
-Running public static void art.Test1912.ObjectMethod(java.lang.Runnable) with "GetLong" on remote thread.
-"GetLong" on public static void art.Test1912.ObjectMethod(java.lang.Runnable) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TARGET OBJECT' (class: class java.lang.String)
-Running public static void art.Test1912.ObjectMethod(java.lang.Runnable) with "GetFloat" on remote thread.
-"GetFloat" on public static void art.Test1912.ObjectMethod(java.lang.Runnable) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TARGET OBJECT' (class: class java.lang.String)
-Running public static void art.Test1912.ObjectMethod(java.lang.Runnable) with "GetDouble" on remote thread.
-"GetDouble" on public static void art.Test1912.ObjectMethod(java.lang.Runnable) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TARGET OBJECT' (class: class java.lang.String)
-Running public static void art.Test1912.ObjectMethod(java.lang.Runnable) with "GetObject" on remote thread.
-"GetObject" on public static void art.Test1912.ObjectMethod(java.lang.Runnable) got value: TARGET OBJECT
-	Value is 'TARGET OBJECT' (class: class java.lang.String)
-Running public static void art.Test1912.ObjectMethod(java.lang.Runnable) with "SetInt" on remote thread.
-"SetInt" on public static void art.Test1912.ObjectMethod(java.lang.Runnable) failed to set value 2147483647 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TARGET OBJECT' (class: class java.lang.String)
-Running public static void art.Test1912.ObjectMethod(java.lang.Runnable) with "SetLong" on remote thread.
-"SetLong" on public static void art.Test1912.ObjectMethod(java.lang.Runnable) failed to set value 9223372036854775807 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TARGET OBJECT' (class: class java.lang.String)
-Running public static void art.Test1912.ObjectMethod(java.lang.Runnable) with "SetFloat" on remote thread.
-"SetFloat" on public static void art.Test1912.ObjectMethod(java.lang.Runnable) failed to set value 9.2 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TARGET OBJECT' (class: class java.lang.String)
-Running public static void art.Test1912.ObjectMethod(java.lang.Runnable) with "SetDouble" on remote thread.
-"SetDouble" on public static void art.Test1912.ObjectMethod(java.lang.Runnable) failed to set value 12.4 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TARGET OBJECT' (class: class java.lang.String)
-Running public static void art.Test1912.ObjectMethod(java.lang.Runnable) with "SetObject" on remote thread.
-"SetObject" on public static void art.Test1912.ObjectMethod(java.lang.Runnable) set value: NEW_VALUE_FOR_SET
-	Value is 'NEW_VALUE_FOR_SET' (class: class java.lang.String)
-Running public static void art.Test1912.ObjectMethod(java.lang.Runnable) with "SetNullObject" on remote thread.
-"SetNullObject" on public static void art.Test1912.ObjectMethod(java.lang.Runnable) set value: null
-	Value is 'null' (class: null)
-Running public static void art.Test1912.NullObjectMethod(java.lang.Runnable) with "GetInt" on remote thread.
-"GetInt" on public static void art.Test1912.NullObjectMethod(java.lang.Runnable) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'null' (class: null)
-Running public static void art.Test1912.NullObjectMethod(java.lang.Runnable) with "GetLong" on remote thread.
-"GetLong" on public static void art.Test1912.NullObjectMethod(java.lang.Runnable) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'null' (class: null)
-Running public static void art.Test1912.NullObjectMethod(java.lang.Runnable) with "GetFloat" on remote thread.
-"GetFloat" on public static void art.Test1912.NullObjectMethod(java.lang.Runnable) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'null' (class: null)
-Running public static void art.Test1912.NullObjectMethod(java.lang.Runnable) with "GetDouble" on remote thread.
-"GetDouble" on public static void art.Test1912.NullObjectMethod(java.lang.Runnable) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'null' (class: null)
-Running public static void art.Test1912.NullObjectMethod(java.lang.Runnable) with "GetObject" on remote thread.
-"GetObject" on public static void art.Test1912.NullObjectMethod(java.lang.Runnable) got value: null
-	Value is 'null' (class: null)
-Running public static void art.Test1912.NullObjectMethod(java.lang.Runnable) with "SetInt" on remote thread.
-"SetInt" on public static void art.Test1912.NullObjectMethod(java.lang.Runnable) failed to set value 2147483647 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'null' (class: null)
-Running public static void art.Test1912.NullObjectMethod(java.lang.Runnable) with "SetLong" on remote thread.
-"SetLong" on public static void art.Test1912.NullObjectMethod(java.lang.Runnable) failed to set value 9223372036854775807 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'null' (class: null)
-Running public static void art.Test1912.NullObjectMethod(java.lang.Runnable) with "SetFloat" on remote thread.
-"SetFloat" on public static void art.Test1912.NullObjectMethod(java.lang.Runnable) failed to set value 9.2 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'null' (class: null)
-Running public static void art.Test1912.NullObjectMethod(java.lang.Runnable) with "SetDouble" on remote thread.
-"SetDouble" on public static void art.Test1912.NullObjectMethod(java.lang.Runnable) failed to set value 12.4 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'null' (class: null)
-Running public static void art.Test1912.NullObjectMethod(java.lang.Runnable) with "SetObject" on remote thread.
-"SetObject" on public static void art.Test1912.NullObjectMethod(java.lang.Runnable) set value: NEW_VALUE_FOR_SET
-	Value is 'NEW_VALUE_FOR_SET' (class: class java.lang.String)
-Running public static void art.Test1912.NullObjectMethod(java.lang.Runnable) with "SetNullObject" on remote thread.
-"SetNullObject" on public static void art.Test1912.NullObjectMethod(java.lang.Runnable) set value: null
-	Value is 'null' (class: null)
 Running public static void art.Test1912.BooleanMethod(java.lang.Runnable) with "SetIntBoolSize" on remote thread.
 "SetIntBoolSize" on public static void art.Test1912.BooleanMethod(java.lang.Runnable) set value: 1
 	Value is 'true' (class: class java.lang.Boolean)
diff --git a/test/1912-get-set-local-primitive/src/art/Test1912.java b/test/1912-get-set-local-primitive/src/art/Test1912.java
index f0a6065..24149f4 100644
--- a/test/1912-get-set-local-primitive/src/art/Test1912.java
+++ b/test/1912-get-set-local-primitive/src/art/Test1912.java
@@ -20,39 +20,29 @@
 import java.lang.reflect.Executable;
 import java.lang.reflect.Method;
 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.concurrent.Semaphore;
-import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
+import java.util.function.Consumer;
 
 // TODO Rename test to set-get-local-prim
 
 public class Test1912 {
   public static final String TARGET_VAR = "TARGET";
 
+
   public static void reportValue(Object val) {
     if (val instanceof Character) {
       val = "<Char: " + Character.getNumericValue(((Character)val).charValue()) + ">";
     }
-    System.out.println("\tValue is '" + val +
-                       "' (class: " + (val != null ? val.getClass().toString() : "null") + ")");
+    System.out.println("\tValue is '" + val + "' (class: " + val.getClass() + ")");
   }
 
-  public static void NullObjectMethod(Runnable safepoint) {
-    Object TARGET = null;
-    safepoint.run();
-    reportValue(TARGET);
-  }
-  public static void ObjectMethod(Runnable safepoint) {
-    Object TARGET = "TARGET OBJECT";
-    safepoint.run();
-    reportValue(TARGET);
-  }
   public static void BooleanMethod(Runnable safepoint) {
     boolean TARGET = false;
     safepoint.run();
@@ -95,27 +85,31 @@
   }
 
   public static interface SafepointFunction {
-    public void
-    invoke(Thread thread, Method target, Locals.VariableDescription TARGET_desc, int depth)
-        throws Exception;
+    public void invoke(
+        Thread thread,
+        Method target,
+        Locals.VariableDescription TARGET_desc,
+        int depth) throws Exception;
   }
 
   public static interface SetterFunction {
     public void SetVar(Thread t, int depth, int slot, Object v);
   }
 
-  public static interface GetterFunction { public Object GetVar(Thread t, int depth, int slot); }
+  public static interface GetterFunction {
+    public Object GetVar(Thread t, int depth, int slot);
+  }
 
-  public static SafepointFunction
-  NamedSet(final String type, final SetterFunction get, final Object v) {
+  public static SafepointFunction NamedSet(
+      final String type, final SetterFunction get, final Object v) {
     return new SafepointFunction() {
       public void invoke(Thread t, Method method, Locals.VariableDescription desc, int depth) {
         try {
           get.SetVar(t, depth, desc.slot, v);
           System.out.println(this + " on " + method + " set value: " + v);
         } catch (Exception e) {
-          System.out.println(this + " on " + method + " failed to set value " + v + " due to " +
-                             e.getMessage());
+          System.out.println(
+              this + " on " + method + " failed to set value " + v + " due to " + e.getMessage());
         }
       }
       public String toString() {
@@ -177,13 +171,15 @@
     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(null, pause);
-        } catch (Exception e) {
-          throw new Error("Error invoking remote thread " + Thread.currentThread(), e);
-        }
-      }, "remote thread for " + target + " with " + safepoint);
+      Thread remote = new Thread(
+          () -> {
+            try {
+              target.invoke(null, 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 {
@@ -200,12 +196,14 @@
 
     private Locals.VariableDescription findTargetVar(long loc) {
       for (Locals.VariableDescription var : Locals.GetLocalVariableTable(target)) {
-        if (var.start_location <= loc && var.length + var.start_location > loc &&
+        if (var.start_location <= loc &&
+            var.length + var.start_location > loc &&
             var.name.equals(TARGET_VAR)) {
           return var;
         }
       }
-      throw new Error("Unable to find variable " + TARGET_VAR + " in " + target + " at loc " + loc);
+      throw new Error(
+          "Unable to find variable " + TARGET_VAR + " in " + target + " at loc " + loc);
     }
 
     private StackTrace.StackFrameData findStackFrame(Thread thr) {
@@ -224,9 +222,10 @@
   public static void run() throws Exception {
     Locals.EnableLocalVariableAccess();
     final TestCase[] MAIN_TEST_CASES = new TestCase[] {
-      new TestCase(getMethod("IntMethod")),    new TestCase(getMethod("LongMethod")),
-      new TestCase(getMethod("FloatMethod")),  new TestCase(getMethod("DoubleMethod")),
-      new TestCase(getMethod("ObjectMethod")), new TestCase(getMethod("NullObjectMethod")),
+      new TestCase(getMethod("IntMethod")),
+      new TestCase(getMethod("LongMethod")),
+      new TestCase(getMethod("FloatMethod")),
+      new TestCase(getMethod("DoubleMethod")),
     };
 
     final SafepointFunction[] SAFEPOINTS = new SafepointFunction[] {
@@ -234,30 +233,28 @@
       NamedGet("Long", Locals::GetLocalVariableLong),
       NamedGet("Float", Locals::GetLocalVariableFloat),
       NamedGet("Double", Locals::GetLocalVariableDouble),
-      NamedGet("Object", Locals::GetLocalVariableObject),
       NamedSet("Int", Locals::SetLocalVariableInt, Integer.MAX_VALUE),
       NamedSet("Long", Locals::SetLocalVariableLong, Long.MAX_VALUE),
       NamedSet("Float", Locals::SetLocalVariableFloat, 9.2f),
       NamedSet("Double", Locals::SetLocalVariableDouble, 12.4d),
-      NamedSet("Object", Locals::SetLocalVariableObject, "NEW_VALUE_FOR_SET"),
-      NamedSet("NullObject", Locals::SetLocalVariableObject, null),
     };
 
-    for (TestCase t : MAIN_TEST_CASES) {
+    for (TestCase t: MAIN_TEST_CASES) {
       for (SafepointFunction s : SAFEPOINTS) {
         t.exec(s);
       }
     }
 
     // Test int for small values.
-    new TestCase(getMethod("BooleanMethod"))
-        .exec(NamedSet("IntBoolSize", Locals::SetLocalVariableInt, 1));
-    new TestCase(getMethod("ByteMethod"))
-        .exec(NamedSet("IntByteSize", Locals::SetLocalVariableInt, Byte.MAX_VALUE - 1));
+    new TestCase(getMethod("BooleanMethod")).exec(
+        NamedSet("IntBoolSize", Locals::SetLocalVariableInt, 1));
+    new TestCase(getMethod("ByteMethod")).exec(
+      NamedSet("IntByteSize", Locals::SetLocalVariableInt, Byte.MAX_VALUE - 1));
 
-    new TestCase(getMethod("CharMethod"))
-        .exec(NamedSet("IntCharSize", Locals::SetLocalVariableInt, Character.MAX_VALUE - 1));
-    new TestCase(getMethod("ShortMethod"))
-        .exec(NamedSet("IntShortSize", Locals::SetLocalVariableInt, Short.MAX_VALUE - 1));
+    new TestCase(getMethod("CharMethod")).exec(
+      NamedSet("IntCharSize", Locals::SetLocalVariableInt, Character.MAX_VALUE - 1));
+    new TestCase(getMethod("ShortMethod")).exec(
+      NamedSet("IntShortSize", Locals::SetLocalVariableInt, Short.MAX_VALUE - 1));
   }
 }
+
diff --git a/test/1913-get-set-local-objects/expected.txt b/test/1913-get-set-local-objects/expected.txt
index 2338915..23f4992 100644
--- a/test/1913-get-set-local-objects/expected.txt
+++ b/test/1913-get-set-local-objects/expected.txt
@@ -70,57 +70,3 @@
 Running public static void art.Test1913.PrimitiveMethod(java.lang.Runnable) with "SetTestClass2impl" on remote thread.
 "SetTestClass2impl" on public static void art.Test1913.PrimitiveMethod(java.lang.Runnable) failed to set value TestClass2impl("TestClass2("Set TestClass2impl")") due to JVMTI_ERROR_TYPE_MISMATCH
 	Value is '42' (class: class java.lang.Integer)
-Running public static void art.Test1913.NullObjectMethod(java.lang.Runnable) with "GetGetObject" on remote thread.
-"GetGetObject" on public static void art.Test1913.NullObjectMethod(java.lang.Runnable) got value: null
-	Value is 'null' (class: NULL)
-Running public static void art.Test1913.NullObjectMethod(java.lang.Runnable) with "SetNull" on remote thread.
-"SetNull" on public static void art.Test1913.NullObjectMethod(java.lang.Runnable) set value: null
-	Value is 'null' (class: NULL)
-Running public static void art.Test1913.NullObjectMethod(java.lang.Runnable) with "SetTestClass1" on remote thread.
-"SetTestClass1" on public static void art.Test1913.NullObjectMethod(java.lang.Runnable) set value: TestClass1("Set TestClass1")
-	Value is 'TestClass1("Set TestClass1")' (class: class art.Test1913$TestClass1)
-Running public static void art.Test1913.NullObjectMethod(java.lang.Runnable) with "SetTestClass1ext" on remote thread.
-"SetTestClass1ext" on public static void art.Test1913.NullObjectMethod(java.lang.Runnable) set value: TestClass1ext("TestClass1("Set TestClass1ext")")
-	Value is 'TestClass1ext("TestClass1("Set TestClass1ext")")' (class: class art.Test1913$TestClass1ext)
-Running public static void art.Test1913.NullObjectMethod(java.lang.Runnable) with "SetTestClass2" on remote thread.
-"SetTestClass2" on public static void art.Test1913.NullObjectMethod(java.lang.Runnable) set value: TestClass2("Set TestClass2")
-	Value is 'TestClass2("Set TestClass2")' (class: class art.Test1913$TestClass2)
-Running public static void art.Test1913.NullObjectMethod(java.lang.Runnable) with "SetTestClass2impl" on remote thread.
-"SetTestClass2impl" on public static void art.Test1913.NullObjectMethod(java.lang.Runnable) set value: TestClass2impl("TestClass2("Set TestClass2impl")")
-	Value is 'TestClass2impl("TestClass2("Set TestClass2impl")")' (class: class art.Test1913$TestClass2impl)
-Running public static void art.Test1913.NullInterfaceMethod(java.lang.Runnable) with "GetGetObject" on remote thread.
-"GetGetObject" on public static void art.Test1913.NullInterfaceMethod(java.lang.Runnable) got value: null
-	Value is 'null' (class: NULL)
-Running public static void art.Test1913.NullInterfaceMethod(java.lang.Runnable) with "SetNull" on remote thread.
-"SetNull" on public static void art.Test1913.NullInterfaceMethod(java.lang.Runnable) set value: null
-	Value is 'null' (class: NULL)
-Running public static void art.Test1913.NullInterfaceMethod(java.lang.Runnable) with "SetTestClass1" on remote thread.
-"SetTestClass1" on public static void art.Test1913.NullInterfaceMethod(java.lang.Runnable) set value: TestClass1("Set TestClass1")
-	Value is 'TestClass1("Set TestClass1")' (class: class art.Test1913$TestClass1)
-Running public static void art.Test1913.NullInterfaceMethod(java.lang.Runnable) with "SetTestClass1ext" on remote thread.
-"SetTestClass1ext" on public static void art.Test1913.NullInterfaceMethod(java.lang.Runnable) set value: TestClass1ext("TestClass1("Set TestClass1ext")")
-	Value is 'TestClass1ext("TestClass1("Set TestClass1ext")")' (class: class art.Test1913$TestClass1ext)
-Running public static void art.Test1913.NullInterfaceMethod(java.lang.Runnable) with "SetTestClass2" on remote thread.
-"SetTestClass2" on public static void art.Test1913.NullInterfaceMethod(java.lang.Runnable) failed to set value TestClass2("Set TestClass2") due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'null' (class: NULL)
-Running public static void art.Test1913.NullInterfaceMethod(java.lang.Runnable) with "SetTestClass2impl" on remote thread.
-"SetTestClass2impl" on public static void art.Test1913.NullInterfaceMethod(java.lang.Runnable) set value: TestClass2impl("TestClass2("Set TestClass2impl")")
-	Value is 'TestClass2impl("TestClass2("Set TestClass2impl")")' (class: class art.Test1913$TestClass2impl)
-Running public static void art.Test1913.NullSpecificClassMethod(java.lang.Runnable) with "GetGetObject" on remote thread.
-"GetGetObject" on public static void art.Test1913.NullSpecificClassMethod(java.lang.Runnable) got value: null
-	Value is 'null' (class: NULL)
-Running public static void art.Test1913.NullSpecificClassMethod(java.lang.Runnable) with "SetNull" on remote thread.
-"SetNull" on public static void art.Test1913.NullSpecificClassMethod(java.lang.Runnable) set value: null
-	Value is 'null' (class: NULL)
-Running public static void art.Test1913.NullSpecificClassMethod(java.lang.Runnable) with "SetTestClass1" on remote thread.
-"SetTestClass1" on public static void art.Test1913.NullSpecificClassMethod(java.lang.Runnable) set value: TestClass1("Set TestClass1")
-	Value is 'TestClass1("Set TestClass1")' (class: class art.Test1913$TestClass1)
-Running public static void art.Test1913.NullSpecificClassMethod(java.lang.Runnable) with "SetTestClass1ext" on remote thread.
-"SetTestClass1ext" on public static void art.Test1913.NullSpecificClassMethod(java.lang.Runnable) set value: TestClass1ext("TestClass1("Set TestClass1ext")")
-	Value is 'TestClass1ext("TestClass1("Set TestClass1ext")")' (class: class art.Test1913$TestClass1ext)
-Running public static void art.Test1913.NullSpecificClassMethod(java.lang.Runnable) with "SetTestClass2" on remote thread.
-"SetTestClass2" on public static void art.Test1913.NullSpecificClassMethod(java.lang.Runnable) failed to set value TestClass2("Set TestClass2") due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'null' (class: NULL)
-Running public static void art.Test1913.NullSpecificClassMethod(java.lang.Runnable) with "SetTestClass2impl" on remote thread.
-"SetTestClass2impl" on public static void art.Test1913.NullSpecificClassMethod(java.lang.Runnable) failed to set value TestClass2impl("TestClass2("Set TestClass2impl")") due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'null' (class: NULL)
diff --git a/test/1913-get-set-local-objects/src/art/Test1913.java b/test/1913-get-set-local-objects/src/art/Test1913.java
index df86493..417138a 100644
--- a/test/1913-get-set-local-objects/src/art/Test1913.java
+++ b/test/1913-get-set-local-objects/src/art/Test1913.java
@@ -20,15 +20,15 @@
 import java.lang.reflect.Executable;
 import java.lang.reflect.Method;
 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.concurrent.Semaphore;
-import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
+import java.util.function.Consumer;
 
 public class Test1913 {
   public static final String TARGET_VAR = "TARGET";
@@ -38,43 +38,27 @@
   }
   public static class TestClass1 implements TestInterface {
     public String id;
-    public TestClass1(String id) {
-      this.id = id;
-    }
-    public String toString() {
-      return String.format("TestClass1(\"%s\")", id);
-    }
+    public TestClass1(String id) { this.id = id; }
+    public String toString() { return String.format("TestClass1(\"%s\")", id); }
   }
 
   public static class TestClass1ext extends TestClass1 {
-    public TestClass1ext(String id) {
-      super(id);
-    }
-    public String toString() {
-      return String.format("TestClass1ext(\"%s\")", super.toString());
-    }
+    public TestClass1ext(String id) { super(id); }
+    public String toString() { return String.format("TestClass1ext(\"%s\")", super.toString()); }
   }
   public static class TestClass2 {
     public String id;
-    public TestClass2(String id) {
-      this.id = id;
-    }
-    public String toString() {
-      return String.format("TestClass2(\"%s\")", id);
-    }
+    public TestClass2(String id) { this.id = id; }
+    public String toString() { return String.format("TestClass2(\"%s\")", id); }
   }
   public static class TestClass2impl extends TestClass2 implements TestInterface {
-    public TestClass2impl(String id) {
-      super(id);
-    }
-    public String toString() {
-      return String.format("TestClass2impl(\"%s\")", super.toString());
-    }
+    public TestClass2impl(String id) { super(id); }
+    public String toString() { return String.format("TestClass2impl(\"%s\")", super.toString()); }
   }
 
   public static void reportValue(Object val) {
-    System.out.println("\tValue is '" + val +
-                       "' (class: " + (val != null ? val.getClass() : "NULL") + ")");
+    System.out.println("\tValue is '" + val + "' (class: "
+        + (val != null ? val.getClass() : "NULL") + ")");
   }
 
   public static void PrimitiveMethod(Runnable safepoint) {
@@ -84,28 +68,7 @@
   }
 
   // b/64115302: Needed to make sure that DX doesn't change the type of TARGET to TestClass1.
-  private static Object AsObject(Object o) {
-    return o;
-  }
-
-  public static void NullObjectMethod(Runnable safepoint) {
-    Object TARGET = null;
-    safepoint.run();
-    reportValue(TARGET);
-  }
-
-  public static void NullInterfaceMethod(Runnable safepoint) {
-    TestInterface TARGET = null;
-    safepoint.run();
-    reportValue(TARGET);
-  }
-
-  public static void NullSpecificClassMethod(Runnable safepoint) {
-    TestClass1 TARGET = null;
-    safepoint.run();
-    reportValue(TARGET);
-  }
-
+  private static Object AsObject(Object o) { return o; }
   public static void ObjectMethod(Runnable safepoint) {
     Object TARGET = AsObject(new TestClass1("ObjectMethod"));
     safepoint.run();
@@ -125,27 +88,31 @@
   }
 
   public static interface SafepointFunction {
-    public void
-    invoke(Thread thread, Method target, Locals.VariableDescription TARGET_desc, int depth)
-        throws Exception;
+    public void invoke(
+        Thread thread,
+        Method target,
+        Locals.VariableDescription TARGET_desc,
+        int depth) throws Exception;
   }
 
   public static interface SetterFunction {
     public void SetVar(Thread t, int depth, int slot, Object v);
   }
 
-  public static interface GetterFunction { public Object GetVar(Thread t, int depth, int slot); }
+  public static interface GetterFunction {
+    public Object GetVar(Thread t, int depth, int slot);
+  }
 
-  public static SafepointFunction
-  NamedSet(final String type, final SetterFunction get, final Object v) {
+  public static SafepointFunction NamedSet(
+      final String type, final SetterFunction get, final Object v) {
     return new SafepointFunction() {
       public void invoke(Thread t, Method method, Locals.VariableDescription desc, int depth) {
         try {
           get.SetVar(t, depth, desc.slot, v);
           System.out.println(this + " on " + method + " set value: " + v);
         } catch (Exception e) {
-          System.out.println(this + " on " + method + " failed to set value " + v + " due to " +
-                             e.getMessage());
+          System.out.println(
+              this + " on " + method + " failed to set value " + v + " due to " + e.getMessage());
         }
       }
       public String toString() {
@@ -207,13 +174,15 @@
     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(null, pause);
-        } catch (Exception e) {
-          throw new Error("Error invoking remote thread " + Thread.currentThread(), e);
-        }
-      }, "remote thread for " + target + " with " + safepoint);
+      Thread remote = new Thread(
+          () -> {
+            try {
+              target.invoke(null, 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 {
@@ -230,12 +199,14 @@
 
     private Locals.VariableDescription findTargetVar(long loc) {
       for (Locals.VariableDescription var : Locals.GetLocalVariableTable(target)) {
-        if (var.start_location <= loc && var.length + var.start_location > loc &&
+        if (var.start_location <= loc &&
+            var.length + var.start_location > loc &&
             var.name.equals(TARGET_VAR)) {
           return var;
         }
       }
-      throw new Error("Unable to find variable " + TARGET_VAR + " in " + target + " at loc " + loc);
+      throw new Error(
+          "Unable to find variable " + TARGET_VAR + " in " + target + " at loc " + loc);
     }
 
     private StackTrace.StackFrameData findStackFrame(Thread thr) {
@@ -254,27 +225,27 @@
   public static void run() throws Exception {
     Locals.EnableLocalVariableAccess();
     final TestCase[] MAIN_TEST_CASES = new TestCase[] {
-      new TestCase(getMethod("ObjectMethod")),        new TestCase(getMethod("InterfaceMethod")),
-      new TestCase(getMethod("SpecificClassMethod")), new TestCase(getMethod("PrimitiveMethod")),
-      new TestCase(getMethod("NullObjectMethod")),
-      new TestCase(getMethod("NullInterfaceMethod")),
-      new TestCase(getMethod("NullSpecificClassMethod")),
+      new TestCase(getMethod("ObjectMethod")),
+      new TestCase(getMethod("InterfaceMethod")),
+      new TestCase(getMethod("SpecificClassMethod")),
+      new TestCase(getMethod("PrimitiveMethod")),
     };
 
     final SetterFunction set_obj = Locals::SetLocalVariableObject;
     final SafepointFunction[] SAFEPOINTS = new SafepointFunction[] {
-      NamedGet("GetObject", Locals::GetLocalVariableObject),
-      NamedSet("Null", set_obj, null),
-      NamedSet("TestClass1", set_obj, new TestClass1("Set TestClass1")),
-      NamedSet("TestClass1ext", set_obj, new TestClass1ext("Set TestClass1ext")),
-      NamedSet("TestClass2", set_obj, new TestClass2("Set TestClass2")),
+      NamedGet("GetObject",      Locals::GetLocalVariableObject),
+      NamedSet("Null",           set_obj, null),
+      NamedSet("TestClass1",     set_obj, new TestClass1("Set TestClass1")),
+      NamedSet("TestClass1ext",  set_obj, new TestClass1ext("Set TestClass1ext")),
+      NamedSet("TestClass2",     set_obj, new TestClass2("Set TestClass2")),
       NamedSet("TestClass2impl", set_obj, new TestClass2impl("Set TestClass2impl")),
     };
 
-    for (TestCase t : MAIN_TEST_CASES) {
+    for (TestCase t: MAIN_TEST_CASES) {
       for (SafepointFunction s : SAFEPOINTS) {
         t.exec(s);
       }
     }
   }
 }
+
diff --git a/test/1965-get-set-local-primitive-no-tables/build b/test/1965-get-set-local-primitive-no-tables/build
deleted file mode 100644
index 6631df9..0000000
--- a/test/1965-get-set-local-primitive-no-tables/build
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash
-#
-# Copyright 2019 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.
-
-# make us exit on a failure
-set -e
-
-if [[ $@ != *"--jvm"* ]]; then
-  mv jasmin jasmin-unused
-else
-  mv smali smali-unused
-fi
-./default-build "$@" 
diff --git a/test/1965-get-set-local-primitive-no-tables/expected.txt b/test/1965-get-set-local-primitive-no-tables/expected.txt
deleted file mode 100644
index 97f8ab0..0000000
--- a/test/1965-get-set-local-primitive-no-tables/expected.txt
+++ /dev/null
@@ -1,210 +0,0 @@
-Running public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetInt" on remote thread.
-"GetInt" on public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) got value: 42
-	Value is '42' (class: class java.lang.Integer)
-Running public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetLong" on remote thread.
-"GetLong" on public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '42' (class: class java.lang.Integer)
-Running public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetFloat" on remote thread.
-"GetFloat" on public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) got value: 5.9E-44
-	Value is '42' (class: class java.lang.Integer)
-Running public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetDouble" on remote thread.
-"GetDouble" on public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '42' (class: class java.lang.Integer)
-Running public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetObject" on remote thread.
-"GetObject" on public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '42' (class: class java.lang.Integer)
-Running public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetInt" on remote thread.
-"SetInt" on public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) set value: 2147483647
-	Value is '2147483647' (class: class java.lang.Integer)
-Running public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetLong" on remote thread.
-"SetLong" on public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value 9223372036854775807 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '42' (class: class java.lang.Integer)
-Running public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetFloat" on remote thread.
-"SetFloat" on public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) set value: 9.2
-	Value is '1091777331' (class: class java.lang.Integer)
-Running public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetDouble" on remote thread.
-"SetDouble" on public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value 12.4 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '42' (class: class java.lang.Integer)
-Running public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetObject" on remote thread.
-"SetObject" on public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value NEW_VALUE_FOR_SET due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '42' (class: class java.lang.Integer)
-Running public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetNullObject" on remote thread.
-"SetNullObject" on public static void art_test.TestCases1965.IntMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value null due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '42' (class: class java.lang.Integer)
-Running public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetInt" on remote thread.
-"GetInt" on public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '9001' (class: class java.lang.Long)
-Running public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetLong" on remote thread.
-"GetLong" on public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) got value: 9001
-	Value is '9001' (class: class java.lang.Long)
-Running public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetFloat" on remote thread.
-"GetFloat" on public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '9001' (class: class java.lang.Long)
-Running public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetDouble" on remote thread.
-"GetDouble" on public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) got value: 4.447E-320
-	Value is '9001' (class: class java.lang.Long)
-Running public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetObject" on remote thread.
-"GetObject" on public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '9001' (class: class java.lang.Long)
-Running public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetInt" on remote thread.
-"SetInt" on public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value 2147483647 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '9001' (class: class java.lang.Long)
-Running public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetLong" on remote thread.
-"SetLong" on public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) set value: 9223372036854775807
-	Value is '9223372036854775807' (class: class java.lang.Long)
-Running public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetFloat" on remote thread.
-"SetFloat" on public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value 9.2 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '9001' (class: class java.lang.Long)
-Running public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetDouble" on remote thread.
-"SetDouble" on public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) set value: 12.4
-	Value is '4623170197477182669' (class: class java.lang.Long)
-Running public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetObject" on remote thread.
-"SetObject" on public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value NEW_VALUE_FOR_SET due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '9001' (class: class java.lang.Long)
-Running public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetNullObject" on remote thread.
-"SetNullObject" on public static void art_test.TestCases1965.LongMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value null due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '9001' (class: class java.lang.Long)
-Running public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetInt" on remote thread.
-"GetInt" on public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) got value: 1070537376
-	Value is '1.618' (class: class java.lang.Float)
-Running public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetLong" on remote thread.
-"GetLong" on public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '1.618' (class: class java.lang.Float)
-Running public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetFloat" on remote thread.
-"GetFloat" on public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) got value: 1.618
-	Value is '1.618' (class: class java.lang.Float)
-Running public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetDouble" on remote thread.
-"GetDouble" on public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '1.618' (class: class java.lang.Float)
-Running public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetObject" on remote thread.
-"GetObject" on public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '1.618' (class: class java.lang.Float)
-Running public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetInt" on remote thread.
-"SetInt" on public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) set value: 2147483647
-	Value is 'NaN' (class: class java.lang.Float)
-Running public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetLong" on remote thread.
-"SetLong" on public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value 9223372036854775807 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '1.618' (class: class java.lang.Float)
-Running public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetFloat" on remote thread.
-"SetFloat" on public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) set value: 9.2
-	Value is '9.2' (class: class java.lang.Float)
-Running public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetDouble" on remote thread.
-"SetDouble" on public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value 12.4 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '1.618' (class: class java.lang.Float)
-Running public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetObject" on remote thread.
-"SetObject" on public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value NEW_VALUE_FOR_SET due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '1.618' (class: class java.lang.Float)
-Running public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetNullObject" on remote thread.
-"SetNullObject" on public static void art_test.TestCases1965.FloatMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value null due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '1.618' (class: class java.lang.Float)
-Running public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetInt" on remote thread.
-"GetInt" on public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '3.1415' (class: class java.lang.Double)
-Running public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetLong" on remote thread.
-"GetLong" on public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) got value: 4614256447914709615
-	Value is '3.1415' (class: class java.lang.Double)
-Running public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetFloat" on remote thread.
-"GetFloat" on public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '3.1415' (class: class java.lang.Double)
-Running public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetDouble" on remote thread.
-"GetDouble" on public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) got value: 3.1415
-	Value is '3.1415' (class: class java.lang.Double)
-Running public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetObject" on remote thread.
-"GetObject" on public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '3.1415' (class: class java.lang.Double)
-Running public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetInt" on remote thread.
-"SetInt" on public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value 2147483647 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '3.1415' (class: class java.lang.Double)
-Running public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetLong" on remote thread.
-"SetLong" on public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) set value: 9223372036854775807
-	Value is 'NaN' (class: class java.lang.Double)
-Running public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetFloat" on remote thread.
-"SetFloat" on public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value 9.2 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '3.1415' (class: class java.lang.Double)
-Running public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetDouble" on remote thread.
-"SetDouble" on public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) set value: 12.4
-	Value is '12.4' (class: class java.lang.Double)
-Running public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetObject" on remote thread.
-"SetObject" on public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value NEW_VALUE_FOR_SET due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '3.1415' (class: class java.lang.Double)
-Running public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetNullObject" on remote thread.
-"SetNullObject" on public static void art_test.TestCases1965.DoubleMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value null due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '3.1415' (class: class java.lang.Double)
-Running public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetInt" on remote thread.
-"GetInt" on public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TARGET_VALUE' (class: class java.lang.String)
-Running public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetLong" on remote thread.
-"GetLong" on public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TARGET_VALUE' (class: class java.lang.String)
-Running public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetFloat" on remote thread.
-"GetFloat" on public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TARGET_VALUE' (class: class java.lang.String)
-Running public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetDouble" on remote thread.
-"GetDouble" on public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TARGET_VALUE' (class: class java.lang.String)
-Running public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetObject" on remote thread.
-"GetObject" on public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) got value: TARGET_VALUE
-	Value is 'TARGET_VALUE' (class: class java.lang.String)
-Running public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetInt" on remote thread.
-"SetInt" on public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value 2147483647 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TARGET_VALUE' (class: class java.lang.String)
-Running public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetLong" on remote thread.
-"SetLong" on public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value 9223372036854775807 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TARGET_VALUE' (class: class java.lang.String)
-Running public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetFloat" on remote thread.
-"SetFloat" on public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value 9.2 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TARGET_VALUE' (class: class java.lang.String)
-Running public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetDouble" on remote thread.
-"SetDouble" on public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value 12.4 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TARGET_VALUE' (class: class java.lang.String)
-Running public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetObject" on remote thread.
-"SetObject" on public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) set value: NEW_VALUE_FOR_SET
-	Value is 'NEW_VALUE_FOR_SET' (class: class java.lang.String)
-Running public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetNullObject" on remote thread.
-"SetNullObject" on public static void art_test.TestCases1965.ObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) set value: null
-	Value is 'null' (class: null)
-Running public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetInt" on remote thread.
-"GetInt" on public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) got value: 0
-	Value is 'null' (class: null)
-Running public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetLong" on remote thread.
-"GetLong" on public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'null' (class: null)
-Running public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetFloat" on remote thread.
-"GetFloat" on public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) got value: 0.0
-	Value is 'null' (class: null)
-Running public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetDouble" on remote thread.
-"GetDouble" on public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'null' (class: null)
-Running public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "GetObject" on remote thread.
-"GetObject" on public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) got value: null
-	Value is 'null' (class: null)
-Running public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetInt" on remote thread.
-"SetInt" on public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value 2147483647 due to JVMTI_ERROR_INTERNAL
-	Value is 'null' (class: null)
-Running public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetLong" on remote thread.
-"SetLong" on public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value 9223372036854775807 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'null' (class: null)
-Running public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetFloat" on remote thread.
-"SetFloat" on public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value 9.2 due to JVMTI_ERROR_INTERNAL
-	Value is 'null' (class: null)
-Running public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetDouble" on remote thread.
-"SetDouble" on public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value 12.4 due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'null' (class: null)
-Running public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetObject" on remote thread.
-"SetObject" on public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value NEW_VALUE_FOR_SET due to JVMTI_ERROR_INTERNAL
-	Value is 'null' (class: null)
-Running public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetNullObject" on remote thread.
-"SetNullObject" on public static void art_test.TestCases1965.NullObjectMethod(java.util.function.IntConsumer,java.util.function.Consumer) set value: null
-	Value is 'null' (class: null)
-Running public static void art_test.TestCases1965.BooleanMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetIntBoolSize" on remote thread.
-"SetIntBoolSize" on public static void art_test.TestCases1965.BooleanMethod(java.util.function.IntConsumer,java.util.function.Consumer) failed to set value 1 due to JVMTI_ERROR_INTERNAL
-	Value is 'false' (class: class java.lang.Boolean)
-Running public static void art_test.TestCases1965.ByteMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetIntByteSize" on remote thread.
-"SetIntByteSize" on public static void art_test.TestCases1965.ByteMethod(java.util.function.IntConsumer,java.util.function.Consumer) set value: 126
-	Value is '126' (class: class java.lang.Byte)
-Running public static void art_test.TestCases1965.CharMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetIntCharSize" on remote thread.
-"SetIntCharSize" on public static void art_test.TestCases1965.CharMethod(java.util.function.IntConsumer,java.util.function.Consumer) set value: 65534
-	Value is '<Char: -1>' (class: class java.lang.String)
-Running public static void art_test.TestCases1965.ShortMethod(java.util.function.IntConsumer,java.util.function.Consumer) with "SetIntShortSize" on remote thread.
-"SetIntShortSize" on public static void art_test.TestCases1965.ShortMethod(java.util.function.IntConsumer,java.util.function.Consumer) set value: 32766
-	Value is '32766' (class: class java.lang.Short)
diff --git a/test/1965-get-set-local-primitive-no-tables/info.txt b/test/1965-get-set-local-primitive-no-tables/info.txt
deleted file mode 100644
index 87a7b35..0000000
--- a/test/1965-get-set-local-primitive-no-tables/info.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Tests for jvmti get/set Local variable primitives.
-
diff --git a/test/1965-get-set-local-primitive-no-tables/jasmin/TestCases1965.j b/test/1965-get-set-local-primitive-no-tables/jasmin/TestCases1965.j
deleted file mode 100644
index 6374262..0000000
--- a/test/1965-get-set-local-primitive-no-tables/jasmin/TestCases1965.j
+++ /dev/null
@@ -1,173 +0,0 @@
-; Copyright (C) 2019 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.
-
-.class public final art_test/TestCases1965
-.super java/lang/Object
-
-.method public <init>()V
-  .limit stack 1
-  .limit locals 1
-  0: aload_0
-  1: invokespecial java/lang/Object/<init>()V
-  4: return
-.end method
-
-; NB We limit locals 4 so that every method has space to fit a long/double in it.
-.method public static NullObjectMethod(Ljava/util/function/IntConsumer;Ljava/util/function/Consumer;)V
-  .limit stack 2
-  .limit locals 4
-  0: aconst_null
-  1: astore_2
-  2: aload_0
-  3: sipush 2
-  6: invokeinterface java/util/function/IntConsumer/accept(I)V 2
-  11: aload_1
-  12: aload_2
-  13: invokeinterface java/util/function/Consumer/accept(Ljava/lang/Object;)V 2
-  18: return
-.end method
-
-.method public static ObjectMethod(Ljava/util/function/IntConsumer;Ljava/util/function/Consumer;)V
-  .limit stack 2
-  .limit locals 4
-  0: ldc "TARGET_VALUE"
-  2: astore_2
-  3: aload_0
-  4: sipush 2
-  7: invokeinterface java/util/function/IntConsumer/accept(I)V 2
-  12: aload_1
-  13: aload_2
-  14: invokeinterface java/util/function/Consumer/accept(Ljava/lang/Object;)V 2
-  19: return
-.end method
-
-.method public static BooleanMethod(Ljava/util/function/IntConsumer;Ljava/util/function/Consumer;)V
-  .limit stack 2
-  .limit locals 4
-  0: iconst_0
-  1: istore_2
-  2: aload_0
-  3: sipush 2
-  6: invokeinterface java/util/function/IntConsumer/accept(I)V 2
-  11: aload_1
-  12: iload_2
-  13: invokestatic java/lang/Boolean/valueOf(Z)Ljava/lang/Boolean;
-  16: invokeinterface java/util/function/Consumer/accept(Ljava/lang/Object;)V 2
-  21: return
-.end method
-
-.method public static ByteMethod(Ljava/util/function/IntConsumer;Ljava/util/function/Consumer;)V
-  .limit stack 2
-  .limit locals 4
-  0: bipush 8
-  2: istore_2
-  3: aload_0
-  4: sipush 2
-  7: invokeinterface java/util/function/IntConsumer/accept(I)V 2
-  12: aload_1
-  13: iload_2
-  14: invokestatic java/lang/Byte/valueOf(B)Ljava/lang/Byte;
-  17: invokeinterface java/util/function/Consumer/accept(Ljava/lang/Object;)V 2
-  22: return
-.end method
-
-.method public static CharMethod(Ljava/util/function/IntConsumer;Ljava/util/function/Consumer;)V
-  .limit stack 2
-  .limit locals 4
-  0: bipush 113
-  2: istore_2
-  3: aload_0
-  4: sipush 2
-  7: invokeinterface java/util/function/IntConsumer/accept(I)V 2
-  12: aload_1
-  13: iload_2
-  14: invokestatic java/lang/Character/valueOf(C)Ljava/lang/Character;
-  17: invokeinterface java/util/function/Consumer/accept(Ljava/lang/Object;)V 2
-  22: return
-.end method
-
-.method public static ShortMethod(Ljava/util/function/IntConsumer;Ljava/util/function/Consumer;)V
-  .limit stack 2
-  .limit locals 4
-  0: sipush 321
-  3: istore_2
-  4: aload_0
-  5: sipush 2
-  8: invokeinterface java/util/function/IntConsumer/accept(I)V 2
-  13: aload_1
-  14: iload_2
-  15: invokestatic java/lang/Short/valueOf(S)Ljava/lang/Short;
-  18: invokeinterface java/util/function/Consumer/accept(Ljava/lang/Object;)V 2
-  23: return
-.end method
-
-.method public static IntMethod(Ljava/util/function/IntConsumer;Ljava/util/function/Consumer;)V
-  .limit stack 2
-  .limit locals 4
-  0: bipush 42
-  2: istore_2
-  3: aload_0
-  4: sipush 2
-  7: invokeinterface java/util/function/IntConsumer/accept(I)V 2
-  12: aload_1
-  13: iload_2
-  14: invokestatic java/lang/Integer/valueOf(I)Ljava/lang/Integer;
-  17: invokeinterface java/util/function/Consumer/accept(Ljava/lang/Object;)V 2
-  22: return
-.end method
-
-.method public static LongMethod(Ljava/util/function/IntConsumer;Ljava/util/function/Consumer;)V
-  .limit stack 3
-  .limit locals 4
-  0: ldc2_w 9001
-  3: lstore_2
-  4: aload_0
-  5: sipush 2
-  8: invokeinterface java/util/function/IntConsumer/accept(I)V 2
-  13: aload_1
-  14: lload_2
-  15: invokestatic java/lang/Long/valueOf(J)Ljava/lang/Long;
-  18: invokeinterface java/util/function/Consumer/accept(Ljava/lang/Object;)V 2
-  23: return
-.end method
-
-.method public static FloatMethod(Ljava/util/function/IntConsumer;Ljava/util/function/Consumer;)V
-  .limit stack 2
-  .limit locals 4
-  0: ldc 1.618
-  2: fstore_2
-  3: aload_0
-  4: sipush 2
-  7: invokeinterface java/util/function/IntConsumer/accept(I)V 2
-  12: aload_1
-  13: fload_2
-  14: invokestatic java/lang/Float/valueOf(F)Ljava/lang/Float;
-  17: invokeinterface java/util/function/Consumer/accept(Ljava/lang/Object;)V 2
-  22: return
-.end method
-
-.method public static DoubleMethod(Ljava/util/function/IntConsumer;Ljava/util/function/Consumer;)V
-  .limit stack 3
-  .limit locals 4
-  0: ldc2_w 3.1415
-  3: dstore_2
-  4: aload_0
-  5: sipush 2
-  8: invokeinterface java/util/function/IntConsumer/accept(I)V 2
-  13: aload_1
-  14: dload_2
-  15: invokestatic java/lang/Double/valueOf(D)Ljava/lang/Double;
-  18: invokeinterface java/util/function/Consumer/accept(Ljava/lang/Object;)V 2
-  23: return
-.end method
diff --git a/test/1965-get-set-local-primitive-no-tables/run b/test/1965-get-set-local-primitive-no-tables/run
deleted file mode 100755
index 9b741ee..0000000
--- a/test/1965-get-set-local-primitive-no-tables/run
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-#
-# Copyright 2019 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.
-
-# If we compile the .oat files non-debuggable we could end up with dex2dex running over the files
-# which will cause some instructions to be removed from smali/TestCases1966.smali. This test relies
-# on the instructions being exactly as written so pass --debuggable to 'dex2oat' only to prevent
-# this from happening.
-./default-run "$@" --jvmti --compiler-only-option --debuggable
diff --git a/test/1965-get-set-local-primitive-no-tables/smali/TestCases1965.smali b/test/1965-get-set-local-primitive-no-tables/smali/TestCases1965.smali
deleted file mode 100644
index 29aa08c..0000000
--- a/test/1965-get-set-local-primitive-no-tables/smali/TestCases1965.smali
+++ /dev/null
@@ -1,140 +0,0 @@
-# Copyright (C) 2019 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.
-
-.class public final Lart_test/TestCases1965;
-.super Ljava/lang/Object;
-
-
-# direct methods
-.method public constructor <init>()V
-    .registers 1
-    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
-    return-void
-.end method
-
-.method public static BooleanMethod(Ljava/util/function/IntConsumer;Ljava/util/function/Consumer;)V
-    .registers 4
-    const/4 v0, 0x0
-    # Slot for value.
-    const/16 v1, 0x0
-    invoke-interface {p0, v1}, Ljava/util/function/IntConsumer;->accept(I)V
-    invoke-static {v0}, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;
-    move-result-object v1
-    invoke-interface {p1, v1}, Ljava/util/function/Consumer;->accept(Ljava/lang/Object;)V
-    return-void
-.end method
-
-.method public static ByteMethod(Ljava/util/function/IntConsumer;Ljava/util/function/Consumer;)V
-    .registers 4
-    const/16 v0, 0x8
-    # Slot for value.
-    const/16 v1, 0x0
-    invoke-interface {p0, v1}, Ljava/util/function/IntConsumer;->accept(I)V
-    invoke-static {v0}, Ljava/lang/Byte;->valueOf(B)Ljava/lang/Byte;
-    move-result-object v1
-    invoke-interface {p1, v1}, Ljava/util/function/Consumer;->accept(Ljava/lang/Object;)V
-    return-void
-.end method
-
-.method public static CharMethod(Ljava/util/function/IntConsumer;Ljava/util/function/Consumer;)V
-    .registers 4
-    const/16 v0, 0x71
-    # Slot for value
-    const/16 v1, 0x0
-    invoke-interface {p0, v1}, Ljava/util/function/IntConsumer;->accept(I)V
-    invoke-static {v0}, Ljava/lang/Character;->valueOf(C)Ljava/lang/Character;
-    move-result-object v1
-    invoke-interface {p1, v1}, Ljava/util/function/Consumer;->accept(Ljava/lang/Object;)V
-    return-void
-.end method
-
-.method public static DoubleMethod(Ljava/util/function/IntConsumer;Ljava/util/function/Consumer;)V
-    .registers 5
-    const-wide v0, 0x400921cac083126fL    # 3.1415
-    # Slot for value
-    const/16 v2, 0x0
-    invoke-interface {p0, v2}, Ljava/util/function/IntConsumer;->accept(I)V
-    invoke-static {v0, v1}, Ljava/lang/Double;->valueOf(D)Ljava/lang/Double;
-    move-result-object v2
-    invoke-interface {p1, v2}, Ljava/util/function/Consumer;->accept(Ljava/lang/Object;)V
-    return-void
-.end method
-
-.method public static FloatMethod(Ljava/util/function/IntConsumer;Ljava/util/function/Consumer;)V
-    .registers 4
-    const v0, 0x3fcf1aa0    # 1.618f
-    # Slot for value
-    const/16 v1, 0x0
-    invoke-interface {p0, v1}, Ljava/util/function/IntConsumer;->accept(I)V
-    invoke-static {v0}, Ljava/lang/Float;->valueOf(F)Ljava/lang/Float;
-    move-result-object v1
-    invoke-interface {p1, v1}, Ljava/util/function/Consumer;->accept(Ljava/lang/Object;)V
-    return-void
-.end method
-
-.method public static IntMethod(Ljava/util/function/IntConsumer;Ljava/util/function/Consumer;)V
-    .registers 4
-    const/16 v0, 0x2a
-    # Slot for value
-    const/16 v1, 0x0
-    invoke-interface {p0, v1}, Ljava/util/function/IntConsumer;->accept(I)V
-    invoke-static {v0}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
-    move-result-object v1
-    invoke-interface {p1, v1}, Ljava/util/function/Consumer;->accept(Ljava/lang/Object;)V
-    return-void
-.end method
-
-.method public static LongMethod(Ljava/util/function/IntConsumer;Ljava/util/function/Consumer;)V
-    .registers 5
-    const-wide/16 v0, 0x2329
-    # Slot for value
-    const/16 v2, 0x0
-    invoke-interface {p0, v2}, Ljava/util/function/IntConsumer;->accept(I)V
-    invoke-static {v0, v1}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;
-    move-result-object v2
-    invoke-interface {p1, v2}, Ljava/util/function/Consumer;->accept(Ljava/lang/Object;)V
-    return-void
-.end method
-
-.method public static NullObjectMethod(Ljava/util/function/IntConsumer;Ljava/util/function/Consumer;)V
-    .registers 4
-    const/4 v0, 0x0
-    # Slot for value
-    const/16 v1, 0x0
-    invoke-interface {p0, v1}, Ljava/util/function/IntConsumer;->accept(I)V
-    invoke-interface {p1, v0}, Ljava/util/function/Consumer;->accept(Ljava/lang/Object;)V
-    return-void
-.end method
-
-.method public static ObjectMethod(Ljava/util/function/IntConsumer;Ljava/util/function/Consumer;)V
-    .registers 4
-    const-string v0, "TARGET_VALUE"
-    # Slot for value
-    const/16 v1, 0x0
-    invoke-interface {p0, v1}, Ljava/util/function/IntConsumer;->accept(I)V
-    invoke-interface {p1, v0}, Ljava/util/function/Consumer;->accept(Ljava/lang/Object;)V
-    return-void
-.end method
-
-.method public static ShortMethod(Ljava/util/function/IntConsumer;Ljava/util/function/Consumer;)V
-    .registers 4
-    const/16 v0, 0x141
-    # slot for value
-    const/16 v1, 0x0
-    invoke-interface {p0, v1}, Ljava/util/function/IntConsumer;->accept(I)V
-    invoke-static {v0}, Ljava/lang/Short;->valueOf(S)Ljava/lang/Short;
-    move-result-object v1
-    invoke-interface {p1, v1}, Ljava/util/function/Consumer;->accept(Ljava/lang/Object;)V
-    return-void
-.end method
diff --git a/test/1965-get-set-local-primitive-no-tables/src/Main.java b/test/1965-get-set-local-primitive-no-tables/src/Main.java
deleted file mode 100644
index 73ce85f..0000000
--- a/test/1965-get-set-local-primitive-no-tables/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.Test1965.run();
-  }
-}
diff --git a/test/1965-get-set-local-primitive-no-tables/src/art/Breakpoint.java b/test/1965-get-set-local-primitive-no-tables/src/art/Breakpoint.java
deleted file mode 120000
index 3673916..0000000
--- a/test/1965-get-set-local-primitive-no-tables/src/art/Breakpoint.java
+++ /dev/null
@@ -1 +0,0 @@
-../../../jvmti-common/Breakpoint.java
\ No newline at end of file
diff --git a/test/1965-get-set-local-primitive-no-tables/src/art/Locals.java b/test/1965-get-set-local-primitive-no-tables/src/art/Locals.java
deleted file mode 120000
index 2998386..0000000
--- a/test/1965-get-set-local-primitive-no-tables/src/art/Locals.java
+++ /dev/null
@@ -1 +0,0 @@
-../../../jvmti-common/Locals.java
\ No newline at end of file
diff --git a/test/1965-get-set-local-primitive-no-tables/src/art/StackTrace.java b/test/1965-get-set-local-primitive-no-tables/src/art/StackTrace.java
deleted file mode 120000
index e1a08aa..0000000
--- a/test/1965-get-set-local-primitive-no-tables/src/art/StackTrace.java
+++ /dev/null
@@ -1 +0,0 @@
-../../../jvmti-common/StackTrace.java
\ No newline at end of file
diff --git a/test/1965-get-set-local-primitive-no-tables/src/art/Suspension.java b/test/1965-get-set-local-primitive-no-tables/src/art/Suspension.java
deleted file mode 120000
index bcef96f..0000000
--- a/test/1965-get-set-local-primitive-no-tables/src/art/Suspension.java
+++ /dev/null
@@ -1 +0,0 @@
-../../../jvmti-common/Suspension.java
\ No newline at end of file
diff --git a/test/1965-get-set-local-primitive-no-tables/src/art/Test1965.java b/test/1965-get-set-local-primitive-no-tables/src/art/Test1965.java
deleted file mode 100644
index f516d18..0000000
--- a/test/1965-get-set-local-primitive-no-tables/src/art/Test1965.java
+++ /dev/null
@@ -1,213 +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.Method;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.Semaphore;
-import java.util.function.Consumer;
-import java.util.function.Function;
-import java.util.function.IntConsumer;
-import java.util.function.IntFunction;
-import java.util.function.Predicate;
-import java.util.function.Supplier;
-
-public class Test1965 {
-  public static final String TARGET_VAR = "TARGET";
-
-  public static void reportValue(Object val) {
-    if (val instanceof Character) {
-      val = "<Char: " + Character.getNumericValue(((Character)val).charValue()) + ">";
-    }
-    System.out.println("\tValue is '" + val +
-                       "' (class: " + (val != null ? val.getClass().toString() : "null") + ")");
-  }
-
-  public static interface SafepointFunction {
-    public void invoke(Thread thread, Method target, int slot, int depth) throws Exception;
-  }
-
-  public static interface SetterFunction {
-    public void SetVar(Thread t, int depth, int slot, Object v);
-  }
-
-  public static interface GetterFunction { public Object GetVar(Thread t, int depth, int slot); }
-
-  public static SafepointFunction
-  NamedSet(final String type, final SetterFunction get, final Object v) {
-    return new SafepointFunction() {
-      public void invoke(Thread t, Method method, int slot, int depth) {
-        try {
-          get.SetVar(t, depth, slot, v);
-          System.out.println(this + " on " + method + " set value: " + v);
-        } catch (Exception e) {
-          System.out.println(this + " on " + method + " failed to set value " + v + " due to " +
-                             e.getMessage());
-        }
-      }
-      public String toString() {
-        return "\"Set" + type + "\"";
-      }
-    };
-  }
-
-  public static SafepointFunction NamedGet(final String type, final GetterFunction get) {
-    return new SafepointFunction() {
-      public void invoke(Thread t, Method method, int slot, int depth) {
-        try {
-          Object res = get.GetVar(t, depth, slot);
-          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 Method target;
-
-    public TestCase(Method target) {
-      this.target = target;
-    }
-
-    public static class ThreadPauser implements IntConsumer {
-      public final Semaphore sem_wakeup_main;
-      public final Semaphore sem_wait;
-      public int slot = -1;
-
-      public ThreadPauser() {
-        sem_wakeup_main = new Semaphore(0);
-        sem_wait = new Semaphore(0);
-      }
-
-      public void accept(int v) {
-        try {
-          slot = v;
-          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();
-      final Consumer<?> reporter = Test1965::reportValue;
-      Thread remote = new Thread(() -> {
-        try {
-          target.invoke(null, pause, reporter);
-        } 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, pause.slot, frame.depth);
-      } finally {
-        Suspension.resume(remote);
-        pause.wakeupOtherThread();
-        remote.join();
-      }
-    }
-
-    private Locals.VariableDescription findTargetVar(long loc) {
-      for (Locals.VariableDescription var : Locals.GetLocalVariableTable(target)) {
-        if (var.start_location <= loc && var.length + var.start_location > loc &&
-            var.name.equals(TARGET_VAR)) {
-          return var;
-        }
-      }
-      throw new Error("Unable to find variable " + TARGET_VAR + " in " + target + " at loc " + loc);
-    }
-
-    private StackTrace.StackFrameData findStackFrame(Thread thr) {
-      for (StackTrace.StackFrameData frame : StackTrace.GetStackTrace(thr)) {
-        if (frame.method.equals(target)) {
-          return frame;
-        }
-      }
-      throw new Error("Unable to find stack frame in method " + target + " on thread " + thr);
-    }
-  }
-  public static Method getMethod(String name) throws Exception {
-    return Class.forName("art_test.TestCases1965")
-        .getDeclaredMethod(name, IntConsumer.class, Consumer.class);
-  }
-
-  public static void run() throws Exception {
-    Locals.EnableLocalVariableAccess();
-    final TestCase[] MAIN_TEST_CASES = new TestCase[] {
-      new TestCase(getMethod("IntMethod")),    new TestCase(getMethod("LongMethod")),
-      new TestCase(getMethod("FloatMethod")),  new TestCase(getMethod("DoubleMethod")),
-      new TestCase(getMethod("ObjectMethod")), new TestCase(getMethod("NullObjectMethod")),
-    };
-
-    final SafepointFunction[] SAFEPOINTS = new SafepointFunction[] {
-      NamedGet("Int", Locals::GetLocalVariableInt),
-      NamedGet("Long", Locals::GetLocalVariableLong),
-      NamedGet("Float", Locals::GetLocalVariableFloat),
-      NamedGet("Double", Locals::GetLocalVariableDouble),
-      NamedGet("Object", Locals::GetLocalVariableObject),
-      NamedSet("Int", Locals::SetLocalVariableInt, Integer.MAX_VALUE),
-      NamedSet("Long", Locals::SetLocalVariableLong, Long.MAX_VALUE),
-      NamedSet("Float", Locals::SetLocalVariableFloat, 9.2f),
-      NamedSet("Double", Locals::SetLocalVariableDouble, 12.4d),
-      NamedSet("Object", Locals::SetLocalVariableObject, "NEW_VALUE_FOR_SET"),
-      NamedSet("NullObject", Locals::SetLocalVariableObject, null),
-    };
-
-    for (TestCase t : MAIN_TEST_CASES) {
-      for (SafepointFunction s : SAFEPOINTS) {
-        t.exec(s);
-      }
-    }
-
-    // Test int for small values.
-    new TestCase(getMethod("BooleanMethod"))
-        .exec(NamedSet("IntBoolSize", Locals::SetLocalVariableInt, 1));
-    new TestCase(getMethod("ByteMethod"))
-        .exec(NamedSet("IntByteSize", Locals::SetLocalVariableInt, Byte.MAX_VALUE - 1));
-
-    new TestCase(getMethod("CharMethod"))
-        .exec(NamedSet("IntCharSize", Locals::SetLocalVariableInt, Character.MAX_VALUE - 1));
-    new TestCase(getMethod("ShortMethod"))
-        .exec(NamedSet("IntShortSize", Locals::SetLocalVariableInt, Short.MAX_VALUE - 1));
-  }
-}
diff --git a/test/1966-get-set-local-objects-no-table/build b/test/1966-get-set-local-objects-no-table/build
deleted file mode 100644
index 6631df9..0000000
--- a/test/1966-get-set-local-objects-no-table/build
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash
-#
-# Copyright 2019 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.
-
-# make us exit on a failure
-set -e
-
-if [[ $@ != *"--jvm"* ]]; then
-  mv jasmin jasmin-unused
-else
-  mv smali smali-unused
-fi
-./default-build "$@" 
diff --git a/test/1966-get-set-local-objects-no-table/expected.txt b/test/1966-get-set-local-objects-no-table/expected.txt
deleted file mode 100644
index f24dfe7..0000000
--- a/test/1966-get-set-local-objects-no-table/expected.txt
+++ /dev/null
@@ -1,162 +0,0 @@
-Running public static void art_test.TestCases1966.ObjectMethod(java.util.function.IntConsumer) with "GetGetObject" on remote thread.
-"GetGetObject" on public static void art_test.TestCases1966.ObjectMethod(java.util.function.IntConsumer) got value: TestClass1("ObjectMethod")
-	Value is 'TestClass1("ObjectMethod")' (class: class art.Test1966$TestClass1)
-Running public static void art_test.TestCases1966.ObjectMethod(java.util.function.IntConsumer) with "SetNull" on remote thread.
-"SetNull" on public static void art_test.TestCases1966.ObjectMethod(java.util.function.IntConsumer) set value: null
-	Value is 'null' (class: NULL)
-Running public static void art_test.TestCases1966.ObjectMethod(java.util.function.IntConsumer) with "SetTestClass1" on remote thread.
-"SetTestClass1" on public static void art_test.TestCases1966.ObjectMethod(java.util.function.IntConsumer) set value: TestClass1("Set TestClass1")
-	Value is 'TestClass1("Set TestClass1")' (class: class art.Test1966$TestClass1)
-Running public static void art_test.TestCases1966.ObjectMethod(java.util.function.IntConsumer) with "SetTestClass1ext" on remote thread.
-"SetTestClass1ext" on public static void art_test.TestCases1966.ObjectMethod(java.util.function.IntConsumer) set value: TestClass1ext("TestClass1("Set TestClass1ext")")
-	Value is 'TestClass1ext("TestClass1("Set TestClass1ext")")' (class: class art.Test1966$TestClass1ext)
-Running public static void art_test.TestCases1966.ObjectMethod(java.util.function.IntConsumer) with "SetTestClass2" on remote thread.
-"SetTestClass2" on public static void art_test.TestCases1966.ObjectMethod(java.util.function.IntConsumer) set value: TestClass2("Set TestClass2")
-	Value is 'TestClass2("Set TestClass2")' (class: class art.Test1966$TestClass2)
-Running public static void art_test.TestCases1966.ObjectMethod(java.util.function.IntConsumer) with "SetTestClass2impl" on remote thread.
-"SetTestClass2impl" on public static void art_test.TestCases1966.ObjectMethod(java.util.function.IntConsumer) set value: TestClass2impl("TestClass2("Set TestClass2impl")")
-	Value is 'TestClass2impl("TestClass2("Set TestClass2impl")")' (class: class art.Test1966$TestClass2impl)
-Running public static void art_test.TestCases1966.CastInterfaceMethod(java.util.function.IntConsumer) with "GetGetObject" on remote thread.
-"GetGetObject" on public static void art_test.TestCases1966.CastInterfaceMethod(java.util.function.IntConsumer) got value: TestClass1("ObjectMethod")
-	Value is 'TestClass1("ObjectMethod")' (class: class art.Test1966$TestClass1)
-Running public static void art_test.TestCases1966.CastInterfaceMethod(java.util.function.IntConsumer) with "SetNull" on remote thread.
-"SetNull" on public static void art_test.TestCases1966.CastInterfaceMethod(java.util.function.IntConsumer) set value: null
-	Value is 'null' (class: NULL)
-Running public static void art_test.TestCases1966.CastInterfaceMethod(java.util.function.IntConsumer) with "SetTestClass1" on remote thread.
-"SetTestClass1" on public static void art_test.TestCases1966.CastInterfaceMethod(java.util.function.IntConsumer) set value: TestClass1("Set TestClass1")
-	Value is 'TestClass1("Set TestClass1")' (class: class art.Test1966$TestClass1)
-Running public static void art_test.TestCases1966.CastInterfaceMethod(java.util.function.IntConsumer) with "SetTestClass1ext" on remote thread.
-"SetTestClass1ext" on public static void art_test.TestCases1966.CastInterfaceMethod(java.util.function.IntConsumer) set value: TestClass1ext("TestClass1("Set TestClass1ext")")
-	Value is 'TestClass1ext("TestClass1("Set TestClass1ext")")' (class: class art.Test1966$TestClass1ext)
-Running public static void art_test.TestCases1966.CastInterfaceMethod(java.util.function.IntConsumer) with "SetTestClass2" on remote thread.
-"SetTestClass2" on public static void art_test.TestCases1966.CastInterfaceMethod(java.util.function.IntConsumer) failed to set value TestClass2("Set TestClass2") due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TestClass1("ObjectMethod")' (class: class art.Test1966$TestClass1)
-Running public static void art_test.TestCases1966.CastInterfaceMethod(java.util.function.IntConsumer) with "SetTestClass2impl" on remote thread.
-"SetTestClass2impl" on public static void art_test.TestCases1966.CastInterfaceMethod(java.util.function.IntConsumer) failed to set value TestClass2impl("TestClass2("Set TestClass2impl")") due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TestClass1("ObjectMethod")' (class: class art.Test1966$TestClass1)
-Running public static void art_test.TestCases1966.CastExactMethod(java.util.function.IntConsumer) with "GetGetObject" on remote thread.
-"GetGetObject" on public static void art_test.TestCases1966.CastExactMethod(java.util.function.IntConsumer) got value: TestClass1("ObjectMethod")
-	Value is 'TestClass1("ObjectMethod")' (class: class art.Test1966$TestClass1)
-Running public static void art_test.TestCases1966.CastExactMethod(java.util.function.IntConsumer) with "SetNull" on remote thread.
-"SetNull" on public static void art_test.TestCases1966.CastExactMethod(java.util.function.IntConsumer) set value: null
-	Value is 'null' (class: NULL)
-Running public static void art_test.TestCases1966.CastExactMethod(java.util.function.IntConsumer) with "SetTestClass1" on remote thread.
-"SetTestClass1" on public static void art_test.TestCases1966.CastExactMethod(java.util.function.IntConsumer) set value: TestClass1("Set TestClass1")
-	Value is 'TestClass1("Set TestClass1")' (class: class art.Test1966$TestClass1)
-Running public static void art_test.TestCases1966.CastExactMethod(java.util.function.IntConsumer) with "SetTestClass1ext" on remote thread.
-"SetTestClass1ext" on public static void art_test.TestCases1966.CastExactMethod(java.util.function.IntConsumer) set value: TestClass1ext("TestClass1("Set TestClass1ext")")
-	Value is 'TestClass1ext("TestClass1("Set TestClass1ext")")' (class: class art.Test1966$TestClass1ext)
-Running public static void art_test.TestCases1966.CastExactMethod(java.util.function.IntConsumer) with "SetTestClass2" on remote thread.
-"SetTestClass2" on public static void art_test.TestCases1966.CastExactMethod(java.util.function.IntConsumer) failed to set value TestClass2("Set TestClass2") due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TestClass1("ObjectMethod")' (class: class art.Test1966$TestClass1)
-Running public static void art_test.TestCases1966.CastExactMethod(java.util.function.IntConsumer) with "SetTestClass2impl" on remote thread.
-"SetTestClass2impl" on public static void art_test.TestCases1966.CastExactMethod(java.util.function.IntConsumer) failed to set value TestClass2impl("TestClass2("Set TestClass2impl")") due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TestClass1("ObjectMethod")' (class: class art.Test1966$TestClass1)
-Running public static void art_test.TestCases1966.InterfaceMethod(java.util.function.IntConsumer) with "GetGetObject" on remote thread.
-"GetGetObject" on public static void art_test.TestCases1966.InterfaceMethod(java.util.function.IntConsumer) got value: TestClass1("InterfaceMethod")
-	Value is 'TestClass1("InterfaceMethod")' (class: class art.Test1966$TestClass1)
-Running public static void art_test.TestCases1966.InterfaceMethod(java.util.function.IntConsumer) with "SetNull" on remote thread.
-"SetNull" on public static void art_test.TestCases1966.InterfaceMethod(java.util.function.IntConsumer) set value: null
-	Value is 'null' (class: NULL)
-Running public static void art_test.TestCases1966.InterfaceMethod(java.util.function.IntConsumer) with "SetTestClass1" on remote thread.
-"SetTestClass1" on public static void art_test.TestCases1966.InterfaceMethod(java.util.function.IntConsumer) set value: TestClass1("Set TestClass1")
-	Value is 'TestClass1("Set TestClass1")' (class: class art.Test1966$TestClass1)
-Running public static void art_test.TestCases1966.InterfaceMethod(java.util.function.IntConsumer) with "SetTestClass1ext" on remote thread.
-"SetTestClass1ext" on public static void art_test.TestCases1966.InterfaceMethod(java.util.function.IntConsumer) set value: TestClass1ext("TestClass1("Set TestClass1ext")")
-	Value is 'TestClass1ext("TestClass1("Set TestClass1ext")")' (class: class art.Test1966$TestClass1ext)
-Running public static void art_test.TestCases1966.InterfaceMethod(java.util.function.IntConsumer) with "SetTestClass2" on remote thread.
-"SetTestClass2" on public static void art_test.TestCases1966.InterfaceMethod(java.util.function.IntConsumer) failed to set value TestClass2("Set TestClass2") due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TestClass1("InterfaceMethod")' (class: class art.Test1966$TestClass1)
-Running public static void art_test.TestCases1966.InterfaceMethod(java.util.function.IntConsumer) with "SetTestClass2impl" on remote thread.
-"SetTestClass2impl" on public static void art_test.TestCases1966.InterfaceMethod(java.util.function.IntConsumer) set value: TestClass2impl("TestClass2("Set TestClass2impl")")
-	Value is 'TestClass2impl("TestClass2("Set TestClass2impl")")' (class: class art.Test1966$TestClass2impl)
-Running public static void art_test.TestCases1966.ExactClassMethod(java.util.function.IntConsumer) with "GetGetObject" on remote thread.
-"GetGetObject" on public static void art_test.TestCases1966.ExactClassMethod(java.util.function.IntConsumer) got value: TestClass1("SpecificClassMethod")
-	Value is 'TestClass1("SpecificClassMethod")' (class: class art.Test1966$TestClass1)
-Running public static void art_test.TestCases1966.ExactClassMethod(java.util.function.IntConsumer) with "SetNull" on remote thread.
-"SetNull" on public static void art_test.TestCases1966.ExactClassMethod(java.util.function.IntConsumer) set value: null
-	Value is 'null' (class: NULL)
-Running public static void art_test.TestCases1966.ExactClassMethod(java.util.function.IntConsumer) with "SetTestClass1" on remote thread.
-"SetTestClass1" on public static void art_test.TestCases1966.ExactClassMethod(java.util.function.IntConsumer) set value: TestClass1("Set TestClass1")
-	Value is 'TestClass1("Set TestClass1")' (class: class art.Test1966$TestClass1)
-Running public static void art_test.TestCases1966.ExactClassMethod(java.util.function.IntConsumer) with "SetTestClass1ext" on remote thread.
-"SetTestClass1ext" on public static void art_test.TestCases1966.ExactClassMethod(java.util.function.IntConsumer) set value: TestClass1ext("TestClass1("Set TestClass1ext")")
-	Value is 'TestClass1ext("TestClass1("Set TestClass1ext")")' (class: class art.Test1966$TestClass1ext)
-Running public static void art_test.TestCases1966.ExactClassMethod(java.util.function.IntConsumer) with "SetTestClass2" on remote thread.
-"SetTestClass2" on public static void art_test.TestCases1966.ExactClassMethod(java.util.function.IntConsumer) failed to set value TestClass2("Set TestClass2") due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TestClass1("SpecificClassMethod")' (class: class art.Test1966$TestClass1)
-Running public static void art_test.TestCases1966.ExactClassMethod(java.util.function.IntConsumer) with "SetTestClass2impl" on remote thread.
-"SetTestClass2impl" on public static void art_test.TestCases1966.ExactClassMethod(java.util.function.IntConsumer) failed to set value TestClass2impl("TestClass2("Set TestClass2impl")") due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'TestClass1("SpecificClassMethod")' (class: class art.Test1966$TestClass1)
-Running public static void art_test.TestCases1966.PrimitiveMethod(java.util.function.IntConsumer) with "GetGetObject" on remote thread.
-"GetGetObject" on public static void art_test.TestCases1966.PrimitiveMethod(java.util.function.IntConsumer) failed due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '42' (class: class java.lang.Integer)
-Running public static void art_test.TestCases1966.PrimitiveMethod(java.util.function.IntConsumer) with "SetNull" on remote thread.
-"SetNull" on public static void art_test.TestCases1966.PrimitiveMethod(java.util.function.IntConsumer) failed to set value null due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '42' (class: class java.lang.Integer)
-Running public static void art_test.TestCases1966.PrimitiveMethod(java.util.function.IntConsumer) with "SetTestClass1" on remote thread.
-"SetTestClass1" on public static void art_test.TestCases1966.PrimitiveMethod(java.util.function.IntConsumer) failed to set value TestClass1("Set TestClass1") due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '42' (class: class java.lang.Integer)
-Running public static void art_test.TestCases1966.PrimitiveMethod(java.util.function.IntConsumer) with "SetTestClass1ext" on remote thread.
-"SetTestClass1ext" on public static void art_test.TestCases1966.PrimitiveMethod(java.util.function.IntConsumer) failed to set value TestClass1ext("TestClass1("Set TestClass1ext")") due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '42' (class: class java.lang.Integer)
-Running public static void art_test.TestCases1966.PrimitiveMethod(java.util.function.IntConsumer) with "SetTestClass2" on remote thread.
-"SetTestClass2" on public static void art_test.TestCases1966.PrimitiveMethod(java.util.function.IntConsumer) failed to set value TestClass2("Set TestClass2") due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '42' (class: class java.lang.Integer)
-Running public static void art_test.TestCases1966.PrimitiveMethod(java.util.function.IntConsumer) with "SetTestClass2impl" on remote thread.
-"SetTestClass2impl" on public static void art_test.TestCases1966.PrimitiveMethod(java.util.function.IntConsumer) failed to set value TestClass2impl("TestClass2("Set TestClass2impl")") due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is '42' (class: class java.lang.Integer)
-Running public static void art_test.TestCases1966.NullMethod(java.util.function.IntConsumer) with "GetGetObject" on remote thread.
-"GetGetObject" on public static void art_test.TestCases1966.NullMethod(java.util.function.IntConsumer) got value: null
-	Value is 'null' (class: NULL)
-Running public static void art_test.TestCases1966.NullMethod(java.util.function.IntConsumer) with "SetNull" on remote thread.
-"SetNull" on public static void art_test.TestCases1966.NullMethod(java.util.function.IntConsumer) set value: null
-	Value is 'null' (class: NULL)
-Running public static void art_test.TestCases1966.NullMethod(java.util.function.IntConsumer) with "SetTestClass1" on remote thread.
-"SetTestClass1" on public static void art_test.TestCases1966.NullMethod(java.util.function.IntConsumer) failed to set value TestClass1("Set TestClass1") due to JVMTI_ERROR_INTERNAL
-	Value is 'null' (class: NULL)
-Running public static void art_test.TestCases1966.NullMethod(java.util.function.IntConsumer) with "SetTestClass1ext" on remote thread.
-"SetTestClass1ext" on public static void art_test.TestCases1966.NullMethod(java.util.function.IntConsumer) failed to set value TestClass1ext("TestClass1("Set TestClass1ext")") due to JVMTI_ERROR_INTERNAL
-	Value is 'null' (class: NULL)
-Running public static void art_test.TestCases1966.NullMethod(java.util.function.IntConsumer) with "SetTestClass2" on remote thread.
-"SetTestClass2" on public static void art_test.TestCases1966.NullMethod(java.util.function.IntConsumer) failed to set value TestClass2("Set TestClass2") due to JVMTI_ERROR_INTERNAL
-	Value is 'null' (class: NULL)
-Running public static void art_test.TestCases1966.NullMethod(java.util.function.IntConsumer) with "SetTestClass2impl" on remote thread.
-"SetTestClass2impl" on public static void art_test.TestCases1966.NullMethod(java.util.function.IntConsumer) failed to set value TestClass2impl("TestClass2("Set TestClass2impl")") due to JVMTI_ERROR_INTERNAL
-	Value is 'null' (class: NULL)
-Running public static void art_test.TestCases1966.CastExactNullMethod(java.util.function.IntConsumer) with "GetGetObject" on remote thread.
-"GetGetObject" on public static void art_test.TestCases1966.CastExactNullMethod(java.util.function.IntConsumer) got value: null
-	Value is 'null' (class: NULL)
-Running public static void art_test.TestCases1966.CastExactNullMethod(java.util.function.IntConsumer) with "SetNull" on remote thread.
-"SetNull" on public static void art_test.TestCases1966.CastExactNullMethod(java.util.function.IntConsumer) set value: null
-	Value is 'null' (class: NULL)
-Running public static void art_test.TestCases1966.CastExactNullMethod(java.util.function.IntConsumer) with "SetTestClass1" on remote thread.
-"SetTestClass1" on public static void art_test.TestCases1966.CastExactNullMethod(java.util.function.IntConsumer) set value: TestClass1("Set TestClass1")
-	Value is 'TestClass1("Set TestClass1")' (class: class art.Test1966$TestClass1)
-Running public static void art_test.TestCases1966.CastExactNullMethod(java.util.function.IntConsumer) with "SetTestClass1ext" on remote thread.
-"SetTestClass1ext" on public static void art_test.TestCases1966.CastExactNullMethod(java.util.function.IntConsumer) set value: TestClass1ext("TestClass1("Set TestClass1ext")")
-	Value is 'TestClass1ext("TestClass1("Set TestClass1ext")")' (class: class art.Test1966$TestClass1ext)
-Running public static void art_test.TestCases1966.CastExactNullMethod(java.util.function.IntConsumer) with "SetTestClass2" on remote thread.
-"SetTestClass2" on public static void art_test.TestCases1966.CastExactNullMethod(java.util.function.IntConsumer) failed to set value TestClass2("Set TestClass2") due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'null' (class: NULL)
-Running public static void art_test.TestCases1966.CastExactNullMethod(java.util.function.IntConsumer) with "SetTestClass2impl" on remote thread.
-"SetTestClass2impl" on public static void art_test.TestCases1966.CastExactNullMethod(java.util.function.IntConsumer) failed to set value TestClass2impl("TestClass2("Set TestClass2impl")") due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'null' (class: NULL)
-Running public static void art_test.TestCases1966.CastInterfaceNullMethod(java.util.function.IntConsumer) with "GetGetObject" on remote thread.
-"GetGetObject" on public static void art_test.TestCases1966.CastInterfaceNullMethod(java.util.function.IntConsumer) got value: null
-	Value is 'null' (class: NULL)
-Running public static void art_test.TestCases1966.CastInterfaceNullMethod(java.util.function.IntConsumer) with "SetNull" on remote thread.
-"SetNull" on public static void art_test.TestCases1966.CastInterfaceNullMethod(java.util.function.IntConsumer) set value: null
-	Value is 'null' (class: NULL)
-Running public static void art_test.TestCases1966.CastInterfaceNullMethod(java.util.function.IntConsumer) with "SetTestClass1" on remote thread.
-"SetTestClass1" on public static void art_test.TestCases1966.CastInterfaceNullMethod(java.util.function.IntConsumer) set value: TestClass1("Set TestClass1")
-	Value is 'TestClass1("Set TestClass1")' (class: class art.Test1966$TestClass1)
-Running public static void art_test.TestCases1966.CastInterfaceNullMethod(java.util.function.IntConsumer) with "SetTestClass1ext" on remote thread.
-"SetTestClass1ext" on public static void art_test.TestCases1966.CastInterfaceNullMethod(java.util.function.IntConsumer) set value: TestClass1ext("TestClass1("Set TestClass1ext")")
-	Value is 'TestClass1ext("TestClass1("Set TestClass1ext")")' (class: class art.Test1966$TestClass1ext)
-Running public static void art_test.TestCases1966.CastInterfaceNullMethod(java.util.function.IntConsumer) with "SetTestClass2" on remote thread.
-"SetTestClass2" on public static void art_test.TestCases1966.CastInterfaceNullMethod(java.util.function.IntConsumer) failed to set value TestClass2("Set TestClass2") due to JVMTI_ERROR_TYPE_MISMATCH
-	Value is 'null' (class: NULL)
-Running public static void art_test.TestCases1966.CastInterfaceNullMethod(java.util.function.IntConsumer) with "SetTestClass2impl" on remote thread.
-"SetTestClass2impl" on public static void art_test.TestCases1966.CastInterfaceNullMethod(java.util.function.IntConsumer) set value: TestClass2impl("TestClass2("Set TestClass2impl")")
-	Value is 'TestClass2impl("TestClass2("Set TestClass2impl")")' (class: class art.Test1966$TestClass2impl)
diff --git a/test/1966-get-set-local-objects-no-table/info.txt b/test/1966-get-set-local-objects-no-table/info.txt
deleted file mode 100644
index 86ac743..0000000
--- a/test/1966-get-set-local-objects-no-table/info.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Tests for jvmti get and set local variable object.
-
diff --git a/test/1966-get-set-local-objects-no-table/jasmin/TestCases1966.j b/test/1966-get-set-local-objects-no-table/jasmin/TestCases1966.j
deleted file mode 100644
index 721f7ce..0000000
--- a/test/1966-get-set-local-objects-no-table/jasmin/TestCases1966.j
+++ /dev/null
@@ -1,161 +0,0 @@
-; Copyright (C) 2019 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.
-
-.class public art_test/TestCases1966
-.super java/lang/Object
-.inner class public static TestClass1 inner art/Test1966$TestClass1 outer art/Test1966
-.inner interface public static abstract TestInterface inner art/Test1966$TestInterface outer art/Test1966
-
-.method public <init>()V
-  .limit stack 1
-  .limit locals 1
-  0: aload_0
-  1: invokespecial java/lang/Object/<init>()V
-  4: return
-.end method
-
-.method public static PrimitiveMethod(Ljava/util/function/IntConsumer;)V
-  .limit stack 2
-  .limit locals 2
-  0: bipush 42
-  2: istore_1
-  3: aload_0
-  4: sipush 1
-  7: invokeinterface java/util/function/IntConsumer/accept(I)V 2
-  12: iload_1
-  13: invokestatic java/lang/Integer/valueOf(I)Ljava/lang/Integer;
-  16: invokestatic art/Test1966/reportValue(Ljava/lang/Object;)V
-  19: return
-.end method
-
-.method public static CastInterfaceMethod(Ljava/util/function/IntConsumer;)V
-  .limit stack 2
-  .limit locals 3
-  0: ldc "ObjectMethod"
-  2: invokestatic art/Test1966$TestClass1/create(Ljava/lang/String;)Ljava/lang/Object;
-  5: astore_1
-  6: aload_1
-  7: checkcast art/Test1966$TestClass1
-  10: astore_2
-  11: aload_0
-  12: sipush 2
-  15: invokeinterface java/util/function/IntConsumer/accept(I)V 2
-  20: aload_2
-  21: invokestatic art/Test1966/reportValue(Ljava/lang/Object;)V
-  24: return
-.end method
-
-.method public static CastExactMethod(Ljava/util/function/IntConsumer;)V
-  .limit stack 2
-  .limit locals 3
-  0: ldc "ObjectMethod"
-  2: invokestatic art/Test1966$TestClass1/create(Ljava/lang/String;)Ljava/lang/Object;
-  5: astore_1
-  6: aload_1
-  7: checkcast art/Test1966$TestClass1
-  10: astore_2
-  11: aload_0
-  12: sipush 2
-  15: invokeinterface java/util/function/IntConsumer/accept(I)V 2
-  20: aload_2
-  21: invokestatic art/Test1966/reportValue(Ljava/lang/Object;)V
-  24: return
-.end method
-
-.method public static ObjectMethod(Ljava/util/function/IntConsumer;)V
-  .limit stack 2
-  .limit locals 2
-  0: ldc "ObjectMethod"
-  2: invokestatic art/Test1966$TestClass1/create(Ljava/lang/String;)Ljava/lang/Object;
-  5: astore_1
-  6: aload_0
-  7: sipush 1
-  10: invokeinterface java/util/function/IntConsumer/accept(I)V 2
-  15: aload_1
-  16: invokestatic art/Test1966/reportValue(Ljava/lang/Object;)V
-  19: return
-.end method
-
-.method public static InterfaceMethod(Ljava/util/function/IntConsumer;)V
-  .limit stack 2
-  .limit locals 2
-  0: ldc "InterfaceMethod"
-  2: invokestatic art/Test1966$TestClass1/createInterface(Ljava/lang/String;)Lart/Test1966$TestInterface;
-  5: astore_1
-  6: aload_0
-  7: sipush 1
-  10: invokeinterface java/util/function/IntConsumer/accept(I)V 2
-  15: aload_1
-  16: invokestatic art/Test1966/reportValue(Ljava/lang/Object;)V
-  19: return
-.end method
-
-.method public static ExactClassMethod(Ljava/util/function/IntConsumer;)V
-  .limit stack 2
-  .limit locals 2
-  0: ldc "SpecificClassMethod"
-  2: invokestatic art/Test1966$TestClass1/createExact(Ljava/lang/String;)Lart/Test1966$TestClass1;
-  5: astore_1
-  6: aload_0
-  7: sipush 1
-  10: invokeinterface java/util/function/IntConsumer/accept(I)V 2
-  15: aload_1
-  16: invokestatic art/Test1966/reportValue(Ljava/lang/Object;)V
-  19: return
-.end method
-
-.method public static CastExactNullMethod(Ljava/util/function/IntConsumer;)V
-  .limit stack 2
-  .limit locals 3
-  0: aconst_null
-  1: astore_1
-  2: aload_1
-  3: checkcast art/Test1966$TestClass1
-  6: astore_2
-  7: aload_0
-  8: sipush 2
-  11: invokeinterface java/util/function/IntConsumer/accept(I)V 2
-  16: aload_2
-  17: invokestatic art/Test1966/reportValue(Ljava/lang/Object;)V
-  20: return
-.end method
-
-.method public static CastInterfaceNullMethod(Ljava/util/function/IntConsumer;)V
-  .limit stack 2
-  .limit locals 3
-  0: aconst_null
-  1: astore_1
-  2: aload_1
-  3: checkcast art/Test1966$TestInterface
-  6: astore_2
-  7: aload_0
-  8: sipush 2
-  11: invokeinterface java/util/function/IntConsumer/accept(I)V 2
-  16: aload_2
-  17: invokestatic art/Test1966/reportValue(Ljava/lang/Object;)V
-  20: return
-.end method
-
-.method public static NullMethod(Ljava/util/function/IntConsumer;)V
-  .limit stack 2
-  .limit locals 2
-  0: aconst_null
-  1: astore_1
-  2: aload_0
-  3: sipush 1
-  6: invokeinterface java/util/function/IntConsumer/accept(I)V 2
-  11: aload_1
-  12: invokestatic art/Test1966/reportValue(Ljava/lang/Object;)V
-  15: return
-.end method
diff --git a/test/1966-get-set-local-objects-no-table/run b/test/1966-get-set-local-objects-no-table/run
deleted file mode 100755
index 9b741ee..0000000
--- a/test/1966-get-set-local-objects-no-table/run
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-#
-# Copyright 2019 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.
-
-# If we compile the .oat files non-debuggable we could end up with dex2dex running over the files
-# which will cause some instructions to be removed from smali/TestCases1966.smali. This test relies
-# on the instructions being exactly as written so pass --debuggable to 'dex2oat' only to prevent
-# this from happening.
-./default-run "$@" --jvmti --compiler-only-option --debuggable
diff --git a/test/1966-get-set-local-objects-no-table/smali/TestCases1966.smali b/test/1966-get-set-local-objects-no-table/smali/TestCases1966.smali
deleted file mode 100644
index d460dcd..0000000
--- a/test/1966-get-set-local-objects-no-table/smali/TestCases1966.smali
+++ /dev/null
@@ -1,121 +0,0 @@
-# Copyright (C) 2019 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.
-
-
-.class public Lart_test/TestCases1966;
-.super Ljava/lang/Object;
-
-# direct methods
-.method public constructor <init>()V
-    .registers 1
-    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
-    return-void
-.end method
-
-.method public static CastExactMethod(Ljava/util/function/IntConsumer;)V
-    .registers 3
-    const-string v0, "ObjectMethod"
-    invoke-static {v0}, Lart/Test1966$TestClass1;->create(Ljava/lang/String;)Ljava/lang/Object;
-    move-result-object v0
-    check-cast v0, Lart/Test1966$TestClass1;
-    const/16 v1, 0x0
-    invoke-interface {p0, v1}, Ljava/util/function/IntConsumer;->accept(I)V
-    invoke-static {v0}, Lart/Test1966;->reportValue(Ljava/lang/Object;)V
-    return-void
-.end method
-
-.method public static CastInterfaceMethod(Ljava/util/function/IntConsumer;)V
-    .registers 3
-    const-string v0, "ObjectMethod"
-    invoke-static {v0}, Lart/Test1966$TestClass1;->create(Ljava/lang/String;)Ljava/lang/Object;
-    move-result-object v0
-    check-cast v0, Lart/Test1966$TestClass1;
-    const/16 v1, 0x0
-    invoke-interface {p0, v1}, Ljava/util/function/IntConsumer;->accept(I)V
-    invoke-static {v0}, Lart/Test1966;->reportValue(Ljava/lang/Object;)V
-    return-void
-.end method
-
-.method public static ExactClassMethod(Ljava/util/function/IntConsumer;)V
-    .registers 3
-    const-string v0, "SpecificClassMethod"
-    invoke-static {v0}, Lart/Test1966$TestClass1;->createExact(Ljava/lang/String;)Lart/Test1966$TestClass1;
-    move-result-object v0
-    const/16 v1, 0x0
-    invoke-interface {p0, v1}, Ljava/util/function/IntConsumer;->accept(I)V
-    invoke-static {v0}, Lart/Test1966;->reportValue(Ljava/lang/Object;)V
-    return-void
-.end method
-
-.method public static InterfaceMethod(Ljava/util/function/IntConsumer;)V
-    .registers 3
-    const-string v0, "InterfaceMethod"
-    invoke-static {v0}, Lart/Test1966$TestClass1;->createInterface(Ljava/lang/String;)Lart/Test1966$TestInterface;
-    move-result-object v0
-    const/16 v1, 0x0
-    invoke-interface {p0, v1}, Ljava/util/function/IntConsumer;->accept(I)V
-    invoke-static {v0}, Lart/Test1966;->reportValue(Ljava/lang/Object;)V
-    return-void
-.end method
-
-.method public static ObjectMethod(Ljava/util/function/IntConsumer;)V
-    .registers 3
-    const-string v0, "ObjectMethod"
-    invoke-static {v0}, Lart/Test1966$TestClass1;->create(Ljava/lang/String;)Ljava/lang/Object;
-    move-result-object v0
-    const/16 v1, 0x0
-    invoke-interface {p0, v1}, Ljava/util/function/IntConsumer;->accept(I)V
-    invoke-static {v0}, Lart/Test1966;->reportValue(Ljava/lang/Object;)V
-    return-void
-.end method
-
-.method public static PrimitiveMethod(Ljava/util/function/IntConsumer;)V
-    .registers 3
-    const/16 v0, 0x2a
-    const/16 v1, 0x0
-    invoke-interface {p0, v1}, Ljava/util/function/IntConsumer;->accept(I)V
-    invoke-static {v0}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
-    move-result-object p0
-    invoke-static {p0}, Lart/Test1966;->reportValue(Ljava/lang/Object;)V
-    return-void
-.end method
-
-.method public static NullMethod(Ljava/util/function/IntConsumer;)V
-    .registers 3
-    const/4 v0, 0x0
-    const/16 v1, 0x0
-    invoke-interface {p0, v1}, Ljava/util/function/IntConsumer;->accept(I)V
-    invoke-static {v0}, Lart/Test1966;->reportValue(Ljava/lang/Object;)V
-    return-void
-.end method
-
-.method public static CastInterfaceNullMethod(Ljava/util/function/IntConsumer;)V
-    .registers 3
-    const/4 v0, 0x0
-    check-cast v0, Lart/Test1966$TestInterface;
-    const/16 v1, 0x0
-    invoke-interface {p0, v1}, Ljava/util/function/IntConsumer;->accept(I)V
-    invoke-static {v0}, Lart/Test1966;->reportValue(Ljava/lang/Object;)V
-    return-void
-.end method
-
-.method public static CastExactNullMethod(Ljava/util/function/IntConsumer;)V
-    .registers 3
-    const/4 v0, 0x0
-    check-cast v0, Lart/Test1966$TestClass1;
-    const/16 v1, 0x0
-    invoke-interface {p0, v1}, Ljava/util/function/IntConsumer;->accept(I)V
-    invoke-static {v0}, Lart/Test1966;->reportValue(Ljava/lang/Object;)V
-    return-void
-.end method
\ No newline at end of file
diff --git a/test/1966-get-set-local-objects-no-table/src/Main.java b/test/1966-get-set-local-objects-no-table/src/Main.java
deleted file mode 100644
index 198f319..0000000
--- a/test/1966-get-set-local-objects-no-table/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.Test1966.run();
-  }
-}
diff --git a/test/1966-get-set-local-objects-no-table/src/art/Breakpoint.java b/test/1966-get-set-local-objects-no-table/src/art/Breakpoint.java
deleted file mode 120000
index 3673916..0000000
--- a/test/1966-get-set-local-objects-no-table/src/art/Breakpoint.java
+++ /dev/null
@@ -1 +0,0 @@
-../../../jvmti-common/Breakpoint.java
\ No newline at end of file
diff --git a/test/1966-get-set-local-objects-no-table/src/art/Locals.java b/test/1966-get-set-local-objects-no-table/src/art/Locals.java
deleted file mode 120000
index 2998386..0000000
--- a/test/1966-get-set-local-objects-no-table/src/art/Locals.java
+++ /dev/null
@@ -1 +0,0 @@
-../../../jvmti-common/Locals.java
\ No newline at end of file
diff --git a/test/1966-get-set-local-objects-no-table/src/art/StackTrace.java b/test/1966-get-set-local-objects-no-table/src/art/StackTrace.java
deleted file mode 120000
index e1a08aa..0000000
--- a/test/1966-get-set-local-objects-no-table/src/art/StackTrace.java
+++ /dev/null
@@ -1 +0,0 @@
-../../../jvmti-common/StackTrace.java
\ No newline at end of file
diff --git a/test/1966-get-set-local-objects-no-table/src/art/Suspension.java b/test/1966-get-set-local-objects-no-table/src/art/Suspension.java
deleted file mode 120000
index bcef96f..0000000
--- a/test/1966-get-set-local-objects-no-table/src/art/Suspension.java
+++ /dev/null
@@ -1 +0,0 @@
-../../../jvmti-common/Suspension.java
\ No newline at end of file
diff --git a/test/1966-get-set-local-objects-no-table/src/art/Test1966.java b/test/1966-get-set-local-objects-no-table/src/art/Test1966.java
deleted file mode 100644
index 00f3c4e..0000000
--- a/test/1966-get-set-local-objects-no-table/src/art/Test1966.java
+++ /dev/null
@@ -1,237 +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.Method;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.Semaphore;
-import java.util.function.Consumer;
-import java.util.function.Function;
-import java.util.function.IntConsumer;
-import java.util.function.Predicate;
-import java.util.function.Supplier;
-
-public class Test1966 {
-  public static final String TARGET_VAR = "TARGET";
-
-  public static interface TestInterface {
-    public default void doNothing() {}
-  }
-  public static class TestClass1 implements TestInterface {
-    public String id;
-    public TestClass1(String id) {
-      this.id = id;
-    }
-    public String toString() {
-      return String.format("TestClass1(\"%s\")", id);
-    }
-
-    public static TestInterface createInterface(String id) {
-      return new TestClass1(id);
-    }
-    public static TestClass1 createExact(String id) {
-      return new TestClass1(id);
-    }
-    public static Object create(String id) {
-      return new TestClass1(id);
-    }
-  }
-
-  public static class TestClass1ext extends TestClass1 {
-    public TestClass1ext(String id) {
-      super(id);
-    }
-    public String toString() {
-      return String.format("TestClass1ext(\"%s\")", super.toString());
-    }
-  }
-  public static class TestClass2 {
-    public String id;
-    public TestClass2(String id) {
-      this.id = id;
-    }
-    public String toString() {
-      return String.format("TestClass2(\"%s\")", id);
-    }
-  }
-  public static class TestClass2impl extends TestClass2 implements TestInterface {
-    public TestClass2impl(String id) {
-      super(id);
-    }
-    public String toString() {
-      return String.format("TestClass2impl(\"%s\")", super.toString());
-    }
-  }
-
-  public static void reportValue(Object val) {
-    System.out.println("\tValue is '" + val +
-                       "' (class: " + (val != null ? val.getClass() : "NULL") + ")");
-  }
-
-  public static interface SafepointFunction {
-    public void invoke(Thread thread, Method target, int slot, int depth) throws Exception;
-  }
-
-  public static interface SetterFunction {
-    public void SetVar(Thread t, int depth, int slot, Object v);
-  }
-
-  public static interface GetterFunction { public Object GetVar(Thread t, int depth, int slot); }
-
-  public static SafepointFunction
-  NamedSet(final String type, final SetterFunction get, final Object v) {
-    return new SafepointFunction() {
-      public void invoke(Thread t, Method method, int slot, int depth) {
-        try {
-          get.SetVar(t, depth, slot, v);
-          System.out.println(this + " on " + method + " set value: " + v);
-        } catch (Exception e) {
-          System.out.println(this + " on " + method + " failed to set value " + v + " due to " +
-                             e.getMessage());
-        }
-      }
-      public String toString() {
-        return "\"Set" + type + "\"";
-      }
-    };
-  }
-
-  public static SafepointFunction NamedGet(final String type, final GetterFunction get) {
-    return new SafepointFunction() {
-      public void invoke(Thread t, Method method, int slot, int depth) {
-        try {
-          Object res = get.GetVar(t, depth, slot);
-          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 Method target;
-
-    public TestCase(Method target) {
-      this.target = target;
-    }
-
-    public static class ThreadPauser implements IntConsumer {
-      public final Semaphore sem_wakeup_main;
-      public final Semaphore sem_wait;
-      public int slot = -1;
-
-      public ThreadPauser() {
-        sem_wakeup_main = new Semaphore(0);
-        sem_wait = new Semaphore(0);
-      }
-
-      public void accept(int i) {
-        try {
-          slot = i;
-          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(null, 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, pause.slot, 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)) {
-          return frame;
-        }
-      }
-      throw new Error("Unable to find stack frame in method " + target + " on thread " + thr);
-    }
-  }
-  public static Method getMethod(String name) throws Exception {
-    return Class.forName("art_test.TestCases1966").getDeclaredMethod(name, IntConsumer.class);
-  }
-
-  public static void run() throws Exception {
-    Locals.EnableLocalVariableAccess();
-    final TestCase[] MAIN_TEST_CASES = new TestCase[] {
-      new TestCase(getMethod("ObjectMethod")),
-      new TestCase(getMethod("CastInterfaceMethod")),
-      new TestCase(getMethod("CastExactMethod")),
-      new TestCase(getMethod("InterfaceMethod")),
-      new TestCase(getMethod("ExactClassMethod")),
-      new TestCase(getMethod("PrimitiveMethod")),
-      new TestCase(getMethod("NullMethod")),
-      new TestCase(getMethod("CastExactNullMethod")),
-      new TestCase(getMethod("CastInterfaceNullMethod")),
-    };
-
-    final SetterFunction set_obj = Locals::SetLocalVariableObject;
-    final SafepointFunction[] SAFEPOINTS = new SafepointFunction[] {
-      NamedGet("GetObject", Locals::GetLocalVariableObject),
-      NamedSet("Null", set_obj, null),
-      NamedSet("TestClass1", set_obj, new TestClass1("Set TestClass1")),
-      NamedSet("TestClass1ext", set_obj, new TestClass1ext("Set TestClass1ext")),
-      NamedSet("TestClass2", set_obj, new TestClass2("Set TestClass2")),
-      NamedSet("TestClass2impl", set_obj, new TestClass2impl("Set TestClass2impl")),
-    };
-
-    for (TestCase t : MAIN_TEST_CASES) {
-      for (SafepointFunction s : SAFEPOINTS) {
-        t.exec(s);
-      }
-    }
-  }
-}
diff --git a/test/etc/run-test-jar b/test/etc/run-test-jar
index 6804091..bcd35e6 100755
--- a/test/etc/run-test-jar
+++ b/test/etc/run-test-jar
@@ -157,11 +157,6 @@
         fi
         ARGS="${ARGS} $1"
         shift
-    elif [ "x$1" = "x--compiler-only-option" ]; then
-        shift
-        option="$1"
-        COMPILE_FLAGS="${COMPILE_FLAGS} $option"
-        shift
     elif [ "x$1" = "x-Xcompiler-option" ]; then
         shift
         option="$1"
diff --git a/test/knownfailures.json b/test/knownfailures.json
index ad0cbe8..963d335 100644
--- a/test/knownfailures.json
+++ b/test/knownfailures.json
@@ -777,18 +777,6 @@
         "description": ["Requires zip, which isn't available on device"]
     },
     {
-        "tests": [
-          "1965-get-set-local-primitive-no-tables",
-          "1966-get-set-local-objects-no-table"
-        ],
-        "variant": "jvm",
-        "bug": "133241695",
-        "description": [
-          "The RI is wildly inconsistent about how it handles Get/SetLocalVariable when classes ",
-          "lack debug info."
-        ]
-    },
-    {
         "tests": ["683-clinit-inline-static-invoke"],
         "variant": "jvm",
         "description": ["Uses android-specific boot image class."]
