diff options
author | Himbeer <himbeer@disroot.org> | 2024-09-05 13:43:57 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-09-05 13:43:57 +0200 |
commit | c9dc7f17a33c87cb671f5313931438643ae6e4e0 (patch) | |
tree | 8627a7cbfc2b0279765b4f55ec63d51fd1591449 /parse.go | |
parent | ee2e07ea567b6eb66399389c88d73e2e1926298f (diff) |
Fix invalid top-level declaration errors causing a deadlock
Diffstat (limited to 'parse.go')
-rw-r--r-- | parse.go | 16 |
1 files changed, 11 insertions, 5 deletions
@@ -65,16 +65,22 @@ func (t *tokens) mustMatch(kind tokenKind) error { } func parse(toks *tokens, root chan<- *rootExpr, errs chan<- error) { - root <- parseRoot(toks, errs) + defer close(root) + + expr, err := parseRoot(toks, errs) + if err != nil { + errs <- err + } else { + root <- expr + } } -func parseRoot(toks *tokens, errs chan<- error) *rootExpr { +func parseRoot(toks *tokens, errs chan<- error) (*rootExpr, error) { toplevels := make([]expression, 0) for !toks.eof() { toplevel, err := parseToplevel(toks) if err != nil { - errs <- err - continue + return nil, err } if toplevel != nil { @@ -84,7 +90,7 @@ func parseRoot(toks *tokens, errs chan<- error) *rootExpr { return &rootExpr{ toplevels: toplevels, - } + }, nil } func parseToplevel(toks *tokens) (expression, error) { |