precheckBlocks
doesn't handle nested IF
blocks properly. This means multiple nested IF
s with missing END
won't be caught as unclosed blocks and could result in misaligned execution (skipping lines or running too far).
Suspected Problem: if (/^IF\s+(.+)\s+THN\s*$/) { ... }
safeEval
variable replacement may break string literals. If the user has a string like "do this"
it might accidentally replace do
inside quotes with __V["do"]
, leading to syntax errors.
Suspected Problem: const replaced = transformed.replace(/\b([A-Za-z_]\w*)\b/g, ...);
collectBlock
doesn’t advance main index inside -c + N =
loops. We never set i = endIndex
after processing, which means: after running the loop, execution continues through the block a second time as if it was normal code, and we could accidentally double execute.
Suspected Problem: const { block, endIndex } = collectBlock(number);
Uncaught errors break async execution silently. Inside executeLine
, the interpreter throw err
after catching, but the outer try
just swallows it. This could be the reason why errors that aren't hardcoded into executeLine
don't show errors in the console, it just stops the execution and throws an error in console. No idea where exactly the suspected problem is
math.Add/Sub/Mul/Div
regex is too strict. This only allows a single binary operation such as 2 + 5, it won't allow more digits, such as 2 + 5 + 4, or nested do Var + 3 * 2
won't work. Also, division by zero is not caught, it could throw infinity
.
Suspected Problem: const parts = expr.match(/^(do\s+[A-Za-z_]\w*|\d+(?:\.\d+)?)\s*([\+\-\*\/])\s*(do\s+[A-Za-z_]\w*|\d+(?:\.\d+)?)$/i);
.
Button leaks if the user runs multiple times fast. If the user spam run
, cleanupRuntime()
removes buttons but the event listeners are still attached because we don't call btn.removeEventListener
before removing them. This is a memory leak. No idea where the suspected problem is.
Edge case: empty code still highlights first line. If editor is empty, queue[0]
is undefined = crash.
Suspected Problem: if (queue.length === 0 || queue[0].line !== "STR")
Expression parser (parseConcatExpression
) fails on escaped quotes. If you have, for example, RRI("Hello \"World\"")
the function will toggle quotes incorrectly because it doesn't account for /"
.
No idea where the suspected problem is.
window.fetchDiagnostics
is global (yipes). We expose window.fetchDiagnostics
directly which could be abused from browser console to spam logs.
No idea where the suspected problem is.
"cringe" lyric output never clears output. If you run another script after cringe
the old lyric timer keeps running and keeps appending to output.
No idea where the suspected problem is.