changeset 22108:f84a7663966d

Adding Message.createNew into standard interop messages so languages like Ruby and Java can use 'new' to instantiate Java classes.
author Jaroslav Tulach <jaroslav.tulach@oracle.com>
date Wed, 26 Aug 2015 12:51:55 +0200
parents 29126a670f9b
children b5eaddcdf86a
files truffle/com.oracle.truffle.api.interop/src/com/oracle/truffle/api/interop/Execute.java truffle/com.oracle.truffle.api.interop/src/com/oracle/truffle/api/interop/ForeignAccess.java truffle/com.oracle.truffle.api.interop/src/com/oracle/truffle/api/interop/Message.java truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/interop/ForeignAccessToStringTest.java truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/MaxMinObject.java
diffstat 5 files changed, 57 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.api.interop/src/com/oracle/truffle/api/interop/Execute.java	Tue Aug 25 15:10:36 2015 +0200
+++ b/truffle/com.oracle.truffle.api.interop/src/com/oracle/truffle/api/interop/Execute.java	Wed Aug 26 12:51:55 2015 +0200
@@ -25,18 +25,19 @@
 package com.oracle.truffle.api.interop;
 
 final class Execute extends KnownMessage {
-    public static final int HASH1 = 423430;
-    public static final int HASH2 = 423429;
+    public static final int EXECUTE = 423430;
+    public static final int INVOKE = 423429;
+    public static final int NEW = 423428;
 
     private final int arity;
-    private final boolean invoke;
+    private final int type;
 
-    public static Execute create(boolean invoke, int arity) {
-        return new Execute(invoke, arity);
+    public static Execute create(int type, int arity) {
+        return new Execute(type, arity);
     }
 
-    private Execute(boolean invoke, int arity) {
-        this.invoke = invoke;
+    private Execute(int type, int arity) {
+        this.type = type;
         this.arity = arity;
     }
 
@@ -51,17 +52,23 @@
         }
         Execute m1 = this;
         Execute m2 = (Execute) message;
-        return m1.invoke == m2.invoke;
+        return m1.type == m2.type;
     }
 
     @Override
     public int hashCode() {
-        return invoke ? HASH1 : HASH2;
+        return type;
     }
 
     @Override
     public String toString() {
-        return invoke ? "msgInvoke" : "msgExecute";
+        switch (type) {
+            case EXECUTE:
+                return "msgExecute";
+            case INVOKE:
+                return "msgInvoke";
+            default:
+                return "msgNew";
+        }
     }
-
 }
--- a/truffle/com.oracle.truffle.api.interop/src/com/oracle/truffle/api/interop/ForeignAccess.java	Tue Aug 25 15:10:36 2015 +0200
+++ b/truffle/com.oracle.truffle.api.interop/src/com/oracle/truffle/api/interop/ForeignAccess.java	Wed Aug 26 12:51:55 2015 +0200
@@ -262,6 +262,15 @@
         CallTarget accessInvoke(int argumentsLength);
 
         /**
+         * Handles {@link Message#createNew(int)} messages.
+         * 
+         * @param argumentsLength number of parameters the messages has been created for
+         * @return call target to handle the message or <code>null</code> if this message is not
+         *         supported
+         */
+        CallTarget accessNew(int argumentsLength);
+
+        /**
          * Handles request for access to a message not known in version 1.0.
          *
          * @param unknown the message
@@ -292,10 +301,12 @@
         public CallTarget accessMessage(Message msg) {
             if (msg instanceof KnownMessage) {
                 switch (msg.hashCode()) {
-                    case Execute.HASH1:
+                    case Execute.EXECUTE:
+                        return factory.accessExecute(((Execute) msg).getArity());
+                    case Execute.INVOKE:
                         return factory.accessInvoke(((Execute) msg).getArity());
-                    case Execute.HASH2:
-                        return factory.accessExecute(((Execute) msg).getArity());
+                    case Execute.NEW:
+                        return factory.accessNew(((Execute) msg).getArity());
                     case GetSize.HASH:
                         return factory.accessGetSize();
                     case HasSize.HASH:
--- a/truffle/com.oracle.truffle.api.interop/src/com/oracle/truffle/api/interop/Message.java	Tue Aug 25 15:10:36 2015 +0200
+++ b/truffle/com.oracle.truffle.api.interop/src/com/oracle/truffle/api/interop/Message.java	Wed Aug 26 12:51:55 2015 +0200
@@ -68,7 +68,7 @@
      * @return execute message
      */
     public static Message createExecute(int argumentsLength) {
-        return Execute.create(false, argumentsLength);
+        return Execute.create(Execute.EXECUTE, argumentsLength);
     }
 
     /**
@@ -89,7 +89,21 @@
      * @return read & execute message
      */
     public static Message createInvoke(int argumentsLength) {
-        return Execute.create(true, argumentsLength);
+        return Execute.create(Execute.INVOKE, argumentsLength);
+    }
+
+    /**
+     * Creates an allocation message. All messages created by this method are
+     * {@link Object#equals(java.lang.Object) equal} to each other regardless of the value of
+     * <code>argumentsLength</code>. The expected behavior of this message is to allocate a new
+     * instance of the {@link ForeignAccess#getReceiver(com.oracle.truffle.api.frame.Frame)
+     * receiver} and then perform its constructor with appropriate number of arguments.
+     *
+     * @param argumentsLength number of parameters to pass to the target
+     * @return read & execute message
+     */
+    public static Message createNew(int argumentsLength) {
+        return Execute.create(Execute.NEW, argumentsLength);
     }
 
     /**
--- a/truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/interop/ForeignAccessToStringTest.java	Tue Aug 25 15:10:36 2015 +0200
+++ b/truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/interop/ForeignAccessToStringTest.java	Wed Aug 26 12:51:55 2015 +0200
@@ -113,5 +113,9 @@
             return null;
         }
 
+        @Override
+        public CallTarget accessNew(int argumentsLength) {
+            return null;
+        }
     }
 }
--- a/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/MaxMinObject.java	Tue Aug 25 15:10:36 2015 +0200
+++ b/truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/MaxMinObject.java	Wed Aug 26 12:51:55 2015 +0200
@@ -110,6 +110,11 @@
         public CallTarget accessMessage(Message unknown) {
             return null;
         }
+
+        @Override
+        public CallTarget accessNew(int argumentsLength) {
+            return null;
+        }
     }
 
     static class ReadArgNode extends Node {