From 20ff75b776308e8b6c07201477d7a4a5df5e7454 Mon Sep 17 00:00:00 2001 From: "Michael \"Z\" Goddard" Date: Wed, 12 Dec 2018 12:37:00 -0500 Subject: [PATCH] fix: initialize stack frame params for all procedures A previous change fixed compatibility with Scratch 2 removing 3's unintentional scope leaking. This furthers that change so that procedures with no parameters will also not accidentally use values in other procedure stacks. --- src/blocks/scratch3_procedures.js | 1 + src/engine/block-utility.js | 7 ++++ src/engine/thread.js | 13 ++++-- .../procedures-nested-missing-no-param.sb2 | Bin 0 -> 54963 bytes test/unit/engine_thread.js | 38 +++++++++--------- 5 files changed, 38 insertions(+), 21 deletions(-) create mode 100644 test/fixtures/execute/procedures-nested-missing-no-param.sb2 diff --git a/src/blocks/scratch3_procedures.js b/src/blocks/scratch3_procedures.js index 86aacd059..1bf782693 100644 --- a/src/blocks/scratch3_procedures.js +++ b/src/blocks/scratch3_procedures.js @@ -38,6 +38,7 @@ class Scratch3ProcedureBlocks { const [paramNames, paramIds, paramDefaults] = paramNamesIdsAndDefaults; + util.initParams(); for (let i = 0; i < paramIds.length; i++) { if (args.hasOwnProperty(paramIds[i])) { util.pushParam(paramNames[i], args[paramIds[i]]); diff --git a/src/engine/block-utility.js b/src/engine/block-utility.js index 5aa79f727..b957342ae 100644 --- a/src/engine/block-utility.js +++ b/src/engine/block-utility.js @@ -170,6 +170,13 @@ class BlockUtility { return this.thread.target.blocks.getProcedureParamNamesIdsAndDefaults(procedureCode); } + /** + * Initialize procedure parameters in the thread before pushing parameters. + */ + initParams () { + this.thread.initParams(); + } + /** * Store a procedure parameter value by its name. * @param {string} paramName The procedure's parameter name. diff --git a/src/engine/thread.js b/src/engine/thread.js index 47777a97a..e381dd9bf 100644 --- a/src/engine/thread.js +++ b/src/engine/thread.js @@ -321,6 +321,16 @@ class Thread { this.justReported = typeof value === 'undefined' ? null : value; } + /** + * Initialize procedure parameters on this stack frame. + */ + initParams () { + const stackFrame = this.peekStackFrame(); + if (stackFrame.params === null) { + stackFrame.params = {}; + } + } + /** * Add a parameter to the stack frame. * Use when calling a procedure with parameter values. @@ -329,9 +339,6 @@ class Thread { */ pushParam (paramName, value) { const stackFrame = this.peekStackFrame(); - if (stackFrame.params === null) { - stackFrame.params = {}; - } stackFrame.params[paramName] = value; } diff --git a/test/fixtures/execute/procedures-nested-missing-no-param.sb2 b/test/fixtures/execute/procedures-nested-missing-no-param.sb2 new file mode 100644 index 0000000000000000000000000000000000000000..af6916e52edaebb3e82acb9590544282a766afad GIT binary patch literal 54963 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ȹ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 literal 0 HcmV?d00001 diff --git a/test/unit/engine_thread.js b/test/unit/engine_thread.js index 5b2174e8d..12ed08357 100644 --- a/test/unit/engine_thread.js +++ b/test/unit/engine_thread.js @@ -5,7 +5,7 @@ const Sprite = require('../../src/sprites/sprite'); test('spec', t => { t.type(Thread, 'function'); - + const th = new Thread('arbitraryString'); t.type(th, 'object'); t.ok(th instanceof Thread); @@ -17,20 +17,21 @@ test('spec', t => { t.type(th.peekStackFrame, 'function'); t.type(th.peekParentStackFrame, 'function'); t.type(th.pushReportedValue, 'function'); + t.type(th.initParams, 'function'); t.type(th.pushParam, 'function'); t.type(th.peekStack, 'function'); t.type(th.getParam, 'function'); t.type(th.atStackTop, 'function'); t.type(th.goToNextBlock, 'function'); t.type(th.isRecursiveCall, 'function'); - + t.end(); }); test('pushStack', t => { const th = new Thread('arbitraryString'); th.pushStack('arbitraryString'); - + t.end(); }); @@ -39,7 +40,7 @@ test('popStack', t => { th.pushStack('arbitraryString'); t.strictEquals(th.popStack(), 'arbitraryString'); t.strictEquals(th.popStack(), undefined); - + t.end(); }); @@ -50,7 +51,7 @@ test('atStackTop', t => { t.strictEquals(th.atStackTop(), false); th.popStack(); t.strictEquals(th.atStackTop(), true); - + t.end(); }); @@ -59,7 +60,7 @@ test('reuseStackForNextBlock', t => { th.pushStack('arbitraryString'); th.reuseStackForNextBlock('secondString'); t.strictEquals(th.popStack(), 'secondString'); - + t.end(); }); @@ -69,7 +70,7 @@ test('peekStackFrame', t => { t.strictEquals(th.peekStackFrame().warpMode, false); th.popStack(); t.strictEquals(th.peekStackFrame(), null); - + t.end(); }); @@ -80,7 +81,7 @@ test('peekParentStackFrame', t => { t.strictEquals(th.peekParentStackFrame(), null); th.pushStack('secondString'); t.strictEquals(th.peekParentStackFrame().warpMode, true); - + t.end(); }); @@ -100,13 +101,14 @@ test('peekStack', t => { t.strictEquals(th.peekStack(), 'arbitraryString'); th.popStack(); t.strictEquals(th.peekStack(), null); - + t.end(); }); test('PushGetParam', t => { const th = new Thread('arbitraryString'); th.pushStack('arbitraryString'); + th.initParams(); th.pushParam('testParam', 'testValue'); t.strictEquals(th.peekStackFrame().params.testParam, 'testValue'); t.strictEquals(th.getParam('testParam'), 'testValue'); @@ -149,12 +151,12 @@ test('goToNextBlock', t => { x: 0, y: 0 }; - + rt.blocks.createBlock(block1); rt.blocks.createBlock(block2); rt.blocks.createBlock(block2); th.target = rt; - + t.strictEquals(th.peekStack(), null); th.pushStack('secondString'); t.strictEquals(th.peekStack(), 'secondString'); @@ -167,7 +169,7 @@ test('goToNextBlock', t => { t.strictEquals(th.peekStack(), 'secondString'); th.goToNextBlock(); t.strictEquals(th.peekStack(), null); - + t.end(); }); @@ -204,11 +206,11 @@ test('stopThisScript', t => { x: 0, y: 0 }; - + rt.blocks.createBlock(block1); rt.blocks.createBlock(block2); th.target = rt; - + th.stopThisScript(); t.strictEquals(th.peekStack(), null); th.pushStack('arbitraryString'); @@ -219,7 +221,7 @@ test('stopThisScript', t => { th.pushStack('secondString'); th.stopThisScript(); t.strictEquals(th.peekStack(), 'secondString'); - + t.end(); }); @@ -256,11 +258,11 @@ test('isRecursiveCall', t => { x: 0, y: 0 }; - + rt.blocks.createBlock(block1); rt.blocks.createBlock(block2); th.target = rt; - + t.strictEquals(th.isRecursiveCall('fakeCode'), false); th.pushStack('secondString'); t.strictEquals(th.isRecursiveCall('fakeCode'), false); @@ -274,6 +276,6 @@ test('isRecursiveCall', t => { t.strictEquals(th.isRecursiveCall('fakeCode'), false); th.popStack(); t.strictEquals(th.isRecursiveCall('fakeCode'), false); - + t.end(); });