annotate truffle/com.oracle.truffle.api.interop/src/com/oracle/truffle/api/interop/impl/SymbolInvokerImpl.java @ 22083:245dc37053f3

Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
author Jaroslav Tulach <jaroslav.tulach@oracle.com>
date Mon, 17 Aug 2015 14:54:11 +0200
parents 78c3d3d8d86e
children 77562c7bc5a6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21770
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
1 /*
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
2 * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
4 *
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation. Oracle designates this
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
8 * particular file as subject to the "Classpath" exception as provided
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
9 * by Oracle in the LICENSE file that accompanied this code.
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
10 *
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
11 * This code is distributed in the hope that it will be useful, but WITHOUT
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
14 * version 2 for more details (a copy is included in the LICENSE file that
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
15 * accompanied this code).
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
16 *
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
17 * You should have received a copy of the GNU General Public License version
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
18 * 2 along with this work; if not, write to the Free Software Foundation,
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
20 *
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
22 * or visit www.oracle.com if you need additional information or have any
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
23 * questions.
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
24 */
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
25 package com.oracle.truffle.api.interop.impl;
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
26
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
27 import java.io.*;
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
28
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
29 import com.oracle.truffle.api.*;
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
30 import com.oracle.truffle.api.frame.*;
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
31 import com.oracle.truffle.api.impl.*;
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
32 import com.oracle.truffle.api.interop.ForeignAccess;
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
33 import com.oracle.truffle.api.interop.Message;
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
34 import com.oracle.truffle.api.interop.TruffleObject;
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
35 import com.oracle.truffle.api.nodes.*;
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
36
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
37 public final class SymbolInvokerImpl extends SymbolInvoker {
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
38 static final FrameDescriptor UNUSED_FRAMEDESCRIPTOR = new FrameDescriptor();
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
39
22066
78c3d3d8d86e Clearly separating the TruffleLanguage definition from context used during its execution. TruffleLanguage now has to have public static field INSTANCE and override createContext method.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22003
diff changeset
40 @SuppressWarnings("unchecked")
21770
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
41 @Override
22066
78c3d3d8d86e Clearly separating the TruffleLanguage definition from context used during its execution. TruffleLanguage now has to have public static field INSTANCE and override createContext method.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22003
diff changeset
42 protected Object invoke(TruffleLanguage<?> lang, Object symbol, Object... arr) throws IOException {
21770
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
43 if (symbol instanceof String) {
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
44 return symbol;
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
45 }
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
46 if (symbol instanceof Number) {
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
47 return symbol;
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
48 }
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
49 if (symbol instanceof Boolean) {
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
50 return symbol;
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
51 }
22066
78c3d3d8d86e Clearly separating the TruffleLanguage definition from context used during its execution. TruffleLanguage now has to have public static field INSTANCE and override createContext method.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22003
diff changeset
52 Class<? extends TruffleLanguage<?>> type = (Class<? extends TruffleLanguage<?>>) lang.getClass();
21770
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
53 Node executeMain = Message.createExecute(arr.length).createNode();
22066
78c3d3d8d86e Clearly separating the TruffleLanguage definition from context used during its execution. TruffleLanguage now has to have public static field INSTANCE and override createContext method.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22003
diff changeset
54 CallTarget callTarget = Truffle.getRuntime().createCallTarget(new TemporaryRoot(type, executeMain, (TruffleObject) symbol, arr));
21770
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
55 VirtualFrame frame = Truffle.getRuntime().createVirtualFrame(arr, UNUSED_FRAMEDESCRIPTOR);
22083
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
56 return callTarget.call(frame);
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
57 }
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
58
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
59 private static class TemporaryRoot extends RootNode {
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
60 @Child private Node foreignAccess;
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
61 @Child private ConvertNode convert;
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
62 private final TruffleObject function;
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
63 private final Object[] args;
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
64
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
65 public TemporaryRoot(Class<? extends TruffleLanguage<?>> lang, Node foreignAccess, TruffleObject function, Object... args) {
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
66 super(lang, null, null);
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
67 this.foreignAccess = foreignAccess;
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
68 this.convert = new ConvertNode();
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
69 this.function = function;
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
70 this.args = args;
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
71 }
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
72
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
73 @Override
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
74 public Object execute(VirtualFrame frame) {
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
75 Object tmp = ForeignAccess.execute(foreignAccess, frame, function, args);
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
76 return convert.convert(frame, tmp);
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
77 }
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
78 }
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
79
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
80 private static final class ConvertNode extends Node {
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
81 @Child private Node isNull;
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
82 @Child private Node isBoxed;
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
83 @Child private Node unbox;
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
84
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
85 public ConvertNode() {
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
86 this.isNull = Message.IS_NULL.createNode();
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
87 this.isBoxed = Message.IS_BOXED.createNode();
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
88 this.unbox = Message.UNBOX.createNode();
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
89 }
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
90
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
91 Object convert(VirtualFrame frame, Object obj) {
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
92 if (obj instanceof TruffleObject) {
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
93 return convert(frame, (TruffleObject) obj);
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
94 } else {
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
95 return obj;
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
96 }
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
97 }
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
98
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
99 private Object convert(VirtualFrame frame, TruffleObject obj) {
21770
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
100 Object isBoxedResult;
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
101 try {
22083
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
102 isBoxedResult = ForeignAccess.execute(isBoxed, frame, obj);
21770
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
103 } catch (IllegalArgumentException ex) {
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
104 isBoxedResult = false;
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
105 }
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
106 if (Boolean.TRUE.equals(isBoxedResult)) {
22083
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
107 return ForeignAccess.execute(unbox, frame, obj);
21770
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
108 } else {
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
109 try {
22083
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
110 Object isNullResult = ForeignAccess.execute(isNull, frame, obj);
21770
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
111 if (Boolean.TRUE.equals(isNullResult)) {
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
112 return null;
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
113 }
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
114 } catch (IllegalArgumentException ex) {
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
115 // fallthrough
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
116 }
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
117 }
22083
245dc37053f3 Using just a one RootNode per call and otherwise doing all the conversions in its children. Is it faster?
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22066
diff changeset
118 return obj;
21770
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
119 }
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
120 }
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
121 }