summaryrefslogtreecommitdiff
path: root/threads.js
diff options
context:
space:
mode:
authorMichael Ball <cycomachead@gmail.com>2014-02-04 11:59:45 -0800
committerMichael Ball <cycomachead@gmail.com>2014-02-04 11:59:45 -0800
commit817f4c5420e5d55409c88386c478f14e4735a627 (patch)
tree29af845c58934508a0ea842786c5838e8deb4519 /threads.js
parent9aa3921dd04ee8b6fedec0116f9e3f5503e4043b (diff)
parent8b5fa2ff9bd81ad9227b2593f9ccd6fdb8d32444 (diff)
downloadsnap-yow-817f4c5420e5d55409c88386c478f14e4735a627.tar.gz
snap-yow-817f4c5420e5d55409c88386c478f14e4735a627.zip
resolve merge conflicts; date problems only
Diffstat (limited to 'threads.js')
-rw-r--r--threads.js106
1 files changed, 84 insertions, 22 deletions
diff --git a/threads.js b/threads.js
index 0647040..7b46f70 100644
--- a/threads.js
+++ b/threads.js
@@ -9,7 +9,7 @@
written by Jens Mönig
jens@moenig.org
- Copyright (C) 2013 by Jens Mönig
+ Copyright (C) 2014 by Jens Mönig
This file is part of Snap!.
@@ -83,7 +83,7 @@ ArgLabelMorph, localize, XML_Element, hex_sha512*/
// Global stuff ////////////////////////////////////////////////////////
-modules.threads = '2014-January-26';
+modules.threads = '2014-Feb-03';
var ThreadManager;
var Process;
@@ -151,15 +151,19 @@ ThreadManager.prototype.startProcess = function (block, isThreadSafe) {
return newProc;
};
-ThreadManager.prototype.stopAll = function () {
+ThreadManager.prototype.stopAll = function (excpt) {
+ // excpt is optional
this.processes.forEach(function (proc) {
- proc.stop();
+ if (proc !== excpt) {
+ proc.stop();
+ }
});
};
-ThreadManager.prototype.stopAllForReceiver = function (rcvr) {
+ThreadManager.prototype.stopAllForReceiver = function (rcvr, excpt) {
+ // excpt is optional
this.processes.forEach(function (proc) {
- if (proc.homeContext.receiver === rcvr) {
+ if (proc.homeContext.receiver === rcvr && proc !== excpt) {
proc.stop();
if (rcvr.isClone) {
proc.isDead = true;
@@ -1368,6 +1372,44 @@ Process.prototype.doStopAll = function () {
}
};
+Process.prototype.doStopThis = function (choice) {
+ switch (this.inputOption(choice)) {
+ case 'all':
+ this.doStopAll();
+ break;
+ case 'this script':
+ this.doStop();
+ break;
+ case 'this block':
+ this.doStopBlock();
+ break;
+ default:
+ nop();
+ }
+};
+
+Process.prototype.doStopOthers = function (choice) {
+ var stage;
+ if (this.homeContext.receiver) {
+ stage = this.homeContext.receiver.parentThatIsA(StageMorph);
+ if (stage) {
+ switch (this.inputOption(choice)) {
+ case 'all but this script':
+ stage.threads.stopAll(this);
+ break;
+ case 'other scripts in sprite':
+ stage.threads.stopAllForReceiver(
+ this.homeContext.receiver,
+ this
+ );
+ break;
+ default:
+ nop();
+ }
+ }
+ }
+};
+
Process.prototype.doWarp = function (body) {
// execute my contents block atomically (more or less)
var outer = this.context.outerContext, // for tail call elimination
@@ -1601,15 +1643,15 @@ Process.prototype.doGlide = function (secs, endX, endY) {
if (!this.context.startTime) {
this.context.startTime = Date.now();
this.context.startValue = new Point(
- this.homeContext.receiver.xPosition(),
- this.homeContext.receiver.yPosition()
+ this.blockReceiver().xPosition(),
+ this.blockReceiver().yPosition()
);
}
if ((Date.now() - this.context.startTime) >= (secs * 1000)) {
- this.homeContext.receiver.gotoXY(endX, endY);
+ this.blockReceiver().gotoXY(endX, endY);
return null;
}
- this.homeContext.receiver.glide(
+ this.blockReceiver().glide(
secs * 1000,
endX,
endY,
@@ -1624,10 +1666,10 @@ Process.prototype.doGlide = function (secs, endX, endY) {
Process.prototype.doSayFor = function (data, secs) {
if (!this.context.startTime) {
this.context.startTime = Date.now();
- this.homeContext.receiver.bubble(data);
+ this.blockReceiver().bubble(data);
}
if ((Date.now() - this.context.startTime) >= (secs * 1000)) {
- this.homeContext.receiver.stopTalking();
+ this.blockReceiver().stopTalking();
return null;
}
this.pushContext('doYield');
@@ -1637,16 +1679,21 @@ Process.prototype.doSayFor = function (data, secs) {
Process.prototype.doThinkFor = function (data, secs) {
if (!this.context.startTime) {
this.context.startTime = Date.now();
- this.homeContext.receiver.doThink(data);
+ this.blockReceiver().doThink(data);
}
if ((Date.now() - this.context.startTime) >= (secs * 1000)) {
- this.homeContext.receiver.stopTalking();
+ this.blockReceiver().stopTalking();
return null;
}
this.pushContext('doYield');
this.pushContext();
};
+Process.prototype.blockReceiver = function () {
+ return this.context ? this.context.receiver || this.homeContext.receiver
+ : this.homeContext.receiver;
+};
+
// Process sound primitives (interpolated)
Process.prototype.doPlaySoundUntilDone = function (name) {
@@ -1681,7 +1728,7 @@ Process.prototype.doStopAllSounds = function () {
Process.prototype.doAsk = function (data) {
var stage = this.homeContext.receiver.parentThatIsA(StageMorph),
- isStage = this.homeContext.receiver instanceof StageMorph,
+ isStage = this.blockReceiver() instanceof StageMorph,
activePrompter;
if (!this.prompter) {
@@ -1691,7 +1738,7 @@ Process.prototype.doAsk = function (data) {
);
if (!activePrompter) {
if (!isStage) {
- this.homeContext.receiver.bubble(data, false, true);
+ this.blockReceiver().bubble(data, false, true);
}
this.prompter = new StagePrompterMorph(isStage ? data : null);
if (stage.scale < 1) {
@@ -1711,7 +1758,7 @@ Process.prototype.doAsk = function (data) {
stage.lastAnswer = this.prompter.inputField.getValue();
this.prompter.destroy();
this.prompter = null;
- if (!isStage) {this.homeContext.receiver.stopTalking(); }
+ if (!isStage) {this.blockReceiver().stopTalking(); }
return null;
}
}
@@ -2246,7 +2293,7 @@ Process.prototype.createClone = function (name) {
// Process sensing primitives
Process.prototype.reportTouchingObject = function (name) {
- var thisObj = this.homeContext.receiver;
+ var thisObj = this.blockReceiver();
if (thisObj) {
return this.objectTouchingObject(thisObj, name);
@@ -2342,7 +2389,7 @@ Process.prototype.reportColorIsTouchingColor = function (color1, color2) {
};
Process.prototype.reportDistanceTo = function (name) {
- var thisObj = this.homeContext.receiver,
+ var thisObj = this.blockReceiver(),
thatObj,
stage,
rc,
@@ -2365,7 +2412,7 @@ Process.prototype.reportDistanceTo = function (name) {
};
Process.prototype.reportAttributeOf = function (attribute, name) {
- var thisObj = this.homeContext.receiver,
+ var thisObj = this.blockReceiver(),
thatObj,
stage;
@@ -2377,6 +2424,9 @@ Process.prototype.reportAttributeOf = function (attribute, name) {
thatObj = this.getOtherObject(name, thisObj, stage);
}
if (thatObj) {
+ if (attribute instanceof Context) {
+ return this.reportContextFor(attribute, thatObj);
+ }
if (isString(attribute)) {
return thatObj.variables.getVar(attribute);
}
@@ -2401,6 +2451,18 @@ Process.prototype.reportAttributeOf = function (attribute, name) {
return '';
};
+Process.prototype.reportContextFor = function (context, otherObj) {
+ // Private - return a copy of the context
+ // and bind it to another receiver
+ var result = copy(context);
+ result.receiver = otherObj;
+ if (result.outerContext) {
+ result.outerContext = copy(result.outerContext);
+ result.outerContext.receiver = otherObj;
+ }
+ return result;
+};
+
Process.prototype.reportMouseX = function () {
var stage, world;
if (this.homeContext.receiver) {
@@ -2492,12 +2554,12 @@ Process.prototype.reportDate = function (datefn) {
currDate = new Date();
func = dateMap[datefn];
result = currDate[func]();
-
+
// Show months as 1-12 and days as 1-7
if (datefn === 'month' || datefn === 'day of week') {
result += 1;
}
-
+
return result;
}