annotate truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/SymbolInvokerImpl.java @ 22129:0589cc5cab30

TruffleVM can now depend on api.interop and thus there is no need for indirection between SymbolInvoker and its Impl. Enough to do direct calls.
author Jaroslav Tulach <jaroslav.tulach@oracle.com>
date Thu, 03 Sep 2015 17:15:44 +0200
parents truffle/com.oracle.truffle.api.interop/src/com/oracle/truffle/api/interop/impl/SymbolInvokerImpl.java@29126a670f9b
children 626862cfa58d
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 */
22129
0589cc5cab30 TruffleVM can now depend on api.interop and thus there is no need for indirection between SymbolInvoker and its Impl. Enough to do direct calls.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22107
diff changeset
25 package com.oracle.truffle.api.vm;
21770
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 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
28 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
29 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
30 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
31 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
32 import com.oracle.truffle.api.nodes.*;
22129
0589cc5cab30 TruffleVM can now depend on api.interop and thus there is no need for indirection between SymbolInvoker and its Impl. Enough to do direct calls.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22107
diff changeset
33 import java.io.*;
21770
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
34
22129
0589cc5cab30 TruffleVM can now depend on api.interop and thus there is no need for indirection between SymbolInvoker and its Impl. Enough to do direct calls.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22107
diff changeset
35 final class SymbolInvokerImpl {
22096
1e78795e7e6a Allow to specify globalSymbols when defining TruffleVM
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22086
diff changeset
36 @SuppressWarnings({"unchecked", "rawtypes"})
22129
0589cc5cab30 TruffleVM can now depend on api.interop and thus there is no need for indirection between SymbolInvoker and its Impl. Enough to do direct calls.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22107
diff changeset
37 static CallTarget createCallTarget(TruffleLanguage<?> lang, Object symbol, Object... arr) throws IOException {
22096
1e78795e7e6a Allow to specify globalSymbols when defining TruffleVM
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22086
diff changeset
38 Class<? extends TruffleLanguage<?>> type;
1e78795e7e6a Allow to specify globalSymbols when defining TruffleVM
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22086
diff changeset
39 if (lang != null) {
1e78795e7e6a Allow to specify globalSymbols when defining TruffleVM
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22086
diff changeset
40 type = (Class) lang.getClass();
1e78795e7e6a Allow to specify globalSymbols when defining TruffleVM
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22086
diff changeset
41 } else {
1e78795e7e6a Allow to specify globalSymbols when defining TruffleVM
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22086
diff changeset
42 type = (Class) TruffleLanguage.class;
1e78795e7e6a Allow to specify globalSymbols when defining TruffleVM
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22086
diff changeset
43 }
22084
77562c7bc5a6 Caching the CallTarget in Symbol, so it may get hot one day
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22083
diff changeset
44 RootNode symbolNode;
77562c7bc5a6 Caching the CallTarget in Symbol, so it may get hot one day
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22083
diff changeset
45 if ((symbol instanceof String) || (symbol instanceof Number) || (symbol instanceof Boolean) || (symbol instanceof Character)) {
77562c7bc5a6 Caching the CallTarget in Symbol, so it may get hot one day
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22083
diff changeset
46 symbolNode = new ConstantRootNode(type, symbol);
77562c7bc5a6 Caching the CallTarget in Symbol, so it may get hot one day
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22083
diff changeset
47 } else {
77562c7bc5a6 Caching the CallTarget in Symbol, so it may get hot one day
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22083
diff changeset
48 Node executeMain = Message.createExecute(arr.length).createNode();
22086
93bfc9602271 Recreate the CallTarget when number of arguments to the createExecute message changes
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22084
diff changeset
49 symbolNode = new TemporaryRoot(type, executeMain, (TruffleObject) symbol, arr.length);
21770
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
50 }
22084
77562c7bc5a6 Caching the CallTarget in Symbol, so it may get hot one day
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22083
diff changeset
51 return Truffle.getRuntime().createCallTarget(symbolNode);
77562c7bc5a6 Caching the CallTarget in Symbol, so it may get hot one day
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22083
diff changeset
52 }
77562c7bc5a6 Caching the CallTarget in Symbol, so it may get hot one day
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22083
diff changeset
53
22129
0589cc5cab30 TruffleVM can now depend on api.interop and thus there is no need for indirection between SymbolInvoker and its Impl. Enough to do direct calls.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22107
diff changeset
54 private static final class ConstantRootNode extends RootNode {
22084
77562c7bc5a6 Caching the CallTarget in Symbol, so it may get hot one day
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22083
diff changeset
55
77562c7bc5a6 Caching the CallTarget in Symbol, so it may get hot one day
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22083
diff changeset
56 private final Object value;
77562c7bc5a6 Caching the CallTarget in Symbol, so it may get hot one day
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22083
diff changeset
57
77562c7bc5a6 Caching the CallTarget in Symbol, so it may get hot one day
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22083
diff changeset
58 public ConstantRootNode(Class<? extends TruffleLanguage<?>> lang, Object value) {
77562c7bc5a6 Caching the CallTarget in Symbol, so it may get hot one day
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22083
diff changeset
59 super(lang, null, null);
77562c7bc5a6 Caching the CallTarget in Symbol, so it may get hot one day
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22083
diff changeset
60 this.value = value;
21770
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
61 }
22084
77562c7bc5a6 Caching the CallTarget in Symbol, so it may get hot one day
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22083
diff changeset
62
77562c7bc5a6 Caching the CallTarget in Symbol, so it may get hot one day
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22083
diff changeset
63 @Override
77562c7bc5a6 Caching the CallTarget in Symbol, so it may get hot one day
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22083
diff changeset
64 public Object execute(VirtualFrame vf) {
77562c7bc5a6 Caching the CallTarget in Symbol, so it may get hot one day
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22083
diff changeset
65 return value;
77562c7bc5a6 Caching the CallTarget in Symbol, so it may get hot one day
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22083
diff changeset
66 }
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
67 }
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
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 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
70 @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
71 @Child private ConvertNode convert;
22086
93bfc9602271 Recreate the CallTarget when number of arguments to the createExecute message changes
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22084
diff changeset
72 private final int argumentLength;
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
73 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
74
22086
93bfc9602271 Recreate the CallTarget when number of arguments to the createExecute message changes
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22084
diff changeset
75 public TemporaryRoot(Class<? extends TruffleLanguage<?>> lang, Node foreignAccess, TruffleObject function, int argumentLength) {
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
76 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
77 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
78 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
79 this.function = function;
22086
93bfc9602271 Recreate the CallTarget when number of arguments to the createExecute message changes
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22084
diff changeset
80 this.argumentLength = argumentLength;
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
81 }
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
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 @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
84 public Object execute(VirtualFrame frame) {
22086
93bfc9602271 Recreate the CallTarget when number of arguments to the createExecute message changes
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22084
diff changeset
85 final Object[] args = frame.getArguments();
93bfc9602271 Recreate the CallTarget when number of arguments to the createExecute message changes
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22084
diff changeset
86 if (args.length != argumentLength) {
93bfc9602271 Recreate the CallTarget when number of arguments to the createExecute message changes
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22084
diff changeset
87 throw new ArgumentsMishmashException();
93bfc9602271 Recreate the CallTarget when number of arguments to the createExecute message changes
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22084
diff changeset
88 }
93bfc9602271 Recreate the CallTarget when number of arguments to the createExecute message changes
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 22084
diff changeset
89 Object tmp = ForeignAccess.execute(foreignAccess, frame, function, args);
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
90 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
91 }
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 }
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
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 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
95 @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
96 @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
97 @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
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 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
100 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
101 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
102 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
103 }
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
104
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
105 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
106 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
107 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
108 } 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
109 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
110 }
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
111 }
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
112
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
113 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
114 Object isBoxedResult;
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
115 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
116 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
117 } 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
118 isBoxedResult = false;
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 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
121 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
122 } else {
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
123 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
124 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
125 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
126 return null;
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
127 }
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
128 } 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
129 // fallthrough
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
130 }
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
131 }
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
132 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
133 }
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
134 }
c76742cc2c6f Polishing inter-operability APIs: Exposing only Message, TruffleObject and ForeignAccess-related classes.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents:
diff changeset
135 }