From a7666f0e7d8f15845b70430e0a86592199b09a75 Mon Sep 17 00:00:00 2001
From: Mikael Ganehag Brorsson <mikael.brorsson@gmail.com>
Date: Sun, 14 Nov 2021 00:10:47 +0100
Subject: [PATCH] Handle panics by deferring recover as an error (#345)

* Handle panics by deferring recover as an error

* Check for type in recover handler
---
 script.go | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/script.go b/script.go
index 73dde31..82b02f5 100644
--- a/script.go
+++ b/script.go
@@ -219,6 +219,18 @@ func (c *Compiled) RunContext(ctx context.Context) (err error) {
 	v := NewVM(c.bytecode, c.globals, c.maxAllocs)
 	ch := make(chan error, 1)
 	go func() {
+		defer func() {
+			if r := recover(); r != nil {
+				switch e := r.(type) {
+				case string:
+					ch <- fmt.Errorf(e)
+				case error:
+					ch <- e
+				default:
+					ch <- fmt.Errorf("unknown panic: %v", e)
+				}
+			}
+		}()
 		ch <- v.Run()
 	}()