From 90082ef495ebda37b001b1fad4cfaf8ec466f170 Mon Sep 17 00:00:00 2001 From: Rodrigo Queiro Date: Thu, 6 Oct 2016 16:38:06 +0200 Subject: [PATCH] Don't modify workspace.variableList in generators Fixes #677. --- generators/php/procedures.js | 20 ++++++++------------ generators/python/procedures.js | 16 ++++++---------- 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/generators/php/procedures.js b/generators/php/procedures.js index 2131bebde..537b97364 100644 --- a/generators/php/procedures.js +++ b/generators/php/procedures.js @@ -30,18 +30,14 @@ goog.require('Blockly.PHP'); Blockly.PHP['procedures_defreturn'] = function(block) { // Define a procedure with a return value. - // First, add a 'global' statement for every variable that is assigned. - var globals = block.workspace.variableList; - for (var i = globals.length - 1; i >= 0; i--) { - var varName = globals[i]; - if (block.arguments_.indexOf(varName) == -1) { - globals[i] = Blockly.PHP.variableDB_.getName(varName, - Blockly.Variables.NAME_TYPE); - } else { - // This variable is actually a parameter name. Do not include it in - // the list of globals, thus allowing it be of local scope. - globals.splice(i, 1); - } + // First, add a 'global' statement for every variable that is not shadowed by + // a local parameter. + var globals = []; + for (var i = 0, varName; varName = block.workspace.variableList[i]; i++) { + if (block.arguments_.indexOf(varName) == -1) { + globals.push(Blockly.PHP.variableDB_.getName(varName, + Blockly.Variables.NAME_TYPE)); + } } globals = globals.length ? ' global ' + globals.join(', ') + ';\n' : ''; diff --git a/generators/python/procedures.js b/generators/python/procedures.js index fa938ef0f..6af144819 100644 --- a/generators/python/procedures.js +++ b/generators/python/procedures.js @@ -31,17 +31,13 @@ goog.require('Blockly.Python'); Blockly.Python['procedures_defreturn'] = function(block) { // Define a procedure with a return value. - // First, add a 'global' statement for every variable that is assigned. - var globals = block.workspace.variableList; - for (var i = globals.length - 1; i >= 0; i--) { - var varName = globals[i]; + // First, add a 'global' statement for every variable that is not shadowed by + // a local parameter. + var globals = []; + for (var i = 0, varName; varName = block.workspace.variableList[i]; i++) { if (block.arguments_.indexOf(varName) == -1) { - globals[i] = Blockly.Python.variableDB_.getName(varName, - Blockly.Variables.NAME_TYPE); - } else { - // This variable is actually a parameter name. Do not include it in - // the list of globals, thus allowing it be of local scope. - globals.splice(i, 1); + globals.push(Blockly.Python.variableDB_.getName(varName, + Blockly.Variables.NAME_TYPE)); } } globals = globals.length ? ' global ' + globals.join(', ') + '\n' : '';