view graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/SpecializationData.java @ 8251:cb70ed101b5f

Added automatic generation of generic specialization which throws unsupported operation if reached.
author Christian Humer <christian.humer@gmail.com>
date Wed, 13 Mar 2013 11:32:43 +0100
parents d81ff782fa1a
children 0905d796944a
line wrap: on
line source

/*
 * Copyright (c) 2012, 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.truffle.codegen.processor.node;

import java.util.*;

import com.oracle.truffle.api.codegen.*;
import com.oracle.truffle.codegen.processor.*;
import com.oracle.truffle.codegen.processor.template.*;

public class SpecializationData extends TemplateMethod {

    private final int order;
    private final boolean generic;
    private final boolean uninitialized;
    private final List<SpecializationThrowsData> exceptions;
    private SpecializationGuardData[] guards;
    private ShortCircuitData[] shortCircuits;
    private boolean useSpecializationsForGeneric = true;
    private NodeData node;

    private final boolean synthetic;

    public SpecializationData(TemplateMethod template, int order, List<SpecializationThrowsData> exceptions) {
        super(template);
        this.order = order;
        this.generic = false;
        this.uninitialized = false;
        this.synthetic = false;
        this.exceptions = exceptions;

        for (SpecializationThrowsData exception : exceptions) {
            exception.setSpecialization(this);
        }
    }

    public SpecializationData(TemplateMethod template, boolean generic, boolean uninitialized, boolean synthetic) {
        super(template);
        this.order = Specialization.DEFAULT_ORDER;
        this.generic = generic;
        this.uninitialized = uninitialized;
        this.exceptions = Collections.emptyList();
        this.guards = new SpecializationGuardData[0];
        this.synthetic = synthetic;
    }

    public boolean hasRewrite(ProcessorContext context) {
        if (getExceptions().size() > 0) {
            return true;
        }
        if (getGuards().length > 0) {
            return true;
        }
        for (ActualParameter parameter : getParameters()) {
            NodeFieldData field = getNode().findField(parameter.getSpecification().getName());
            if (field == null) {
                continue;
            }
            ExecutableTypeData type = field.getNodeData().findExecutableType(parameter.getActualTypeData(field.getNodeData().getTypeSystem()));
            if (type.hasUnexpectedValue(context)) {
                return true;
            }
        }
        return false;
    }

    public NodeData getNode() {
        return node;
    }

    public void setNode(NodeData node) {
        this.node = node;
    }

    public void setGuards(SpecializationGuardData[] guards) {
        this.guards = guards;
    }

    public boolean isSynthetic() {
        return synthetic;
    }

    public int getOrder() {
        return order;
    }

    public boolean isGeneric() {
        return generic;
    }

    public boolean isUninitialized() {
        return uninitialized;
    }

    public List<SpecializationThrowsData> getExceptions() {
        return exceptions;
    }

    public SpecializationGuardData[] getGuards() {
        return guards;
    }

    public void setShortCircuits(ShortCircuitData[] shortCircuits) {
        this.shortCircuits = shortCircuits;
    }

    public ShortCircuitData[] getShortCircuits() {
        return shortCircuits;
    }

    void setUseSpecializationsForGeneric(boolean useSpecializationsForGeneric) {
        this.useSpecializationsForGeneric = useSpecializationsForGeneric;
    }

    public boolean isUseSpecializationsForGeneric() {
        return useSpecializationsForGeneric;
    }

    public SpecializationData findNextSpecialization() {
        List<SpecializationData> specializations = node.getSpecializations();
        for (int i = 0; i < specializations.size() - 1; i++) {
            if (specializations.get(i) == this) {
                return specializations.get(i + 1);
            }
        }
        return null;
    }

    public boolean hasDynamicGuards() {
        for (SpecializationGuardData guard : getGuards()) {
            if (guard.isOnExecution()) {
                return true;
            }
        }
        return false;
    }

}