diff options
Diffstat (limited to 'test')
5 files changed, 192 insertions, 1 deletions
diff --git a/test/954-invoke-polymorphic-verifier/expected.txt b/test/954-invoke-polymorphic-verifier/expected.txt index 5df393aede..d49af9648f 100644 --- a/test/954-invoke-polymorphic-verifier/expected.txt +++ b/test/954-invoke-polymorphic-verifier/expected.txt @@ -5,6 +5,12 @@ java.lang.VerifyError: Verifier rejected class TooFewArguments: void TooFewArgum java.lang.VerifyError: Verifier rejected class TooManyArguments: void TooManyArguments.<init>() failed to verify: void TooManyArguments.<init>(): void TooManyArguments.<init>(): Rejecting invocation, expected 4 argument registers, method signature has 3 java.lang.VerifyError: Verifier rejected class BadThis: void BadThis.<init>() failed to verify: void BadThis.<init>(): void BadThis.<init>(): 'this' argument 'Precise Reference: java.lang.String' not instance of 'Reference: java.lang.invoke.MethodHandle' java.lang.VerifyError: Verifier rejected class FakeSignaturePolymorphic: void FakeSignaturePolymorphic.<init>() failed to verify: void FakeSignaturePolymorphic.<init>(): void FakeSignaturePolymorphic.<init>(): invoke type (METHOD_POLYMORPHIC) does not match method type of java.lang.Object Main.invoke(java.lang.Object[]) -java.lang.VerifyError: Verifier rejected class BetterFakeSignaturePolymorphic: void BetterFakeSignaturePolymorphic.<init>() failed to verify: void BetterFakeSignaturePolymorphic.<init>(): Signature polymorphic method must be declared in java.lang.invoke.MethodClass +java.lang.VerifyError: Verifier rejected class BetterFakeSignaturePolymorphic: void BetterFakeSignaturePolymorphic.<init>() failed to verify: void BetterFakeSignaturePolymorphic.<init>(): Signature polymorphic method in unsuppported class: Main Passed Subclass test java.lang.VerifyError: Verifier rejected class Unresolved: void Unresolved.<init>() failed to verify: void Unresolved.<init>(): invoke-polymorphic receiver has no class: Unresolved Reference: other.thing.Foo +Passed VarHandleHappyAccessors test +java.lang.VerifyError: Verifier rejected class VarHandleUnhappyAccessors: void VarHandleUnhappyAccessors.compareAndExchange(java.lang.invoke.VarHandle, java.lang.Object[]) failed to verify: void VarHandleUnhappyAccessors.compareAndExchange(java.lang.invoke.VarHandle, java.lang.Object[]): void VarHandleUnhappyAccessors.compareAndExchange(java.lang.invoke.VarHandle, java.lang.Object[]): couldn't find method java.lang.invoke.VarHandle.compareAndExchange ([Ljava/lang/Object;)Ljava/lang/Integer; + void VarHandleUnhappyAccessors.compareAndExchangeAcquire(java.lang.invoke.VarHandle) failed to verify: void VarHandleUnhappyAccessors.compareAndExchangeAcquire(java.lang.invoke.VarHandle): void VarHandleUnhappyAccessors.compareAndExchangeAcquire(java.lang.invoke.VarHandle): couldn't find method java.lang.invoke.VarHandle.compareAndExchangeAcquire (I)Ljava/lang/Object; + void VarHandleUnhappyAccessors.compareAndExchangeRelease(java.lang.invoke.VarHandle) failed to verify: void VarHandleUnhappyAccessors.compareAndExchangeRelease(java.lang.invoke.VarHandle): void VarHandleUnhappyAccessors.compareAndExchangeRelease(java.lang.invoke.VarHandle): couldn't find method java.lang.invoke.VarHandle.compareAndExchangeRelease ()V + void VarHandleUnhappyAccessors.compareAndSet(java.lang.invoke.VarHandle) failed to verify: void VarHandleUnhappyAccessors.compareAndSet(java.lang.invoke.VarHandle): void VarHandleUnhappyAccessors.compareAndSet(java.lang.invoke.VarHandle): couldn't find method java.lang.invoke.VarHandle.compareAndSet (I)Z +java.lang.VerifyError: Verifier rejected class VarHandleUnknownAccessor: void VarHandleUnknownAccessor.<init>() failed to verify: void VarHandleUnknownAccessor.<init>(): void VarHandleUnknownAccessor.<init>(): couldn't find method java.lang.invoke.VarHandle.unknownAccessor ([Ljava/lang/Object;)Ljava/lang/Object; diff --git a/test/954-invoke-polymorphic-verifier/smali/Main.smali b/test/954-invoke-polymorphic-verifier/smali/Main.smali index 5b5e5557d7..e35aae7f4e 100644 --- a/test/954-invoke-polymorphic-verifier/smali/Main.smali +++ b/test/954-invoke-polymorphic-verifier/smali/Main.smali @@ -50,6 +50,12 @@ invoke-static {v0}, LMain;->test(Ljava/lang/String;)V const-string v0, "Unresolved" invoke-static {v0}, LMain;->test(Ljava/lang/String;)V + const-string v0, "VarHandleHappyAccessors" + invoke-static {v0}, LMain;->test(Ljava/lang/String;)V + const-string v0, "VarHandleUnhappyAccessors" + invoke-static {v0}, LMain;->test(Ljava/lang/String;)V +const-string v0, "VarHandleUnknownAccessor" + invoke-static {v0}, LMain;->test(Ljava/lang/String;)V return-void .end method diff --git a/test/954-invoke-polymorphic-verifier/smali/VarHandleHappyAccessors.smali b/test/954-invoke-polymorphic-verifier/smali/VarHandleHappyAccessors.smali new file mode 100644 index 0000000000..ec6aa5bbce --- /dev/null +++ b/test/954-invoke-polymorphic-verifier/smali/VarHandleHappyAccessors.smali @@ -0,0 +1,72 @@ +# +# Copyright (C) 2018 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. + +.source "VarHandleHappyAccessors.smali" + +.class public LVarHandleHappyAccessors; +.super Ljava/lang/Object; + +.method public constructor <init>()V +.registers 4 + invoke-direct {p0}, Ljava/lang/Object;-><init>()V + invoke-static {}, LVarHandleHappyAccessors;->getVarHandle()Ljava/lang/invoke/VarHandle; + move-result-object v0 + if-eqz v0, :done + const/4 v1, 0 + move-object v1, v1 + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->compareAndExchange([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->compareAndExchangeAcquire([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->compareAndExchangeRelease([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->compareAndSet([Ljava/lang/Object;)Z, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->get([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->getAcquire([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->getAndAdd([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->getAndAddAcquire([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->getAndAddRelease([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->getAndBitwiseAnd([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->getAndBitwiseAndAcquire([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->getAndBitwiseAndRelease([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->getAndBitwiseOr([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->getAndBitwiseOrAcquire([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->getAndBitwiseOrRelease([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->getAndBitwiseXor([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->getAndBitwiseXorAcquire([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->getAndBitwiseXorRelease([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->getAndSet([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->getAndSetAcquire([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->getAndSetRelease([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->getOpaque([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->getVolatile([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->set([Ljava/lang/Object;)V, ([Ljava/lang/Object;)V + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->setOpaque([Ljava/lang/Object;)V, ([Ljava/lang/Object;)V + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->setRelease([Ljava/lang/Object;)V, ([Ljava/lang/Object;)V + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->setVolatile([Ljava/lang/Object;)V, ([Ljava/lang/Object;)V + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->weakCompareAndSet([Ljava/lang/Object;)Z, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->weakCompareAndSetAcquire([Ljava/lang/Object;)Z, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->weakCompareAndSetPlain([Ljava/lang/Object;)Z, ([Ljava/lang/Object;)Ljava/lang/Object; + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->weakCompareAndSetRelease([Ljava/lang/Object;)Z, ([Ljava/lang/Object;)Ljava/lang/Object; + return-void + :done + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + const-string v1, "Passed VarHandleHappyAccessors test" + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + return-void +.end method + +.method public static getVarHandle()Ljava/lang/invoke/VarHandle; +.registers 1 + const/4 v0, 0 + return-object v0 +.end method diff --git a/test/954-invoke-polymorphic-verifier/smali/VarHandleUnhappyAccessors.smali b/test/954-invoke-polymorphic-verifier/smali/VarHandleUnhappyAccessors.smali new file mode 100644 index 0000000000..0832c04d38 --- /dev/null +++ b/test/954-invoke-polymorphic-verifier/smali/VarHandleUnhappyAccessors.smali @@ -0,0 +1,70 @@ +# +# Copyright (C) 2018 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. + +.source "VarHandleUnhappyAccessors.smali" + +.class public LVarHandleUnhappyAccessors; +.super Ljava/lang/Object; + +.method public constructor <init>()V +.registers 4 + invoke-direct {p0}, Ljava/lang/Object;-><init>()V + invoke-static {}, LVarHandleUnhappyAccessors;->getVarHandle()Ljava/lang/invoke/VarHandle; + move-result-object v0 + invoke-static {}, LVarHandleUnhappyAccessors;->getObjectArray()[Ljava/lang/Object; + move-result-object v1 + invoke-static {v0, v1}, LVarHandleUnhappyAccessors;->compareAndExchange(Ljava/lang/invoke/VarHandle;[Ljava/lang/Object;)V + invoke-static {v0}, LVarHandleUnhappyAccessors;->compareAndExchangeAcquire(Ljava/lang/invoke/VarHandle;)V + invoke-static {v0}, LVarHandleUnhappyAccessors;->compareAndExchangeRelease(Ljava/lang/invoke/VarHandle;)V + invoke-static {v0}, LVarHandleUnhappyAccessors;->compareAndSet(Ljava/lang/invoke/VarHandle;)V + return-void +.end method + +# The following methods all invoke VarHandle accessors but the targetted +# accessor methods have the wrong signature. + +.method public static compareAndExchange(Ljava/lang/invoke/VarHandle;[Ljava/lang/Object;)V +.registers 2 + invoke-polymorphic {p0, p1}, Ljava/lang/invoke/VarHandle;->compareAndExchange([Ljava/lang/Object;)Ljava/lang/Integer;, ([Ljava/lang/Object;)Ljava/lang/Object; +.end method + +.method public static compareAndExchangeAcquire(Ljava/lang/invoke/VarHandle;)V +.registers 2 + const/4 v0, 1 + invoke-polymorphic {p0, v0}, Ljava/lang/invoke/VarHandle;->compareAndExchangeAcquire(I)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; +.end method + +.method public static compareAndExchangeRelease(Ljava/lang/invoke/VarHandle;)V +.registers 1 + invoke-polymorphic {p0}, Ljava/lang/invoke/VarHandle;->compareAndExchangeRelease()V, ([Ljava/lang/Object;)Ljava/lang/Object; +.end method + +.method public static compareAndSet(Ljava/lang/invoke/VarHandle;)V +.registers 2 + const/4 v0, 1 + invoke-polymorphic {p0, v0}, Ljava/lang/invoke/VarHandle;->compareAndSet(I)Z, ([Ljava/lang/Object;)Ljava/lang/Object; +.end method + +.method public static getVarHandle()Ljava/lang/invoke/VarHandle; +.registers 1 + const/4 v0, 0 + return-object v0 +.end method + +.method public static getObjectArray()[Ljava/lang/Object; +.registers 1 + const/4 v0, 0 + return-object v0 +.end method diff --git a/test/954-invoke-polymorphic-verifier/smali/VarHandleUnknownAccessor.smali b/test/954-invoke-polymorphic-verifier/smali/VarHandleUnknownAccessor.smali new file mode 100644 index 0000000000..35084f5bca --- /dev/null +++ b/test/954-invoke-polymorphic-verifier/smali/VarHandleUnknownAccessor.smali @@ -0,0 +1,37 @@ +# +# Copyright (C) 2018 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. + +.source "VarHandleUnknownAccessor.smali" + +.class public LVarHandleUnknownAccessor; +.super Ljava/lang/Object; + +.method public constructor <init>()V +.registers 4 + invoke-direct {p0}, Ljava/lang/Object;-><init>()V + invoke-static {}, LVarHandleUnknownAccessor;->getVarHandle()Ljava/lang/invoke/VarHandle; + move-result-object v0 + const/4 v1, 0 + move-object v1, v1 + # Attempt invoke-polymorphic on VarHandle.unknownAccessor(). + invoke-polymorphic {v0, v1}, Ljava/lang/invoke/VarHandle;->unknownAccessor([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/Object;)Ljava/lang/Object; + return-void +.end method + +.method public static getVarHandle()Ljava/lang/invoke/VarHandle; +.registers 1 + const/4 v0, 0 + return-object v0 +.end method |