diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/979-const-method-handle/build | 22 | ||||
| -rw-r--r-- | test/979-const-method-handle/classes/Main.class | bin | 0 -> 943 bytes | |||
| -rw-r--r-- | test/979-const-method-handle/classes/constmethodhandle/ConstTest.class | bin | 0 -> 1411 bytes | |||
| -rw-r--r-- | test/979-const-method-handle/expected.txt | 2 | ||||
| -rw-r--r-- | test/979-const-method-handle/info.txt | 7 | ||||
| -rw-r--r-- | test/dexdump/const-method-handle.dex | bin | 0 -> 2524 bytes | |||
| -rw-r--r-- | test/dexdump/const-method-handle.lst | 9 | ||||
| -rw-r--r-- | test/dexdump/const-method-handle.txt | 275 | ||||
| -rw-r--r-- | test/dexdump/const-method-handle.xml | 91 |
9 files changed, 406 insertions, 0 deletions
diff --git a/test/979-const-method-handle/build b/test/979-const-method-handle/build new file mode 100644 index 0000000000..966ecf4ce4 --- /dev/null +++ b/test/979-const-method-handle/build @@ -0,0 +1,22 @@ +#!/bin/bash +# +# 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. + +# Stop if something fails. +set -e + +${DX} --dex --min-sdk-version=27 --output=classes.dex classes + +zip $TEST_NAME.jar classes.dex diff --git a/test/979-const-method-handle/classes/Main.class b/test/979-const-method-handle/classes/Main.class Binary files differnew file mode 100644 index 0000000000..8d6b7d88bb --- /dev/null +++ b/test/979-const-method-handle/classes/Main.class diff --git a/test/979-const-method-handle/classes/constmethodhandle/ConstTest.class b/test/979-const-method-handle/classes/constmethodhandle/ConstTest.class Binary files differnew file mode 100644 index 0000000000..a21b0a336c --- /dev/null +++ b/test/979-const-method-handle/classes/constmethodhandle/ConstTest.class diff --git a/test/979-const-method-handle/expected.txt b/test/979-const-method-handle/expected.txt new file mode 100644 index 0000000000..573b80da99 --- /dev/null +++ b/test/979-const-method-handle/expected.txt @@ -0,0 +1,2 @@ +MethodHandle MethodHandle(Object)Class => class java.lang.Float +MethodType (char,short,int,long,float,double,Object)boolean diff --git a/test/979-const-method-handle/info.txt b/test/979-const-method-handle/info.txt new file mode 100644 index 0000000000..e8514ce91f --- /dev/null +++ b/test/979-const-method-handle/info.txt @@ -0,0 +1,7 @@ +This test checks const-method-handle and const-method-type bytecodes. + +The class files in this test come from: + + dalvik/dx/tests/142-const-method-handle + +and are built using ASM bytecode manipulation library. diff --git a/test/dexdump/const-method-handle.dex b/test/dexdump/const-method-handle.dex Binary files differnew file mode 100644 index 0000000000..1fe28e572c --- /dev/null +++ b/test/dexdump/const-method-handle.dex diff --git a/test/dexdump/const-method-handle.lst b/test/dexdump/const-method-handle.lst new file mode 100644 index 0000000000..961d427fe7 --- /dev/null +++ b/test/dexdump/const-method-handle.lst @@ -0,0 +1,9 @@ +#const-method-handle.dex +0x000003c0 8 Main <init> ()V Main.java 22 +0x000003d8 50 Main main ([Ljava/lang/String;)V Main.java 26 +0x0000041c 8 constmethodhandle.ConstTest <init> ()V ConstTest.java 22 +0x00000434 94 constmethodhandle.ConstTest displayMethodHandle (Ljava/lang/invoke/MethodHandle;)V ConstTest.java 24 +0x000004a4 50 constmethodhandle.ConstTest displayMethodType (Ljava/lang/invoke/MethodType;)V ConstTest.java 29 +0x000004e8 30 constmethodhandle.ConstTest main ([Ljava/lang/String;)V ConstTest.java -1 +0x00000518 6 constmethodhandle.ConstTest test1 ()Ljava/lang/invoke/MethodHandle; ConstTest.java -1 +0x00000530 6 constmethodhandle.ConstTest test2 ()Ljava/lang/invoke/MethodType; ConstTest.java -1 diff --git a/test/dexdump/const-method-handle.txt b/test/dexdump/const-method-handle.txt new file mode 100644 index 0000000000..6b33502105 --- /dev/null +++ b/test/dexdump/const-method-handle.txt @@ -0,0 +1,275 @@ +Processing 'const-method-handle.dex'... +Opened 'const-method-handle.dex', DEX version '039' +DEX file header: +magic : 'dex\n039\0' +checksum : 16656a27 +signature : 1953...5aa5 +file_size : 2524 +header_size : 112 +link_size : 0 +link_off : 0 (0x000000) +string_ids_size : 57 +string_ids_off : 112 (0x000070) +type_ids_size : 26 +type_ids_off : 340 (0x000154) +proto_ids_size : 18 +proto_ids_off : 444 (0x0001bc) +field_ids_size : 2 +field_ids_off : 660 (0x000294) +method_ids_size : 23 +method_ids_off : 676 (0x0002a4) +class_defs_size : 2 +class_defs_off : 860 (0x00035c) +data_size : 1588 +data_off : 936 (0x0003a8) + +Class #0 header: +class_idx : 5 +access_flags : 1 (0x0001) +superclass_idx : 11 +interfaces_off : 0 (0x000000) +source_file_idx : 29 +annotations_off : 1336 (0x000538) +class_data_off : 2270 (0x0008de) +static_fields_size : 0 +instance_fields_size: 0 +direct_methods_size : 2 +virtual_methods_size: 0 + +Class #0 annotations: +Annotations on method #1 'main' + VISIBILITY_SYSTEM Ldalvik/annotation/Throws; value={ Ljava/lang/Throwable; } + +Class #0 - + Class descriptor : 'LMain;' + Access flags : 0x0001 (PUBLIC) + Superclass : 'Ljava/lang/Object;' + Interfaces - + Static fields - + Instance fields - + Direct methods - + #0 : (in LMain;) + name : '<init>' + type : '()V' + access : 0x10001 (PUBLIC CONSTRUCTOR) + code - + registers : 1 + ins : 1 + outs : 1 + insns size : 4 16-bit code units +0003b0: |[0003b0] Main.<init>:()V +0003c0: 7010 0a00 0000 |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@000a +0003c6: 0e00 |0003: return-void + catches : (none) + positions : + 0x0000 line=22 + locals : + 0x0000 - 0x0004 reg=0 this LMain; + + #1 : (in LMain;) + name : 'main' + type : '([Ljava/lang/String;)V' + access : 0x0009 (PUBLIC STATIC) + code - + registers : 6 + ins : 1 + outs : 4 + insns size : 25 16-bit code units +0003c8: |[0003c8] Main.main:([Ljava/lang/String;)V +0003d8: 7100 1500 0000 |0000: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@0015 +0003de: 0c00 |0003: move-result-object v0 +0003e0: 1c01 0600 |0004: const-class v1, Lconstmethodhandle/ConstTest; // type@0006 +0003e4: 1a02 3000 |0006: const-string v2, "main" // string@0030 +0003e8: 6203 0100 |0008: sget-object v3, Ljava/lang/Void;.TYPE:Ljava/lang/Class; // field@0001 +0003ec: 1c04 1900 |000a: const-class v4, [Ljava/lang/String; // type@0019 +0003f0: 7120 1600 4300 |000c: invoke-static {v3, v4}, Ljava/lang/invoke/MethodType;.methodType:(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/invoke/MethodType; // method@0016 +0003f6: 0c03 |000f: move-result-object v3 +0003f8: 6e40 1400 1032 |0010: invoke-virtual {v0, v1, v2, v3}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@0014 +0003fe: 0c00 |0013: move-result-object v0 +000400: fa20 1200 5000 1000 |0014: invoke-polymorphic {v0, v5}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ([Ljava/lang/String;)V // method@0012, proto@0010 +000408: 0e00 |0018: return-void + catches : (none) + positions : + 0x0000 line=26 + 0x000c line=27 + 0x0014 line=28 + 0x0018 line=29 + locals : + 0x0000 - 0x0019 reg=5 (null) [Ljava/lang/String; + + Virtual methods - + source_file_idx : 29 (Main.java) + +Class #1 header: +class_idx : 6 +access_flags : 1 (0x0001) +superclass_idx : 11 +interfaces_off : 0 (0x000000) +source_file_idx : 3 +annotations_off : 1360 (0x000550) +class_data_off : 2284 (0x0008ec) +static_fields_size : 0 +instance_fields_size: 0 +direct_methods_size : 6 +virtual_methods_size: 0 + +Class #1 annotations: +Annotations on method #3 'displayMethodHandle' + VISIBILITY_SYSTEM Ldalvik/annotation/Throws; value={ Ljava/lang/Throwable; } + +Class #1 - + Class descriptor : 'Lconstmethodhandle/ConstTest;' + Access flags : 0x0001 (PUBLIC) + Superclass : 'Ljava/lang/Object;' + Interfaces - + Static fields - + Instance fields - + Direct methods - + #0 : (in Lconstmethodhandle/ConstTest;) + name : '<init>' + type : '()V' + access : 0x10001 (PUBLIC CONSTRUCTOR) + code - + registers : 1 + ins : 1 + outs : 1 + insns size : 4 16-bit code units +00040c: |[00040c] constmethodhandle.ConstTest.<init>:()V +00041c: 7010 0a00 0000 |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@000a +000422: 0e00 |0003: return-void + catches : (none) + positions : + 0x0000 line=22 + locals : + 0x0000 - 0x0004 reg=0 this Lconstmethodhandle/ConstTest; + + #1 : (in Lconstmethodhandle/ConstTest;) + name : 'displayMethodHandle' + type : '(Ljava/lang/invoke/MethodHandle;)V' + access : 0x000a (PRIVATE STATIC) + code - + registers : 4 + ins : 1 + outs : 2 + insns size : 47 16-bit code units +000424: |[000424] constmethodhandle.ConstTest.displayMethodHandle:(Ljava/lang/invoke/MethodHandle;)V +000434: 6200 0000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0000 +000438: 2201 0d00 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@000d +00043c: 7010 0c00 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@000c +000442: 1a02 1e00 |0007: const-string v2, "MethodHandle " // string@001e +000446: 6e20 0e00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@000e +00044c: 0c01 |000c: move-result-object v1 +00044e: 6e20 0d00 3100 |000d: invoke-virtual {v1, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@000d +000454: 0c01 |0010: move-result-object v1 +000456: 1a02 0000 |0011: const-string v2, " => " // string@0000 +00045a: 6e20 0e00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@000e +000460: 0c01 |0016: move-result-object v1 +000462: 1402 0030 4046 |0017: const v2, #float 12300 // #46403000 +000468: 7110 0900 0200 |001a: invoke-static {v2}, Ljava/lang/Float;.valueOf:(F)Ljava/lang/Float; // method@0009 +00046e: 0c02 |001d: move-result-object v2 +000470: fa20 1100 2300 0100 |001e: invoke-polymorphic {v3, v2}, Ljava/lang/invoke/MethodHandle;.invoke:([Ljava/lang/Object;)Ljava/lang/Object;, (Ljava/lang/Object;)Ljava/lang/Class; // method@0011, proto@0001 +000478: 0c02 |0022: move-result-object v2 +00047a: 6e20 0d00 2100 |0023: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@000d +000480: 0c01 |0026: move-result-object v1 +000482: 6e10 0f00 0100 |0027: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@000f +000488: 0c01 |002a: move-result-object v1 +00048a: 6e20 0800 1000 |002b: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@0008 +000490: 0e00 |002e: return-void + catches : (none) + positions : + 0x0000 line=24 + 0x001a line=25 + 0x002b line=24 + 0x002e line=26 + locals : + 0x0000 - 0x002f reg=3 (null) Ljava/lang/invoke/MethodHandle; + + #2 : (in Lconstmethodhandle/ConstTest;) + name : 'displayMethodType' + type : '(Ljava/lang/invoke/MethodType;)V' + access : 0x000a (PRIVATE STATIC) + code - + registers : 4 + ins : 1 + outs : 2 + insns size : 25 16-bit code units +000494: |[000494] constmethodhandle.ConstTest.displayMethodType:(Ljava/lang/invoke/MethodType;)V +0004a4: 6200 0000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0000 +0004a8: 2201 0d00 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@000d +0004ac: 7010 0c00 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@000c +0004b2: 1a02 1f00 |0007: const-string v2, "MethodType " // string@001f +0004b6: 6e20 0e00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@000e +0004bc: 0c01 |000c: move-result-object v1 +0004be: 6e20 0d00 3100 |000d: invoke-virtual {v1, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@000d +0004c4: 0c01 |0010: move-result-object v1 +0004c6: 6e10 0f00 0100 |0011: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@000f +0004cc: 0c01 |0014: move-result-object v1 +0004ce: 6e20 0800 1000 |0015: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@0008 +0004d4: 0e00 |0018: return-void + catches : (none) + positions : + 0x0000 line=29 + 0x0018 line=30 + locals : + 0x0000 - 0x0019 reg=3 (null) Ljava/lang/invoke/MethodType; + + #3 : (in Lconstmethodhandle/ConstTest;) + name : 'main' + type : '([Ljava/lang/String;)V' + access : 0x0009 (PUBLIC STATIC) + code - + registers : 2 + ins : 1 + outs : 1 + insns size : 15 16-bit code units +0004d8: |[0004d8] constmethodhandle.ConstTest.main:([Ljava/lang/String;)V +0004e8: 7100 0600 0000 |0000: invoke-static {}, Lconstmethodhandle/ConstTest;.test1:()Ljava/lang/invoke/MethodHandle; // method@0006 +0004ee: 0c00 |0003: move-result-object v0 +0004f0: 7110 0300 0000 |0004: invoke-static {v0}, Lconstmethodhandle/ConstTest;.displayMethodHandle:(Ljava/lang/invoke/MethodHandle;)V // method@0003 +0004f6: 7100 0700 0000 |0007: invoke-static {}, Lconstmethodhandle/ConstTest;.test2:()Ljava/lang/invoke/MethodType; // method@0007 +0004fc: 0c00 |000a: move-result-object v0 +0004fe: 7110 0400 0000 |000b: invoke-static {v0}, Lconstmethodhandle/ConstTest;.displayMethodType:(Ljava/lang/invoke/MethodType;)V // method@0004 +000504: 0e00 |000e: return-void + catches : (none) + positions : + locals : + + #4 : (in Lconstmethodhandle/ConstTest;) + name : 'test1' + type : '()Ljava/lang/invoke/MethodHandle;' + access : 0x0009 (PUBLIC STATIC) + code - + registers : 1 + ins : 0 + outs : 0 + insns size : 3 16-bit code units +000508: |[000508] constmethodhandle.ConstTest.test1:()Ljava/lang/invoke/MethodHandle; +000518: fe00 0000 |0000: const-method-handle v0, method_handle@0000 +00051c: 1100 |0002: return-object v0 + catches : (none) + positions : + locals : + + #5 : (in Lconstmethodhandle/ConstTest;) + name : 'test2' + type : '()Ljava/lang/invoke/MethodType;' + access : 0x0009 (PUBLIC STATIC) + code - + registers : 1 + ins : 0 + outs : 0 + insns size : 3 16-bit code units +000520: |[000520] constmethodhandle.ConstTest.test2:()Ljava/lang/invoke/MethodType; +000530: ff00 1100 |0000: const-method-type v0, (CSIJFDLjava/lang/Object;)Z // proto@0011 +000534: 1100 |0002: return-object v0 + catches : (none) + positions : + locals : + + Virtual methods - + source_file_idx : 3 (ConstTest.java) + +Method handle #0: + type : invoke-instance + target : Ljava/lang/Object; getClass + target_type : (Ljava/lang/Object;)Ljava/lang/Class; diff --git a/test/dexdump/const-method-handle.xml b/test/dexdump/const-method-handle.xml new file mode 100644 index 0000000000..f1cf9f8557 --- /dev/null +++ b/test/dexdump/const-method-handle.xml @@ -0,0 +1,91 @@ +<api> +<package name="" +> +<class name="Main" + extends="java.lang.Object" + interface="false" + abstract="false" + static="false" + final="false" + visibility="public" +> +<constructor name="Main" + type="Main" + static="false" + final="false" + visibility="public" +> +</constructor> +<method name="main" + return="void" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + visibility="public" +> +<parameter name="arg0" type="java.lang.String[]"> +</parameter> +</method> +</class> +</package> +<package name="constmethodhandle" +> +<class name="ConstTest" + extends="java.lang.Object" + interface="false" + abstract="false" + static="false" + final="false" + visibility="public" +> +<constructor name="ConstTest" + type="constmethodhandle.ConstTest" + static="false" + final="false" + visibility="public" +> +</constructor> +<method name="main" + return="void" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + visibility="public" +> +<parameter name="arg0" type="java.lang.String[]"> +</parameter> +</method> +<method name="test1" + return="java.lang.invoke.MethodHandle" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + visibility="public" +> +</method> +<method name="test2" + return="java.lang.invoke.MethodType" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + visibility="public" +> +</method> +</class> +<method_handle index="0" + type="invoke-instance" + target_class="Ljava/lang/Object;" + target_member="getClass" + target_member_type="(Ljava/lang/Object;)Ljava/lang/Class;" +> +</method_handle> +</package> +</api> |