Mercurial > hg > truffle
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));