1/*
2 * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23package org.graalvm.compiler.jtt.jdk;
24
25import java.util.AbstractList;
26import java.util.List;
27
28import org.junit.Ignore;
29import org.junit.Test;
30
31import org.graalvm.compiler.jtt.JTTTest;
32
33import jdk.vm.ci.meta.ResolvedJavaMethod;
34
35/*
36 */
37public class UnsafeAllocateInstance01 extends JTTTest {
38
39    int field01 = 42;
40
41    public static int testInstance() throws SecurityException, InstantiationException {
42        UnsafeAllocateInstance01 newObject = (UnsafeAllocateInstance01) UNSAFE.allocateInstance(UnsafeAllocateInstance01.class);
43        return newObject.field01;
44    }
45
46    public static void testClassForException(Class<?> clazz) throws SecurityException, InstantiationException {
47        UNSAFE.allocateInstance(clazz);
48    }
49
50    @Override
51    protected Result executeExpected(ResolvedJavaMethod method, Object receiver, Object... args) {
52        if (args.length == 1) {
53            /*
54             * HotSpot will crash if the C2 intrinsic for this is used with array classes, so just
55             * handle it explicitly so that we can still exercise Graal.
56             */
57            Class<?> cl = (Class<?>) args[0];
58            if (cl.isArray()) {
59                return new Result(null, new InstantiationException(cl.getName()));
60            }
61        }
62        return super.executeExpected(method, receiver, args);
63    }
64
65    @Test
66    public void run0() throws Throwable {
67        runTest("testInstance");
68    }
69
70    @Test
71    public void run1() throws Throwable {
72        runTest("testClassForException", UnsafeAllocateInstance01[].class);
73    }
74
75    @Test
76    public void run7() throws Throwable {
77        runTest("testClassForException", UnsafeAllocateInstance01.class);
78    }
79
80    @Test
81    public void run2() throws Throwable {
82        runTest("testClassForException", AbstractList.class);
83    }
84
85    @Test
86    public void run3() throws Throwable {
87        runTest("testClassForException", List.class);
88    }
89
90    @Test
91    public void run4() throws Throwable {
92        runTest("testClassForException", Class.class);
93    }
94
95    @Ignore("Currently crashes hotspot because primitive classes aren't handled")
96    @Test
97    public void run5() throws Throwable {
98        runTest("testClassForException", void.class);
99    }
100
101    @Ignore("Currently crashes hotspot because primitive classes aren't handled")
102    @Test
103    public void run6() throws Throwable {
104        runTest("testClassForException", int.class);
105    }
106}
107