diff --git a/src/blocks/scratch3_operators.js b/src/blocks/scratch3_operators.js
index c6ee70bef..53f64fbc2 100644
--- a/src/blocks/scratch3_operators.js
+++ b/src/blocks/scratch3_operators.js
@@ -91,7 +91,9 @@ class Scratch3OperatorsBlocks {
     }
 
     join (args) {
-        return Cast.toString(args.STRING1) + Cast.toString(args.STRING2);
+        // Limit result to 10240 characters: https://github.com/LLK/scratch-vm/issues/922
+        return (Cast.toString(args.STRING1) + Cast.toString(args.STRING2))
+            .slice(0, 10240);
     }
 
     letterOf (args) {
diff --git a/test/unit/blocks_operators.js b/test/unit/blocks_operators.js
index 5dbe082e9..d19834b67 100644
--- a/test/unit/blocks_operators.js
+++ b/test/unit/blocks_operators.js
@@ -122,6 +122,18 @@ test('random - reverse', t => {
 test('join', t => {
     t.strictEqual(blocks.join({STRING1: 'foo', STRING2: 'bar'}), 'foobar');
     t.strictEqual(blocks.join({STRING1: '1', STRING2: '2'}), '12');
+    t.strictEqual(blocks.join({STRING1: '1', STRING2: '2'}), '12');
+    t.end();
+});
+
+test('join result length does not exceed 10240', t => {
+    const sixThousandCharacterString = Array(6000)
+        .fill('a')
+        .join('');
+    t.strictEqual(blocks.join({
+        STRING1: sixThousandCharacterString,
+        STRING2: sixThousandCharacterString
+    }).length, 10240);
     t.end();
 });