Skip to content

Allow return at the top level of a js_eval snippet#78

Open
I-Connect wants to merge 2 commits into
cesanta:masterfrom
I-Connect:allow-toplevel-return
Open

Allow return at the top level of a js_eval snippet#78
I-Connect wants to merge 2 commits into
cesanta:masterfrom
I-Connect:allow-toplevel-return

Conversation

@I-Connect

Copy link
Copy Markdown

Previously, a return statement outside a function call failed with
"not in func". This is inconvenient for embedded use cases where user
code is passed directly to js_eval (not wrapped in a function) and a
natural early-exit idiom is:

if (cond) { return; }

js_return now treats a top-level return as "end of snippet": it
jumps pos to clen, so the remainder of the code is skipped.
F_RETURN is still set only inside a function call (F_CALL), so the
flag never leaks into subsequent top-level js_eval calls and
call_js's existing check at the end of a function body continues to
work unchanged.

The value-less form (return, return;, return}, return<EOF>) now
also exits the snippet — upstream only did this when a value
expression followed, which made the idiomatic return; silently
fall through instead of short-circuiting.

Unit tests updated to assert the new top-level behaviour alongside the
existing function-body tests.

Bascy and others added 2 commits April 22, 2026 15:16
Previously, a `return` statement outside a function call failed with
"not in func". This is inconvenient for embedded use cases where user
code is passed directly to `js_eval` (not wrapped in a function) and a
natural early-exit idiom is:

    if (cond) { return; }

`js_return` now treats a top-level `return` as "end of snippet": it
jumps `pos` to `clen`, so the remainder of the code is skipped.
`F_RETURN` is still set only inside a function call (`F_CALL`), so the
flag never leaks into subsequent top-level `js_eval` calls and
`call_js`'s existing check at the end of a function body continues to
work unchanged.

The value-less form (`return`, `return;`, `return}`, `return<EOF>`) now
also exits the snippet — upstream only did this when a value
expression followed, which made the idiomatic `return;` silently
fall through instead of short-circuiting.

Unit tests updated to assert the new top-level behaviour alongside the
existing function-body tests.
Adds a "Top-level `return`" section that explains the supported
behaviour, gives `js_eval` examples (bare `return`, `return;`,
`return <expr>;`, block-wrapped, and short-circuit), and notes that
`F_RETURN` is still scoped to `F_CALL` so function-body return
semantics are unchanged. Also adds a one-liner to the supported
features list with a forward link to the new section.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants