$tLoop = { js : new Object(), //built in JS loops loop : new Object(), //loop-stop start : new Object(), //start-repeat ts : new Object(), //task switcher none : new Object() } $tAction = { br : {target : $tLoop.none}, cont : {target : $tLoop.none}, none : new Object() } $loopStack = [$tLoop.none]; $currentAction = $tAction.none; doOrPropagate = function(action, target, doWhat, propagateWhat) { return 'if ($loopStack.last() == ' + target+ ') { $currentAction.target = $tLoop.none; $currentAction = $tAction.none;' + doWhat + '; } else { $currentAction = ' + action + '; $currentAction.target = ' + target + ';' + propagateWhat + '; }' } enterLoop = function(loopType) { return 'try { $loopStack.push(' + loopType + ');'; } exitLoop = function() { return '} finally { $loopStack.pop(); if ($currentAction == $tAction.br) {' + doOrPropagate('$tAction.br', '$tAction.br.target', 'break', 'break') + ' } else if ($currentAction == $tAction.cont) {' + doOrPropagate('$tAction.cont', '$tAction.cont.target', 'continue', 'break') + ' } else { } }' } wrapLoop = function(loopType, loopStr) { return enterLoop(loopType) + loopStr + exitLoop() }