diff truffle/com.oracle.truffle.api.interop.java/src/com/oracle/truffle/api/interop/java/JavaInterop.java @ 22163:7a6719b66a74

Send Message.INVOKE first and only if it yields IllegalArgumentException consider going back to Message.READ, Message.IS_EXECUTABLE and Message.EXECUTE.
author Jaroslav Tulach <jaroslav.tulach@oracle.com>
date Mon, 21 Sep 2015 09:46:12 +0200
parents b5b0f3621f05
children 1e753eabe503
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.api.interop.java/src/com/oracle/truffle/api/interop/java/JavaInterop.java	Thu Sep 17 11:12:45 2015 +0200
+++ b/truffle/com.oracle.truffle.api.interop.java/src/com/oracle/truffle/api/interop/java/JavaInterop.java	Mon Sep 21 09:46:12 2015 +0200
@@ -335,17 +335,6 @@
             }
 
             if (message == null) {
-                val = message(Message.READ, obj, name);
-                if (isPrimitive(val)) {
-                    return val;
-                }
-                TruffleObject attr = (TruffleObject) val;
-                if (Boolean.FALSE.equals(message(Message.IS_EXECUTABLE, attr))) {
-                    if (args.length == 0) {
-                        return toJava(attr, method);
-                    }
-                    throw new IllegalStateException(attr + " cannot be invoked with " + args.length + " parameters");
-                }
                 Object ret;
                 try {
                     List<Object> callArgs = new ArrayList<>(args.length);
@@ -353,6 +342,17 @@
                     callArgs.addAll(Arrays.asList(args));
                     ret = message(Message.createInvoke(callArgs.size()), obj, callArgs.toArray());
                 } catch (IllegalArgumentException ex) {
+                    val = message(Message.READ, obj, name);
+                    if (isPrimitive(val)) {
+                        return val;
+                    }
+                    TruffleObject attr = (TruffleObject) val;
+                    if (Boolean.FALSE.equals(message(Message.IS_EXECUTABLE, attr))) {
+                        if (args.length == 0) {
+                            return toJava(attr, method);
+                        }
+                        throw new IllegalStateException(attr + " cannot be invoked with " + args.length + " parameters");
+                    }
                     List<Object> callArgs = new ArrayList<>(args.length + 1);
                     // callArgs.add(attr);
                     callArgs.addAll(Arrays.asList(args));