Mercurial > hg > graal-compiler
view graal/com.oracle.graal.boot/src/com/oracle/graal/boot/meta/MethodElement.java @ 6539:2463eb24b644
Cleanup of Graal API: Rename methods so that it follows the getXxx naming convention and so that they are similar to the names of the java.lang.reflect classes. Remove unused methods.
author | Christian Wimmer <christian.wimmer@oracle.com> |
---|---|
date | Tue, 09 Oct 2012 15:23:38 -0700 |
parents | ee651c726397 |
children |
line wrap: on
line source
/* * Copyright (c) 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.boot.meta; import java.lang.reflect.*; import java.util.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.boot.*; import com.oracle.graal.graph.*; import com.oracle.graal.java.*; import com.oracle.graal.java.GraphBuilderConfiguration.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.java.*; import com.oracle.graal.phases.*; import com.oracle.graal.phases.common.*; public class MethodElement extends Element { private ParameterElement[] parameters; private Graph graph; private ResolvedJavaMethod resolvedJavaMethod; public MethodElement(ResolvedJavaMethod javaMethod) { super(javaMethod.getSignature().getReturnType(javaMethod.getDeclaringClass()).resolve(javaMethod.getDeclaringClass())); assert javaMethod != null; this.resolvedJavaMethod = javaMethod; int parameterCount = resolvedJavaMethod.getSignature().getParameterCount(!Modifier.isStatic(resolvedJavaMethod.getModifiers())); parameters = new ParameterElement[parameterCount]; for (int i = 0; i < parameters.length; ++i) { parameters[i] = new ParameterElement(resolvedJavaMethod, i); } } public ParameterElement getParameter(int index) { return parameters[index]; } public synchronized boolean hasGraph() { return graph != null; } public void postParseGraph(final BigBang bb) { synchronized (this) { if (graph != null) { return; } } new UniverseExpansionOp() { @Override protected void expand() { parseGraph(bb); } @Override public String toString() { return String.format("Parsing method %s", resolvedJavaMethod); } }.post(bb); } protected void parseGraph(final BigBang bb) { StructuredGraph newGraph = null; synchronized (this) { if (graph != null) { // Graph already exists => quit operation. return; } newGraph = new StructuredGraph(resolvedJavaMethod); this.graph = newGraph; } if (Modifier.isNative(resolvedJavaMethod.getModifiers())) { BigBang.out.println("NATIVE METHOD " + resolvedJavaMethod); return; } BigBang.out.println("parsing graph " + resolvedJavaMethod + ", locals=" + resolvedJavaMethod.getMaxLocals()); GraphBuilderConfiguration config = new GraphBuilderConfiguration(ResolvePolicy.Eager, null); GraphBuilderPhase graphBuilderPhase = new GraphBuilderPhase(bb.getMetaAccess(), config, OptimisticOptimizations.NONE); graphBuilderPhase.apply(newGraph); new PhiStampPhase().apply(newGraph); for (MethodCallTargetNode callTargetNode : newGraph.getNodes(MethodCallTargetNode.class)) { bb.registerSourceCallTargetNode(callTargetNode); } for (Node node : newGraph.getNodes()) { bb.registerSourceNode(node); } for (NewInstanceNode newInstance : newGraph.getNodes(NewInstanceNode.class)) { Set<ResolvedJavaType> types = new HashSet<>(); types.add(newInstance.instanceClass()); BigBang.out.println("propagate new instance " + newInstance + ", " + newInstance.instanceClass()); for (Node use : newInstance.usages()) { Element element = bb.getSinkElement(use, newInstance); assert element != null; if (element != BLACK_HOLE) { element.postUnionTypes(bb, newInstance, types); } } } } public ResolvedJavaMethod getResolvedJavaMethod() { return resolvedJavaMethod; } }