Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
6model bits for representing continuations as objects, also s/shift/c…
…ontrol/ (oops)
  • Loading branch information
sorear committed Jun 15, 2013
1 parent 948a2ce commit 9aeeadd
Show file tree
Hide file tree
Showing 8 changed files with 52 additions and 12 deletions.
4 changes: 2 additions & 2 deletions docs/continuations.pod
Expand Up @@ -48,8 +48,8 @@ B<Details here are subject greatly to change.>

# should be 3 * 3 * 10 = 90
# will infinite loop if the clones are removed
my $cont := nqp::continuationreset(-> $ {
3 * (nqp::continuationshift(0, -> $k { $k }))();
my $cont := nqp::continuationreset(nqp::null(), {
3 * (nqp::continuationshift(nqp::null(), -> $k { $k }))();
});
nqp::continuationinvoke(nqp::continuationclone($cont),
-> { nqp::continuationinvoke(nqp::continuationclone($cont)), -> { 10 }) });
Expand Down
4 changes: 2 additions & 2 deletions src/vm/jvm/QAST/Compiler.nqp
Expand Up @@ -2403,8 +2403,8 @@ sub contop($name, @params) {
}
QAST::OperationsJAST.map_classlib_core_op('continuationclone', $TYPE_OPS, 'continuationclone', [$RT_OBJ], $RT_OBJ, :tc);
contop('continuationreset', [$RT_OBJ, $RT_OBJ]);
contop('continuationshift', [$RT_OBJ, $RT_OBJ]);
contop('continuationinvoke', [$RT_OBJ]);
contop('continuationcontrol', [$RT_INT, $RT_OBJ, $RT_OBJ]);
contop('continuationinvoke', [$RT_OBJ, $RT_OBJ]);


class QAST::CompilerJAST {
Expand Down
5 changes: 5 additions & 0 deletions src/vm/jvm/runtime/org/perl6/nqp/runtime/GlobalContext.java
Expand Up @@ -60,6 +60,11 @@ public class GlobalContext {
*/
public SixModelObject SCRef;

/**
* Continuation type; a basic, method-less type with the Continuation REPR.
*/
public SixModelObject Continuation;

/**
* ContextRef type; a basic, method-less type with the ContextRef REPR.
*/
Expand Down
4 changes: 2 additions & 2 deletions src/vm/jvm/runtime/org/perl6/nqp/runtime/Ops.java
Expand Up @@ -4148,10 +4148,10 @@ public static SixModelObject continuationclone(SixModelObject in, ThreadContext
public static SixModelObject continuationreset(SixModelObject key, SixModelObject run, ThreadContext tc, ResumeStatus.Frame resume) {
throw new UnsupportedOperationException();
}
public static SixModelObject continuationshift(SixModelObject key, SixModelObject run, ThreadContext tc, ResumeStatus.Frame resume) {
public static SixModelObject continuationcontrol(long protect, SixModelObject key, SixModelObject run, ThreadContext tc, ResumeStatus.Frame resume) {
throw new UnsupportedOperationException();
}
public static SixModelObject continuationinvoke(SixModelObject cont, ThreadContext tc, ResumeStatus.Frame resume) {
public static SixModelObject continuationinvoke(SixModelObject cont, SixModelObject arg, ThreadContext tc, ResumeStatus.Frame resume) {
throw new UnsupportedOperationException();
}
}
8 changes: 2 additions & 6 deletions src/vm/jvm/runtime/org/perl6/nqp/runtime/ResumeStatus.java
@@ -1,11 +1,12 @@
package org.perl6.nqp.runtime;

import java.lang.invoke.MethodHandle;
import org.perl6.nqp.sixmodel.SixModelObject;

/**
* Represents a composable continuation.
*/
public class ResumeStatus {
public class ResumeStatus extends SixModelObject {
/**
* Represents one saved, not-currently-executing execution frame.
*/
Expand Down Expand Up @@ -48,9 +49,4 @@ public void resumeNext() throws Throwable {

/** The first frame of this continuation. Subsequent frames can be accessed using {@link Frame#next}. */
public Frame top;

/** Builds a new continuation from the stack stored in a {@link SaveStackException}. */
public ResumeStatus(SaveStackException ex) {
this.top = ex.top;
}
}
Expand Up @@ -39,6 +39,8 @@ public static void bootstrap(ThreadContext tc)
tc.gc.BOOTStrArray = bootTypedArray(tc, "BOOTStrArray", tc.gc.BOOTStr);

tc.gc.MultiCache = bootType(tc, "MultiCache", "MultiCache");

tc.gc.Continuation = bootType(tc, "Continuation", "Continuation");

Ops.setboolspec(tc.gc.BOOTIter, BoolificationSpec.MODE_ITER, null, tc);
Ops.setboolspec(tc.gc.BOOTInt, BoolificationSpec.MODE_UNBOX_INT, null, tc);
Expand Down
2 changes: 2 additions & 0 deletions src/vm/jvm/runtime/org/perl6/nqp/sixmodel/REPRRegistry.java
Expand Up @@ -6,6 +6,7 @@
import org.perl6.nqp.sixmodel.reprs.CallCapture;
import org.perl6.nqp.sixmodel.reprs.CodeRefREPR;
import org.perl6.nqp.sixmodel.reprs.ContextRef;
import org.perl6.nqp.sixmodel.reprs.Continuation;
import org.perl6.nqp.sixmodel.reprs.IOHandle;
import org.perl6.nqp.sixmodel.reprs.KnowHOWAttribute;
import org.perl6.nqp.sixmodel.reprs.KnowHOWREPR;
Expand Down Expand Up @@ -61,6 +62,7 @@ public static void setup() {
addREPR("Uninstantiable", new Uninstantiable());
addREPR("SCRef", new SCRef());
addREPR("ContextRef", new ContextRef());
addREPR("Continuation", new Continuation());
addREPR("CodeRef", new CodeRefREPR());
addREPR("CallCapture", new CallCapture());
addREPR("NFA", new NFA());
Expand Down
35 changes: 35 additions & 0 deletions src/vm/jvm/runtime/org/perl6/nqp/sixmodel/reprs/Continuation.java
@@ -0,0 +1,35 @@
package org.perl6.nqp.sixmodel.reprs;

import org.perl6.nqp.runtime.ExceptionHandling;
import org.perl6.nqp.runtime.ResumeStatus;
import org.perl6.nqp.runtime.ThreadContext;
import org.perl6.nqp.sixmodel.REPR;
import org.perl6.nqp.sixmodel.STable;
import org.perl6.nqp.sixmodel.SerializationReader;
import org.perl6.nqp.sixmodel.SixModelObject;
import org.perl6.nqp.sixmodel.TypeObject;

public class Continuation extends REPR {
public SixModelObject type_object_for(ThreadContext tc, SixModelObject HOW) {
STable st = new STable(this, HOW);
SixModelObject obj = new TypeObject();
obj.st = st;
st.WHAT = obj;
return st.WHAT;
}

public SixModelObject allocate(ThreadContext tc, STable st) {
ResumeStatus obj = new ResumeStatus();
obj.st = st;
return obj;
}

public SixModelObject deserialize_stub(ThreadContext tc, STable st) {
throw ExceptionHandling.dieInternal(tc, "Continuation does not participate in serialization");
}

public void deserialize_finish(ThreadContext tc, STable st,
SerializationReader reader, SixModelObject obj) {
throw ExceptionHandling.dieInternal(tc, "Continuation does not participate in serialization");
}
}

0 comments on commit 9aeeadd

Please sign in to comment.