comparison truffle/com.oracle.truffle.api.interop/src/com/oracle/truffle/api/interop/impl/SymbolInvokerImpl.java @ 22084:77562c7bc5a6

Caching the CallTarget in Symbol, so it may get hot one day
author Jaroslav Tulach <jaroslav.tulach@oracle.com>
date Mon, 17 Aug 2015 15:20:42 +0200
parents 245dc37053f3
children 93bfc9602271
comparison
equal deleted inserted replaced
22083:245dc37053f3 22084:77562c7bc5a6
37 public final class SymbolInvokerImpl extends SymbolInvoker { 37 public final class SymbolInvokerImpl extends SymbolInvoker {
38 static final FrameDescriptor UNUSED_FRAMEDESCRIPTOR = new FrameDescriptor(); 38 static final FrameDescriptor UNUSED_FRAMEDESCRIPTOR = new FrameDescriptor();
39 39
40 @SuppressWarnings("unchecked") 40 @SuppressWarnings("unchecked")
41 @Override 41 @Override
42 protected Object invoke(TruffleLanguage<?> lang, Object symbol, Object... arr) throws IOException { 42 protected CallTarget createCallTarget(TruffleLanguage<?> lang, Object symbol, Object... arr) throws IOException {
43 if (symbol instanceof String) { 43 Class<? extends TruffleLanguage<?>> type = (Class<? extends TruffleLanguage<?>>) lang.getClass();
44 return symbol; 44 RootNode symbolNode;
45 if ((symbol instanceof String) || (symbol instanceof Number) || (symbol instanceof Boolean) || (symbol instanceof Character)) {
46 symbolNode = new ConstantRootNode(type, symbol);
47 } else {
48 Node executeMain = Message.createExecute(arr.length).createNode();
49 symbolNode = new TemporaryRoot(type, executeMain, (TruffleObject) symbol);
45 } 50 }
46 if (symbol instanceof Number) { 51 return Truffle.getRuntime().createCallTarget(symbolNode);
47 return symbol; 52 }
53
54 private final class ConstantRootNode extends RootNode {
55
56 private final Object value;
57
58 public ConstantRootNode(Class<? extends TruffleLanguage<?>> lang, Object value) {
59 super(lang, null, null);
60 this.value = value;
48 } 61 }
49 if (symbol instanceof Boolean) { 62
50 return symbol; 63 @Override
64 public Object execute(VirtualFrame vf) {
65 return value;
51 } 66 }
52 Class<? extends TruffleLanguage<?>> type = (Class<? extends TruffleLanguage<?>>) lang.getClass();
53 Node executeMain = Message.createExecute(arr.length).createNode();
54 CallTarget callTarget = Truffle.getRuntime().createCallTarget(new TemporaryRoot(type, executeMain, (TruffleObject) symbol, arr));
55 VirtualFrame frame = Truffle.getRuntime().createVirtualFrame(arr, UNUSED_FRAMEDESCRIPTOR);
56 return callTarget.call(frame);
57 } 67 }
58 68
59 private static class TemporaryRoot extends RootNode { 69 private static class TemporaryRoot extends RootNode {
60 @Child private Node foreignAccess; 70 @Child private Node foreignAccess;
61 @Child private ConvertNode convert; 71 @Child private ConvertNode convert;
62 private final TruffleObject function; 72 private final TruffleObject function;
63 private final Object[] args;
64 73
65 public TemporaryRoot(Class<? extends TruffleLanguage<?>> lang, Node foreignAccess, TruffleObject function, Object... args) { 74 public TemporaryRoot(Class<? extends TruffleLanguage<?>> lang, Node foreignAccess, TruffleObject function) {
66 super(lang, null, null); 75 super(lang, null, null);
67 this.foreignAccess = foreignAccess; 76 this.foreignAccess = foreignAccess;
68 this.convert = new ConvertNode(); 77 this.convert = new ConvertNode();
69 this.function = function; 78 this.function = function;
70 this.args = args;
71 } 79 }
72 80
73 @Override 81 @Override
74 public Object execute(VirtualFrame frame) { 82 public Object execute(VirtualFrame frame) {
75 Object tmp = ForeignAccess.execute(foreignAccess, frame, function, args); 83 Object tmp = ForeignAccess.execute(foreignAccess, frame, function, frame.getArguments());
76 return convert.convert(frame, tmp); 84 return convert.convert(frame, tmp);
77 } 85 }
78 } 86 }
79 87
80 private static final class ConvertNode extends Node { 88 private static final class ConvertNode extends Node {