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);
     }
 }