Skip to content

Instantly share code, notes, and snippets.

@bga
Created January 17, 2011 19:43
Show Gist options
  • Save bga/783338 to your computer and use it in GitHub Desktop.
Save bga/783338 to your computer and use it in GitHub Desktop.
// yield in es3
// original code
(function()
{
var _gen = function(a)
{
var d = '';
for(;;) {
if(a == 'a') {
d += a + a + a;
yield '1' + d;
yield '_1' + d;
} else if(a == 'b') {
d = a + a;
yield '2' + d;
} else {
d += a;
return '3' + d;
}
}
};
var _test = function()
{
console.log(_gen('a'));
console.log(_gen('a'));
console.log(_gen('b'));
console.log(_gen('c'));
console.log(_gen('a'));
}
})();
// 'generated' code (was manualy written by myself but i'll planning a real generator)
(function()
{
var _gen = (function()
{
var d, eip = -1; // context + eip
return function(a) {for(;;) { switch(eip) {
case -1: d = '';
case 0: /* for(;;) { */
/* if(a == 'a') { */ if(!(a == 'a')){ eip = 4; break; }
d += a + a + a;
case 1: /* yield '1' + d; */ eip = 2; return '1' + d;
case 2: /* yield '_1' + d; */ eip = 3; return '_1' + d;
case 3: eip = 8; break;
case 4: /* } else if(a == 'b') { */ if(!(a == 'b')){ eip = 7; break; }
d += a + a;
case 5: /* yield '2' + d; */ eip = 6; return '2' + d;
case 6: eip = 8; break;
case 7: /* } else { */
d += a;
/* return '3' + d; */ eip = -1; return '3' + d;
case 8: /* } */ eip = 9; break;
case 9: /* } */ eip = 0; break;
}}};
})();
var _test = function()
{
console.log(_gen('a'));
console.log(_gen('a'));
console.log(_gen('b'));
console.log(_gen('c'));
console.log(_gen('a'));
};
_test();
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment