Cache list value in JS foreach loops.

This commit is contained in:
Neil Fraser
2015-03-20 16:24:09 -07:00
parent c4d3fb721e
commit e571533f6a
3 changed files with 149 additions and 108 deletions

View File

@@ -111,7 +111,7 @@ Blockly.JavaScript['controls_for'] = function(block) {
// Cache non-trivial values to variables to prevent repeated look-ups.
var startVar = argument0;
if (!argument0.match(/^\w+$/) && !Blockly.isNumber(argument0)) {
var startVar = Blockly.JavaScript.variableDB_.getDistinctName(
startVar = Blockly.JavaScript.variableDB_.getDistinctName(
variable0 + '_start', Blockly.Variables.NAME_TYPE);
code += 'var ' + startVar + ' = ' + argument0 + ';\n';
}
@@ -152,12 +152,19 @@ Blockly.JavaScript['controls_forEach'] = function(block) {
Blockly.JavaScript.ORDER_ASSIGNMENT) || '[]';
var branch = Blockly.JavaScript.statementToCode(block, 'DO');
branch = Blockly.JavaScript.addLoopTrap(branch, block.id);
var code = '';
// Cache non-trivial values to variables to prevent repeated look-ups.
var listVar = argument0;
if (!argument0.match(/^\w+$/)) {
listVar = Blockly.JavaScript.variableDB_.getDistinctName(
variable0 + '_list', Blockly.Variables.NAME_TYPE);
code += 'var ' + listVar + ' = ' + argument0 + ';\n';
}
var indexVar = Blockly.JavaScript.variableDB_.getDistinctName(
variable0 + '_index', Blockly.Variables.NAME_TYPE);
branch = Blockly.JavaScript.INDENT + variable0 + ' = ' +
argument0 + '[' + indexVar + '];\n' + branch;
var code = 'for (var ' + indexVar + ' in ' + argument0 + ') {\n' +
branch + '}\n';
listVar + '[' + indexVar + '];\n' + branch;
code += 'for (var ' + indexVar + ' in ' + listVar + ') {\n' + branch + '}\n';
return code;
};