diff graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/operation/OperationData.java @ 7291:a748e4d44694

Truffle API to specify type-specalized Node classes; annotation processor for automatic code generation of the type-specialized Node classes during the build process
author Christian Humer <christian.humer@gmail.com>
date Fri, 21 Dec 2012 10:44:31 -0800
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/operation/OperationData.java	Fri Dec 21 10:44:31 2012 -0800
@@ -0,0 +1,185 @@
+/*
+ * 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.operation;
+
+import java.util.*;
+
+import javax.lang.model.element.*;
+import javax.lang.model.type.*;
+
+import com.oracle.truffle.codegen.processor.template.*;
+import com.oracle.truffle.codegen.processor.typesystem.*;
+
+public class OperationData extends Template {
+
+    private final TypeSystemData typeSystem;
+    private final String[] values;
+    private final String[] shortCircuitValues;
+    private final OperationFieldData[] operationFields;
+    private final OperationFieldData[] constructorFields;
+    private final OperationFieldData[] superFields;
+    private final TypeMirror nodeType;
+
+    private MethodSpec specification;
+    private SpecializationData genericSpecialization;
+    private SpecializationData[] specializations;
+    private TemplateMethod[] specializationListeners;
+    private GuardData[] guards;
+
+    boolean generateFactory = true;
+
+    public OperationData(TypeElement templateType, AnnotationMirror templateTypeAnnotation,
+                    TypeSystemData typeSystem, TypeMirror nodeType,
+                    String[] values, String[] shortCircuitValues,
+                    OperationFieldData[] operationFields,
+                    OperationFieldData[] constructorFields,
+                    OperationFieldData[] superFields) {
+        super(templateType, templateTypeAnnotation);
+        this.nodeType = nodeType;
+        this.typeSystem = typeSystem;
+        this.values = values;
+        this.shortCircuitValues = shortCircuitValues;
+        this.operationFields = operationFields;
+        this.constructorFields = constructorFields;
+        this.superFields = superFields;
+    }
+
+    public boolean isUseSingleton() {
+        return constructorFields.length == 0;
+    }
+
+    public boolean hasExtensions() {
+        return !getExtensionElements().isEmpty();
+    }
+
+    public List<GuardData> findGuards(String name) {
+        List<GuardData> foundGuards = new ArrayList<>();
+        for (GuardData guardData : guards) {
+            if (guardData.getMethodName().equals(name)) {
+                foundGuards.add(guardData);
+            }
+        }
+        for (GuardData guardData : getTypeSystem().getGuards()) {
+            if (guardData.getMethodName().equals(name)) {
+                foundGuards.add(guardData);
+            }
+        }
+        return foundGuards;
+    }
+
+
+    void setGuards(GuardData[] guards) {
+        this.guards = guards;
+    }
+
+    void setSpecification(MethodSpec specification) {
+        this.specification = specification;
+    }
+
+    void setGenericSpecialization(SpecializationData genericSpecialization) {
+        this.genericSpecialization = genericSpecialization;
+    }
+
+    void setSpecializations(SpecializationData[] specializations) {
+        this.specializations = specializations;
+        for (SpecializationData specialization : specializations) {
+            specialization.setOperation(this);
+        }
+    }
+
+    void setSpecializationListeners(TemplateMethod[] specializationListeners) {
+        this.specializationListeners = specializationListeners;
+    }
+
+    public String[] getValues() {
+        return values;
+    }
+
+    public OperationFieldData[] getOperationFields() {
+        return operationFields;
+    }
+
+    public String[] getShortCircuitValues() {
+        return shortCircuitValues;
+    }
+
+    public TypeSystemData getTypeSystem() {
+        return typeSystem;
+    }
+
+    public TypeMirror getNodeType() {
+        return nodeType;
+    }
+
+    public SpecializationData[] getSpecializations() {
+        return specializations;
+    }
+
+    public SpecializationData getGenericSpecialization() {
+        return genericSpecialization;
+    }
+
+    public OperationFieldData[] getConstructorFields() {
+        return constructorFields;
+    }
+
+    public OperationFieldData[] getSuperFields() {
+        return superFields;
+    }
+
+    public MethodSpec getSpecification() {
+        return specification;
+    }
+
+    public SpecializationData[] getAllMethods() {
+        return specializations;
+    }
+
+    public boolean needsRewrites() {
+        boolean needsRewrites = getValues().length > 0 || getShortCircuitValues().length > 0;
+        needsRewrites &= specializations.length >= 2;
+        return needsRewrites;
+    }
+
+    public TemplateMethod[] getSpecializationListeners() {
+        return specializationListeners;
+    }
+
+    public GuardData[] getGuards() {
+        return guards;
+    }
+
+    public SpecializationData findUniqueSpecialization(TypeData type) {
+        SpecializationData result = null;
+        for (SpecializationData specialization : specializations) {
+            if (specialization.getReturnType().getActualTypeData(getTypeSystem()) == type) {
+                if (result != null) {
+                    // Result not unique;
+                    return null;
+                }
+                result = specialization;
+            }
+        }
+        return result;
+    }
+}