Mercurial > hg > truffle
changeset 10889:a9225e3678aa
added macro node for Class.isInstance
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Fri, 26 Jul 2013 19:49:36 +0200 |
parents | 406d9b8bf040 |
children | 2cdd22e1ac5e |
files | graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsInstanceNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassSubstitutions.java graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/lang/Class_isInstance07.java |
diffstat | 3 files changed, 145 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsInstanceNode.java Fri Jul 26 19:49:36 2013 +0200 @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.hotspot.nodes; + +import com.oracle.graal.hotspot.meta.*; +import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.calc.*; +import com.oracle.graal.nodes.java.*; +import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.replacements.nodes.*; + +/** + * {@link MacroNode Macro node} for {@link Class#isInstance(Object)}. + */ +public class ClassIsInstanceNode extends MacroNode implements Canonicalizable, Lowerable { + + public ClassIsInstanceNode(Invoke invoke) { + super(invoke); + } + + private ValueNode getJavaClass() { + return arguments.get(0); + } + + private ValueNode getObject() { + return arguments.get(1); + } + + public ValueNode canonical(CanonicalizerTool tool) { + ValueNode javaClass = getJavaClass(); + if (javaClass.isConstant()) { + ValueNode object = getObject(); + Class c = (Class) javaClass.asConstant().asObject(); + if (c.isPrimitive()) { + return ConstantNode.forBoolean(false, graph()); + } + if (object.isConstant()) { + Object o = object.asConstant().asObject(); + return ConstantNode.forBoolean(o != null && c.isInstance(o), graph()); + } + HotSpotResolvedObjectType type = (HotSpotResolvedObjectType) HotSpotResolvedObjectType.fromClass(c); + InstanceOfNode instanceOf = graph().unique(new InstanceOfNode(type, object, null)); + return graph().unique(new ConditionalNode(instanceOf, ConstantNode.forBoolean(true, graph()), ConstantNode.forBoolean(false, graph()))); + } + return this; + } +}
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassSubstitutions.java Fri Jul 26 19:49:00 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassSubstitutions.java Fri Jul 26 19:49:36 2013 +0200 @@ -29,7 +29,9 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.api.replacements.*; +import com.oracle.graal.hotspot.nodes.*; import com.oracle.graal.nodes.calc.*; +import com.oracle.graal.nodes.spi.*; import com.oracle.graal.word.*; /** @@ -108,6 +110,11 @@ return null; } + /** + * This is macro substitution that falls back to a normal method substitution if the macro node + * does not canonicalize away. + */ + @MacroSubstitution(macro = ClassIsInstanceNode.class, isStatic = false) @MethodSubstitution(isStatic = false) public static boolean isInstance(final Class<?> thisObj, Object obj) { return !isPrimitive(thisObj) && ConditionalNode.materializeIsInstance(thisObj, obj);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/lang/Class_isInstance07.java Fri Jul 26 19:49:36 2013 +0200 @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + */ +package com.oracle.graal.jtt.lang; + +import com.oracle.graal.jtt.*; + +import org.junit.*; + +public final class Class_isInstance07 extends JTTTest implements Cloneable { + + static final String string = ""; + static final Object obj = new Object(); + static final String[] sarray = {}; + static final Object thisObject = new Class_isInstance07(); + + public static boolean test(int i, Class c) { + Object object = null; + if (i == 0) { + object = obj; + } + if (i == 1) { + object = string; + } + if (i == 2) { + object = thisObject; + } + return c.isInstance(object); + } + + @Test + public void run0() throws Throwable { + runTest("test", 0, String.class); + } + + @Test + public void run1() throws Throwable { + runTest("test", 1, String.class); + } + + @Test + public void run2() throws Throwable { + runTest("test", 2, String.class); + } + + @Test + public void run3() throws Throwable { + runTest("test", 3, String.class); + } +}