# HG changeset patch # User Matthias Grimmer # Date 1450099208 -3600 # Node ID b3569a53c24cbbb1820a8712b82f5f669993dddb # Parent aeba89e1d8da74a1800be2bf11f1e3688a77a849 Refactor and improve ComplexNumber sequence tests diff -r aeba89e1d8da -r b3569a53c24c truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumber.java --- a/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumber.java Fri Dec 11 15:20:27 2015 +0100 +++ b/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumber.java Mon Dec 14 14:20:08 2015 +0100 @@ -33,7 +33,7 @@ import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.nodes.RootNode; -public final class ComplexNumber implements TruffleObject { +final class ComplexNumber implements TruffleObject { public static final String REAL_IDENTIFIER = "real"; public static final String IMAGINARY_IDENTIFIER = "imaginary"; @@ -41,7 +41,7 @@ private double real; private double imag; - public ComplexNumber(double real, double imaginary) { + ComplexNumber(double real, double imaginary) { this.real = real; this.imag = imaginary; } diff -r aeba89e1d8da -r b3569a53c24c truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumbersA.java --- a/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumbersA.java Fri Dec 11 15:20:27 2015 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,219 +0,0 @@ -/* - * Copyright (c) 2015, 2015, 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. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * 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.tck; - -import com.oracle.truffle.api.CallTarget; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.Truffle; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.interop.ForeignAccess; -import com.oracle.truffle.api.interop.ForeignAccess.Factory; -import com.oracle.truffle.api.interop.Message; -import com.oracle.truffle.api.interop.TruffleObject; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.nodes.RootNode; - -public final class ComplexNumbersA implements TruffleObject { - - private final double[] data; - - public ComplexNumbersA(double[] data) { - assert data.length % 2 == 0; - this.data = data; - } - - public double[] getData() { - return data; - } - - public ForeignAccess getForeignAccess() { - return ForeignAccess.create(new ComplexNumbersAForeignAccessFactory()); - } - - private static class ComplexNumbersAForeignAccessFactory implements Factory { - - public boolean canHandle(TruffleObject obj) { - return obj instanceof ComplexNumbersA; - } - - public CallTarget accessMessage(Message tree) { - if (Message.IS_NULL.equals(tree)) { - return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); - } else if (Message.IS_EXECUTABLE.equals(tree)) { - return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); - } else if (Message.IS_BOXED.equals(tree)) { - return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); - } else if (Message.HAS_SIZE.equals(tree)) { - return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(true)); - } else if (Message.READ.equals(tree)) { - return Truffle.getRuntime().createCallTarget(new ComplexNumbersAReadNode()); - } else if (Message.WRITE.equals(tree)) { - return Truffle.getRuntime().createCallTarget(new ComplexNumbersAWriteNode()); - } else if (Message.GET_SIZE.equals(tree)) { - return Truffle.getRuntime().createCallTarget(new ComplexNumbersASizeNode()); - } else { - throw new IllegalArgumentException(tree.toString() + " not supported"); - } - } - } - - private static class ComplexNumbersAWriteNode extends RootNode { - protected ComplexNumbersAWriteNode() { - super(TckLanguage.class, null, null); - } - - @Child private Node readReal; - @Child private Node readImag; - - @Override - public Object execute(VirtualFrame frame) { - ComplexNumbersA complexNumbers = (ComplexNumbersA) ForeignAccess.getReceiver(frame); - Number index = (Number) ForeignAccess.getArguments(frame).get(0); - TruffleObject value = (TruffleObject) ForeignAccess.getArguments(frame).get(1); - if (readReal == null || readImag == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - this.readReal = insert(Message.READ.createNode()); - this.readImag = insert(Message.READ.createNode()); - } - Number realPart = (Number) ForeignAccess.execute(readReal, frame, value, new Object[]{ComplexNumber.REAL_IDENTIFIER}); - Number imagPart = (Number) ForeignAccess.execute(readImag, frame, value, new Object[]{ComplexNumber.IMAGINARY_IDENTIFIER}); - - complexNumbers.data[index.intValue() * 2] = realPart.doubleValue(); - complexNumbers.data[index.intValue() * 2 + 1] = imagPart.doubleValue(); - return value; - } - } - - private static class ComplexNumbersAReadNode extends RootNode { - protected ComplexNumbersAReadNode() { - super(TckLanguage.class, null, null); - } - - @Override - public Object execute(VirtualFrame frame) { - ComplexNumbersA complexNumbers = (ComplexNumbersA) ForeignAccess.getReceiver(frame); - Number index = (Number) ForeignAccess.getArguments(frame).get(0); - return new ComplexNumberAEntry(complexNumbers, index.intValue()); - } - } - - private static class ComplexNumbersASizeNode extends RootNode { - protected ComplexNumbersASizeNode() { - super(TckLanguage.class, null, null); - } - - @Override - public Object execute(VirtualFrame frame) { - ComplexNumbersA complexNumbers = (ComplexNumbersA) ForeignAccess.getReceiver(frame); - return complexNumbers.data.length / 2; - } - - } - - private static class ComplexNumberAEntry implements TruffleObject { - - private final ComplexNumbersA numbers; - private final int index; - - public ComplexNumberAEntry(ComplexNumbersA numbers, int index) { - this.numbers = numbers; - this.index = index; - } - - public ForeignAccess getForeignAccess() { - return ForeignAccess.create(new ComplexNumberAEntryForeignAccessFactory()); - } - - private static class ComplexNumberAEntryForeignAccessFactory implements Factory { - - public boolean canHandle(TruffleObject obj) { - return obj instanceof ComplexNumberAEntry; - } - - public CallTarget accessMessage(Message tree) { - if (Message.IS_NULL.equals(tree)) { - return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); - } else if (Message.IS_EXECUTABLE.equals(tree)) { - return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); - } else if (Message.IS_BOXED.equals(tree)) { - return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); - } else if (Message.HAS_SIZE.equals(tree)) { - return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); - } else if (Message.READ.equals(tree)) { - return Truffle.getRuntime().createCallTarget(new ComplexNumbersAEntryReadNode()); - } else if (Message.WRITE.equals(tree)) { - return Truffle.getRuntime().createCallTarget(new ComplexNumbersAEntryWriteNode()); - } else { - throw new IllegalArgumentException(tree.toString() + " not supported"); - } - } - - private static class ComplexNumbersAEntryReadNode extends RootNode { - protected ComplexNumbersAEntryReadNode() { - super(TckLanguage.class, null, null); - } - - @Child private Node readReal; - @Child private Node readImag; - - @Override - public Object execute(VirtualFrame frame) { - ComplexNumberAEntry complexNumber = (ComplexNumberAEntry) ForeignAccess.getReceiver(frame); - String name = (String) ForeignAccess.getArguments(frame).get(0); - if (name.equals(ComplexNumber.IMAGINARY_IDENTIFIER)) { - return complexNumber.numbers.data[complexNumber.index * 2 + 1]; - } else if (name.equals(ComplexNumber.REAL_IDENTIFIER)) { - return complexNumber.numbers.data[complexNumber.index * 2]; - } else { - throw new IllegalArgumentException(); - } - } - } - - private static class ComplexNumbersAEntryWriteNode extends RootNode { - protected ComplexNumbersAEntryWriteNode() { - super(TckLanguage.class, null, null); - } - - @Override - public Object execute(VirtualFrame frame) { - ComplexNumberAEntry complexNumber = (ComplexNumberAEntry) ForeignAccess.getReceiver(frame); - String name = (String) ForeignAccess.getArguments(frame).get(0); - Number value = (Number) ForeignAccess.getArguments(frame).get(1); - if (name.equals(ComplexNumber.IMAGINARY_IDENTIFIER)) { - complexNumber.numbers.data[complexNumber.index * 2 + 1] = value.doubleValue(); - } else if (name.equals(ComplexNumber.REAL_IDENTIFIER)) { - complexNumber.numbers.data[complexNumber.index * 2] = value.doubleValue(); - } else { - throw new IllegalArgumentException(); - } - return value; - } - - } - } - - } -} diff -r aeba89e1d8da -r b3569a53c24c truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumbersB.java --- a/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumbersB.java Fri Dec 11 15:20:27 2015 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,229 +0,0 @@ -/* - * Copyright (c) 2015, 2015, 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. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * 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.tck; - -import com.oracle.truffle.api.CallTarget; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.Truffle; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.interop.ForeignAccess; -import com.oracle.truffle.api.interop.ForeignAccess.Factory; -import com.oracle.truffle.api.interop.Message; -import com.oracle.truffle.api.interop.TruffleObject; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.nodes.RootNode; - -public class ComplexNumbersB implements TruffleObject { - - private final double[] reals; - private final double[] imags; - - public ComplexNumbersB(double[] reals, double[] imags) { - assert reals.length == imags.length; - this.reals = reals; - this.imags = imags; - } - - public double[] getData() { - double[] data = new double[reals.length * 2]; - for (int i = 0; i < reals.length; i++) { - data[i * 2] = reals[i]; - data[i * 2 + 1] = imags[i]; - } - return data; - } - - public ForeignAccess getForeignAccess() { - return ForeignAccess.create(new ComplexNumbersBForeignAccessFactory()); - } - - private static class ComplexNumbersBForeignAccessFactory implements Factory { - - public boolean canHandle(TruffleObject obj) { - return obj instanceof ComplexNumbersB; - } - - public CallTarget accessMessage(Message tree) { - if (Message.IS_NULL.equals(tree)) { - return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); - } else if (Message.IS_EXECUTABLE.equals(tree)) { - return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); - } else if (Message.IS_BOXED.equals(tree)) { - return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); - } else if (Message.HAS_SIZE.equals(tree)) { - return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(true)); - } else if (Message.READ.equals(tree)) { - return Truffle.getRuntime().createCallTarget(new ComplexNumbersBReadNode()); - } else if (Message.WRITE.equals(tree)) { - return Truffle.getRuntime().createCallTarget(new ComplexNumbersBWriteNode()); - } else if (Message.GET_SIZE.equals(tree)) { - return Truffle.getRuntime().createCallTarget(new ComplexNumbersBSizeNode()); - } else { - throw new IllegalArgumentException(tree.toString() + " not supported"); - } - } - } - - private static class ComplexNumbersBWriteNode extends RootNode { - protected ComplexNumbersBWriteNode() { - super(TckLanguage.class, null, null); - } - - @Child private Node readReal; - @Child private Node readImag; - - @Override - public Object execute(VirtualFrame frame) { - ComplexNumbersB complexNumbers = (ComplexNumbersB) ForeignAccess.getReceiver(frame); - Number index = (Number) ForeignAccess.getArguments(frame).get(0); - TruffleObject value = (TruffleObject) ForeignAccess.getArguments(frame).get(1); - if (readReal == null || readImag == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - this.readReal = insert(Message.READ.createNode()); - this.readImag = insert(Message.READ.createNode()); - } - Number realPart = (Number) ForeignAccess.execute(readReal, frame, value, new Object[]{ComplexNumber.REAL_IDENTIFIER}); - Number imagPart = (Number) ForeignAccess.execute(readImag, frame, value, new Object[]{ComplexNumber.IMAGINARY_IDENTIFIER}); - - complexNumbers.reals[index.intValue()] = realPart.doubleValue(); - complexNumbers.imags[index.intValue()] = imagPart.doubleValue(); - return value; - } - } - - private static class ComplexNumbersBReadNode extends RootNode { - protected ComplexNumbersBReadNode() { - super(TckLanguage.class, null, null); - } - - @Override - public Object execute(VirtualFrame frame) { - ComplexNumbersB complexNumbers = (ComplexNumbersB) ForeignAccess.getReceiver(frame); - Number index = (Number) ForeignAccess.getArguments(frame).get(0); - return new ComplexNumberBEntry(complexNumbers, index.intValue()); - } - - } - - private static class ComplexNumbersBSizeNode extends RootNode { - protected ComplexNumbersBSizeNode() { - super(TckLanguage.class, null, null); - } - - @Override - public Object execute(VirtualFrame frame) { - ComplexNumbersB complexNumbers = (ComplexNumbersB) ForeignAccess.getReceiver(frame); - assert complexNumbers.reals.length == complexNumbers.imags.length; - return complexNumbers.reals.length; - } - - } - - private static class ComplexNumberBEntry implements TruffleObject { - - private final ComplexNumbersB numbers; - private final int index; - - public ComplexNumberBEntry(ComplexNumbersB numbers, int index) { - this.numbers = numbers; - this.index = index; - } - - public ForeignAccess getForeignAccess() { - return ForeignAccess.create(new ComplexNumberBEntryForeignAccessFactory()); - } - - private static class ComplexNumberBEntryForeignAccessFactory implements Factory { - - public boolean canHandle(TruffleObject obj) { - return obj instanceof ComplexNumberBEntry; - } - - public CallTarget accessMessage(Message tree) { - if (Message.IS_NULL.equals(tree)) { - return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); - } else if (Message.IS_EXECUTABLE.equals(tree)) { - return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); - } else if (Message.IS_BOXED.equals(tree)) { - return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); - } else if (Message.HAS_SIZE.equals(tree)) { - return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); - } else if (Message.READ.equals(tree)) { - return Truffle.getRuntime().createCallTarget(new ComplexNumbersAEntryReadNode()); - } else if (Message.WRITE.equals(tree)) { - return Truffle.getRuntime().createCallTarget(new ComplexNumbersAEntryWriteNode()); - } else { - throw new IllegalArgumentException(tree.toString() + " not supported"); - } - } - - private static class ComplexNumbersAEntryReadNode extends RootNode { - protected ComplexNumbersAEntryReadNode() { - super(TckLanguage.class, null, null); - } - - @Child private Node readReal; - @Child private Node readImag; - - @Override - public Object execute(VirtualFrame frame) { - ComplexNumberBEntry complexNumber = (ComplexNumberBEntry) ForeignAccess.getReceiver(frame); - String name = (String) ForeignAccess.getArguments(frame).get(0); - if (name.equals(ComplexNumber.IMAGINARY_IDENTIFIER)) { - return complexNumber.numbers.imags[complexNumber.index]; - } else if (name.equals(ComplexNumber.REAL_IDENTIFIER)) { - return complexNumber.numbers.reals[complexNumber.index]; - } else { - throw new IllegalArgumentException(); - } - } - } - - private static class ComplexNumbersAEntryWriteNode extends RootNode { - protected ComplexNumbersAEntryWriteNode() { - super(TckLanguage.class, null, null); - } - - @Override - public Object execute(VirtualFrame frame) { - ComplexNumberBEntry complexNumber = (ComplexNumberBEntry) ForeignAccess.getReceiver(frame); - String name = (String) ForeignAccess.getArguments(frame).get(0); - Number value = (Number) ForeignAccess.getArguments(frame).get(1); - if (name.equals(ComplexNumber.IMAGINARY_IDENTIFIER)) { - complexNumber.numbers.imags[complexNumber.index] = value.doubleValue(); - } else if (name.equals(ComplexNumber.REAL_IDENTIFIER)) { - complexNumber.numbers.reals[complexNumber.index] = value.doubleValue(); - } else { - throw new IllegalArgumentException(); - } - return value; - } - - } - } - - } - -} diff -r aeba89e1d8da -r b3569a53c24c truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumbersColumnBased.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumbersColumnBased.java Mon Dec 14 14:20:08 2015 +0100 @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2015, 2015, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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.tck; + +import com.oracle.truffle.api.CallTarget; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.Truffle; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.interop.ForeignAccess; +import com.oracle.truffle.api.interop.ForeignAccess.Factory; +import com.oracle.truffle.api.interop.Message; +import com.oracle.truffle.api.interop.TruffleObject; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.nodes.RootNode; + +final class ComplexNumbersColumnBased implements TruffleObject { + + private final double[] reals; + private final double[] imags; + + ComplexNumbersColumnBased(double[] reals, double[] imags) { + assert reals.length == imags.length; + this.reals = reals; + this.imags = imags; + } + + public double[] getData() { + double[] data = new double[reals.length * 2]; + for (int i = 0; i < reals.length; i++) { + data[i * 2] = reals[i]; + data[i * 2 + 1] = imags[i]; + } + return data; + } + + public ForeignAccess getForeignAccess() { + return ForeignAccess.create(new ComplexNumbersBForeignAccessFactory()); + } + + private static class ComplexNumbersBForeignAccessFactory implements Factory { + + public boolean canHandle(TruffleObject obj) { + return obj instanceof ComplexNumbersColumnBased; + } + + public CallTarget accessMessage(Message tree) { + if (Message.IS_NULL.equals(tree)) { + return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); + } else if (Message.IS_EXECUTABLE.equals(tree)) { + return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); + } else if (Message.IS_BOXED.equals(tree)) { + return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); + } else if (Message.HAS_SIZE.equals(tree)) { + return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(true)); + } else if (Message.READ.equals(tree)) { + return Truffle.getRuntime().createCallTarget(new ComplexNumbersBReadNode()); + } else if (Message.WRITE.equals(tree)) { + return Truffle.getRuntime().createCallTarget(new ComplexNumbersBWriteNode()); + } else if (Message.GET_SIZE.equals(tree)) { + return Truffle.getRuntime().createCallTarget(new ComplexNumbersBSizeNode()); + } else { + throw new IllegalArgumentException(tree.toString() + " not supported"); + } + } + } + + private static class ComplexNumbersBWriteNode extends RootNode { + protected ComplexNumbersBWriteNode() { + super(TckLanguage.class, null, null); + } + + @Child private Node readReal; + @Child private Node readImag; + + @Override + public Object execute(VirtualFrame frame) { + ComplexNumbersColumnBased complexNumbers = (ComplexNumbersColumnBased) ForeignAccess.getReceiver(frame); + Number index = (Number) ForeignAccess.getArguments(frame).get(0); + TruffleObject value = (TruffleObject) ForeignAccess.getArguments(frame).get(1); + if (readReal == null || readImag == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + this.readReal = insert(Message.READ.createNode()); + this.readImag = insert(Message.READ.createNode()); + } + Number realPart = (Number) ForeignAccess.execute(readReal, frame, value, new Object[]{ComplexNumber.REAL_IDENTIFIER}); + Number imagPart = (Number) ForeignAccess.execute(readImag, frame, value, new Object[]{ComplexNumber.IMAGINARY_IDENTIFIER}); + + complexNumbers.reals[index.intValue()] = realPart.doubleValue(); + complexNumbers.imags[index.intValue()] = imagPart.doubleValue(); + return value; + } + } + + private static class ComplexNumbersBReadNode extends RootNode { + protected ComplexNumbersBReadNode() { + super(TckLanguage.class, null, null); + } + + @Override + public Object execute(VirtualFrame frame) { + ComplexNumbersColumnBased complexNumbers = (ComplexNumbersColumnBased) ForeignAccess.getReceiver(frame); + Number index = (Number) ForeignAccess.getArguments(frame).get(0); + return new ComplexNumberBEntry(complexNumbers, index.intValue()); + } + + } + + private static class ComplexNumbersBSizeNode extends RootNode { + protected ComplexNumbersBSizeNode() { + super(TckLanguage.class, null, null); + } + + @Override + public Object execute(VirtualFrame frame) { + ComplexNumbersColumnBased complexNumbers = (ComplexNumbersColumnBased) ForeignAccess.getReceiver(frame); + assert complexNumbers.reals.length == complexNumbers.imags.length; + return complexNumbers.reals.length; + } + + } + + private static class ComplexNumberBEntry implements TruffleObject { + + private final ComplexNumbersColumnBased numbers; + private final int index; + + public ComplexNumberBEntry(ComplexNumbersColumnBased numbers, int index) { + this.numbers = numbers; + this.index = index; + } + + public ForeignAccess getForeignAccess() { + return ForeignAccess.create(new ComplexNumberBEntryForeignAccessFactory()); + } + + private static class ComplexNumberBEntryForeignAccessFactory implements Factory { + + public boolean canHandle(TruffleObject obj) { + return obj instanceof ComplexNumberBEntry; + } + + public CallTarget accessMessage(Message tree) { + if (Message.IS_NULL.equals(tree)) { + return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); + } else if (Message.IS_EXECUTABLE.equals(tree)) { + return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); + } else if (Message.IS_BOXED.equals(tree)) { + return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); + } else if (Message.HAS_SIZE.equals(tree)) { + return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); + } else if (Message.READ.equals(tree)) { + return Truffle.getRuntime().createCallTarget(new ComplexNumbersAEntryReadNode()); + } else if (Message.WRITE.equals(tree)) { + return Truffle.getRuntime().createCallTarget(new ComplexNumbersAEntryWriteNode()); + } else { + throw new IllegalArgumentException(tree.toString() + " not supported"); + } + } + + private static class ComplexNumbersAEntryReadNode extends RootNode { + protected ComplexNumbersAEntryReadNode() { + super(TckLanguage.class, null, null); + } + + @Child private Node readReal; + @Child private Node readImag; + + @Override + public Object execute(VirtualFrame frame) { + ComplexNumberBEntry complexNumber = (ComplexNumberBEntry) ForeignAccess.getReceiver(frame); + String name = (String) ForeignAccess.getArguments(frame).get(0); + if (name.equals(ComplexNumber.IMAGINARY_IDENTIFIER)) { + return complexNumber.numbers.imags[complexNumber.index]; + } else if (name.equals(ComplexNumber.REAL_IDENTIFIER)) { + return complexNumber.numbers.reals[complexNumber.index]; + } else { + throw new IllegalArgumentException(); + } + } + } + + private static class ComplexNumbersAEntryWriteNode extends RootNode { + protected ComplexNumbersAEntryWriteNode() { + super(TckLanguage.class, null, null); + } + + @Override + public Object execute(VirtualFrame frame) { + ComplexNumberBEntry complexNumber = (ComplexNumberBEntry) ForeignAccess.getReceiver(frame); + String name = (String) ForeignAccess.getArguments(frame).get(0); + Number value = (Number) ForeignAccess.getArguments(frame).get(1); + if (name.equals(ComplexNumber.IMAGINARY_IDENTIFIER)) { + complexNumber.numbers.imags[complexNumber.index] = value.doubleValue(); + } else if (name.equals(ComplexNumber.REAL_IDENTIFIER)) { + complexNumber.numbers.reals[complexNumber.index] = value.doubleValue(); + } else { + throw new IllegalArgumentException(); + } + return value; + } + + } + } + + } + +} diff -r aeba89e1d8da -r b3569a53c24c truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumbersRowBased.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/ComplexNumbersRowBased.java Mon Dec 14 14:20:08 2015 +0100 @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2015, 2015, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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.tck; + +import com.oracle.truffle.api.CallTarget; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.Truffle; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.interop.ForeignAccess; +import com.oracle.truffle.api.interop.ForeignAccess.Factory; +import com.oracle.truffle.api.interop.Message; +import com.oracle.truffle.api.interop.TruffleObject; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.nodes.RootNode; + +final class ComplexNumbersRowBased implements TruffleObject { + + private final double[] data; + + ComplexNumbersRowBased(double[] data) { + assert data.length % 2 == 0; + this.data = data; + } + + public double[] getData() { + return data; + } + + public ForeignAccess getForeignAccess() { + return ForeignAccess.create(new ComplexNumbersAForeignAccessFactory()); + } + + private static class ComplexNumbersAForeignAccessFactory implements Factory { + + public boolean canHandle(TruffleObject obj) { + return obj instanceof ComplexNumbersRowBased; + } + + public CallTarget accessMessage(Message tree) { + if (Message.IS_NULL.equals(tree)) { + return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); + } else if (Message.IS_EXECUTABLE.equals(tree)) { + return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); + } else if (Message.IS_BOXED.equals(tree)) { + return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); + } else if (Message.HAS_SIZE.equals(tree)) { + return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(true)); + } else if (Message.READ.equals(tree)) { + return Truffle.getRuntime().createCallTarget(new ComplexNumbersAReadNode()); + } else if (Message.WRITE.equals(tree)) { + return Truffle.getRuntime().createCallTarget(new ComplexNumbersAWriteNode()); + } else if (Message.GET_SIZE.equals(tree)) { + return Truffle.getRuntime().createCallTarget(new ComplexNumbersASizeNode()); + } else { + throw new IllegalArgumentException(tree.toString() + " not supported"); + } + } + } + + private static class ComplexNumbersAWriteNode extends RootNode { + protected ComplexNumbersAWriteNode() { + super(TckLanguage.class, null, null); + } + + @Child private Node readReal; + @Child private Node readImag; + + @Override + public Object execute(VirtualFrame frame) { + ComplexNumbersRowBased complexNumbers = (ComplexNumbersRowBased) ForeignAccess.getReceiver(frame); + Number index = (Number) ForeignAccess.getArguments(frame).get(0); + TruffleObject value = (TruffleObject) ForeignAccess.getArguments(frame).get(1); + if (readReal == null || readImag == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + this.readReal = insert(Message.READ.createNode()); + this.readImag = insert(Message.READ.createNode()); + } + Number realPart = (Number) ForeignAccess.execute(readReal, frame, value, new Object[]{ComplexNumber.REAL_IDENTIFIER}); + Number imagPart = (Number) ForeignAccess.execute(readImag, frame, value, new Object[]{ComplexNumber.IMAGINARY_IDENTIFIER}); + + complexNumbers.data[index.intValue() * 2] = realPart.doubleValue(); + complexNumbers.data[index.intValue() * 2 + 1] = imagPart.doubleValue(); + return value; + } + } + + private static class ComplexNumbersAReadNode extends RootNode { + protected ComplexNumbersAReadNode() { + super(TckLanguage.class, null, null); + } + + @Override + public Object execute(VirtualFrame frame) { + ComplexNumbersRowBased complexNumbers = (ComplexNumbersRowBased) ForeignAccess.getReceiver(frame); + Number index = (Number) ForeignAccess.getArguments(frame).get(0); + return new ComplexNumberAEntry(complexNumbers, index.intValue()); + } + } + + private static class ComplexNumbersASizeNode extends RootNode { + protected ComplexNumbersASizeNode() { + super(TckLanguage.class, null, null); + } + + @Override + public Object execute(VirtualFrame frame) { + ComplexNumbersRowBased complexNumbers = (ComplexNumbersRowBased) ForeignAccess.getReceiver(frame); + return complexNumbers.data.length / 2; + } + + } + + private static class ComplexNumberAEntry implements TruffleObject { + + private final ComplexNumbersRowBased numbers; + private final int index; + + public ComplexNumberAEntry(ComplexNumbersRowBased numbers, int index) { + this.numbers = numbers; + this.index = index; + } + + public ForeignAccess getForeignAccess() { + return ForeignAccess.create(new ComplexNumberAEntryForeignAccessFactory()); + } + + private static class ComplexNumberAEntryForeignAccessFactory implements Factory { + + public boolean canHandle(TruffleObject obj) { + return obj instanceof ComplexNumberAEntry; + } + + public CallTarget accessMessage(Message tree) { + if (Message.IS_NULL.equals(tree)) { + return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); + } else if (Message.IS_EXECUTABLE.equals(tree)) { + return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); + } else if (Message.IS_BOXED.equals(tree)) { + return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); + } else if (Message.HAS_SIZE.equals(tree)) { + return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); + } else if (Message.READ.equals(tree)) { + return Truffle.getRuntime().createCallTarget(new ComplexNumbersAEntryReadNode()); + } else if (Message.WRITE.equals(tree)) { + return Truffle.getRuntime().createCallTarget(new ComplexNumbersAEntryWriteNode()); + } else { + throw new IllegalArgumentException(tree.toString() + " not supported"); + } + } + + private static class ComplexNumbersAEntryReadNode extends RootNode { + protected ComplexNumbersAEntryReadNode() { + super(TckLanguage.class, null, null); + } + + @Child private Node readReal; + @Child private Node readImag; + + @Override + public Object execute(VirtualFrame frame) { + ComplexNumberAEntry complexNumber = (ComplexNumberAEntry) ForeignAccess.getReceiver(frame); + String name = (String) ForeignAccess.getArguments(frame).get(0); + if (name.equals(ComplexNumber.IMAGINARY_IDENTIFIER)) { + return complexNumber.numbers.data[complexNumber.index * 2 + 1]; + } else if (name.equals(ComplexNumber.REAL_IDENTIFIER)) { + return complexNumber.numbers.data[complexNumber.index * 2]; + } else { + throw new IllegalArgumentException(); + } + } + } + + private static class ComplexNumbersAEntryWriteNode extends RootNode { + protected ComplexNumbersAEntryWriteNode() { + super(TckLanguage.class, null, null); + } + + @Override + public Object execute(VirtualFrame frame) { + ComplexNumberAEntry complexNumber = (ComplexNumberAEntry) ForeignAccess.getReceiver(frame); + String name = (String) ForeignAccess.getArguments(frame).get(0); + Number value = (Number) ForeignAccess.getArguments(frame).get(1); + if (name.equals(ComplexNumber.IMAGINARY_IDENTIFIER)) { + complexNumber.numbers.data[complexNumber.index * 2 + 1] = value.doubleValue(); + } else if (name.equals(ComplexNumber.REAL_IDENTIFIER)) { + complexNumber.numbers.data[complexNumber.index * 2] = value.doubleValue(); + } else { + throw new IllegalArgumentException(); + } + return value; + } + + } + } + + } +} diff -r aeba89e1d8da -r b3569a53c24c truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/MapTruffleObject.java --- a/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/MapTruffleObject.java Fri Dec 11 15:20:27 2015 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2015, 2015, 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. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * 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.tck; - -import java.util.Map; - -import com.oracle.truffle.api.CallTarget; -import com.oracle.truffle.api.Truffle; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.interop.ForeignAccess; -import com.oracle.truffle.api.interop.ForeignAccess.Factory; -import com.oracle.truffle.api.interop.Message; -import com.oracle.truffle.api.interop.TruffleObject; -import com.oracle.truffle.api.nodes.RootNode; - -@SuppressWarnings({"rawtypes", "unchecked"}) -public final class MapTruffleObject implements TruffleObject { - - private final Map map; - - public MapTruffleObject(Map map) { - this.map = map; - } - - public ForeignAccess getForeignAccess() { - return ForeignAccess.create(new MapForeignAccessFactory()); - } - - private static class MapForeignAccessFactory implements Factory { - - public boolean canHandle(TruffleObject obj) { - return obj instanceof MapTruffleObject; - } - - public CallTarget accessMessage(Message tree) { - if (Message.IS_NULL.equals(tree)) { - return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); - } else if (Message.IS_EXECUTABLE.equals(tree)) { - return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); - } else if (Message.IS_BOXED.equals(tree)) { - return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); - } else if (Message.HAS_SIZE.equals(tree)) { - return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(true)); - } else if (Message.READ.equals(tree)) { - return Truffle.getRuntime().createCallTarget(new MapReadNode()); - } else if (Message.WRITE.equals(tree)) { - return Truffle.getRuntime().createCallTarget(new MapWriteNode()); - } else if (Message.GET_SIZE.equals(tree)) { - return Truffle.getRuntime().createCallTarget(new MapSizeNode()); - } else { - throw new IllegalArgumentException(tree.toString() + " not supported"); - } - } - } - - private static class MapWriteNode extends RootNode { - protected MapWriteNode() { - super(TckLanguage.class, null, null); - } - - @Override - public Object execute(VirtualFrame frame) { - MapTruffleObject map = (MapTruffleObject) ForeignAccess.getReceiver(frame); - Object key = ForeignAccess.getArguments(frame).get(0); - Object value = ForeignAccess.getArguments(frame).get(1); - map.map.put(key, value); - return value; - } - } - - private static class MapReadNode extends RootNode { - protected MapReadNode() { - super(TckLanguage.class, null, null); - } - - @Override - public Object execute(VirtualFrame frame) { - MapTruffleObject map = (MapTruffleObject) ForeignAccess.getReceiver(frame); - Object key = ForeignAccess.getArguments(frame).get(0); - return map.map.get(key); - } - - } - - private static class MapSizeNode extends RootNode { - protected MapSizeNode() { - super(TckLanguage.class, null, null); - } - - @Override - public Object execute(VirtualFrame frame) { - MapTruffleObject map = (MapTruffleObject) ForeignAccess.getReceiver(frame); - return map.map.size(); - } - - } - -} diff -r aeba89e1d8da -r b3569a53c24c truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/Schema.java --- a/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/Schema.java Fri Dec 11 15:20:27 2015 +0100 +++ b/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/Schema.java Mon Dec 14 14:20:08 2015 +0100 @@ -25,13 +25,11 @@ package com.oracle.truffle.tck; import java.nio.ByteBuffer; -import java.util.HashMap; import java.util.List; -import java.util.Map; -public final class Schema { +final class Schema { - public enum Type { + enum Type { DOUBLE(Double.SIZE / Byte.SIZE), INT(Integer.SIZE / Byte.SIZE); @@ -47,7 +45,7 @@ private final List names; private final List types; - public Schema(int size, boolean rowBased, List names, List types) { + Schema(int size, boolean rowBased, List names, List types) { this.size = size; this.rowBased = rowBased; this.names = names; @@ -58,19 +56,7 @@ return size; } - // for simplicity: structured data is read-only - - public Map getEntry(byte[] buffer, int index) { - Map entry = new HashMap<>(); - for (int i = 0; i < names.size(); i++) { - String name = names.get(i); - Object value = get(buffer, index, name); - entry.put(name, value); - } - return entry; - } - - private Object get(byte[] buffer, int index, String name) { + public Object get(byte[] buffer, int index, String name) { assert names.contains(name); int offset = rowBased ? getRowOffset(name, index) : getColumnOffset(name, index); if (types.get(names.indexOf(name)) == Type.DOUBLE) { diff -r aeba89e1d8da -r b3569a53c24c truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/StructuredData.java --- a/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/StructuredData.java Fri Dec 11 15:20:27 2015 +0100 +++ b/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/StructuredData.java Mon Dec 14 14:20:08 2015 +0100 @@ -24,8 +24,6 @@ */ package com.oracle.truffle.tck; -import java.util.Map; - import com.oracle.truffle.api.CallTarget; import com.oracle.truffle.api.Truffle; import com.oracle.truffle.api.frame.VirtualFrame; @@ -35,20 +33,16 @@ import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.nodes.RootNode; -public final class StructuredData implements TruffleObject { +final class StructuredData implements TruffleObject { private final byte[] buffer; private final Schema schema; - public StructuredData(byte[] buffer, Schema schema) { + StructuredData(byte[] buffer, Schema schema) { this.buffer = buffer; this.schema = schema; } - public Map getEntry(int index) { - return schema.getEntry(buffer, index); - } - public ForeignAccess getForeignAccess() { return ForeignAccess.create(new StructuredDataForeignAccessFactory()); } @@ -88,7 +82,7 @@ public Object execute(VirtualFrame frame) { StructuredData data = (StructuredData) ForeignAccess.getReceiver(frame); Number index = (Number) ForeignAccess.getArguments(frame).get(0); - return new MapTruffleObject(data.getEntry(index.intValue())); + return new StructuredDataEntry(data.buffer, data.schema, index.intValue()); } } diff -r aeba89e1d8da -r b3569a53c24c truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/StructuredDataEntry.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/StructuredDataEntry.java Mon Dec 14 14:20:08 2015 +0100 @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2015, 2015, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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.tck; + +import com.oracle.truffle.api.CallTarget; +import com.oracle.truffle.api.Truffle; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.interop.ForeignAccess; +import com.oracle.truffle.api.interop.ForeignAccess.Factory; +import com.oracle.truffle.api.interop.Message; +import com.oracle.truffle.api.interop.TruffleObject; +import com.oracle.truffle.api.nodes.RootNode; + +final class StructuredDataEntry implements TruffleObject { + + private final byte[] buffer; + private final Schema schema; + private final int index; + + StructuredDataEntry(byte[] buffer, Schema schema, int index) { + this.buffer = buffer; + this.schema = schema; + this.index = index; + } + + public ForeignAccess getForeignAccess() { + return ForeignAccess.create(new StructuredDataEntryForeignAccessFactory()); + } + + private static class StructuredDataEntryForeignAccessFactory implements Factory { + + public boolean canHandle(TruffleObject obj) { + return obj instanceof StructuredDataEntry; + } + + public CallTarget accessMessage(Message tree) { + // for simplicity: this StructuredData is read-only + if (Message.IS_NULL.equals(tree)) { + return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); + } else if (Message.IS_EXECUTABLE.equals(tree)) { + return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); + } else if (Message.IS_BOXED.equals(tree)) { + return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); + } else if (Message.HAS_SIZE.equals(tree)) { + return Truffle.getRuntime().createCallTarget(RootNode.createConstantNode(false)); + } else if (Message.READ.equals(tree)) { + return Truffle.getRuntime().createCallTarget(new StructuredDataEntryReadNode()); + } else { + throw new IllegalArgumentException(tree.toString() + " not supported"); + } + } + } + + private static class StructuredDataEntryReadNode extends RootNode { + protected StructuredDataEntryReadNode() { + super(TckLanguage.class, null, null); + } + + @Override + public Object execute(VirtualFrame frame) { + StructuredDataEntry data = (StructuredDataEntry) ForeignAccess.getReceiver(frame); + String name = (String) ForeignAccess.getArguments(frame).get(0); + return data.schema.get(data.buffer, data.index, name); + } + + } +} diff -r aeba89e1d8da -r b3569a53c24c truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/TruffleTCK.java --- a/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/TruffleTCK.java Fri Dec 11 15:20:27 2015 +0100 +++ b/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/TruffleTCK.java Mon Dec 14 14:20:08 2015 +0100 @@ -834,7 +834,7 @@ } PolyglotEngine.Value apply = findGlobalSymbol(id); - ComplexNumbersA numbers = new ComplexNumbersA(new double[]{2, -1, 30, -1, 10, -1}); + ComplexNumbersRowBased numbers = new ComplexNumbersRowBased(new double[]{2, -1, 30, -1, 10, -1}); Number n = (Number) apply.execute(numbers).get(); assertEquals("The same value returned", 42.0, n.doubleValue(), 0.01); @@ -848,7 +848,7 @@ } PolyglotEngine.Value apply = findGlobalSymbol(id); - ComplexNumbersB numbers = new ComplexNumbersB(new double[]{2, 30, 10}, new double[]{-1, -1, -1}); + ComplexNumbersColumnBased numbers = new ComplexNumbersColumnBased(new double[]{2, 30, 10}, new double[]{-1, -1, -1}); Number n = (Number) apply.execute(numbers).get(); assertEquals("The same value returned", 42.0, n.doubleValue(), 0.01); @@ -897,8 +897,8 @@ } PolyglotEngine.Value apply = findGlobalSymbol(id); - ComplexNumbersA a = new ComplexNumbersA(new double[]{-1, -1, -1, -1, -1, -1}); - ComplexNumbersA b = new ComplexNumbersA(new double[]{41, 42, 43, 44, 45, 46}); + ComplexNumbersRowBased a = new ComplexNumbersRowBased(new double[]{-1, -1, -1, -1, -1, -1}); + ComplexNumbersRowBased b = new ComplexNumbersRowBased(new double[]{41, 42, 43, 44, 45, 46}); apply.execute(a, b); @@ -913,8 +913,8 @@ } PolyglotEngine.Value apply = findGlobalSymbol(id); - ComplexNumbersB a = new ComplexNumbersB(new double[]{-1, -1, -1}, new double[]{-1, -1, -1}); - ComplexNumbersB b = new ComplexNumbersB(new double[]{41, 43, 45}, new double[]{42, 44, 46}); + ComplexNumbersColumnBased a = new ComplexNumbersColumnBased(new double[]{-1, -1, -1}, new double[]{-1, -1, -1}); + ComplexNumbersColumnBased b = new ComplexNumbersColumnBased(new double[]{41, 43, 45}, new double[]{42, 44, 46}); apply.execute(a, b); @@ -929,7 +929,7 @@ } PolyglotEngine.Value apply = findGlobalSymbol(id); - ComplexNumbersA a = new ComplexNumbersA(new double[]{-1, -1, -1, -1, -1, -1}); + ComplexNumbersRowBased a = new ComplexNumbersRowBased(new double[]{-1, -1, -1, -1, -1, -1}); Schema schema = new Schema(3, true, Arrays.asList(ComplexNumber.REAL_IDENTIFIER, ComplexNumber.IMAGINARY_IDENTIFIER), Arrays.asList(Type.DOUBLE, Type.DOUBLE)); byte[] buffer = new byte[6 * Double.SIZE / Byte.SIZE];