HS test generator: accept ES6 shorthand {foo} in run() locals

Several upstream regex-pick tests use JS ES6 shorthand to pass a
local declared earlier in the test body, e.g.

  const haystack = "..."
  await run(\`pick match of "\\\\d+" from haystack ...\`, {locals: {haystack}});

The generator's `(\\w+)\\s*:\\s*...` locals regex only matched explicit
`key: value` entries, so `{haystack}` produced zero local_pairs and the
HS script failed with "Undefined symbol: haystack". Now a second pass
scans for bare identifiers in the locals object and resolves each
against a preceding `const NAME = VALUE;` in the test body.

Net test-count is unchanged (the affected regex tests still fail — now
with TIMEOUT in the regex engine rather than Undefined-symbol, so this
just moves them closer to real coverage).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-22 22:13:19 +00:00
parent 7329b1d242
commit b2ae80fb21

View File

@@ -1125,6 +1125,21 @@ def generate_eval_only_test(test, idx):
lname = lm.group(1) lname = lm.group(1)
lval = js_val_to_sx(lm.group(2).strip().rstrip(',')) lval = js_val_to_sx(lm.group(2).strip().rstrip(','))
local_pairs.append((lname, lval)) local_pairs.append((lname, lval))
# Also accept ES6 shorthand `{foo}` (= `{foo: foo}`): for every
# bare identifier in locals_str not already captured, look up
# `const <name> = <value>;` earlier in the test body.
taken = {n for n, _ in local_pairs}
for sh in re.finditer(r'(?<![\w:])(\w+)(?![\w:])', locals_str):
lname = sh.group(1)
if lname in taken:
continue
const_match = re.search(
r'const\s+' + re.escape(lname) + r'\s*=\s*(.+?);',
body, re.DOTALL)
if const_match:
lval = js_val_to_sx(const_match.group(1).strip())
local_pairs.append((lname, lval))
taken.add(lname)
# SX list of (symbol value) pairs for eval-hs-locals # SX list of (symbol value) pairs for eval-hs-locals
locals_sx = '(list ' + ' '.join(f'(list (quote {n}) {v})' for n, v in local_pairs) + ')' if local_pairs else '(list)' locals_sx = '(list ' + ' '.join(f'(list (quote {n}) {v})' for n, v in local_pairs) + ')' if local_pairs else '(list)'