Continuation.st
changeset 8582 115869898a97
parent 8559 aca77c69cd91
child 8596 5433434a9bf0
--- a/Continuation.st	Wed Sep 22 12:03:04 2004 +0200
+++ b/Continuation.st	Wed Sep 22 13:52:26 2004 +0200
@@ -55,10 +55,26 @@
     [author:]
         Claus Gittinger
 "
+!
+
+supported
+    ^ false
 ! !
 
 !Continuation class methodsFor:'instance creation'!
 
+current
+	^ self fromContext: thisContext sender
+!
+
+currentDo: aBlock
+	^ aBlock value: (self fromContext: thisContext sender)
+!
+
+fromContext: aStack
+	^self new initializeFromContext: aStack
+!
+
 new
     |cont id|
 
@@ -80,6 +96,65 @@
     ^ cont
 ! !
 
+!Continuation methodsFor:'as yet unclassified'!
+
+restoreValues
+self halt.
+"/        | valueStream context |
+"/
+"/        valueStream _ values readStream.
+"/        [valueStream atEnd] whileFalse:
+"/                [context _ valueStream next.
+"/                1 to: context class instSize do: [:i | context instVarAt: i put: valueStream next].
+"/                1 to: context localSize do: [:i | context localAt: i put: valueStream next]]
+! !
+
+!Continuation methodsFor:'invocation'!
+
+numArgs
+	^ 1
+!
+
+value
+	self value: nil
+!
+
+value: v
+self halt.
+"/        self terminate: thisContext.
+"/        self restoreValues.
+"/        thisContext swapSender: values first.
+"/        ^v
+!
+
+valueWithArguments: v
+	v size == 1 ifFalse: [^self error: 'continuations can only be resumed with one argument'].
+	self value: v first
+! !
+
+!Continuation methodsFor:'private'!
+
+initializeFromContext: aContext
+self halt.
+"/        | valueStream context |
+"/
+"/        valueStream _ WriteStream on: (Array new: 20).
+"/        context _ aContext.
+"/        [context notNil] whileTrue:
+"/                [valueStream nextPut: context.
+"/                1 to: context class instSize do: [:i | valueStream nextPut: (context instVarAt: i)].
+"/                1 to: context localSize do: [:i | valueStream nextPut: (context localAt: i)].
+"/                context _ context sender].
+"/        values _ valueStream contents
+!
+
+terminate: aContext
+self halt.
+"/        | context |
+"/        context _ aContext.
+"/        [context notNil] whileTrue: [context _ context swapSender: nil]
+! !
+
 !Continuation methodsFor:'private accessing'!
 
 setId:idArg process:aProcess
@@ -90,5 +165,5 @@
 !Continuation class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Continuation.st,v 1.5 2004-09-20 14:27:04 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Continuation.st,v 1.6 2004-09-22 11:52:26 cg Exp $'
 ! !