diff options
| author | 2020-08-18 09:29:51 +0100 | |
|---|---|---|
| committer | 2020-08-24 09:32:55 +0000 | |
| commit | cfd65805a5b3b0437e355b8044a05ee6c9d352c5 (patch) | |
| tree | c91f72b2fe4325cbbc21b6d4a889ea87a7c3608f /test/727-checker-unresolved-class/src-ex | |
| parent | 095dc4611b8001861f8d0e621f9df704a933754a (diff) | |
Optimizing: Fix weak method access check.
And improve generated code for accessing package private
methods from unresolved compiling class in the same package.
Test: Additional test in 727-checker-unresolved-class
Test: testrunner.py --host --optimizing --interpreter --jvm -t 727
Test: testrunner.py --host --optimizing
Bug: 161898207
Change-Id: Ia34552d90620e8e0398099522a5a52b4a45df15d
Diffstat (limited to 'test/727-checker-unresolved-class/src-ex')
| -rw-r--r-- | test/727-checker-unresolved-class/src-ex/Test.java | 27 | ||||
| -rw-r--r-- | test/727-checker-unresolved-class/src-ex/resolved/SubclassOfUnresolvedClass2.java | 181 |
2 files changed, 208 insertions, 0 deletions
diff --git a/test/727-checker-unresolved-class/src-ex/Test.java b/test/727-checker-unresolved-class/src-ex/Test.java new file mode 100644 index 0000000000..1dd03c29ad --- /dev/null +++ b/test/727-checker-unresolved-class/src-ex/Test.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2020 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. + */ + +import resolved.SubclassOfUnresolvedClass; +import resolved.SubclassOfUnresolvedClass2; +import unresolved.UnresolvedClass; + +public class Test { + public static void $noinline$main() { + UnresolvedClass.$noinline$main(); + SubclassOfUnresolvedClass.$noinline$main(); + SubclassOfUnresolvedClass2.$noinline$main(); + } +} diff --git a/test/727-checker-unresolved-class/src-ex/resolved/SubclassOfUnresolvedClass2.java b/test/727-checker-unresolved-class/src-ex/resolved/SubclassOfUnresolvedClass2.java new file mode 100644 index 0000000000..41b5e8b8d4 --- /dev/null +++ b/test/727-checker-unresolved-class/src-ex/resolved/SubclassOfUnresolvedClass2.java @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2020 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 resolved; + +import unresolved.UnresolvedClass; + +// This class is defined by the child class loader, so access to +// package-private classes and members defined in the parent class +// loader is illegal even though the package name is the same. +public class SubclassOfUnresolvedClass2 extends UnresolvedClass { + public static void $noinline$main() { + $noinline$testPublicFieldInResolvedPackagePrivateClass(); + $noinline$testPublicFieldInPackagePrivateClassViaResolvedPublicSubclass(); + $noinline$testPrivateFieldInResolvedPackagePrivateClass(); + $noinline$testPrivateFieldInPackagePrivateClassViaResolvedPublicSubclass(); + $noinline$testPackagePrivateFieldInResolvedPackagePrivateClass(); + $noinline$testPackagePrivateFieldInPackagePrivateClassViaResolvedPublicSubclass(); + + $noinline$testPublicMethodInResolvedPackagePrivateClass(); + $noinline$testPublicMethodInPackagePrivateClassViaResolvedPublicSubclass(); + $noinline$testPrivateMethodInResolvedPackagePrivateClass(); + $noinline$testPrivateMethodInPackagePrivateClassViaResolvedPublicSubclass(); + $noinline$testPackagePrivateMethodInResolvedPackagePrivateClass(); + $noinline$testPackagePrivateMethodInPackagePrivateClassViaResolvedPublicSubclass(); + + System.out.println("SubclassOfUnresolvedClass2 passed"); + } + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPublicFieldInResolvedPackagePrivateClass() builder (after) + /// CHECK: UnresolvedStaticFieldSet + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPublicFieldInResolvedPackagePrivateClass() builder (after) + /// CHECK-NOT: StaticFieldSet + static void $noinline$testPublicFieldInResolvedPackagePrivateClass() { + try { + ResolvedPackagePrivateClass.publicIntField = 42; + throw new Error("Unreachable"); + } catch (IllegalAccessError expected) {} + } + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPublicFieldInPackagePrivateClassViaResolvedPublicSubclass() builder (after) + /// CHECK: UnresolvedStaticFieldSet + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPublicFieldInPackagePrivateClassViaResolvedPublicSubclass() builder (after) + /// CHECK-NOT: StaticFieldSet + static void $noinline$testPublicFieldInPackagePrivateClassViaResolvedPublicSubclass() { + // TODO: Use StaticFieldSet. + ResolvedPublicSubclassOfPackagePrivateClass.publicIntField = 42; + } + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPrivateFieldInResolvedPackagePrivateClass() builder (after) + /// CHECK: UnresolvedStaticFieldSet + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPrivateFieldInResolvedPackagePrivateClass() builder (after) + /// CHECK-NOT: StaticFieldSet + static void $noinline$testPrivateFieldInResolvedPackagePrivateClass() { + try { + ResolvedPackagePrivateClass.privateIntField = 42; + throw new Error("Unreachable"); + } catch (IllegalAccessError expected) {} + } + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPrivateFieldInPackagePrivateClassViaResolvedPublicSubclass() builder (after) + /// CHECK: UnresolvedStaticFieldSet + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPrivateFieldInPackagePrivateClassViaResolvedPublicSubclass() builder (after) + /// CHECK-NOT: StaticFieldSet + static void $noinline$testPrivateFieldInPackagePrivateClassViaResolvedPublicSubclass() { + try { + ResolvedPublicSubclassOfPackagePrivateClass.privateIntField = 42; + throw new Error("Unreachable"); + } catch (IllegalAccessError expected) {} + } + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPackagePrivateFieldInResolvedPackagePrivateClass() builder (after) + /// CHECK: UnresolvedStaticFieldSet + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPackagePrivateFieldInResolvedPackagePrivateClass() builder (after) + /// CHECK-NOT: StaticFieldSet + static void $noinline$testPackagePrivateFieldInResolvedPackagePrivateClass() { + try { + ResolvedPackagePrivateClass.intField = 42; + throw new Error("Unreachable"); + } catch (IllegalAccessError expected) {} + } + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPackagePrivateFieldInPackagePrivateClassViaResolvedPublicSubclass() builder (after) + /// CHECK: UnresolvedStaticFieldSet + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPackagePrivateFieldInPackagePrivateClassViaResolvedPublicSubclass() builder (after) + /// CHECK-NOT: StaticFieldSet + static void $noinline$testPackagePrivateFieldInPackagePrivateClassViaResolvedPublicSubclass() { + try { + ResolvedPublicSubclassOfPackagePrivateClass.intField = 42; + throw new Error("Unreachable"); + } catch (IllegalAccessError expected) {} + } + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPublicMethodInResolvedPackagePrivateClass() builder (after) + /// CHECK: InvokeUnresolved method_name:{{[^$]*}}$noinline$publicStaticMethod + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPublicMethodInResolvedPackagePrivateClass() builder (after) + /// CHECK-NOT: InvokeStaticOrDirect method_name:{{[^$]*}}$noinline$publicStaticMethod + static void $noinline$testPublicMethodInResolvedPackagePrivateClass() { + try { + ResolvedPackagePrivateClass.$noinline$publicStaticMethod(); + throw new Error("Unreachable"); + } catch (IllegalAccessError expected) {} + } + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPublicMethodInPackagePrivateClassViaResolvedPublicSubclass() builder (after) + /// CHECK: InvokeStaticOrDirect method_name:{{[^$]*}}$noinline$publicStaticMethod + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPublicMethodInPackagePrivateClassViaResolvedPublicSubclass() builder (after) + /// CHECK-NOT: InvokeUnresolved method_name:{{[^$]*}}$noinline$publicStaticMethod + static void $noinline$testPublicMethodInPackagePrivateClassViaResolvedPublicSubclass() { + ResolvedPublicSubclassOfPackagePrivateClass.$noinline$publicStaticMethod(); + } + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPrivateMethodInResolvedPackagePrivateClass() builder (after) + /// CHECK: InvokeUnresolved method_name:{{[^$]*}}$noinline$privateStaticMethod + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPrivateMethodInResolvedPackagePrivateClass() builder (after) + /// CHECK-NOT: InvokeStaticOrDirect method_name:{{[^$]*}}$noinline$privateStaticMethod + static void $noinline$testPrivateMethodInResolvedPackagePrivateClass() { + try { + ResolvedPackagePrivateClass.$noinline$privateStaticMethod(); + throw new Error("Unreachable"); + } catch (IllegalAccessError expected) {} + } + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPrivateMethodInPackagePrivateClassViaResolvedPublicSubclass() builder (after) + /// CHECK: InvokeUnresolved method_name:{{[^$]*}}$noinline$privateStaticMethod + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPrivateMethodInPackagePrivateClassViaResolvedPublicSubclass() builder (after) + /// CHECK-NOT: InvokeStaticOrDirect method_name:{{[^$]*}}$noinline$privateStaticMethod + static void $noinline$testPrivateMethodInPackagePrivateClassViaResolvedPublicSubclass() { + try { + ResolvedPublicSubclassOfPackagePrivateClass.$noinline$privateStaticMethod(); + throw new Error("Unreachable"); + } catch (IllegalAccessError expected) {} + } + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPackagePrivateMethodInResolvedPackagePrivateClass() builder (after) + /// CHECK: InvokeUnresolved method_name:{{[^$]*}}$noinline$staticMethod + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPackagePrivateMethodInResolvedPackagePrivateClass() builder (after) + /// CHECK-NOT: InvokeStaticOrDirect method_name:{{[^$]*}}$noinline$staticMethod + static void $noinline$testPackagePrivateMethodInResolvedPackagePrivateClass() { + try { + ResolvedPackagePrivateClass.$noinline$staticMethod(); + throw new Error("Unreachable"); + } catch (IllegalAccessError expected) {} + } + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPackagePrivateMethodInPackagePrivateClassViaResolvedPublicSubclass() builder (after) + /// CHECK: InvokeUnresolved method_name:{{[^$]*}}$noinline$staticMethod + + /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPackagePrivateMethodInPackagePrivateClassViaResolvedPublicSubclass() builder (after) + /// CHECK-NOT: InvokeStaticOrDirect method_name:{{[^$]*}}$noinline$staticMethod + static void $noinline$testPackagePrivateMethodInPackagePrivateClassViaResolvedPublicSubclass() { + try { + ResolvedPublicSubclassOfPackagePrivateClass.$noinline$staticMethod(); + throw new Error("Unreachable"); + } catch (IllegalAccessError expected) {} + } +} |