diff --git a/generators/dart/procedures.js b/generators/dart/procedures.js index fa751c1ef..efb432986 100644 --- a/generators/dart/procedures.js +++ b/generators/dart/procedures.js @@ -33,24 +33,28 @@ Blockly.Dart['procedures_defreturn'] = function(block) { // Define a procedure with a return value. var funcName = Blockly.Dart.variableDB_.getName(block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); - var branch = Blockly.Dart.statementToCode(block, 'STACK'); - if (Blockly.Dart.STATEMENT_SUFFIX) { - branch = Blockly.Dart.prefixLines( - Blockly.Dart.injectId(Blockly.Dart.STATEMENT_SUFFIX, block), - Blockly.Dart.INDENT) + branch; - } - if (Blockly.Dart.INFINITE_LOOP_TRAP) { - branch = Blockly.Dart.prefixLines( - Blockly.Dart.injectId(Blockly.Dart.INFINITE_LOOP_TRAP, block), - Blockly.Dart.INDENT) + branch; - } + var xfix1 = ''; if (Blockly.Dart.STATEMENT_PREFIX) { - branch = Blockly.Dart.prefixLines( - Blockly.Dart.injectId(Blockly.Dart.STATEMENT_PREFIX, block), - Blockly.Dart.INDENT) + branch; + xfix1 += Blockly.Dart.injectId(Blockly.Dart.STATEMENT_PREFIX, block); } + if (Blockly.Dart.STATEMENT_SUFFIX) { + xfix1 += Blockly.Dart.injectId(Blockly.Dart.STATEMENT_SUFFIX, block); + } + xfix1 = Blockly.Dart.prefixLines(xfix1, Blockly.Dart.INDENT); + var loopTrap = ''; + if (Blockly.Dart.INFINITE_LOOP_TRAP) { + loopTrap = Blockly.Dart.prefixLines( + Blockly.Dart.injectId(Blockly.Dart.INFINITE_LOOP_TRAP, block), + Blockly.Dart.INDENT); + } + var branch = Blockly.Dart.statementToCode(block, 'STACK'); var returnValue = Blockly.Dart.valueToCode(block, 'RETURN', Blockly.Dart.ORDER_NONE) || ''; + var xfix2 = ''; + if (branch && returnValue) { + // After executing the function body, revisit this block for the return. + xfix2 = xfix1; + } if (returnValue) { returnValue = Blockly.Dart.INDENT + 'return ' + returnValue + ';\n'; } @@ -61,7 +65,7 @@ Blockly.Dart['procedures_defreturn'] = function(block) { Blockly.Variables.NAME_TYPE); } var code = returnType + ' ' + funcName + '(' + args.join(', ') + ') {\n' + - branch + returnValue + '}'; + xfix1 + loopTrap + branch + xfix2 + returnValue + '}'; code = Blockly.Dart.scrub_(block, code); // Add % so as not to collide with helper functions in definitions list. Blockly.Dart.definitions_['%' + funcName] = code; diff --git a/generators/javascript/procedures.js b/generators/javascript/procedures.js index d2fba2d8e..cd6767daa 100644 --- a/generators/javascript/procedures.js +++ b/generators/javascript/procedures.js @@ -33,24 +33,30 @@ Blockly.JavaScript['procedures_defreturn'] = function(block) { // Define a procedure with a return value. var funcName = Blockly.JavaScript.variableDB_.getName( block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); - var branch = Blockly.JavaScript.statementToCode(block, 'STACK'); - if (Blockly.JavaScript.STATEMENT_SUFFIX) { - branch = Blockly.JavaScript.prefixLines( - Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX, block), - Blockly.JavaScript.INDENT) + branch; - } - if (Blockly.JavaScript.INFINITE_LOOP_TRAP) { - branch = Blockly.JavaScript.prefixLines( - Blockly.JavaScript.injectId(Blockly.JavaScript.INFINITE_LOOP_TRAP, - block), Blockly.JavaScript.INDENT) + branch; - } + var xfix1 = ''; if (Blockly.JavaScript.STATEMENT_PREFIX) { - branch = Blockly.JavaScript.prefixLines( - Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX, block), - Blockly.JavaScript.INDENT) + branch; + xfix1 += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX, + block); } + if (Blockly.JavaScript.STATEMENT_SUFFIX) { + xfix1 += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX, + block); + } + xfix1 = Blockly.JavaScript.prefixLines(xfix1, Blockly.JavaScript.INDENT); + var loopTrap = ''; + if (Blockly.JavaScript.INFINITE_LOOP_TRAP) { + loopTrap = Blockly.JavaScript.prefixLines( + Blockly.JavaScript.injectId(Blockly.JavaScript.INFINITE_LOOP_TRAP, + block), Blockly.JavaScript.INDENT); + } + var branch = Blockly.JavaScript.statementToCode(block, 'STACK'); var returnValue = Blockly.JavaScript.valueToCode(block, 'RETURN', Blockly.JavaScript.ORDER_NONE) || ''; + var xfix2 = ''; + if (branch && returnValue) { + // After executing the function body, revisit this block for the return. + xfix2 = xfix1; + } if (returnValue) { returnValue = Blockly.JavaScript.INDENT + 'return ' + returnValue + ';\n'; } @@ -60,7 +66,7 @@ Blockly.JavaScript['procedures_defreturn'] = function(block) { Blockly.Variables.NAME_TYPE); } var code = 'function ' + funcName + '(' + args.join(', ') + ') {\n' + - branch + returnValue + '}'; + xfix1 + loopTrap + branch + xfix2 + returnValue + '}'; code = Blockly.JavaScript.scrub_(block, code); // Add % so as not to collide with helper functions in definitions list. Blockly.JavaScript.definitions_['%' + funcName] = code; diff --git a/generators/lua/procedures.js b/generators/lua/procedures.js index b1739cdd9..32462b3af 100644 --- a/generators/lua/procedures.js +++ b/generators/lua/procedures.js @@ -33,24 +33,28 @@ Blockly.Lua['procedures_defreturn'] = function(block) { // Define a procedure with a return value. var funcName = Blockly.Lua.variableDB_.getName( block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); - var branch = Blockly.Lua.statementToCode(block, 'STACK'); - if (Blockly.Lua.STATEMENT_SUFFIX) { - branch = Blockly.Lua.prefixLines( - Blockly.Lua.injectId(Blockly.Lua.STATEMENT_SUFFIX, block), - Blockly.Lua.INDENT) + branch; - } - if (Blockly.Lua.INFINITE_LOOP_TRAP) { - branch = Blockly.Lua.prefixLines( - Blockly.Lua.injectId(Blockly.Lua.INFINITE_LOOP_TRAP, block), - Blockly.Lua.INDENT) + branch; - } + var xfix1 = ''; if (Blockly.Lua.STATEMENT_PREFIX) { - branch = Blockly.Lua.prefixLines( - Blockly.Lua.injectId(Blockly.Lua.STATEMENT_PREFIX, block), - Blockly.Lua.INDENT) + branch; + xfix1 += Blockly.Lua.injectId(Blockly.Lua.STATEMENT_PREFIX, block); } + if (Blockly.Lua.STATEMENT_SUFFIX) { + xfix1 += Blockly.Lua.injectId(Blockly.Lua.STATEMENT_SUFFIX, block); + } + xfix1 = Blockly.Lua.prefixLines(xfix1, Blockly.Lua.INDENT); + var loopTrap = ''; + if (Blockly.Lua.INFINITE_LOOP_TRAP) { + loopTrap = Blockly.Lua.prefixLines( + Blockly.Lua.injectId(Blockly.Lua.INFINITE_LOOP_TRAP, block), + Blockly.Lua.INDENT); + } + var branch = Blockly.Lua.statementToCode(block, 'STACK'); var returnValue = Blockly.Lua.valueToCode(block, 'RETURN', Blockly.Lua.ORDER_NONE) || ''; + var xfix2 = ''; + if (branch && returnValue) { + // After executing the function body, revisit this block for the return. + xfix2 = xfix1; + } if (returnValue) { returnValue = Blockly.Lua.INDENT + 'return ' + returnValue + '\n'; } else if (!branch) { @@ -62,7 +66,7 @@ Blockly.Lua['procedures_defreturn'] = function(block) { Blockly.Variables.NAME_TYPE); } var code = 'function ' + funcName + '(' + args.join(', ') + ')\n' + - branch + returnValue + 'end\n'; + xfix1 + loopTrap + branch + xfix2 + returnValue + 'end\n'; code = Blockly.Lua.scrub_(block, code); // Add % so as not to collide with helper functions in definitions list. Blockly.Lua.definitions_['%' + funcName] = code; diff --git a/generators/php/procedures.js b/generators/php/procedures.js index fe51de408..e567068b1 100644 --- a/generators/php/procedures.js +++ b/generators/php/procedures.js @@ -54,24 +54,28 @@ Blockly.PHP['procedures_defreturn'] = function(block) { var funcName = Blockly.PHP.variableDB_.getName( block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); - var branch = Blockly.PHP.statementToCode(block, 'STACK'); - if (Blockly.PHP.STATEMENT_SUFFIX) { - branch = Blockly.PHP.prefixLines( - Blockly.PHP.injectId(Blockly.PHP.STATEMENT_SUFFIX, block), - Blockly.PHP.INDENT) + branch; - } - if (Blockly.PHP.INFINITE_LOOP_TRAP) { - branch = Blockly.PHP.prefixLines( - Blockly.PHP.injectId(Blockly.PHP.INFINITE_LOOP_TRAP, block), - Blockly.PHP.INDENT) + branch; - } + var xfix1 = ''; if (Blockly.PHP.STATEMENT_PREFIX) { - branch = Blockly.PHP.prefixLines( - Blockly.PHP.injectId(Blockly.PHP.STATEMENT_PREFIX, block), - Blockly.PHP.INDENT) + branch; + xfix1 += Blockly.PHP.injectId(Blockly.PHP.STATEMENT_PREFIX, block); } + if (Blockly.PHP.STATEMENT_SUFFIX) { + xfix1 += Blockly.PHP.injectId(Blockly.PHP.STATEMENT_SUFFIX, block); + } + xfix1 = Blockly.PHP.prefixLines(xfix1, Blockly.PHP.INDENT); + var loopTrap = ''; + if (Blockly.PHP.INFINITE_LOOP_TRAP) { + loopTrap = Blockly.PHP.prefixLines( + Blockly.PHP.injectId(Blockly.PHP.INFINITE_LOOP_TRAP, block), + Blockly.PHP.INDENT); + } + var branch = Blockly.PHP.statementToCode(block, 'STACK'); var returnValue = Blockly.PHP.valueToCode(block, 'RETURN', Blockly.PHP.ORDER_NONE) || ''; + var xfix2 = ''; + if (branch && returnValue) { + // After executing the function body, revisit this block for the return. + xfix2 = xfix1; + } if (returnValue) { returnValue = Blockly.PHP.INDENT + 'return ' + returnValue + ';\n'; } @@ -81,7 +85,7 @@ Blockly.PHP['procedures_defreturn'] = function(block) { Blockly.Variables.NAME_TYPE); } var code = 'function ' + funcName + '(' + args.join(', ') + ') {\n' + - globals + branch + returnValue + '}'; + globals + xfix1 + loopTrap + branch + xfix2 + returnValue + '}'; code = Blockly.PHP.scrub_(block, code); // Add % so as not to collide with helper functions in definitions list. Blockly.PHP.definitions_['%' + funcName] = code; diff --git a/generators/python/procedures.js b/generators/python/procedures.js index 76bd11687..2455c2903 100644 --- a/generators/python/procedures.js +++ b/generators/python/procedures.js @@ -55,24 +55,28 @@ Blockly.Python['procedures_defreturn'] = function(block) { Blockly.Python.INDENT + 'global ' + globals.join(', ') + '\n' : ''; var funcName = Blockly.Python.variableDB_.getName( block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); - var branch = Blockly.Python.statementToCode(block, 'STACK'); - if (Blockly.Python.STATEMENT_SUFFIX) { - branch = Blockly.Python.prefixLines( - Blockly.Python.injectId(Blockly.Python.STATEMENT_SUFFIX, block), - Blockly.Python.INDENT) + branch; - } - if (Blockly.Python.INFINITE_LOOP_TRAP) { - branch = Blockly.Python.prefixLines( - Blockly.Python.injectId(Blockly.Python.INFINITE_LOOP_TRAP, block), - Blockly.Python.INDENT) + branch; - } + var xfix1 = ''; if (Blockly.Python.STATEMENT_PREFIX) { - branch = Blockly.Python.prefixLines( - Blockly.Python.injectId(Blockly.Python.STATEMENT_PREFIX, block), - Blockly.Python.INDENT) + branch; + xfix1 += Blockly.Python.injectId(Blockly.Python.STATEMENT_PREFIX, block); } + if (Blockly.Python.STATEMENT_SUFFIX) { + xfix1 += Blockly.Python.injectId(Blockly.Python.STATEMENT_SUFFIX, block); + } + xfix1 = Blockly.Python.prefixLines(xfix1, Blockly.Python.INDENT); + var loopTrap = ''; + if (Blockly.Python.INFINITE_LOOP_TRAP) { + loopTrap = Blockly.Python.prefixLines( + Blockly.Python.injectId(Blockly.Python.INFINITE_LOOP_TRAP, block), + Blockly.Python.INDENT); + } + var branch = Blockly.Python.statementToCode(block, 'STACK'); var returnValue = Blockly.Python.valueToCode(block, 'RETURN', Blockly.Python.ORDER_NONE) || ''; + var xfix2 = ''; + if (branch && returnValue) { + // After executing the function body, revisit this block for the return. + xfix2 = xfix1; + } if (returnValue) { returnValue = Blockly.Python.INDENT + 'return ' + returnValue + '\n'; } else if (!branch) { @@ -84,7 +88,7 @@ Blockly.Python['procedures_defreturn'] = function(block) { Blockly.Variables.NAME_TYPE); } var code = 'def ' + funcName + '(' + args.join(', ') + '):\n' + - globals + branch + returnValue; + globals + xfix1 + loopTrap + branch + xfix2 + returnValue; code = Blockly.Python.scrub_(block, code); // Add % so as not to collide with helper functions in definitions list. Blockly.Python.definitions_['%' + funcName] = code;