[Truffle] Support for long[]/double[] in TypeSystem

Christian Humer christian.humer at gmail.com
Wed Dec 3 20:14:49 UTC 2014


Hi Stefan,

You are right primitive arrays are broken. No wonder they were not tested
at all.
I've attached a patch. Its going to get integrated on openjdk this night.

Thanks for the report.

- Christian Humer

On Wed, Dec 3, 2014 at 10:29 AM, Stefan Marr <java at stefan-marr.de> wrote:

> Hi:
>
> I wanted to briefly see whether primitive arrays will give a significant
> speedup to see what the potential for collection strategies is. However, I
> ran into an issue with the TruffleDSL, specifically, the processing of
> @TypeSystem.
>
> Looks like primitive arrays are currently not supported.
> At least I get the error/stack trace below (both on TruffleSOM as well as
> SimpleLanguage).
>
> ElementUtils.fromTypeMirror does seem to return null, instead of a
> TypeElement.
>
> Would it be possible to add support for primitive arrays?
>
> Hints how I could do that myself, and how I could debug an annotation
> processor would also be very much appreciate.
>
> Thanks
> Stefan
>
> Uncaught error in AnnotationProcessor while processing
> som.interpreter.Types: null java.lang.NullPointerException at
>  com.oracle.truffle.dsl.processor.java.ElementUtils.getSuperType(ElementUtils.java:619)
> at
> com.oracle.truffle.dsl.processor.java.ElementUtils.getSuperTypes(ElementUtils.java:629)
> at
>  com.oracle.truffle.dsl.processor.java.ElementUtils.getQualifiedSuperTypeNames(ElementUtils.java:521)
> at
>  com.oracle.truffle.dsl.processor.parser.TypeSystemParser.verifyTypeOrder(TypeSystemParser.java:219)
> at
>  com.oracle.truffle.dsl.processor.parser.TypeSystemParser.parseTypes(TypeSystemParser.java:203)
> at
> com.oracle.truffle.dsl.processor.parser.TypeSystemParser.parse(TypeSystemParser.java:70)
>  at
> com.oracle.truffle.dsl.processor.parser.TypeSystemParser.parse(TypeSystemParser.java:39)
> at
> com.oracle.truffle.dsl.processor.parser.AbstractParser.parse(AbstractParser.java:64)
> at
>  com.oracle.truffle.dsl.processor.AnnotationProcessor.process(AnnotationProcessor.java:76)
> at
> com.oracle.truffle.dsl.processor.TruffleProcessor.processElement(TruffleProcessor.java:89)
> at
>  com.oracle.truffle.dsl.processor.TruffleProcessor.processImpl(TruffleProcessor.java:65)
> at
> com.oracle.truffle.dsl.processor.TruffleProcessor.process(TruffleProcessor.java:51)
> at
>  org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.handleProcessor(RoundDispatcher.java:139)
> at
>  org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.round(RoundDispatcher.java:121)
> at
>  org.eclipse.jdt.internal.compiler.apt.dispatch.BaseAnnotationProcessorManager.processAnnotations(BaseAnnotationProcessorManager.java:159)
> at
>  org.eclipse.jdt.internal.apt.pluggable.core.dispatch.IdeAnnotationProcessorManager.processAnnotations(IdeAnnotationProcessorManager.java:134)
> at
>  org.eclipse.jdt.internal.compiler.Compiler.processAnnotations(Compiler.java:818)
> at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:434) at
>
> --
> Stefan Marr
> INRIA Lille - Nord Europe
> http://stefan-marr.de/research/
>
>
>
>
-------------- next part --------------
# HG changeset patch
# Parent 43e2cc9a4fde1d5c631569874e55d3b45922925d
Truffle-DSL: fixed several bugs when using arrays as type. added arrays test.

diff -r 43e2cc9a4fde graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ArrayTest.java
--- /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;
+        }
+
+    }
+
+}
diff -r 43e2cc9a4fde graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java	Wed Dec 03 18:53:22 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) {
diff -r 43e2cc9a4fde graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeTreeBuilder.java
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeTreeBuilder.java	Wed Dec 03 18:53:22 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));
     }
 
diff -r 43e2cc9a4fde graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/TypeSystemData.java
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/TypeSystemData.java	Wed Dec 03 18:53:22 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;
             }
         }
diff -r 43e2cc9a4fde graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeSystemParser.java
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeSystemParser.java	Wed Dec 03 18:53:22 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) {


More information about the graal-dev mailing list