How to write a function call with Truffle
Thomas Wuerthinger
thomas.wuerthinger at oracle.com
Thu Aug 15 08:34:03 PDT 2013
The error message is a little bit misleading; we will fix this. The problem is actually in the method FunctionNode.execute. The loop accesses the array "slots" and gives it to the method Frame.setObject [1]. This parameter must evaluate to a constant, otherwise we cannot do the escape analysis of the accessed frame object. The recommended solution for this is to have an @Children array with individual nodes on the FunctionNode where each child node sets the value of one argument to one local variable (and each node has a final field referring to the slot; you can actually use your VarStoreNode for this!).
This solution will also later allow you to specialise on the primitive type of the local (the best possible place to look at for local variable specialisation are the ReadLocalNode and WriteLocalNode classes in the com.oracle.truffle.sl.nodes package).
Otherwise, the way you are doing function calls looks fine. For performance the next steps would be to (a) create an inline cache for the call target via node rewriting (i.e., create a ResolvedFunCallNode and replace the FunCallNode with this node) and as a follow-up (b) perform function inlining via copying of the AST of the called function and directly executing it.
- thomas
[1] http://lafo.ssw.uni-linz.ac.at/javadoc/graalvm/com.oracle.truffle.api/javadoc/com/oracle/truffle/api/frame/Frame.html#setObject(com.oracle.truffle.api.frame.FrameSlot, java.lang.Object)
On Aug 15, 2013, at 5:05 PM, Remi Forax <forax at univ-mlv.fr> wrote:
> On 08/15/2013 04:51 PM, Chris Seaton wrote:
>> This looks like the virtual frame escaping problem. See
>> https://wiki.openjdk.java.net/display/Graal/Truffle+FAQ+and+Guidelines#TruffleFAQandGuidelines-WhyamIgettingerrorsaboutescapingframes
>> ?.
>
> yes,
> in fact it's more like th entry just below, "Why am I getting errors about materializing frames?"
> The issue is that I don't think I use too much abstraction here, hence my question,
> how to do a method call ?
>
> The code that does a method call is here:
> https://github.com/forax/ninal/blob/master/fr.umlv.ninal/src/fr/umlv/ninal/interpreter/Interpreter.java#L129
> and the code that transfer the values from the arguments to the local variables is here:
> https://github.com/forax/ninal/blob/master/fr.umlv.ninal/src/fr/umlv/ninal/interpreter/Interpreter.java#L94
>
> Rémi
>
>>
>>
>> On 15 August 2013 15:38, Remi Forax <forax at univ-mlv.fr> wrote:
>>
>>> I've written a small 'not a lisp' language using Truffle
>>> (using only the API part, not the DSL part)
>>> https://github.com/forax/ninal
>>>
>>> but I've some trouble to understand how writing a function call,
>>> so Graal/Truffle chokes when it tries to JIT the code for a simple fib
>>> function like this:
>>>
>>> (def fib (n)
>>> (if (< n 1)
>>> 1
>>> (+ (fib (- n 1)) (fib (- n 2)))
>>> )
>>> )
>>>
>>> (print (fib 17))
>>>
>>> [forax at localhost ninal]$ mx.sh --java-home=/usr/jdk/jdk1.8.0 vm
>>> -G:+DumpOnError -XX:-BootstrapGraal -XX:+PrintCompilation -cp classes
>>> fr.umlv.ninal.Main fib.ninal
>>> 59 1 n com.oracle.graal.hotspot.**bridge.CompilerToVMImpl::**executeCompiledMethodIntrinsic
>>> (native) (static)
>>> 193 2 n java.lang.System::arraycopy (native) (static)
>>> 239 3 n sun.misc.Unsafe::getInt (native)
>>> 0 2 sun.nio.cs.UTF_8$Encoder::**encode(char[], int,
>>> int, byte[]) (359 bytes)
>>> 0 1 java.lang.String::charAt(int) (29 bytes)
>>> 0 3 java.lang.String::indexOf(int, int) (70 bytes)
>>> 0 4 java.lang.String::hashCode() (55 bytes)
>>> using Graal Truffle Runtime
>>> IfNode(sourceSection = null) {
>>> condition = TestOpNode(sourceSection = null, binOp = LT) {
>>> leftNode = VarLoadNode(sourceSection = null, slot = [0,:n,Object])
>>> rightNode = ConstNode(sourceSection = null, constant = 1)
>>> }
>>> trueNode = ConstNode(sourceSection = null, constant = 1)
>>> falseNode = NumberOpNode(sourceSection = null, binOp = ADD) {
>>> leftNode = FunCallNode(sourceSection = null, name = :fib) {
>>> argumentNodes = [NumberOpNode(sourceSection = null, binOp =
>>> SUB) {
>>> leftNode = VarLoadNode(sourceSection = null, slot =
>>> [0,:n,Object])
>>> rightNode = ConstNode(sourceSection = null, constant = 1)
>>> }]
>>> }
>>> rightNode = FunCallNode(sourceSection = null, name = :fib) {
>>> argumentNodes = [NumberOpNode(sourceSection = null, binOp =
>>> SUB) {
>>> leftNode = VarLoadNode(sourceSection = null, slot =
>>> [0,:n,Object])
>>> rightNode = ConstNode(sourceSection = null, constant = 2)
>>> }]
>>> }
>>> }
>>> }
>>> 648 4 n sun.misc.Unsafe::getObject (native)
>>> 651 5 n java.lang.Thread::**currentThread (native)
>>> (static)
>>> 736 6 n java.lang.Object::getClass (native)
>>> 742 7 n java.lang.Class::isInstance (native)
>>> 795 8 n java.lang.Object::hashCode (native)
>>> 874 9 n sun.misc.Unsafe::**getObjectVolatile (native)
>>> 878 10 n java.lang.System::**identityHashCode (native)
>>> (static)
>>> 1012 11 n java.lang.Object::clone (native)
>>> 1228 12 n sun.misc.Unsafe::putObject (native)
>>> 0 5 java.io.DataOutputStream::**writeUTF(String,
>>> DataOutput) (435 bytes)
>>> 0 7 java.util.HashMap::indexFor(**int, int) (6 bytes)
>>> 0 8 java.lang.CharacterDataLatin1:**:isWhitespace(int) (23 bytes)
>>> 0 6 java.lang.String::indexOf(**char[], int, int,
>>> char[], int, int, int) (166 bytes)
>>> 0 9 sun.reflect.generics.parser.**SignatureParser::**parseIdentifier()
>>> (115 bytes)
>>> 1404 13 n java.lang.Class::isPrimitive (native)
>>> 0 10 java.util.HashMap::transfer(**Object[]) (155
>>> bytes)
>>> 1746 14 n java.lang.Class::**getComponentType (native)
>>> 1762 15 n java.lang.reflect.Array::**newArray (native)
>>> (static)
>>> 0 11 java.lang.String::replace(**char, char) (127
>>> bytes)
>>> 2709 16 n java.lang.Class::**isAssignableFrom (native)
>>> 3756 17 n sun.reflect.Reflection::**getCallerClass
>>> (native) (static)
>>> 3760 18 n java.lang.Class::getModifiers (native)
>>> 3761 19 n java.lang.Class::**getClassLoader0 (native)
>>> 0 12 sun.reflect.generics.parser.**SignatureParser::current() (40
>>> bytes)
>>> 0 13 java.lang.Object::<init>() (1 bytes)
>>> 0 14 java.lang.Character::**isWhitespace(char) (5
>>> bytes)
>>> 0 15 java.lang.Character::**isWhitespace(int) (9
>>> bytes)
>>> 0 16 java.lang.StringBuilder::<**init>() (7 bytes)
>>> 4809 20 n sun.reflect.ConstantPool::**getUTF8At0 (native)
>>> 5389 21 n sun.misc.Unsafe::getLong (native)
>>> 6554 22 n sun.misc.Unsafe::getShort (native)
>>> 0 17 java.lang.CharacterData::of(**int) (120 bytes)
>>> 0 18 java.lang.CharacterDataLatin1:**:getProperties(int) (11
>>> bytes)
>>> 0 19 java.lang.**AbstractStringBuilder::**ensureCapacityInternal(int)
>>> (16 bytes)
>>> 0 20 java.lang.String::lastIndexOf(**int, int) (52
>>> bytes)
>>> 0 21 java.lang.Math::min(int, int) (11 bytes)
>>> 0 22 java.lang.String::equals(**Object) (81 bytes)
>>> 0 23 java.util.ArrayList::access$**100(ArrayList) (5
>>> bytes)
>>> 0 24 java.lang.ref.Reference::get() (5 bytes)
>>> 0 25 java.util.HashMap::hash(**Object) (33 bytes)
>>> 7227 23 n java.lang.Class::**getConstantPool (native)
>>> 0 26 java.lang.reflect.Method::**getName() (5 bytes)
>>> 0 27 java.lang.String::startsWith(**String, int) (72
>>> bytes)
>>> 0 28 com.oracle.graal.hotspot.meta.**HotSpotSignature::**parseSignature(String,
>>> int) (199 bytes)
>>> 0 29 java.util.ArrayList::size() (5 bytes)
>>> 0 30 java.lang.**AbstractStringBuilder::append(**char) (29 bytes)
>>> 0 31 java.lang.StringBuilder::**append(char) (8 bytes)
>>> 0 32 java.util.HashMap$Entry::<**init>(int, Object,
>>> Object, Object) (26 bytes)
>>> 0 33 java.util.Arrays::copyOfRange(**char[], int,
>>> int) (63 bytes)
>>> 0 34 java.lang.String::<init>(char[**], int, int) (62
>>> bytes)
>>> 0 35 com.oracle.graal.graph.Graph::**access$000(Graph) (5 bytes)
>>> 0 36 java.lang.String::length() (6 bytes)
>>> 8064 24 n sun.misc.Unsafe::getBoolean (native)
>>> 0 37 java.util.HashMap::get(Object) (20 bytes)
>>> 0 38 java.util.ArrayList::**rangeCheck(int) (22 bytes)
>>> 0 39 java.util.ArrayList::**elementData(int) (7 bytes)
>>> 0 40 sun.reflect.generics.parser.**SignatureParser::advance() (37
>>> bytes)
>>> 0 41 java.util.ArrayList::get(int) (11 bytes)
>>> 0 42 java.util.HashMap$Entry::**getValue() (5 bytes)
>>> 0 43 com.oracle.graal.graph.Node::**id() (5 bytes)
>>> 0 44 java.lang.ThreadLocal::access$**400(ThreadLocal) (5 bytes)
>>> 0 45 java.lang.ThreadLocal::getMap(**Thread) (5 bytes)
>>> 0 46 java.lang.ThreadLocal::get() (38 bytes)
>>> 0 47 java.lang.ThreadLocal$**ThreadLocalMap::getEntry(**ThreadLocal)
>>> (42 bytes)
>>> 0 48 java.lang.ThreadLocal$**ThreadLocalMap::access$000(**ThreadLocal$ThreadLocalMap,
>>> ThreadLocal) (6 bytes)
>>> 0 49 com.oracle.graal.graph.**NodeClass$NodeClassIterator::**forward()
>>> (161 bytes)
>>> 0 50 java.util.BitSet::wordIndex(**int) (5 bytes)
>>> 0 51 com.oracle.graal.graph.Node::**getNodeClass() (5
>>> bytes)
>>> 0 52 java.util.ArrayList::**ensureExplicitCapacity(int) (26 bytes)
>>> 8600 25 n java.lang.String::intern (native)
>>> 0 53 java.util.ArrayList::**ensureCapacityInternal(int) (23 bytes)
>>> 0 54 java.util.BitSet::**checkInvariants() (111 bytes)
>>> 0 55 com.oracle.graal.graph.**NodeClass::getNode(Node, long) (12
>>> bytes)
>>> 0 56 java.util.ArrayList$Itr::**hasNext() (20 bytes)
>>> 0 57 com.oracle.graal.debug.**internal.DebugScope::**getInstance()
>>> (53 bytes)
>>> 0 58 java.util.ArrayList::add(**Object) (29 bytes)
>>> 0 59 com.oracle.graal.graph.**NodeClass$NodeClassIterator::**hasNext()
>>> (83 bytes)
>>> 0 60 com.oracle.graal.graph.Graph$**NodeIterator::forward() (62
>>> bytes)
>>> 0 61 com.oracle.graal.graph.**NodeClass::access$300(Node, long)
>>> (6 bytes)
>>> 0 62 com.oracle.graal.graph.**iterators.**AbstractNodeIterable::<init>()
>>> (5 bytes)
>>> 0 63 com.oracle.graal.graph.Node::**isAlive() (13
>>> bytes)
>>> 0 64 java.util.ArrayList$Itr::**checkForComodification() (23
>>> bytes)
>>> 0 65 java.util.BitSet::get(int) (69 bytes)
>>> 0 66 java.util.ArrayList$Itr::next(**) (66 bytes)
>>> 0 67 com.oracle.graal.graph.**NodeBitMap::isMarked(Node) (12
>>> bytes)
>>> 0 68 com.oracle.graal.graph.**NodeUsagesList::access$100(**NodeUsagesList)
>>> (5 bytes)
>>> 0 69 com.oracle.graal.graph.**NodeUsagesList$1::hasNext() (48
>>> bytes)
>>> 0 70 com.oracle.graal.debug.**internal.DebugScope::**getQualifiedName()
>>> (5 bytes)
>>> 0 71 com.oracle.graal.compiler.**GraalDebugConfig::**checkDebugFilter(String,
>>> DebugFilter) (18 bytes)
>>> 0 72 com.oracle.graal.debug.Debug::**currentScope() (16 bytes)
>>> 0 73 com.oracle.graal.compiler.**GraalDebugConfig::isEnabled(**DebugFilter)
>>> (23 bytes)
>>> 0 74 com.oracle.graal.graph.Graph$**NodeIterator::**checkForDeletedNode()
>>> (65 bytes)
>>> 0 75 com.oracle.graal.graph.Graph$**NodeIterator::hasNext() (27
>>> bytes)
>>> 0 76 com.oracle.graal.graph.**NodeMap::check(Node)
>>> (88 bytes)
>>> 0 77 java.util.AbstractCollection::**<init>() (5 bytes)
>>> 0 78 com.oracle.graal.graph.**iterators.**
>>> PredicatedProxyNodeIterator::**forward() (113 bytes)
>>> 0 79 com.oracle.graal.graph.**NodeMap::size() (6
>>> bytes)
>>> 0 80 com.oracle.graal.graph.**NodeMap::isNew(Node)
>>> (17 bytes)
>>> 10220 26 n java.lang.Class::forName0 (native) (static)
>>> 0 81 com.oracle.graal.graph.**NodeMap::get(Node) (15
>>> bytes)
>>> 0 82 com.oracle.graal.graph.Graph$**NodeIterator::next() (31
>>> bytes)
>>> 10292 27 n sun.misc.Unsafe::getByte (native)
>>> 0 83 com.oracle.graal.graph.Graph$**NodeIterator::next() (5 bytes)
>>> 0 84 com.oracle.graal.graph.**NodeClassIterable::<init>() (5
>>> bytes)
>>> 0 85 com.oracle.graal.graph.Node::**modCount() (5
>>> bytes)
>>> 0 86 com.oracle.graal.graph.**NodeClass$NodeClassIterator::<**init>(Node,
>>> long[], int, NodeClass$1) (8 bytes)
>>> 10541 28 n sun.misc.Unsafe::getLong (native)
>>> 0 87 com.oracle.graal.graph.**NodeClass$NodeClassIterator::<**init>(Node,
>>> long[], int) (42 bytes)
>>> 0 88 java.util.HashMap$**HashIterator::findNextBin() (66 bytes)
>>> 0 89 java.util.Arrays::copyOf(char[**], int) (19
>>> bytes)
>>> 0 90 com.oracle.graal.graph.**NodeUsagesList$1::next() (48 bytes)
>>> 0 91 com.oracle.graal.graph.**NodeUsagesList$1::next() (5 bytes)
>>> 0 92 com.oracle.graal.graph.**NodeClass$NodeClassIterator::**next()
>>> (74 bytes)
>>> 0 93 com.oracle.graal.graph.**NodeClass$NodeClassIterator::**nextElement()
>>> (74 bytes)
>>> 0 94 java.lang.**AbstractStringBuilder::**expandCapacity(int) (50
>>> bytes)
>>> 0 95 com.oracle.graal.nodes.cfg.**Block::getId() (5
>>> bytes)
>>> 0 96 com.oracle.graal.graph.**iterators.NodePredicates$**
>>> PositiveTypePredicate::apply(**Node) (35 bytes)
>>> 0 97 java.util.HashMap::put(Object, Object) (300 bytes)
>>> 0 98 sun.reflect.**ClassFileAssembler::**emitConstantPoolUTF8(String)
>>> (50 bytes)
>>> 0 99 sun.reflect.UTF8::encode(**String) (191 bytes)
>>> 0 100 sun.reflect.UTF8::utf8Length(**String) (81 bytes)
>>> 0 101 com.oracle.graal.nodes.cfg.**ControlFlowGraph::**getNodeToBlock()
>>> (5 bytes)
>>> 0 102 java.lang.Enum::ordinal() (5 bytes)
>>> 0 103 java.io.ByteArrayOutputStream:**:ensureCapacity(int) (16
>>> bytes)
>>> 0 104 java.util.Arrays::fill(Object[**], Object) (21
>>> bytes)
>>> 0 105 sun.reflect.generics.parser.**SignatureParser::**
>>> parsePackageNameAndSimpleClass**TypeSignature() (139 bytes)
>>> 0 106 java.util.HashMap::**createEntry(int, Object,
>>> Object, int, boolean) (131 bytes)
>>> 12621 -1 java.lang.String::indexOf (166 bytes) made not
>>> entrant
>>> scope: Truffle.createGraph.**PartialEscape.iteration 0.InterceptException
>>> Exception occurred in scope: Truffle.createGraph.**PartialEscape.iteration
>>> 0.InterceptException
>>> Context obj com.oracle.graal.nodes.util.**GraphUtil$2: Must not let
>>> virtual frame object escape at node 100|FrameSetByte. Insert a call to
>>> VirtualFrame.materialize() to convert the instance to a materialized frame
>>> object (source position of following stack trace is approximate)
>>> Context obj com.oracle.graal.virtual.**phases.ea.PartialEscapePhase@**
>>> 38089dae
>>> Context obj StructuredGraph:6{**HotSpotMethod<**OptimizedCallTarget.**executeHelper(PackedFrame,
>>> Arguments)>}
>>> Could not connect to the IGV on 127.0.0.1:4445 :
>>> java.net.ConnectException: Connection refused
>>> Context obj DebugDumpScope[Truffle: FunctionNode at 4dcbadb4]
>>> [truffle] opt failed FunctionNode at 4dcbadb4 com.oracle.graal.nodes.util.**GraphUtil$2:
>>> Must not let virtual frame object escape at node 100|FrameSetByte. Insert a
>>> call to VirtualFrame.materialize() to convert the instance to a
>>> materialized frame object (source position of following stack trace is
>>> approximate)
>>> com.oracle.graal.nodes.util.**GraphUtil$2: Must not let virtual frame
>>> object escape at node 100|FrameSetByte. Insert a call to
>>> VirtualFrame.materialize() to convert the instance to a materialized frame
>>> object (source position of following stack trace is approximate)
>>> Caused by: com.oracle.graal.graph.**GraalInternalError: Must not let
>>> virtual frame object escape at node 100|FrameSetByte. Insert a call to
>>> VirtualFrame.materialize() to convert the instance to a materialized frame
>>> object (source position of following stack trace is approximate)
>>> at com.oracle.graal.truffle.**nodes.NewFrameNode.**
>>> getMaterializedRepresentationH**elper(NewFrameNode.java:130)
>>> at com.oracle.graal.truffle.**nodes.NewFrameNode$**
>>> VirtualOnlyInstanceNode.**getMaterializedRepresentation(**
>>> NewFrameNode.java:107)
>>> at com.oracle.graal.virtual.**phases.ea.**PartialEscapeBlockState.**
>>> materializeWithCommit(**PartialEscapeBlockState.java:**93)
>>> at com.oracle.graal.virtual.**phases.ea.**PartialEscapeBlockState.**
>>> materializeBefore(**PartialEscapeBlockState.java:**83)
>>> at com.oracle.graal.virtual.**phases.ea.**PartialEscapeClosure.**
>>> ensureMaterialized(**PartialEscapeClosure.java:207)
>>> at com.oracle.graal.virtual.**phases.ea.**PartialEscapeClosure.**
>>> replaceWithMaterialized(**PartialEscapeClosure.java:215)
>>> at com.oracle.graal.virtual.**phases.ea.**PartialEscapeClosure.**
>>> processNode(**PartialEscapeClosure.java:196)
>>> at com.oracle.graal.virtual.**phases.ea.**PartialEscapeClosure.**
>>> processNode(**PartialEscapeClosure.java:98)
>>> at com.oracle.graal.virtual.**phases.ea.**PEReadEliminationClosure.**
>>> processNode(**PEReadEliminationClosure.java:**54)
>>> at com.oracle.graal.virtual.**phases.ea.**PEReadEliminationClosure.**
>>> processNode(**PEReadEliminationClosure.java:**41)
>>> at com.oracle.graal.virtual.**phases.ea.EffectsClosure.**
>>> processBlock(EffectsClosure.**java:121)
>>> at com.oracle.graal.virtual.**phases.ea.EffectsClosure.**
>>> processBlock(EffectsClosure.**java:39)
>>> at com.oracle.graal.phases.graph.**ReentrantBlockIterator.apply(**
>>> ReentrantBlockIterator.java:**91)
>>> at com.oracle.graal.phases.graph.**ReentrantBlockIterator.**
>>> processLoop(**ReentrantBlockIterator.java:**56)
>>> at com.oracle.graal.virtual.**phases.ea.EffectsClosure.**
>>> processLoop(EffectsClosure.**java:149)
>>> at com.oracle.graal.virtual.**phases.ea.EffectsClosure.**
>>> processLoop(EffectsClosure.**java:39)
>>> at com.oracle.graal.phases.graph.**ReentrantBlockIterator.apply(**
>>> ReentrantBlockIterator.java:**108)
>>> at com.oracle.graal.phases.graph.**ReentrantBlockIterator.apply(**
>>> ReentrantBlockIterator.java:**76)
>>> at com.oracle.graal.virtual.**phases.ea.EffectsPhase$1.call(**
>>> EffectsPhase.java:69)
>>> at com.oracle.graal.virtual.**phases.ea.EffectsPhase$1.call(**
>>> EffectsPhase.java:62)
>>> at com.oracle.graal.debug.**internal.DebugScope.call(**
>>> DebugScope.java:311)
>>> at com.oracle.graal.debug.**internal.DebugScope.**
>>> executeScope(DebugScope.java:**192)
>>> at com.oracle.graal.debug.**internal.DebugScope.scope(**
>>> DebugScope.java:177)
>>> at com.oracle.graal.debug.Debug.**scope(Debug.java:155)
>>> at com.oracle.graal.debug.Debug.**scope(Debug.java:126)
>>> at com.oracle.graal.virtual.**phases.ea.EffectsPhase.**
>>> runAnalysis(EffectsPhase.java:**62)
>>> at com.oracle.graal.virtual.**phases.ea.PartialEscapePhase.**
>>> run(PartialEscapePhase.java:**63)
>>> at com.oracle.graal.virtual.**phases.ea.PartialEscapePhase.**
>>> run(PartialEscapePhase.java:**41)
>>> at com.oracle.graal.phases.**BasePhase$1.run(BasePhase.**java:62)
>>> at com.oracle.graal.debug.**internal.DebugScope.**
>>> executeScope(DebugScope.java:**189)
>>> at com.oracle.graal.debug.**internal.DebugScope.scope(**
>>> DebugScope.java:177)
>>> at com.oracle.graal.debug.Debug.**scope(Debug.java:135)
>>> at com.oracle.graal.debug.Debug.**scope(Debug.java:130)
>>> at com.oracle.graal.phases.**BasePhase.apply(BasePhase.**java:59)
>>> at com.oracle.graal.phases.**BasePhase.apply(BasePhase.**java:55)
>>> at com.oracle.graal.truffle.**PartialEvaluator$1.run(**
>>> PartialEvaluator.java:180)
>>> at com.oracle.graal.debug.**internal.DebugScope.**
>>> executeScope(DebugScope.java:**189)
>>> at com.oracle.graal.debug.**internal.DebugScope.scope(**
>>> DebugScope.java:177)
>>> at com.oracle.graal.debug.Debug.**scope(Debug.java:135)
>>> at com.oracle.graal.debug.Debug.**scope(Debug.java:130)
>>> at com.oracle.graal.truffle.**PartialEvaluator.createGraph(**
>>> PartialEvaluator.java:112)
>>> at com.oracle.graal.truffle.**TruffleCompilerImpl.**compileMethodImpl(
>>> **TruffleCompilerImpl.java:118)
>>> at com.oracle.graal.truffle.**TruffleCompilerImpl.access$**
>>> 000(TruffleCompilerImpl.java:**54)
>>> at com.oracle.graal.truffle.**TruffleCompilerImpl$1.call(**
>>> TruffleCompilerImpl.java:105)
>>> at com.oracle.graal.truffle.**TruffleCompilerImpl$1.call(**
>>> TruffleCompilerImpl.java:101)
>>> at com.oracle.graal.debug.**internal.DebugScope.call(**
>>> DebugScope.java:311)
>>> at com.oracle.graal.debug.**internal.DebugScope.**
>>> executeScope(DebugScope.java:**192)
>>> at com.oracle.graal.debug.**internal.DebugScope.scope(**
>>> DebugScope.java:177)
>>> at com.oracle.graal.debug.Debug.**scope(Debug.java:155)
>>> at com.oracle.graal.truffle.**TruffleCompilerImpl.compile(**
>>> TruffleCompilerImpl.java:101)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.compile(**
>>> OptimizedCallTarget.java:140)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**compileOrInline(**
>>> OptimizedCallTarget.java:128)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>> OptimizedCallTarget.java:116)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>> OptimizedCallTarget.java:89)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>> Interpreter.java:156)
>>> at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>> Interpreter.java:216)
>>> at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>> Interpreter.java:383)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>> execute(Interpreter.java:107)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>> OptimizedCallTarget.java:174)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>> OptimizedCallTarget.java:114)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>> OptimizedCallTarget.java:89)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>> Interpreter.java:156)
>>> at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>> Interpreter.java:216)
>>> at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>> Interpreter.java:383)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>> execute(Interpreter.java:107)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>> OptimizedCallTarget.java:174)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>> OptimizedCallTarget.java:114)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>> OptimizedCallTarget.java:89)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>> Interpreter.java:156)
>>> at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>> Interpreter.java:216)
>>> at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>> Interpreter.java:383)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>> execute(Interpreter.java:107)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>> OptimizedCallTarget.java:174)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>> OptimizedCallTarget.java:114)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>> OptimizedCallTarget.java:89)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>> Interpreter.java:156)
>>> at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>> Interpreter.java:217)
>>> at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>> Interpreter.java:383)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>> execute(Interpreter.java:107)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>> OptimizedCallTarget.java:174)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>> OptimizedCallTarget.java:114)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>> OptimizedCallTarget.java:89)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>> Interpreter.java:156)
>>> at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>> Interpreter.java:217)
>>> at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>> Interpreter.java:383)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>> execute(Interpreter.java:107)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>> OptimizedCallTarget.java:174)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>> OptimizedCallTarget.java:114)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>> OptimizedCallTarget.java:89)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>> Interpreter.java:156)
>>> at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>> Interpreter.java:216)
>>> at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>> Interpreter.java:383)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>> execute(Interpreter.java:107)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>> OptimizedCallTarget.java:174)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>> OptimizedCallTarget.java:114)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>> OptimizedCallTarget.java:89)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>> Interpreter.java:156)
>>> at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>> Interpreter.java:217)
>>> at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>> Interpreter.java:383)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>> execute(Interpreter.java:107)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>> OptimizedCallTarget.java:174)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>> OptimizedCallTarget.java:114)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>> OptimizedCallTarget.java:89)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>> Interpreter.java:156)
>>> at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>> Interpreter.java:216)
>>> at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>> Interpreter.java:383)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>> execute(Interpreter.java:107)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>> OptimizedCallTarget.java:174)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>> OptimizedCallTarget.java:114)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>> OptimizedCallTarget.java:89)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>> Interpreter.java:156)
>>> at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>> Interpreter.java:217)
>>> at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>> Interpreter.java:383)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>> execute(Interpreter.java:107)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>> OptimizedCallTarget.java:174)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>> OptimizedCallTarget.java:114)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>> OptimizedCallTarget.java:89)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>> Interpreter.java:156)
>>> at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>> Interpreter.java:216)
>>> at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>> Interpreter.java:383)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>> execute(Interpreter.java:107)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>> OptimizedCallTarget.java:174)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>> OptimizedCallTarget.java:114)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>> OptimizedCallTarget.java:89)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>> Interpreter.java:156)
>>> at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>> Interpreter.java:216)
>>> at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>> Interpreter.java:383)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>> execute(Interpreter.java:107)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>> OptimizedCallTarget.java:174)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>> OptimizedCallTarget.java:114)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>> OptimizedCallTarget.java:89)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>> Interpreter.java:156)
>>> at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>> Interpreter.java:216)
>>> at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>> Interpreter.java:383)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>> execute(Interpreter.java:107)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>> OptimizedCallTarget.java:174)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>> OptimizedCallTarget.java:114)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>> OptimizedCallTarget.java:89)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>> Interpreter.java:156)
>>> at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>> Interpreter.java:216)
>>> at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>> Interpreter.java:383)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>> execute(Interpreter.java:107)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>> OptimizedCallTarget.java:174)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>> OptimizedCallTarget.java:114)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>> OptimizedCallTarget.java:89)
>>> at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>> Interpreter.java:156)
>>> at fr.umlv.ninal.interpreter.**Interpreter$PrintNode.eval(**
>>> Interpreter.java:355)
>>> at fr.umlv.ninal.interpreter.**Interpreter$EvalNode.execute(**
>>> Interpreter.java:77)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>> OptimizedCallTarget.java:174)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>> OptimizedCallTarget.java:114)
>>> at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>> OptimizedCallTarget.java:89)
>>> at com.oracle.truffle.api.**CallTarget.call(CallTarget.**java:42)
>>> at fr.umlv.ninal.interpreter.**Interpreter.interpret(**
>>> Interpreter.java:605)
>>> at fr.umlv.ninal.Main.main(Main.**java:22)
>>>
>>>
>>> Rémi
>>>
>>>
>
More information about the graal-dev
mailing list