# HG changeset patch # User Jaroslav Tulach # Date 1440586315 -7200 # Node ID f84a7663966da606b7e63b3f28a2db834894297b # Parent 29126a670f9b0463ddd3610b87fd288a1fc61038 Adding Message.createNew into standard interop messages so languages like Ruby and Java can use 'new' to instantiate Java classes. diff -r 29126a670f9b -r f84a7663966d truffle/com.oracle.truffle.api.interop/src/com/oracle/truffle/api/interop/Execute.java --- 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"; + } } - } diff -r 29126a670f9b -r f84a7663966d truffle/com.oracle.truffle.api.interop/src/com/oracle/truffle/api/interop/ForeignAccess.java --- 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 null 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: diff -r 29126a670f9b -r f84a7663966d truffle/com.oracle.truffle.api.interop/src/com/oracle/truffle/api/interop/Message.java --- 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 + * argumentsLength. 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); } /** diff -r 29126a670f9b -r f84a7663966d truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/interop/ForeignAccessToStringTest.java --- 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; + } } } diff -r 29126a670f9b -r f84a7663966d truffle/com.oracle.truffle.tck/src/com/oracle/truffle/tck/MaxMinObject.java --- 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 {