mirror of
https://github.com/scratchfoundation/scratch-vm.git
synced 2025-06-06 10:34:05 -04:00
Merge pull request #730 from paulkaplan/fix-undefined-proc-execution
Fix undefined procedure execution
This commit is contained in:
commit
aaa107dbe5
2 changed files with 37 additions and 0 deletions
|
@ -27,11 +27,20 @@ class Scratch3ProcedureBlocks {
|
|||
if (!util.stackFrame.executed) {
|
||||
const procedureCode = args.mutation.proccode;
|
||||
const paramNames = util.getProcedureParamNames(procedureCode);
|
||||
|
||||
// If null, procedure could not be found, which can happen if custom
|
||||
// block is dragged between sprites without the definition.
|
||||
// Match Scratch 2.0 behavior and noop.
|
||||
if (paramNames === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (let i = 0; i < paramNames.length; i++) {
|
||||
if (args.hasOwnProperty(`input${i}`)) {
|
||||
util.pushParam(paramNames[i], args[`input${i}`]);
|
||||
}
|
||||
}
|
||||
|
||||
util.stackFrame.executed = true;
|
||||
util.startProcedure(procedureCode);
|
||||
}
|
||||
|
|
28
test/unit/blocks_procedures.js
Normal file
28
test/unit/blocks_procedures.js
Normal file
|
@ -0,0 +1,28 @@
|
|||
const test = require('tap').test;
|
||||
const Procedures = require('../../src/blocks/scratch3_procedures');
|
||||
|
||||
const blocks = new Procedures(null);
|
||||
|
||||
test('getPrimitives', t => {
|
||||
t.type(blocks.getPrimitives(), 'object');
|
||||
t.end();
|
||||
});
|
||||
|
||||
// Originally inspired by https://github.com/LLK/scratch-gui/issues/809
|
||||
test('calling a custom block with no definition does not throw', t => {
|
||||
const args = {
|
||||
mutation: {
|
||||
proccode: 'undefined proc'
|
||||
}
|
||||
};
|
||||
const util = {
|
||||
getProcedureParamNames: () => null,
|
||||
stackFrame: {
|
||||
executed: false
|
||||
}
|
||||
};
|
||||
t.doesNotThrow(() => {
|
||||
blocks.callNoReturn(args, util);
|
||||
});
|
||||
t.end();
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue