/*
|
* Copyright (C) 2015 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 extends UnresolvedSuperClass {
|
|
/// CHECK-START: void Main.callInvokeUnresolvedStatic() register (before)
|
/// CHECK: InvokeUnresolved invoke_type:static
|
static public void callInvokeUnresolvedStatic() {
|
UnresolvedClass.staticMethod();
|
}
|
|
/// CHECK-START: void Main.callInvokeUnresolvedVirtual(UnresolvedClass) register (before)
|
/// CHECK: InvokeUnresolved invoke_type:virtual
|
static public void callInvokeUnresolvedVirtual(UnresolvedClass c) {
|
c.virtualMethod();
|
}
|
|
/// CHECK-START: void Main.callInvokeUnresolvedInterface(UnresolvedInterface) register (before)
|
/// CHECK: InvokeUnresolved invoke_type:interface
|
static public void callInvokeUnresolvedInterface(UnresolvedInterface c) {
|
c.interfaceMethod();
|
}
|
|
static public void callInvokeUnresolvedSuper(Main c) {
|
c.superMethod();
|
}
|
|
/// CHECK-START: void Main.superMethod() register (before)
|
/// CHECK: InvokeUnresolved invoke_type:super
|
public void superMethod() {
|
super.superMethod();
|
}
|
|
/// CHECK-START: void Main.callUnresolvedStaticFieldAccess() register (before)
|
/// CHECK: UnresolvedStaticFieldSet field_type:Int8
|
/// CHECK: UnresolvedStaticFieldSet field_type:Uint16
|
/// CHECK: UnresolvedStaticFieldSet field_type:Int32
|
/// CHECK: UnresolvedStaticFieldSet field_type:Int64
|
/// CHECK: UnresolvedStaticFieldSet field_type:Float32
|
/// CHECK: UnresolvedStaticFieldSet field_type:Float64
|
/// CHECK: UnresolvedStaticFieldSet field_type:Reference
|
|
/// CHECK: UnresolvedStaticFieldGet field_type:Int8
|
/// CHECK: UnresolvedStaticFieldGet field_type:Uint16
|
/// CHECK: UnresolvedStaticFieldGet field_type:Int32
|
/// CHECK: UnresolvedStaticFieldGet field_type:Int64
|
/// CHECK: UnresolvedStaticFieldGet field_type:Float32
|
/// CHECK: UnresolvedStaticFieldGet field_type:Float64
|
/// CHECK: UnresolvedStaticFieldGet field_type:Reference
|
static public void callUnresolvedStaticFieldAccess() {
|
Object o = new Object();
|
UnresolvedClass.staticByte = (byte)1;
|
UnresolvedClass.staticChar = '1';
|
UnresolvedClass.staticInt = 123456789;
|
UnresolvedClass.staticLong = 123456789123456789l;
|
UnresolvedClass.staticFloat = 123456789123456789f;
|
UnresolvedClass.staticDouble = 123456789123456789d;
|
UnresolvedClass.staticObject = o;
|
|
expectEquals((byte)1, UnresolvedClass.staticByte);
|
expectEquals('1', UnresolvedClass.staticChar);
|
expectEquals(123456789, UnresolvedClass.staticInt);
|
expectEquals(123456789123456789l, UnresolvedClass.staticLong);
|
expectEquals(123456789123456789f, UnresolvedClass.staticFloat);
|
expectEquals(123456789123456789d, UnresolvedClass.staticDouble);
|
expectEquals(o, UnresolvedClass.staticObject);
|
|
// Check "large" values.
|
|
UnresolvedClass.staticByte = (byte)-1;
|
UnresolvedClass.staticChar = (char)32768;
|
UnresolvedClass.staticInt = -1;
|
|
expectEquals((byte)-1, UnresolvedClass.staticByte);
|
expectEquals((char)32768, UnresolvedClass.staticChar);
|
expectEquals(-1, UnresolvedClass.staticInt);
|
}
|
|
/// CHECK-START: void Main.callUnresolvedInstanceFieldAccess(UnresolvedClass) register (before)
|
/// CHECK: UnresolvedInstanceFieldSet field_type:Int8
|
/// CHECK: UnresolvedInstanceFieldSet field_type:Uint16
|
/// CHECK: UnresolvedInstanceFieldSet field_type:Int32
|
/// CHECK: UnresolvedInstanceFieldSet field_type:Int64
|
/// CHECK: UnresolvedInstanceFieldSet field_type:Float32
|
/// CHECK: UnresolvedInstanceFieldSet field_type:Float64
|
/// CHECK: UnresolvedInstanceFieldSet field_type:Reference
|
|
/// CHECK: UnresolvedInstanceFieldGet field_type:Int8
|
/// CHECK: UnresolvedInstanceFieldGet field_type:Uint16
|
/// CHECK: UnresolvedInstanceFieldGet field_type:Int32
|
/// CHECK: UnresolvedInstanceFieldGet field_type:Int64
|
/// CHECK: UnresolvedInstanceFieldGet field_type:Float32
|
/// CHECK: UnresolvedInstanceFieldGet field_type:Float64
|
/// CHECK: UnresolvedInstanceFieldGet field_type:Reference
|
static public void callUnresolvedInstanceFieldAccess(UnresolvedClass c) {
|
Object o = new Object();
|
c.instanceByte = (byte)1;
|
c.instanceChar = '1';
|
c.instanceInt = 123456789;
|
c.instanceLong = 123456789123456789l;
|
c.instanceFloat = 123456789123456789f;
|
c.instanceDouble = 123456789123456789d;
|
c.instanceObject = o;
|
|
expectEquals((byte)1, c.instanceByte);
|
expectEquals('1', c.instanceChar);
|
expectEquals(123456789, c.instanceInt);
|
expectEquals(123456789123456789l, c.instanceLong);
|
expectEquals(123456789123456789f, c.instanceFloat);
|
expectEquals(123456789123456789d, c.instanceDouble);
|
expectEquals(o, c.instanceObject);
|
|
// Check "large" values.
|
|
c.instanceByte = (byte)-1;
|
c.instanceChar = (char)32768;
|
c.instanceInt = -1;
|
|
expectEquals((byte)-1, c.instanceByte);
|
expectEquals((char)32768, c.instanceChar);
|
expectEquals(-1, c.instanceInt);
|
}
|
|
/// CHECK-START: void Main.callUnresolvedNull(UnresolvedClass) register (before)
|
/// CHECK-NOT: NullCheck
|
static public void callUnresolvedNull(UnresolvedClass c) {
|
int x = 0;
|
try {
|
x = c.instanceInt;
|
throw new Error("Expected NPE");
|
} catch (NullPointerException e) {
|
x -= 1;
|
}
|
expectEquals(-1, x);
|
try {
|
c.instanceInt = -1;
|
throw new Error("Expected NPE");
|
} catch (NullPointerException e) {
|
x -= 1;
|
}
|
expectEquals(-2, x);
|
try {
|
c.virtualMethod();
|
throw new Error("Expected NPE");
|
} catch (NullPointerException e) {
|
x -= 1;
|
}
|
expectEquals(-3, x);
|
}
|
|
static public void testInstanceOf(Object o) {
|
if (o instanceof UnresolvedSuperClass) {
|
System.out.println("instanceof ok");
|
}
|
}
|
|
static public UnresolvedSuperClass testCheckCast(Object o) {
|
UnresolvedSuperClass c = (UnresolvedSuperClass) o;
|
System.out.println("checkcast ok");
|
return c;
|
}
|
/// CHECK-START: void Main.main(java.lang.String[]) register (before)
|
/// CHECK: InvokeUnresolved invoke_type:direct
|
static public void main(String[] args) {
|
UnresolvedClass c = new UnresolvedClass();
|
Main m = new Main();
|
callInvokeUnresolvedStatic();
|
callInvokeUnresolvedVirtual(c);
|
callInvokeUnresolvedInterface(c);
|
callInvokeUnresolvedSuper(m);
|
callUnresolvedStaticFieldAccess();
|
callUnresolvedInstanceFieldAccess(c);
|
callUnresolvedNull(null);
|
testInstanceOf(m);
|
testCheckCast(m);
|
testLicm(2);
|
}
|
|
/// CHECK-START: void Main.testLicm(int) licm (before)
|
/// CHECK: <<Class:l\d+>> LoadClass loop:<<LoopLabel:B\d+>>
|
/// CHECK-NEXT: <<Clinit:l\d+>> ClinitCheck [<<Class>>] loop:<<LoopLabel>>
|
/// CHECK-NEXT: <<New:l\d+>> NewInstance [<<Clinit>>] loop:<<LoopLabel>>
|
/// CHECK-NEXT: ConstructorFence [<<New>>] loop:<<LoopLabel>>
|
/// CHECK-NEXT: InvokeUnresolved [<<New>>] loop:<<LoopLabel>>
|
|
/// CHECK-START: void Main.testLicm(int) licm (after)
|
/// CHECK: <<Class:l\d+>> LoadClass loop:none
|
/// CHECK-NEXT: <<Clinit:l\d+>> ClinitCheck [<<Class>>] loop:none
|
/// CHECK: <<New:l\d+>> NewInstance [<<Clinit>>] loop:<<LoopLabel:B\d+>>
|
/// CHECK-NEXT: ConstructorFence [<<New>>] loop:<<LoopLabel>>
|
/// CHECK-NEXT: InvokeUnresolved [<<New>>] loop:<<LoopLabel>>
|
static public void testLicm(int count) {
|
// Test to make sure we keep the initialization check after loading an unresolved class.
|
UnresolvedClass c;
|
int i = 0;
|
do {
|
c = new UnresolvedClass();
|
} while (i++ != count);
|
}
|
|
public static void expectEquals(byte expected, byte result) {
|
if (expected != result) {
|
throw new Error("Expected: " + expected + ", found: " + result);
|
}
|
}
|
|
public static void expectEquals(char expected, char result) {
|
if (expected != result) {
|
throw new Error("Expected: " + expected + ", found: " + result);
|
}
|
}
|
|
public static void expectEquals(int expected, int result) {
|
if (expected != result) {
|
throw new Error("Expected: " + expected + ", found: " + result);
|
}
|
}
|
|
public static void expectEquals(long expected, long result) {
|
if (expected != result) {
|
throw new Error("Expected: " + expected + ", found: " + result);
|
}
|
}
|
|
public static void expectEquals(float expected, float result) {
|
if (expected != result) {
|
throw new Error("Expected: " + expected + ", found: " + result);
|
}
|
}
|
|
public static void expectEquals(double expected, double result) {
|
if (expected != result) {
|
throw new Error("Expected: " + expected + ", found: " + result);
|
}
|
}
|
|
public static void expectEquals(Object expected, Object result) {
|
if (expected != result) {
|
throw new Error("Expected: " + expected + ", found: " + result);
|
}
|
}
|
}
|