view graal/com.oracle.graal.boot/src/com/oracle/graal/boot/meta/Element.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 b679a28208fd
children
line wrap: on
line source

/*
 * Copyright (c) 2011, 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.util.*;

import com.oracle.graal.api.meta.*;
import com.oracle.graal.boot.*;
import com.oracle.graal.graph.*;


public class Element {

    public static final Element BLACK_HOLE = new Element(null);

    protected List<Node> usages = new ArrayList<>(4);
    protected Set<ResolvedJavaType> seenTypes = new HashSet<>();
    private ResolvedJavaType declaredType;

    protected Element(ResolvedJavaType declaredType) {
        this.declaredType = declaredType;
    }

    public void postUnionTypes(final BigBang bb, final Node sourceNode, final Set<ResolvedJavaType> newSeenTypes) {
        new UniverseExpansionOp() {
            @Override
            protected void expand() {
                unionTypes(bb, sourceNode, newSeenTypes);
            }

            @Override
            public String toString() {
                return String.format("Add new seen types %s from source node %s to element %s", newSeenTypes, sourceNode, Element.this);
            }
        }.post(bb);
    }

    public void postAddUsage(final BigBang bb, final Node usage) {
        new UniverseExpansionOp() {
            @Override
            protected void expand() {
                addUsage(bb, usage);
            }

            @Override
            public String toString() {
                return String.format("Add usage %s to element %s", usage, Element.this);
            }
        }.post(bb);
    }

    protected synchronized void unionTypes(BigBang bb, @SuppressWarnings("unused") Node sourceNode, Set<ResolvedJavaType> newSeenTypes) {
        if (!seenTypes.containsAll(newSeenTypes)) {
            if (declaredType != null) {
                for (ResolvedJavaType seenType : newSeenTypes) {
                    if (!seenType.isSubtypeOf(declaredType)) {
                        BigBang.out.println("Wrong type found " + seenType + " where declared type of element " + this + " is " + declaredType);
                        System.exit(-1);
                    }
                }
            }
            seenTypes.addAll(newSeenTypes);
            propagateTypes(bb, newSeenTypes);
        }
    }

    protected synchronized void propagateTypes(BigBang bb, Set<ResolvedJavaType> newSeenTypes) {
        for (Node n : usages) {
            propagateTypes(bb, n, newSeenTypes);
        }
    }

    public synchronized int getUsageCount() {
        return usages.size();
    }

    protected synchronized void addUsage(BigBang bb, Node usage) {
        if (!usages.contains(usage)) {
            usages.add(usage);
            propagateTypes(bb, usage, seenTypes);
        }
    }

    public void propagateTypes(BigBang bb, Node n, Set<ResolvedJavaType> types) {
        if (types.size() != 0) {
            Set<ResolvedJavaType> newSet = new HashSet<>(types);
            for (Node use : n.usages()) {
                Element element = bb.getSinkElement(use, n);
                assert element != null;
                if (element != BLACK_HOLE) {
                    propagateTypesToUsage(bb, n, newSet, element);
                }
            }
        }
    }

    protected void propagateTypesToUsage(BigBang bb, Node use, Set<ResolvedJavaType> newSet, Element element) {
        element.postUnionTypes(bb, use, newSet);
    }


    public synchronized void printSeenTypes() {
        for (ResolvedJavaType type : seenTypes) {
            BigBang.out.print(type.getName() + " ");
        }
    }
}