diff --git a/HISTORY.md b/HISTORY.md
index f697b393..bf7375c0 100755
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -11,6 +11,9 @@
* Norwegian, thanks, Olav!
* German
+### 2020-09-04
+* byob, blocks, objects: refactored scanning for message senders
+
### 2020-09-03
* byob: experimental: Inspect & export dependencies for global custom blocks (shift-right-click for context menu)
* byob: new feature: "export block definition" including dependencies
diff --git a/snap.html b/snap.html
index 15ca19e2..fc285fd8 100755
--- a/snap.html
+++ b/snap.html
@@ -8,13 +8,13 @@
-
+
-
+
-
+
diff --git a/src/blocks.js b/src/blocks.js
index 75b7a7fa..1305afac 100644
--- a/src/blocks.js
+++ b/src/blocks.js
@@ -158,7 +158,7 @@ CustomCommandBlockMorph, SymbolMorph, ToggleButtonMorph, DialMorph*/
// Global stuff ////////////////////////////////////////////////////////
-modules.blocks = '2020-September-03';
+modules.blocks = '2020-September-04';
var SyntaxElementMorph;
var BlockMorph;
@@ -3173,6 +3173,37 @@ BlockMorph.prototype.showMessageUsers = function () {
}
};
+BlockMorph.prototype.isSending = function (message, receiverName, known = []) {
+ if (typeof message === 'number') {
+ message = message.toString();
+ }
+ return this.allChildren().some(morph => {
+ var event, eventReceiver;
+ if (morph.isCustomBlock &&
+ morph.isGlobal &&
+ contains(known, morph.definition)
+ ) {
+ return true;
+ }
+ if ((morph.selector) &&
+ contains(
+ ['doBroadcast', 'doBroadcastAndWait', 'doSend'],
+ morph.selector)
+ ) {
+ event = morph.inputs()[0].evaluate();
+ if (morph.selector === 'doSend') {
+ eventReceiver = morph.inputs()[1].evaluate();
+ }
+ return ((morph.selector !== 'doSend') ||
+ (receiverName === eventReceiver)) &&
+ ((event === message) ||
+ (message instanceof Array &&
+ message[0] === 'any message'));
+ }
+ return false;
+ });
+};
+
BlockMorph.prototype.developersMenu = function () {
var menu = BlockMorph.uber.developersMenu.call(this);
menu.addLine();
diff --git a/src/byob.js b/src/byob.js
index b0460938..2ba20d1f 100644
--- a/src/byob.js
+++ b/src/byob.js
@@ -107,7 +107,7 @@ WatcherMorph, Variable, BooleanSlotMorph, XML_Serializer, SnapTranslator*/
// Global stuff ////////////////////////////////////////////////////////
-modules.byob = '2020-September-03';
+modules.byob = '2020-September-04';
// Declarations
@@ -589,32 +589,9 @@ CustomBlockDefinition.prototype.collectDependencies = function (
};
CustomBlockDefinition.prototype.isSending = function (message, receiverName) {
- if (typeof message === 'number') {
- message = message.toString();
- }
return this.scripts.concat(
this.body ? [this.body.expression] : []
- ).some(script =>
- script.allChildren().some(morph => {
- var event, eventReceiver;
- if ((morph.selector) &&
- contains(
- ['doBroadcast', 'doBroadcastAndWait', 'doSend'],
- morph.selector)
- ) {
- event = morph.inputs()[0].evaluate();
- if (morph.selector === 'doSend') {
- eventReceiver = morph.inputs()[1].evaluate();
- }
- return ((morph.selector !== 'doSend') ||
- (receiverName === eventReceiver)) &&
- ((event === message) ||
- (message instanceof Array &&
- message[0] === 'any message'));
- }
- return false;
- })
- );
+ ).some(script => script.isSending(message, receiverName));
};
// CustomCommandBlockMorph /////////////////////////////////////////////
diff --git a/src/objects.js b/src/objects.js
index aee2b763..dcd744d4 100644
--- a/src/objects.js
+++ b/src/objects.js
@@ -84,7 +84,7 @@ BlockEditorMorph, BlockDialogMorph, PrototypeHatBlockMorph, BooleanSlotMorph,
localize, TableMorph, TableFrameMorph, normalizeCanvas, VectorPaintEditorMorph,
HandleMorph, AlignmentMorph, Process, XML_Element, WorldMap, copyCanvas*/
-modules.objects = '2020-September-03';
+modules.objects = '2020-September-04';
var SpriteMorph;
var StageMorph;
@@ -5774,35 +5774,8 @@ SpriteMorph.prototype.allMessageNames = function () {
};
SpriteMorph.prototype.allSendersOf = function (message, receiverName, known) {
- if (typeof message === 'number') {
- message = message.toString();
- }
return this.allScripts().filter(script =>
- script.allChildren().some(morph => {
- var event, eventReceiver;
- if (morph.isCustomBlock &&
- morph.isGlobal &&
- contains(known, morph.definition)
- ) {
- return true;
- }
- if ((morph.selector) &&
- contains(
- ['doBroadcast', 'doBroadcastAndWait', 'doSend'],
- morph.selector)
- ) {
- event = morph.inputs()[0].evaluate();
- if (morph.selector === 'doSend') {
- eventReceiver = morph.inputs()[1].evaluate();
- }
- return ((morph.selector !== 'doSend') ||
- (receiverName === eventReceiver)) &&
- ((event === message) ||
- (message instanceof Array &&
- message[0] === 'any message'));
- }
- return false;
- })
+ script.isSending(message, receiverName, known)
);
};