got a Truffle Exception
Chris Seaton
chris.seaton at oracle.com
Mon Jun 1 16:29:03 UTC 2015
You’ll need something that looks like
MumblerNode eval = builder.build(new MumExec(frame.getFrameDescriptor()));
MumblerRootNode rootNode = new MumblerRootNode(eval);
System.out.println("exec " + src + " = " + rootNode.execute(frame));
If you don’t have a MumblerRootNode, it needs to extend com.oracle.truffle.api.nodes.RootNode, hold a reference to the root node, and execute it in the execute method.
Take a look at Simple Language:
https://github.com/graalvm/simplelanguage/blob/master/src/main/java/com/oracle/truffle/sl/nodes/SLRootNode.java <https://github.com/graalvm/simplelanguage/blob/master/src/main/java/com/oracle/truffle/sl/nodes/SLRootNode.java>
You don’t need a CallTarget here for this kind of testing, but to actually execute, you should create one via Truffle.getRuntime().createCallTarget(). If you had one, it would create that frame for you.
Chris
> On 1 Jun 2015, at 17:10, Grace Wang <huohuohuomumu at gmail.com> wrote:
>
> Hello Chris,
>
> Yes the testBuilder calls execute directly!
> private static void testBuilder(String src, VirtualFrame frame) {
> Builder builder = parse(src, Builder.builderBuilder(MumAlg.class));
> MumblerNode eval = builder.build(new MumExec(frame.getFrameDescriptor()));
> System.out.println("exec " + src + " = " + eval.execute(frame));
> }
>
> But I don’t know how to create the ‘RootNode’ or ‘CallTarget’.
>
> Thank you for providing these tutorials, I’ll watch them :)
>
> Regards,
> Grace
>
>
>
>
> On June 1, 2015 at 11:53:51 PM, Chris Seaton (chris.seaton at oracle.com <mailto:chris.seaton at oracle.com>) wrote:
>
>> Hello Grace,
>>
>> I looks like your program is missing some key concepts of how programs using Truffle need to be structured to work correctly.
>>
>> The point of failure here looks to be that you are executing a node without any kind of CallTarget or RootNode.
>>
>> I guess that testBuilder calls execute on a node directly?
>>
>> It is the RootNode which walks the AST and assigns parent nodes, so if you aren’t using a RootNode that won’t happen and nodes will not know what their parents are (they need to know so they can tell them when they are replaced).
>>
>> Have you watched the Truffle tutorials? They might be a good place to start.
>>
>> http://youtu.be/N_sOxGkZfTg <http://youtu.be/N_sOxGkZfTg>
>> http://youtu.be/EXzaBTLlS9I <http://youtu.be/EXzaBTLlS9I>
>>
>> Regards,
>>
>> Chris
>>
>>> On 1 Jun 2015, at 16:35, Grace Wang <huohuohuomumu at gmail.com <mailto:huohuohuomumu at gmail.com>> wrote:
>>>
>>> Hi,
>>>
>>> I’m using truffle in a testing project, but somehow got the following exception. I’m not familiar with the code, but I’d like to know what could possibly cause this exception?
>>>
>>> Thank you very much!
>>>
>>> Regards,
>>> Grace Wang
>>>
>>>
>>> Exception in thread "main" java.lang.IllegalStateException: This node cannot be replaced, because it does not yet have a parent.
>>> at com.oracle.truffle.api.nodes.Node.replaceHelper(Node.java:272)
>>> at com.oracle.truffle.api.nodes.NodeUtil.nonAtomicReplace(NodeUtil.java:195)
>>> at com.oracle.truffle.api.dsl.internal.SpecializationNode.insertAt(SpecializationNode.java:523)
>>> at com.oracle.truffle.api.dsl.internal.SpecializationNode$InsertionEvent1.call(SpecializationNode.java:649)
>>> at com.oracle.truffle.api.dsl.internal.SpecializationNode$InsertionEvent1.call(SpecializationNode.java:633)
>>> at com.oracle.truffle.api.nodes.Node.atomic(Node.java:521)
>>> at com.oracle.truffle.api.dsl.internal.SpecializationNode.uninitialized(SpecializationNode.java:395)
>>> at mumbler.truffle.node.special.QuoteNodeGen$UninitializedNode_.acceptAndExecute(QuoteNodeGen.java:160)
>>> at mumbler.truffle.node.special.QuoteNodeGen$BaseNode_.executeGeneric(QuoteNodeGen.java:91)
>>> at mumbler.truffle.node.special.QuoteNodeGen.execute(QuoteNodeGen.java:41)
>>> at mumbler.truffle.newparser.TruffleMumblerMain2.testBuilder(TruffleMumblerMain2.java:127)
>>> at mumbler.truffle.newparser.TruffleMumblerMain2.testMumExec(TruffleMumblerMain2.java:75)
>>> at mumbler.truffle.newparser.TruffleMumblerMain2.main(TruffleMumblerMain2.java:49)
>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>>> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>>> at java.lang.reflect.Method.invoke(Method.java:483)
>>> at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
>>>
>>>
>>>
>>> I also show the related code causing the exception here (although these are probably not helpful):
>>>
>>> (1) QuoteNodeGen.java
>>> @GeneratedBy(QuoteNode.class)
>>> private static final class UninitializedNode_ extends BaseNode_ {
>>>
>>> UninitializedNode_(QuoteNodeGen root) {
>>> super(root, 2147483647);
>>> }
>>>
>>> @Override
>>> public Object acceptAndExecute(Frame frameValue, Object literalNodeValue) {
>>> return uninitialized(frameValue, literalNodeValue);
>>> }
>>>
>>> static BaseNode_ create(QuoteNodeGen root) {
>>> return new UninitializedNode_(root);
>>> }
>>>
>>> }
>>> (2)QuoteNodeGen.java
>>> public Object executeGeneric(Frame frameValue) {
>>> Object literalNodeValue_ = executeLiteralNode_(frameValue);
>>> return acceptAndExecute(frameValue, literalNodeValue_);
>>> }
>>> (3) QuoteNodeGen.java
>>> @Override
>>> public Object execute(VirtualFrame frameValue) {
>>> return specialization_.executeGeneric(frameValue);
>>> }
More information about the graal-dev
mailing list