Защита от бесконечной петли - PullRequest
1 голос
/ 06 марта 2019

Я работаю над редактором кода JavaScript, где пользователи могут написать свой собственный код JavaScript в браузере и запустить его.Мне нужно найти способ вырваться из бесконечных петель.Когда мне дают код:

while (1) {
    doSomething();
}

Я хочу преобразовать код в нечто вроде этого:

var start = Date.now();
while (1) {
    if (Date.now() - start > 1000) { break; }
    doSomething();
}

Я наткнулся на Web-Maker, , который имеет функциюэто делает именно это .Я не смог получить функцию для преобразования переданного кода. Я попытался addInfiniteLoopProtection('while (1) doSomething()', { timeout: 1000 }), но он возвращает 'while (1) doSomething()' вместо изменения кода, чтобы выйти из бесконечного цикла.

Вотмоя попытка на codepen

1 Ответ

0 голосов
/ 07 марта 2019

Я нашел loop-protect .Установите Babel в автономном режиме и защитите цикл с помощью npm:

npm i @babel/standalone loop-protect

Затем добавьте код JavaScript:

import Babel from '@babel/standalone';
import protect from 'loop-protect';

const timeout = 100;
Babel.registerPlugin('loopProtection', protect(timeout));

const transform = source => Babel.transform(source, {
  plugins: ['loopProtection'],
}).code;

transform('while (1) doSomething()') возвращает строку:

var _LP = Date.now();

while (1) {
  if (Date.now() - _LP > 100) break;
  doSomething();
}
...