Mercurial > hg > truffle
diff truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/MaxMinObject.java @ 22135:e70b20f4bb00
Implementing API for Java/Truffle interop. Based around JavaInterop.asJavaObject and JavaInterop.asTruffleObject methods. Connected to TruffleVM via Symbol.as(Class) wrapper. Verified by extended TCK.
author | Jaroslav Tulach <jaroslav.tulach@oracle.com> |
---|---|
date | Mon, 07 Sep 2015 17:07:20 +0200 |
parents | f84a7663966d |
children | 89db2519ef18 |
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/MaxMinObject.java Fri Sep 04 16:41:38 2015 +0200 +++ b/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/MaxMinObject.java Mon Sep 07 17:07:20 2015 +0200 @@ -24,21 +24,7 @@ */ 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.TruffleLanguage; -import com.oracle.truffle.api.dsl.NodeChild; -import com.oracle.truffle.api.dsl.NodeChildren; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.interop.ForeignAccess; -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 MaxMinObject implements TruffleObject { +final class MaxMinObject implements LongBinaryOperation { private final boolean max; public MaxMinObject(boolean max) { @@ -46,159 +32,7 @@ } @Override - public ForeignAccess getForeignAccess() { - return ForeignAccess.create(MaxMinObject.class, new AF()); - } - - static final class AF implements ForeignAccess.Factory10 { - @Override - public CallTarget accessIsNull() { - return null; - } - - @Override - public CallTarget accessIsExecutable() { - return null; - } - - @Override - public CallTarget accessIsBoxed() { - return null; - } - - @Override - public CallTarget accessHasSize() { - return null; - } - - @Override - public CallTarget accessGetSize() { - return null; - } - - @Override - public CallTarget accessUnbox() { - return null; - } - - @Override - public CallTarget accessRead() { - return null; - } - - @Override - public CallTarget accessWrite() { - return null; - } - - @Override - public CallTarget accessExecute(int argumentsLength) { - if (argumentsLength == 2) { - MaxMinNode maxNode = MaxMinObjectFactory.MaxMinNodeGen.create(new ReadReceiverNode(), MaxMinObjectFactory.UnboxNodeGen.create(new ReadArgNode(0)), - MaxMinObjectFactory.UnboxNodeGen.create(new ReadArgNode(1))); - return Truffle.getRuntime().createCallTarget(maxNode); - } - return null; - } - - @Override - public CallTarget accessInvoke(int argumentsLength) { - return null; - } - - @Override - public CallTarget accessMessage(Message unknown) { - return null; - } - - @Override - public CallTarget accessNew(int argumentsLength) { - return null; - } - } - - static class ReadArgNode extends Node { - private final int argIndex; - - public ReadArgNode(int argIndex) { - this.argIndex = argIndex; - } - - public Object execute(VirtualFrame frame) { - return ForeignAccess.getArguments(frame).get(argIndex); - } - } - - static class ReadReceiverNode extends Node { - public Object execute(VirtualFrame frame) { - return ForeignAccess.getReceiver(frame); - } - } - - @NodeChildren({@NodeChild(value = "valueNode", type = ReadArgNode.class)}) - abstract static class UnboxNode extends Node { - @Child private Node unbox; - @Child private Node isBoxed; - - public abstract Object executeUnbox(VirtualFrame frame); - - @Specialization - public int executeUnbox(int value) { - return value; - } - - @Specialization - public long executeUnbox(long value) { - return value; - } - - @Specialization - public String executeUnbox(String value) { - return value; - } - - @Specialization(guards = "isBoxedPrimitive(frame, foreignValue)") - public Object executeUnbox(VirtualFrame frame, TruffleObject foreignValue) { - if (unbox == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - unbox = insert(Message.UNBOX.createNode()); - } - return ForeignAccess.execute(unbox, frame, foreignValue); - } - - protected final boolean isBoxedPrimitive(VirtualFrame frame, TruffleObject object) { - if (isBoxed == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - isBoxed = insert(Message.IS_BOXED.createNode()); - } - return (boolean) ForeignAccess.execute(isBoxed, frame, object); - } - - } - - @NodeChildren({@NodeChild(value = "receiver", type = ReadReceiverNode.class), @NodeChild(value = "firstNode", type = UnboxNode.class), @NodeChild(value = "secondNode", type = UnboxNode.class)}) - abstract static class MaxMinNode extends RootNode { - - MaxMinNode() { - super(MMLanguage.class, null, null); - } - - @Specialization - public int execute(MaxMinObject receiver, int first, int second) { - return receiver.max ? Math.max(first, second) : Math.min(first, second); - } - - @Specialization - public long execute(MaxMinObject receiver, long first, long second) { - return receiver.max ? Math.max(first, second) : Math.min(first, second); - } - - @Specialization - public double execute(MaxMinObject receiver, double first, double second) { - return receiver.max ? Math.max(first, second) : Math.min(first, second); - } - } - - private abstract class MMLanguage extends TruffleLanguage<Object> { + public long compute(long a, long b) { + return max ? Math.max(a, b) : Math.min(a, b); } }