Skip to content

Add basic visitor support#17

Closed
etcinitd wants to merge 1 commit into
expr-lang:masterfrom
etcinitd:feature/visitor
Closed

Add basic visitor support#17
etcinitd wants to merge 1 commit into
expr-lang:masterfrom
etcinitd:feature/visitor

Conversation

@etcinitd

@etcinitd etcinitd commented Dec 6, 2018

Copy link
Copy Markdown

Not ready to merge yet!
Hi @antonmedv
I needed a feature that allows me to walk the parsed AST (without evaluation) to find variables and functions used in an expression. This was my first try that I wanted to get your opinions on.
What do you think? Is it the right approach? How can I make it good enough to be merged into the upstream master?
Cheers,
Amir

@antonmedv

Copy link
Copy Markdown
Member

I was thinking about adding visitor myself. But still haven't found time for this. Will be cool to see API there custom visitor can define only needed nodes wishing to visit.

See babel for example, pretty cool implementation.

@etcinitd

Copy link
Copy Markdown
Author

Then we need some form of defining node types, I guess. For example, we can make node structs exported. Any other ideas?

@antonmedv

Copy link
Copy Markdown
Member

If visitor will be added, AST nodes must be exported.

@antonmedv

Copy link
Copy Markdown
Member

Will be solved in #21

@antonmedv antonmedv closed this May 23, 2019
blitzy Bot pushed a commit to blitzy-research/expr that referenced this pull request Jul 16, 2026
Resolves all 19 QA review findings for the try/catch/finally/retry,
throw, errtype, and lazy try(expr, fallback) error-handling feature.

CRITICAL:
- #1 VM: add Program.verify() operand-domain + typed-constant + jump-target
  validation on the handler path; malformed programs become non-catchable
  fatal errors instead of catchable panics.
- #2 VM: validate handler-frame targets (OpTry catch strictly-forward,
  in-range, lands on OpCatch/OpPopHandler; OpSetupFinally lands on
  OpFinallyStart) in verify(); add 6 runtime phase guards + balanced-handler
  completion check.
- expr-lang#3 VM/builtin: control/safety errors (context.Canceled/DeadlineExceeded,
  ErrorMaxDepth, ErrMemoryBudget) are non-catchable via isNonRecoverable
  gate; add ErrMemoryBudget sentinel used by repeat().

MAJOR:
- expr-lang#4 VM: recovered panic(nil) is reported (panicNilError sentinel +
  finishedNormally/completed flags at both recover boundaries), not swallowed.
- expr-lang#5 builtin: panic-safe recovery-path message extraction (safeMessage +
  typed-nil guard) so a hostile Error()/typed-nil never escapes handleRecover.
- expr-lang#6 builtin/VM: retain original cause (unexported field + Cause() accessor);
  top-level recover wraps the cause so host errors.Is/As work; privacy
  invariant preserved (no Unwrap).
- expr-lang#7 VM: clear reclaimed scope/scopePool/Scopes slots to prevent cross-run
  value retention.
- expr-lang#8 builtin: classifyError bounded-BFS over Unwrap() error and []error;
  validCategory guard; non-error input -> custom.
- expr-lang#9 builtin: Type() returns "error" for RuntimeError (no internal-type leak
  on the Eval path).
- expr-lang#16 compiler tests: exact Bytecode/Arguments/disassembly + handler
  target/balance invariants for try/catch/finally/retry and lazy try().
- expr-lang#17 tests: fill public-API required-path gaps (fallback-error propagation,
  finally-after-catch-body-failure, retry-exhaustion-through-finally,
  errors.Is/As) plus adversarial/structural coverage.
- expr-lang#18 VM: restore no-handler fast path (hasHandler metadata + execute()
  extraction) and re-inline hot helpers via pre-built *fatalError sentinels;
  reuseVm back to pre-feature parity (~73 ns/op).
- expr-lang#19 builtin/expr: preserve backward-compat env overrides of try/throw/errtype
  in Eval via ErrorHandlingBuiltins + narrow parseForEval override detection.

MINOR:
- expr-lang#10/expr-lang#11 optimizer: single-pass O(N) protected-region marker; pass protected
  set to constExpr so lazy/catchable subtrees are never constant-folded.
- expr-lang#12 parser: reject bare try (no catch and no finally) with a source-anchored
  error at the try token.
- expr-lang#13 parser: reject reserved catch binding name "retry" with a precise
  diagnostic.
- expr-lang#14 ast: parenthesize TryCatchNode/ConditionalNode when rendered as a call
  callee / unary operand so printed source re-parses.
- expr-lang#15 docs: correct error-handling documentation (bare-try invalid, contextual
  retry, fatal-finally override, errtype classifier contract).

Validation: go build . / go vet ./... clean; go test ./... 56 ok / 0 FAIL;
race-clean; -tags=expr_debug TestDebugger pass; gofmt clean on all touched
files. No new third-party dependencies. Full backward compatibility preserved.
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