changeset 18605:58eb9bbb60c4

Truffle-DSL: fixed several bugs when using arrays as type. added arrays test.
author Christian Humer <christian.humer@gmail.com>
date Wed, 03 Dec 2014 21:02:27 +0100
parents 39441c10d314
children 3d0422b6f8fa
files graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ArrayTest.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeTreeBuilder.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/TypeSystemData.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeSystemParser.java
diffstat 5 files changed, 131 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ArrayTest.java	Wed Dec 03 21:02:27 2014 +0100
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2014, 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.api.dsl.test;
+
+import org.junit.*;
+
+import com.oracle.truffle.api.*;
+import com.oracle.truffle.api.dsl.*;
+import com.oracle.truffle.api.dsl.test.ArrayTestFactory.TestNode1Factory;
+import com.oracle.truffle.api.frame.*;
+import com.oracle.truffle.api.nodes.*;
+
+public class ArrayTest {
+
+    @Test
+    public void testNode1() {
+        final TestNode1 node = TestNode1Factory.create(null);
+        RootNode root = new RootNode() {
+            @Child TestNode1 test = node;
+
+            @Override
+            public Object execute(VirtualFrame frame) {
+                return test.executeWith(frame, frame.getArguments()[0]);
+            }
+        };
+        CallTarget target = Truffle.getRuntime().createCallTarget(root);
+
+        Assert.assertEquals(1, (int) target.call(1));
+        Assert.assertArrayEquals(new double[0], (double[]) target.call(new int[0]), 0.0d);
+        Assert.assertArrayEquals(new double[0], (double[]) target.call(new double[0]), 0.0d);
+        Assert.assertArrayEquals(new String[0], (String[]) target.call((Object) new String[0]));
+    }
+
+    @TypeSystemReference(ArrayTypeSystem.class)
+    abstract static class BaseNode extends Node {
+
+        abstract Object execute(VirtualFrame frame);
+
+        int executeInt(VirtualFrame frame) throws UnexpectedResultException {
+            return ArrayTypeSystemGen.ARRAYTYPESYSTEM.expectInteger(execute(frame));
+        }
+
+        int[] executeIntArray(VirtualFrame frame) throws UnexpectedResultException {
+            return ArrayTypeSystemGen.ARRAYTYPESYSTEM.expectIntArray(execute(frame));
+        }
+
+        String[] executeStringArray(VirtualFrame frame) throws UnexpectedResultException {
+            return ArrayTypeSystemGen.ARRAYTYPESYSTEM.expectStringArray(execute(frame));
+        }
+
+        double[] executeDoubleArray(VirtualFrame frame) throws UnexpectedResultException {
+            return ArrayTypeSystemGen.ARRAYTYPESYSTEM.expectDoubleArray(execute(frame));
+        }
+    }
+
+    @NodeChild
+    abstract static class TestNode1 extends BaseNode {
+
+        abstract Object executeWith(VirtualFrame frame, Object operand);
+
+        @Specialization
+        int doInt(int value) {
+            return value;
+        }
+
+        @Specialization
+        double[] doDoubleArray(double[] value) {
+            return value;
+        }
+
+        @Specialization
+        String[] doStringArray(String[] value) {
+            return value;
+        }
+
+    }
+
+    @TypeSystem({int.class, int[].class, double[].class, String[].class, Object[].class})
+    public static class ArrayTypeSystem {
+
+        @ImplicitCast
+        public double[] castFromInt(int[] array) {
+            double[] newArray = new double[array.length];
+            for (int i = 0; i < array.length; i++) {
+                newArray[i] = array[i];
+            }
+            return newArray;
+        }
+
+        @TypeCheck
+        public boolean isIntArray(Object array) {
+            return array instanceof int[];
+        }
+
+        @TypeCast
+        public int[] asIntArray(Object array) {
+            return (int[]) array;
+        }
+
+    }
+
+}
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java	Wed Dec 03 22:10:15 2014 +0100
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java	Wed Dec 03 21:02:27 2014 +0100
@@ -322,12 +322,12 @@
     /**
      * <pre>
      * variant1 $condition != null
-     * 
+     *
      * $type $name = defaultValue($type);
      * if ($condition) {
      *     $name = $value;
      * }
-     * 
+     *
      * variant2 $condition != null
      * $type $name = $value;
      * </pre>
@@ -1993,7 +1993,7 @@
             }
             String prefix = expect ? "expect" : "execute";
             String suffix = execution.getIndex() > -1 ? String.valueOf(execution.getIndex()) : "";
-            return prefix + ElementUtils.firstLetterUpperCase(child.getName()) + ElementUtils.firstLetterUpperCase(ElementUtils.getSimpleName(param.getType())) + suffix;
+            return prefix + ElementUtils.firstLetterUpperCase(child.getName()) + ElementUtils.firstLetterUpperCase(ElementUtils.getTypeId(param.getType())) + suffix;
         }
 
         private List<CodeExecutableElement> createExecuteChilds(Parameter param, Set<TypeData> expectTypes) {
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeTreeBuilder.java	Wed Dec 03 22:10:15 2014 +0100
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeTreeBuilder.java	Wed Dec 03 21:02:27 2014 +0100
@@ -672,10 +672,6 @@
     }
 
     public CodeTreeBuilder instanceOf(String var, TypeMirror type) {
-        TypeElement element = ElementUtils.fromTypeMirror(type);
-        if (element == null) {
-            throw new IllegalArgumentException("Cannot call instanceof for a non supported type: " + type.getKind());
-        }
         return instanceOf(singleString(var), singleType(type));
     }
 
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/TypeSystemData.java	Wed Dec 03 22:10:15 2014 +0100
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/TypeSystemData.java	Wed Dec 03 21:02:27 2014 +0100
@@ -139,7 +139,7 @@
 
     public TypeData findType(String simpleName) {
         for (TypeData type : types) {
-            if (ElementUtils.getSimpleName(type.getBoxedType()).equals(simpleName)) {
+            if (ElementUtils.getTypeId(type.getBoxedType()).equals(simpleName)) {
                 return type;
             }
         }
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeSystemParser.java	Wed Dec 03 22:10:15 2014 +0100
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeSystemParser.java	Wed Dec 03 21:02:27 2014 +0100
@@ -216,7 +216,11 @@
                 typeData.addError("Invalid type order. The type(s) %s are inherited from a earlier defined type %s.", invalidTypes.get(ElementUtils.getQualifiedName(type)),
                                 ElementUtils.getQualifiedName(type));
             }
-            List<String> nextInvalidTypes = ElementUtils.getQualifiedSuperTypeNames(ElementUtils.fromTypeMirror(type));
+            TypeElement element = ElementUtils.fromTypeMirror(type);
+            List<String> nextInvalidTypes = new ArrayList<>();
+            if (element != null) {
+                nextInvalidTypes.addAll(ElementUtils.getQualifiedSuperTypeNames(element));
+            }
             nextInvalidTypes.add(getQualifiedName(type));
 
             for (String qualifiedName : nextInvalidTypes) {