# HG changeset patch # User Jaroslav Tulach # Date 1443603580 -7200 # Node ID 7804ee711b7d50fcf124167e2e37ddcd69c8df64 # Parent 3d9e283e2487a7e79759f6fca69ee0d2a0caf240 Ensure materialized frame is really materialized diff -r 3d9e283e2487 -r 7804ee711b7d truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/FrameTest.java --- a/truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/FrameTest.java Tue Sep 29 18:04:11 2015 +0200 +++ b/truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/FrameTest.java Wed Sep 30 10:59:40 2015 +0200 @@ -27,13 +27,17 @@ import com.oracle.truffle.api.TruffleRuntime; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.FrameDescriptor; +import com.oracle.truffle.api.frame.FrameInstance; import com.oracle.truffle.api.frame.FrameSlot; import com.oracle.truffle.api.frame.FrameSlotKind; import com.oracle.truffle.api.frame.FrameSlotTypeException; +import com.oracle.truffle.api.frame.MaterializedFrame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.nodes.RootNode; import org.junit.Assert; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import org.junit.Test; /** @@ -152,4 +156,31 @@ } } } + + @Test + public void framesCanBeMaterialized() { + final TruffleRuntime runtime = Truffle.getRuntime(); + + class FrameRootNode extends RootNode { + + public FrameRootNode() { + super(TestingLanguage.class, null, null); + } + + @Override + public Object execute(VirtualFrame frame) { + FrameInstance frameInstance = runtime.getCurrentFrame(); + Frame readWrite = frameInstance.getFrame(FrameInstance.FrameAccess.READ_WRITE, true); + Frame materialized = frameInstance.getFrame(FrameInstance.FrameAccess.MATERIALIZE, true); + + assertTrue("Really materilized: " + materialized, materialized instanceof MaterializedFrame); + assertEquals("It's my frame", frame, readWrite); + return this; + } + } + + FrameRootNode frn = new FrameRootNode(); + Object ret = Truffle.getRuntime().createCallTarget(frn).call(); + assertEquals("Returns itself", frn, ret); + } } diff -r 3d9e283e2487 -r 7804ee711b7d truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultCallTarget.java --- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultCallTarget.java Tue Sep 29 18:04:11 2015 +0200 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultCallTarget.java Wed Sep 30 10:59:40 2015 +0200 @@ -30,7 +30,6 @@ import com.oracle.truffle.api.TruffleRuntime; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.FrameInstance; -import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.nodes.RootNode; @@ -59,10 +58,13 @@ @Override public Object call(Object... args) { - final VirtualFrame frame = new DefaultVirtualFrame(getRootNode().getFrameDescriptor(), args); + final DefaultVirtualFrame frame = new DefaultVirtualFrame(getRootNode().getFrameDescriptor(), args); FrameInstance oldCurrentFrame = defaultTruffleRuntime().setCurrentFrame(new FrameInstance() { public Frame getFrame(FrameAccess access, boolean slowPath) { + if (access == FrameAccess.MATERIALIZE) { + return new DefaultMaterializedFrame(frame); + } return frame; }