Skip to content

Commit

Permalink
Merge PR #58: Add Promise Breakpoints
Browse files Browse the repository at this point in the history
Implementation of promise breakpoints for resolver and resolution side.
  • Loading branch information
smarr committed Nov 24, 2016
2 parents 0046758 + f99f5a8 commit b46f6bb
Show file tree
Hide file tree
Showing 98 changed files with 1,639 additions and 1,347 deletions.
1 change: 0 additions & 1 deletion .classpath
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
<classpathentry combineaccessrules="false" kind="src" path="/com.oracle.truffle.api.profiles"/>
<classpathentry kind="src" path="/com.oracle.truffle.tools"/>
<classpathentry kind="src" path="/com.oracle.truffle.tools.debug.shell"/>
<classpathentry kind="src" path="/CoverallsTruffle"/>
<classpathentry kind="lib" path="libs/somns-deps-dev.jar"/>
<classpathentry kind="lib" path="libs/somns-deps.jar"/>
<classpathentry kind="output" path="build/classes"/>
Expand Down
46 changes: 23 additions & 23 deletions core-lib/Actors.som
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*)
class Actors usingVmMirror: vmMirror usingKernel: kernel = Value (
| private vmMirror = vmMirror.
| private vmMirror = vmMirror.
private Exception = kernel Exception.
private Vector = kernel Vector.
|
Expand All @@ -28,7 +28,7 @@ class Actors usingVmMirror: vmMirror usingKernel: kernel = Value (
vmMirror actorsFarReferenceClass: FarReference.
vmMirror actorsPromiseClass: Promise.
vmMirror actorsPairClass: Pair.
vmMirror actorsResolverClass: Resolver.
vmMirror actorsResolverClass: Resolver.
vmMirror actorsModule: self.
)(
public class FarReference = Value (
Expand Down Expand Up @@ -61,33 +61,33 @@ class Actors usingVmMirror: vmMirror usingKernel: kernel = Value (
public class Promise = Object ()(
(* all whenResolved blocks are executed. *)
public whenResolved: aBlock = ( ^ vmMirror actorsWhen: self resolved: aBlock )

(* all ensure blocks are executed. *)
public ensure: aBlock = ( whenResolved: aBlock. onError: aBlock. )

(* all onError blocks are executed. *)
public onError: errorBlock = ( ^ vmMirror actorsFor: self onError: errorBlock )

public whenResolved: aBlock onError: errorBlock = (
^ vmMirror actorsWhen: self resolved: aBlock onError: errorBlock
)

(* similar to exception handlers, only the first matching on:do: is executed.
registration order determines search order.
This seems to be also what the Bluebird JS lib is doing. *)
public on: exception do: errorBlock = (
vmMirror actorsFor: self on: exception do: errorBlock
)

public , other = (
^ (PromiseGroup for: self), other.
)
)

public class Resolver = Value ()( (* Object or Value? *)
public resolve: value = ( vmMirror actorsResolve: self with: value )
public resolve: value = ( vmMirror actorsResolve: self with: value isBPResolver: false isBPResolution: false)
public error: value = ( self notYetImplemented )
)
)

class Pair with: promise and: resolver = (
(* A promise Pair is useful for explicitly creating dependencies between
Expand Down Expand Up @@ -120,14 +120,14 @@ class Actors usingVmMirror: vmMirror usingKernel: kernel = Value (
public on: exception do: errorBlock = (
^ all on: exception do: errorBlock
)

all = (
(lazyAll == nil) ifTrue: [
| promisePair counter results |
counter := 0.
promisePair := createPromisePair.
results := Vector new.

do: [ :p |
counter := counter + 1.
p whenResolved: [:r |
Expand All @@ -141,7 +141,7 @@ class Actors usingVmMirror: vmMirror usingKernel: kernel = Value (
].
^ lazyAll
)

do: block = (
| it |
it := self.
Expand All @@ -165,7 +165,7 @@ class Actors usingVmMirror: vmMirror usingKernel: kernel = Value (
)

(* Can't be part of kernel, don't have promises in the kernel... *)
private async: collection do: aBlock next: i prevPromise: prev
private async: collection do: aBlock next: i prevPromise: prev
completionResolver: resolver = (
prev whenResolved: [:res |
i <= collection size
Expand All @@ -176,7 +176,7 @@ class Actors usingVmMirror: vmMirror usingKernel: kernel = Value (
ifFalse: [
resolver resolve: collection ] ]
)

(* Iteration is done sequential but asynchronous. *)
public async: collection do: aBlockReturningAPromise = (
| promisePair |
Expand All @@ -189,12 +189,12 @@ class Actors usingVmMirror: vmMirror usingKernel: kernel = Value (
async: collection
do: aBlockReturningAPromise
next: 2
prevPromise: first
prevPromise: first
completionResolver: promisePair resolver.
] ifFalse: [
promisePair resolve: collection.
].

^ promisePair promise.
)

Expand All @@ -218,21 +218,21 @@ class Actors usingVmMirror: vmMirror usingKernel: kernel = Value (
public async: intStart to: intEnd do: aBlockReturningAPromise = (
| promisePair |
promisePair := createPromisePair.

intStart <= intEnd ifTrue: [
| first |
first := aBlockReturningAPromise value: intStart.

async: intStart + 1 to: intEnd
do: aBlockReturningAPromise
do: aBlockReturningAPromise
prevPromise: first
completionResolver: promisePair resolver.
] ifFalse: [
promisePair resolve: intStart
].
^ promisePair promise
)

private async: conditionBlock whileTrue: bodyBlockReturningAPromise prevPromise: prev completionResolver: resolver = (
prev whenResolved: [:res |
conditionBlock value ifTrue: [
Expand All @@ -244,16 +244,16 @@ class Actors usingVmMirror: vmMirror usingKernel: kernel = Value (
]
]
)

public async: conditionBlock whileTrue: bodyBlockReturningAPromise = (
| promisePair |
promisePair := createPromisePair.

conditionBlock value ifTrue: [
| prevPromise |
prevPromise := bodyBlockReturningAPromise value.
async: conditionBlock
whileTrue: bodyBlockReturningAPromise
whileTrue: bodyBlockReturningAPromise
prevPromise: prevPromise
completionResolver: promisePair resolver
] ifFalse: [
Expand Down
50 changes: 38 additions & 12 deletions src/som/interpreter/actors/EventualMessage.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,25 @@ public abstract class EventualMessage {
protected final RootCallTarget onReceive;
protected final EventualMessage causalMessage;

protected final boolean triggerRcvrBreakpoint;
/**
* It is not final because its value can be updated in order that other breakpoints
* can reuse the stepping strategy implemented for message receiver breakpoints.
*/
protected boolean triggerMessageReceiverBreakpoint;
protected final boolean triggerPromiseResolverBreakpoint;
protected final boolean triggerPromiseResolutionBreakpoint;

protected EventualMessage(final EventualMessage causalMessage, final Object[] args,
final SResolver resolver, final RootCallTarget onReceive, final boolean triggerRcvrBreakpoint) {
final SResolver resolver, final RootCallTarget onReceive,
final boolean triggerMessageReceiverBreakpoint, final boolean triggerPromiseResolverBreakpoint,
final boolean triggerPromiseResolutionBreakpoint) {
this.causalMessage = causalMessage;
this.args = args;
this.resolver = resolver;
this.onReceive = onReceive;
this.triggerRcvrBreakpoint = triggerRcvrBreakpoint;
this.triggerMessageReceiverBreakpoint = triggerMessageReceiverBreakpoint;
this.triggerPromiseResolverBreakpoint = triggerPromiseResolverBreakpoint;
this.triggerPromiseResolutionBreakpoint = triggerPromiseResolutionBreakpoint;
assert onReceive.getRootNode() instanceof ReceivedMessage || onReceive.getRootNode() instanceof ReceivedCallback;
}

Expand All @@ -56,8 +66,11 @@ public static final class DirectMessage extends EventualMessage {

public DirectMessage(final EventualMessage causalMessage, final Actor target, final SSymbol selector,
final Object[] arguments, final Actor sender, final SResolver resolver,
final RootCallTarget onReceive, final boolean triggerRcvrBreakpoint) {
super(causalMessage, arguments, resolver, onReceive, triggerRcvrBreakpoint);
final RootCallTarget onReceive, final boolean triggerMessageReceiverBreakpoint,
final boolean triggerPromiseResolverBreakpoint,
final boolean triggerPromiseResolutionBreakpoint) {
super(causalMessage, arguments, resolver, onReceive, triggerMessageReceiverBreakpoint,
triggerPromiseResolverBreakpoint, triggerPromiseResolutionBreakpoint);
this.selector = selector;
this.sender = sender;
this.target = target;
Expand Down Expand Up @@ -131,8 +144,10 @@ public abstract static class PromiseMessage extends EventualMessage {
protected final Actor originalSender; // initial owner of the arguments

public PromiseMessage(final EventualMessage causalMessage, final Object[] arguments, final Actor originalSender,
final SResolver resolver, final RootCallTarget onReceive, final boolean triggerRcvrBreakpoint) {
super(causalMessage, arguments, resolver, onReceive, triggerRcvrBreakpoint);
final SResolver resolver, final RootCallTarget onReceive, final boolean triggerMessageReceiverBreakpoint,
final boolean triggerPromiseResolverBreakpoint, final boolean triggerPromiseResolutionBreakpoint) {
super(causalMessage, arguments, resolver, onReceive, triggerMessageReceiverBreakpoint,
triggerPromiseResolverBreakpoint, triggerPromiseResolutionBreakpoint);
this.originalSender = originalSender;
}

Expand All @@ -156,8 +171,10 @@ public static final class PromiseSendMessage extends PromiseMessage {

protected PromiseSendMessage(final EventualMessage causalMessage, final SSymbol selector,
final Object[] arguments, final Actor originalSender,
final SResolver resolver, final RootCallTarget onReceive, final boolean triggerRcvrBreakpoint) {
super(causalMessage, arguments, originalSender, resolver, onReceive, triggerRcvrBreakpoint);
final SResolver resolver, final RootCallTarget onReceive, final boolean triggerMessageReceiverBreakpoint,
final boolean triggerPromiseResolverBreakpoint, final boolean triggerPromiseResolutionBreakpoint) {
super(causalMessage, arguments, originalSender, resolver, onReceive, triggerMessageReceiverBreakpoint,
triggerPromiseResolverBreakpoint, triggerPromiseResolutionBreakpoint);
this.selector = selector;
}

Expand Down Expand Up @@ -204,8 +221,10 @@ public String toString() {
public static final class PromiseCallbackMessage extends PromiseMessage {

public PromiseCallbackMessage(final EventualMessage causalMessage, final Actor owner, final SBlock callback,
final SResolver resolver, final RootCallTarget onReceive, final boolean triggerRcvrBreakpoint) {
super(causalMessage, new Object[] {callback, null}, owner, resolver, onReceive, triggerRcvrBreakpoint);
final SResolver resolver, final RootCallTarget onReceive, final boolean triggerMessageReceiverBreakpoint,
final boolean triggerPromiseResolverBreakpoint, final boolean triggerPromiseResolutionBreakpoint) {
super(causalMessage, new Object[] {callback, null}, owner, resolver, onReceive,
triggerMessageReceiverBreakpoint, triggerPromiseResolverBreakpoint, triggerPromiseResolutionBreakpoint);
}

@Override
Expand Down Expand Up @@ -280,6 +299,13 @@ public static EventualMessage getCurrentExecutingMessage() {
* before the message is processed.
*/
public boolean isBreakpoint() {
return triggerRcvrBreakpoint;
return triggerMessageReceiverBreakpoint;
}

/**
* Updates the value of the flag for the message receiver breakpoint.
*/
public void setIsMessageReceiverBreakpoint(final boolean triggerBreakpoint) {
this.triggerMessageReceiverBreakpoint = triggerBreakpoint;
}
}

0 comments on commit b46f6bb

Please sign in to comment.