Revert "Remove finalizable restriction on structural redefinition"
This reverts commit 55d6fa4c352a1fadbd21b8d8e0929833e547b9e5.
Bug: 134162467
Test: None, pure revert.
Reason for revert: Flaky segvs across multiple configurations.
Change-Id: Iaa8ec6cbd2eee141e271cd3a56a1b6be8bbb3a7c
diff --git a/openjdkjvmti/ti_redefine.cc b/openjdkjvmti/ti_redefine.cc
index dccc226..c505933 100644
--- a/openjdkjvmti/ti_redefine.cc
+++ b/openjdkjvmti/ti_redefine.cc
@@ -1131,6 +1131,10 @@
jvmtiError res;
if (driver_->type_ == RedefinitionType::kStructural && this->IsStructuralRedefinition()) {
res = Redefiner::GetClassRedefinitionError<RedefinitionType::kStructural>(h_klass, &err);
+ if (res == OK && HasVirtualMembers() && h_klass->IsFinalizable()) {
+ res = ERR(INTERNAL);
+ err = "Cannot redefine finalizable objects at this time.";
+ }
} else {
res = Redefiner::GetClassRedefinitionError<RedefinitionType::kNormal>(h_klass, &err);
}
@@ -1746,21 +1750,7 @@
[&](auto class_pair) REQUIRES_SHARED(art::Locks::mutator_lock_) {
return class_pair.first == hinstance->GetClass();
}));
- // Make sure when allocating the new instance we don't add it's finalizer since we will directly
- // replace the old object in the finalizer reference. If we added it here to we would call
- // finalize twice.
- // NB If a type is changed from being non-finalizable to finalizable the finalizers on any
- // objects created before the redefine will never be called. This is (sort of) allowable by
- // the spec and greatly simplifies implementation.
- // TODO Make it so we will always call all finalizers, even if the object when it was created
- // wasn't finalizable. To do this we need to be careful of handling failure correctly and making
- // sure that objects aren't finalized multiple times and that instances of failed redefinitions
- // aren't finalized.
- art::ObjPtr<art::mirror::Object> new_instance(
- new_type->Alloc</*kIsInstrumented=*/true,
- art::mirror::Class::AddFinalizer::kNoAddFinalizer,
- /*kCheckAddFinalizer=*/false>(
- driver_->self_, driver_->runtime_->GetHeap()->GetCurrentAllocator()));
+ art::ObjPtr<art::mirror::Object> new_instance(new_type->AllocObject(driver_->self_));
if (new_instance.IsNull()) {
driver_->self_->AssertPendingOOMException();
driver_->self_->ClearException();
diff --git a/runtime/entrypoints/entrypoint_utils-inl.h b/runtime/entrypoints/entrypoint_utils-inl.h
index 1e42201..338928e 100644
--- a/runtime/entrypoints/entrypoint_utils-inl.h
+++ b/runtime/entrypoints/entrypoint_utils-inl.h
@@ -199,15 +199,14 @@
return nullptr;
}
gc::Heap* heap = Runtime::Current()->GetHeap();
- // Pass in kNoAddFinalizer since the object cannot be finalizable.
+ // Pass in false since the object cannot be finalizable.
// CheckClassInitializedForObjectAlloc can cause thread suspension which means we may now be
// instrumented.
- return klass->Alloc</*kInstrumented=*/true, mirror::Class::AddFinalizer::kNoAddFinalizer>(
+ return klass->Alloc</*kInstrumented=*/true, /*kCheckAddFinalizer=*/false>(
self, heap->GetCurrentAllocator());
}
- // Pass in kNoAddFinalizer since the object cannot be finalizable.
- return klass->Alloc<kInstrumented,
- mirror::Class::AddFinalizer::kNoAddFinalizer>(self, allocator_type);
+ // Pass in false since the object cannot be finalizable.
+ return klass->Alloc<kInstrumented, /*kCheckAddFinalizer=*/false>(self, allocator_type);
}
// Given the context of a calling Method and an initialized class, create an instance.
@@ -217,9 +216,8 @@
Thread* self,
gc::AllocatorType allocator_type) {
DCHECK(klass != nullptr);
- // Pass in kNoAddFinalizer since the object cannot be finalizable.
- return klass->Alloc<kInstrumented,
- mirror::Class::AddFinalizer::kNoAddFinalizer>(self, allocator_type);
+ // Pass in false since the object cannot be finalizable.
+ return klass->Alloc<kInstrumented, /*kCheckAddFinalizer=*/false>(self, allocator_type);
}
diff --git a/runtime/mirror/class-alloc-inl.h b/runtime/mirror/class-alloc-inl.h
index 5627b49..2861244 100644
--- a/runtime/mirror/class-alloc-inl.h
+++ b/runtime/mirror/class-alloc-inl.h
@@ -46,19 +46,13 @@
DCHECK_GE(this->object_size_, sizeof(Object));
}
-template<bool kIsInstrumented, Class::AddFinalizer kAddFinalizer, bool kCheckAddFinalizer>
+template<bool kIsInstrumented, bool kCheckAddFinalizer>
inline ObjPtr<Object> Class::Alloc(Thread* self, gc::AllocatorType allocator_type) {
CheckObjectAlloc();
gc::Heap* heap = Runtime::Current()->GetHeap();
- bool add_finalizer;
- switch (kAddFinalizer) {
- case Class::AddFinalizer::kUseClassTag:
- add_finalizer = IsFinalizable();
- break;
- case Class::AddFinalizer::kNoAddFinalizer:
- add_finalizer = false;
- DCHECK(!kCheckAddFinalizer || !IsFinalizable());
- break;
+ const bool add_finalizer = kCheckAddFinalizer && IsFinalizable();
+ if (!kCheckAddFinalizer) {
+ DCHECK(!IsFinalizable());
}
// Note that the `this` pointer may be invalidated after the allocation.
ObjPtr<Object> obj =
diff --git a/runtime/mirror/class.h b/runtime/mirror/class.h
index 3e24346..b600c43 100644
--- a/runtime/mirror/class.h
+++ b/runtime/mirror/class.h
@@ -498,21 +498,8 @@
template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
bool IsPrimitiveArray() REQUIRES_SHARED(Locks::mutator_lock_);
- // Enum used to control whether we try to add a finalizer-reference for object alloc or not.
- enum class AddFinalizer {
- // Don't create a finalizer reference regardless of what the class-flags say.
- kNoAddFinalizer,
- // Use the class-flags to figure out if we should make a finalizer reference.
- kUseClassTag,
- };
-
// Creates a raw object instance but does not invoke the default constructor.
- // kCheckAddFinalizer controls whether we use a DCHECK to sanity check that we create a
- // finalizer-reference if needed. This should only be disabled when doing structural class
- // redefinition.
- template <bool kIsInstrumented = true,
- AddFinalizer kAddFinalizer = AddFinalizer::kUseClassTag,
- bool kCheckAddFinalizer = true>
+ template<bool kIsInstrumented = true, bool kCheckAddFinalizer = true>
ALWAYS_INLINE ObjPtr<Object> Alloc(Thread* self, gc::AllocatorType allocator_type)
REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_);
diff --git a/test/2006-virtual-structural-finalizing/expected.txt b/test/2006-virtual-structural-finalizing/expected.txt
deleted file mode 100644
index e965357..0000000
--- a/test/2006-virtual-structural-finalizing/expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Finalizing
-start_counter: 1
-Finish_counter: 1
diff --git a/test/2006-virtual-structural-finalizing/info.txt b/test/2006-virtual-structural-finalizing/info.txt
deleted file mode 100644
index 3e5291d..0000000
--- a/test/2006-virtual-structural-finalizing/info.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-Tests structural redefinition with multiple threads.
-
-Tests that using the structural redefinition while concurrently loading and using a subtype of
-the class being redefined doesn't cause any unexpected problems.
diff --git a/test/2006-virtual-structural-finalizing/run b/test/2006-virtual-structural-finalizing/run
deleted file mode 100755
index 03e41a5..0000000
--- a/test/2006-virtual-structural-finalizing/run
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-#
-# Copyright 2016 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.
-
-./default-run "$@" --jvmti --runtime-option -Xopaque-jni-ids:true
diff --git a/test/2006-virtual-structural-finalizing/src-art/Main.java b/test/2006-virtual-structural-finalizing/src-art/Main.java
deleted file mode 100644
index 11f9aa7..0000000
--- a/test/2006-virtual-structural-finalizing/src-art/Main.java
+++ /dev/null
@@ -1,21 +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.
- */
-
-public class Main {
- public static void main(String[] args) throws Exception {
- art.Test2006.run();
- }
-}
diff --git a/test/2006-virtual-structural-finalizing/src-art/art/Redefinition.java b/test/2006-virtual-structural-finalizing/src-art/art/Redefinition.java
deleted file mode 120000
index 81eaf31..0000000
--- a/test/2006-virtual-structural-finalizing/src-art/art/Redefinition.java
+++ /dev/null
@@ -1 +0,0 @@
-../../../jvmti-common/Redefinition.java
\ No newline at end of file
diff --git a/test/2006-virtual-structural-finalizing/src-art/art/Test2006.java b/test/2006-virtual-structural-finalizing/src-art/art/Test2006.java
deleted file mode 100644
index 27102dc..0000000
--- a/test/2006-virtual-structural-finalizing/src-art/art/Test2006.java
+++ /dev/null
@@ -1,109 +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.
- */
-
-package art;
-
-import dalvik.system.InMemoryDexClassLoader;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Base64;
-import java.util.concurrent.CountDownLatch;
-import java.util.function.Supplier;
-import java.util.concurrent.atomic.*;
-import java.lang.ref.*;
-
-public class Test2006 {
- public static final CountDownLatch start_latch = new CountDownLatch(1);
- public static final CountDownLatch redefine_latch = new CountDownLatch(1);
- public static final CountDownLatch finish_latch = new CountDownLatch(1);
- public static volatile int start_counter = 0;
- public static volatile int finish_counter = 0;
- public static class Transform {
- public Transform() { }
- protected void finalize() throws Throwable {
- System.out.println("Finalizing");
- start_counter++;
- start_latch.countDown();
- redefine_latch.await();
- finish_counter++;
- finish_latch.countDown();
- }
- }
-
- /**
- * base64 encoded class/dex file for
- * public static class Transform {
- * public String greeting;
- *
- * public Transform() {
- * greeting = "Hello";
- * }
- * protected void finalize() {
- * System.out.println("NOTHING HERE!");
- * }
- * }
- */
- private static final byte[] DEX_BYTES =
- Base64.getDecoder()
- .decode(
-"ZGV4CjAzNQDtxu0Tsy2rLn9iTZHx3r+yuY0IuN+y1el4BAAAcAAAAHhWNBIAAAAAAAAAALQDAAAX" +
-"AAAAcAAAAAkAAADMAAAAAgAAAPAAAAACAAAACAEAAAQAAAAYAQAAAQAAADgBAAAgAwAAWAEAAKoB" +
-"AACyAQAAuQEAANMBAADjAQAABwIAACcCAAA+AgAAUgIAAGYCAAB6AgAAiQIAAJgCAACjAgAApgIA" +
-"AKoCAAC3AgAAwQIAAMsCAADRAgAA1gIAAN8CAADmAgAAAgAAAAMAAAAEAAAABQAAAAYAAAAHAAAA" +
-"CAAAAAkAAAANAAAADQAAAAgAAAAAAAAADgAAAAgAAACkAQAAAAAGABEAAAAHAAQAEwAAAAAAAAAA" +
-"AAAAAAAAABAAAAAEAAEAFAAAAAUAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAAsAAACkAwAAhAMAAAAA" +
-"AAACAAEAAQAAAJgBAAAIAAAAcBADAAEAGgABAFsQAAAOAAMAAQACAAAAngEAAAgAAABiAAEAGgEK" +
-"AG4gAgAQAA4ABgAOPEsACgAOeAAAAQAAAAYABjxpbml0PgAFSGVsbG8AGExhcnQvVGVzdDIwMDYk" +
-"VHJhbnNmb3JtOwAOTGFydC9UZXN0MjAwNjsAIkxkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdD" +
-"bGFzczsAHkxkYWx2aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwAVTGphdmEvaW8vUHJpbnRTdHJl" +
-"YW07ABJMamF2YS9sYW5nL09iamVjdDsAEkxqYXZhL2xhbmcvU3RyaW5nOwASTGphdmEvbGFuZy9T" +
-"eXN0ZW07AA1OT1RISU5HIEhFUkUhAA1UZXN0MjAwNi5qYXZhAAlUcmFuc2Zvcm0AAVYAAlZMAAth" +
-"Y2Nlc3NGbGFncwAIZmluYWxpemUACGdyZWV0aW5nAARuYW1lAANvdXQAB3ByaW50bG4ABXZhbHVl" +
-"AIwBfn5EOHsiY29tcGlsYXRpb24tbW9kZSI6ImRlYnVnIiwiaGFzLWNoZWNrc3VtcyI6ZmFsc2Us" +
-"Im1pbi1hcGkiOjEsInNoYS0xIjoiMTI5ZWU5ZjY3NTZjMzlkZjU3ZmYwNzg1ZDI1NmIyMzc3MjY0" +
-"MmI3YyIsInZlcnNpb24iOiIyLjAuMTAtZGV2In0AAgIBFRgBAgMCDwQJEhcMAAEBAQABAIGABNgC" +
-"AQT4AgAAAAACAAAAdQMAAHsDAACYAwAAAAAAAAAAAAAAAAAAEAAAAAAAAAABAAAAAAAAAAEAAAAX" +
-"AAAAcAAAAAIAAAAJAAAAzAAAAAMAAAACAAAA8AAAAAQAAAACAAAACAEAAAUAAAAEAAAAGAEAAAYA" +
-"AAABAAAAOAEAAAEgAAACAAAAWAEAAAMgAAACAAAAmAEAAAEQAAABAAAApAEAAAIgAAAXAAAAqgEA" +
-"AAQgAAACAAAAdQMAAAAgAAABAAAAhAMAAAMQAAACAAAAlAMAAAYgAAABAAAApAMAAAAQAAABAAAA" +
-"tAMAAA==");
-
- public static void run() throws Exception {
- Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
- doTest();
- }
-
- public static void doTest() throws Exception {
- Thread gc_thr = new Thread(() -> {
- while (true) {
- Runtime.getRuntime().gc();
- System.runFinalization();
- }
- });
- gc_thr.setDaemon(true);
- gc_thr.start();
- mktransform();
- start_latch.await();
- System.out.println("start_counter: " + start_counter);
- Redefinition.doCommonStructuralClassRedefinition(Transform.class, DEX_BYTES);
- redefine_latch.countDown();
- finish_latch.await();
- System.out.println("Finish_counter: " + finish_counter);
- }
- public static void mktransform() throws Exception {
- Transform tr = new Transform();
- }
-}
diff --git a/test/2006-virtual-structural-finalizing/src/Main.java b/test/2006-virtual-structural-finalizing/src/Main.java
deleted file mode 100644
index 89b8557..0000000
--- a/test/2006-virtual-structural-finalizing/src/Main.java
+++ /dev/null
@@ -1,21 +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.
- */
-
-public class Main {
- public static void main(String[] args) throws Exception {
- System.out.println("FAIL: Test is only for art!");
- }
-}
diff --git a/test/2007-virtual-structural-finalizable/expected.txt b/test/2007-virtual-structural-finalizable/expected.txt
deleted file mode 100644
index 781fc9a..0000000
--- a/test/2007-virtual-structural-finalizable/expected.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Finalizing
-counter: 1
diff --git a/test/2007-virtual-structural-finalizable/info.txt b/test/2007-virtual-structural-finalizable/info.txt
deleted file mode 100644
index 3e5291d..0000000
--- a/test/2007-virtual-structural-finalizable/info.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-Tests structural redefinition with multiple threads.
-
-Tests that using the structural redefinition while concurrently loading and using a subtype of
-the class being redefined doesn't cause any unexpected problems.
diff --git a/test/2007-virtual-structural-finalizable/run b/test/2007-virtual-structural-finalizable/run
deleted file mode 100755
index 03e41a5..0000000
--- a/test/2007-virtual-structural-finalizable/run
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-#
-# Copyright 2016 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.
-
-./default-run "$@" --jvmti --runtime-option -Xopaque-jni-ids:true
diff --git a/test/2007-virtual-structural-finalizable/src-art/Main.java b/test/2007-virtual-structural-finalizable/src-art/Main.java
deleted file mode 100644
index ab8daea..0000000
--- a/test/2007-virtual-structural-finalizable/src-art/Main.java
+++ /dev/null
@@ -1,21 +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.
- */
-
-public class Main {
- public static void main(String[] args) throws Exception {
- art.Test2007.run();
- }
-}
diff --git a/test/2007-virtual-structural-finalizable/src-art/art/Redefinition.java b/test/2007-virtual-structural-finalizable/src-art/art/Redefinition.java
deleted file mode 120000
index 81eaf31..0000000
--- a/test/2007-virtual-structural-finalizable/src-art/art/Redefinition.java
+++ /dev/null
@@ -1 +0,0 @@
-../../../jvmti-common/Redefinition.java
\ No newline at end of file
diff --git a/test/2007-virtual-structural-finalizable/src-art/art/Test2007.java b/test/2007-virtual-structural-finalizable/src-art/art/Test2007.java
deleted file mode 100644
index 08e05f5..0000000
--- a/test/2007-virtual-structural-finalizable/src-art/art/Test2007.java
+++ /dev/null
@@ -1,115 +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.
- */
-
-package art;
-
-import dalvik.system.InMemoryDexClassLoader;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Base64;
-import java.util.concurrent.CountDownLatch;
-import java.util.function.Supplier;
-import java.util.concurrent.atomic.*;
-import java.lang.ref.*;
-
-public class Test2007 {
- public static final CountDownLatch finish_latch = new CountDownLatch(1);
- public static volatile int counter = 0;
- public static Object theObject = null;
- public static class Transform {
- public Transform() { }
- protected void finalize() throws Throwable {
- System.out.println("Should never be called!");
- // Do nothing.
- }
- }
-
- /**
- * base64 encoded class/dex file for
- * public static class Transform {
- * public String greeting;
- *
- * public Transform() {
- * greeting = "Hello";
- * }
- * protected void finalize() throws Throwable {
- * System.out.println("Finalizing");
- * counter++;
- * finish_latch.countDown();
- * }
- * }
- */
- private static final byte[] DEX_BYTES =
- Base64.getDecoder()
- .decode(
-"ZGV4CjAzNQCC9DECxo2lTpw7FCCSqZArgZe8ab49ywRoBQAAcAAAAHhWNBIAAAAAAAAAAKQEAAAe" +
-"AAAAcAAAAA0AAADoAAAAAgAAABwBAAAEAAAANAEAAAUAAABUAQAAAQAAAHwBAADMAwAAnAEAAAYC" +
-"AAAOAgAAGgIAACECAAAkAgAAPgIAAE4CAAByAgAAkgIAAK4CAADFAgAA2QIAAO0CAAABAwAAGAMA" +
-"AD8DAABOAwAAWQMAAFwDAABgAwAAbQMAAHgDAACBAwAAiwMAAJkDAACjAwAAqQMAAK4DAAC3AwAA" +
-"vgMAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAABEAAAAR" +
-"AAAADAAAAAAAAAASAAAADAAAAAACAAABAAgAGAAAAAIAAAAVAAAAAgALABcAAAAJAAYAGgAAAAEA" +
-"AAAAAAAAAQAAABYAAAAGAAEAGwAAAAcAAAAAAAAACwAAABQAAAABAAAAAQAAAAcAAAAAAAAADwAA" +
-"AIwEAABkBAAAAAAAAAIAAQABAAAA8gEAAAgAAABwEAMAAQAaAAIAWxAAAA4AAwABAAIAAAD4AQAA" +
-"EwAAAGIAAwAaAQEAbiACABAAYAABANgAAAFnAAEAYgACAG4QBAAAAA4ADAAOPEsAEAAOeGlaAAAB" +
-"AAAACAAGPGluaXQ+AApGaW5hbGl6aW5nAAVIZWxsbwABSQAYTGFydC9UZXN0MjAwNyRUcmFuc2Zv" +
-"cm07AA5MYXJ0L1Rlc3QyMDA3OwAiTGRhbHZpay9hbm5vdGF0aW9uL0VuY2xvc2luZ0NsYXNzOwAe" +
-"TGRhbHZpay9hbm5vdGF0aW9uL0lubmVyQ2xhc3M7ABpMZGFsdmlrL2Fubm90YXRpb24vVGhyb3dz" +
-"OwAVTGphdmEvaW8vUHJpbnRTdHJlYW07ABJMamF2YS9sYW5nL09iamVjdDsAEkxqYXZhL2xhbmcv" +
-"U3RyaW5nOwASTGphdmEvbGFuZy9TeXN0ZW07ABVMamF2YS9sYW5nL1Rocm93YWJsZTsAJUxqYXZh" +
-"L3V0aWwvY29uY3VycmVudC9Db3VudERvd25MYXRjaDsADVRlc3QyMDA3LmphdmEACVRyYW5zZm9y" +
-"bQABVgACVkwAC2FjY2Vzc0ZsYWdzAAljb3VudERvd24AB2NvdW50ZXIACGZpbmFsaXplAAxmaW5p" +
-"c2hfbGF0Y2gACGdyZWV0aW5nAARuYW1lAANvdXQAB3ByaW50bG4ABXZhbHVlAIwBfn5EOHsiY29t" +
-"cGlsYXRpb24tbW9kZSI6ImRlYnVnIiwiaGFzLWNoZWNrc3VtcyI6ZmFsc2UsIm1pbi1hcGkiOjEs" +
-"InNoYS0xIjoiMTI5ZWU5ZjY3NTZjMzlkZjU3ZmYwNzg1ZDI1NmIyMzc3MjY0MmI3YyIsInZlcnNp" +
-"b24iOiIyLjAuMTAtZGV2In0AAgUBHBwBGAoCAwEcGAICBAITBAkZFxAAAQEBAAEAgYAEnAMBBLwD" +
-"AAAAAAEAAABNBAAAAgAAAFUEAABbBAAAgAQAAAAAAAABAAAAAAAAAAEAAAB4BAAAEAAAAAAAAAAB" +
-"AAAAAAAAAAEAAAAeAAAAcAAAAAIAAAANAAAA6AAAAAMAAAACAAAAHAEAAAQAAAAEAAAANAEAAAUA" +
-"AAAFAAAAVAEAAAYAAAABAAAAfAEAAAEgAAACAAAAnAEAAAMgAAACAAAA8gEAAAEQAAABAAAAAAIA" +
-"AAIgAAAeAAAABgIAAAQgAAADAAAATQQAAAAgAAABAAAAZAQAAAMQAAADAAAAdAQAAAYgAAABAAAA" +
-"jAQAAAAQAAABAAAApAQAAA==");
-
-
- public static void run() throws Exception {
- Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
- doTest();
- }
-
- public static void doTest() throws Exception {
- // Try GC forever
- Thread gc_thr = new Thread(() -> {
- while (true) {
- Runtime.getRuntime().gc();
- System.runFinalization();
- }
- });
- gc_thr.setDaemon(true);
- gc_thr.start();
- // Make a transform
- mktransform();
- Redefinition.doCommonStructuralClassRedefinition(Transform.class, DEX_BYTES);
- theObject = null;
- finish_latch.await();
- System.out.println("counter: " + counter);
- // Make sure we don't have any remaining things to finalize, eg obsolete objects or something.
- Runtime.getRuntime().gc();
- System.runFinalization();
- }
-
- // Make sure there is never a transform in the frame of doTest.
- public static void mktransform() throws Exception {
- theObject = new Transform();
- }
-}
diff --git a/test/2007-virtual-structural-finalizable/src/Main.java b/test/2007-virtual-structural-finalizable/src/Main.java
deleted file mode 100644
index 89b8557..0000000
--- a/test/2007-virtual-structural-finalizable/src/Main.java
+++ /dev/null
@@ -1,21 +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.
- */
-
-public class Main {
- public static void main(String[] args) throws Exception {
- System.out.println("FAIL: Test is only for art!");
- }
-}