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