disable loop protection inside generators (#4716)

pull/4761/head
Billy Levin 4 years ago committed by GitHub
parent edeeb05a6c
commit 3d811311b7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -714,8 +714,14 @@ export default class Component {
};
let scope_updated = false;
let generator_count = 0;
walk(content, {
enter(node: Node, parent, prop, index) {
if ((node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression') && node.generator === true) {
generator_count++;
}
if (map.has(node)) {
scope = map.get(node);
}
@ -742,8 +748,12 @@ export default class Component {
},
leave(node: Node) {
if ((node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression') && node.generator === true) {
generator_count--;
}
// do it on leave, to prevent infinite loop
if (component.compile_options.dev && component.compile_options.loopGuardTimeout > 0) {
if (component.compile_options.dev && component.compile_options.loopGuardTimeout > 0 && generator_count <= 0) {
const to_replace_for_loop_protect = component.loop_protect(node, scope, component.compile_options.loopGuardTimeout);
if (to_replace_for_loop_protect) {
this.replace(to_replace_for_loop_protect);

@ -0,0 +1,6 @@
export default {
compileOptions: {
dev: true,
loopGuardTimeout: 1,
},
};

@ -0,0 +1,14 @@
<script>
const it = gen();
it.next();
setTimeout(() => {
it.next();
}, 20)
function* gen() {
while (true) {
yield;
}
}
</script>
Loading…
Cancel
Save