Mercurial > hg > truffle
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 { |