From 70f709841b9e5f68fb5ed200226907b6d55ad8e3 Mon Sep 17 00:00:00 2001 From: Laurent Demailly Date: Sun, 26 Jan 2025 13:44:56 -0800 Subject: [PATCH] Fix for panic on invalid arrays on left side of assignment (#280) * Fix for panic on invalid arrays on left side of assignement * bump deps including fortio/terminal --- eval/eval.go | 10 ++++++++-- eval/eval_test.go | 14 ++++++++++++++ go.mod | 14 +++++++------- go.sum | 24 ++++++++++++------------ 4 files changed, 41 insertions(+), 21 deletions(-) diff --git a/eval/eval.go b/eval/eval.go index 758c7a0..5ea86f4 100644 --- a/eval/eval.go +++ b/eval/eval.go @@ -23,11 +23,17 @@ func (s *State) evalAssignment(right object.Object, node *ast.InfixExpression) o } switch node.Left.Value().Type() { case token.DOT: - idxE := node.Left.(*ast.IndexExpression) + idxE, ok := node.Left.(*ast.IndexExpression) + if !ok { + return s.Errorf("assignment to non index . expression %T %s", node.Left, ast.DebugString(node.Left)) + } index := object.String{Value: idxE.Index.Value().Literal()} return s.evalIndexAssigment(idxE.Left, index, right) case token.LBRACKET: - idxE := node.Left.(*ast.IndexExpression) + idxE, ok := node.Left.(*ast.IndexExpression) + if !ok { + return s.Errorf("assignment to non index [] expression %T %v", node.Left, ast.DebugString(node.Left)) + } index := s.Eval(idxE.Index) return s.evalIndexAssigment(idxE.Left, index, right) case token.IDENT: diff --git a/eval/eval_test.go b/eval/eval_test.go index 52edef5..cb92f22 100644 --- a/eval/eval_test.go +++ b/eval/eval_test.go @@ -1051,3 +1051,17 @@ func TestDecrRegister(t *testing.T) { t.Errorf("wrong result, got %q", res.Inspect()) } } + +// Test for https://github.com/grol-io/grol/issues/276 +func TestArrayLeftNoPanic(t *testing.T) { + inp := `[]=0` + s := eval.NewState() + res, err := eval.EvalString(s, inp, false) + if err == nil { + t.Errorf("should have errored: %v", res) + } + expected := "" + if res.Inspect() != expected { + t.Errorf("wrong result, got %q", res.Inspect()) + } +} diff --git a/go.mod b/go.mod index 5fa6826..d3f26ab 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module grol.io/grol -go 1.23.3 +go 1.23.5 require ( fortio.org/cli v1.9.2 @@ -8,7 +8,7 @@ require ( fortio.org/safecast v1.0.0 fortio.org/sets v1.2.0 fortio.org/struct2env v0.4.1 - fortio.org/terminal v0.27.1 + fortio.org/terminal v0.27.2 fortio.org/testscript v0.3.2 // only for tests fortio.org/version v1.0.4 github.com/rivo/uniseg v0.4.7 @@ -16,10 +16,10 @@ require ( ) require ( - fortio.org/term v0.23.0-fortio-6 // indirect + fortio.org/term v0.29.0-fortio-1 // indirect github.com/kortschak/goroutine v1.1.2 // indirect - golang.org/x/crypto/x509roots/fallback v0.0.0-20240916204253-42ee18b96377 // indirect - golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect - golang.org/x/sys v0.27.0 // indirect - golang.org/x/tools v0.25.0 // indirect + golang.org/x/crypto/x509roots/fallback v0.0.0-20250118192723-a8ea4be81f07 // indirect + golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 // indirect + golang.org/x/sys v0.29.0 // indirect + golang.org/x/tools v0.29.0 // indirect ) diff --git a/go.sum b/go.sum index 38bbfe8..bc0003a 100644 --- a/go.sum +++ b/go.sum @@ -10,10 +10,10 @@ fortio.org/sets v1.2.0 h1:FBfC7R2xrOJtkcioUbY6WqEzdujuBoZRbSdp1fYF4Kk= fortio.org/sets v1.2.0/go.mod h1:J2BwIxNOLWsSU7IMZUg541kh3Au4JEKHrghVwXs68tE= fortio.org/struct2env v0.4.1 h1:rJludAMO5eBvpWplWEQNqoVDFZr4RWMQX7RUapgZyc0= fortio.org/struct2env v0.4.1/go.mod h1:lENUe70UwA1zDUCX+8AsO663QCFqYaprk5lnPhjD410= -fortio.org/term v0.23.0-fortio-6 h1:pKrUX0tKOxyEhkhLV50oJYucTVx94rzFrXc24lIuLvk= -fortio.org/term v0.23.0-fortio-6/go.mod h1:7buBfn81wEJUGWiVjFNiUE/vxWs5FdM9c7PyZpZRS30= -fortio.org/terminal v0.27.1 h1:4TQnDltqCrYEt653dXaX/r388Jj3YxahTEPmBj9MLWs= -fortio.org/terminal v0.27.1/go.mod h1:J7wmCkbBZhCNv3HPgctMOTI8WeJmoBE5BbkFzcXw19I= +fortio.org/term v0.29.0-fortio-1 h1:D1zHcUQurWucmqVO3WIAbAFZg6Hd+N20v78MEcZqcF4= +fortio.org/term v0.29.0-fortio-1/go.mod h1:fknYq/M01ez/1XHFSWTVODvzFe26JiP7IQFIFmTCJOo= +fortio.org/terminal v0.27.2 h1:kwr/SI1fCZ5iqHTWVhoWdzrNzrT7DJLg+BOsbG/D3As= +fortio.org/terminal v0.27.2/go.mod h1:2ep87Eza7dK4auM9SXWSfLoRcJd9dZIDXfA85uNvh34= fortio.org/testscript v0.3.2 h1:ks5V+Y6H6nmeGqnVlZuLdiFwpqXemDkEnyGgCZa/ZNA= fortio.org/testscript v0.3.2/go.mod h1:Z2kUvEDHYETV8FLxsdA6zwSZ8sZUiTNJh2Dw5c4a3Pg= fortio.org/version v1.0.4 h1:FWUMpJ+hVTNc4RhvvOJzb0xesrlRmG/a+D6bjbQ4+5U= @@ -22,13 +22,13 @@ github.com/kortschak/goroutine v1.1.2 h1:lhllcCuERxMIK5cYr8yohZZScL1na+JM5JYPRcl github.com/kortschak/goroutine v1.1.2/go.mod h1:zKpXs1FWN/6mXasDQzfl7g0LrGFIOiA6cLs9eXKyaMY= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -golang.org/x/crypto/x509roots/fallback v0.0.0-20240916204253-42ee18b96377 h1:aDWu69N3Si4isYMY1ppnuoGEFypX/E5l4MWA//GPClw= -golang.org/x/crypto/x509roots/fallback v0.0.0-20240916204253-42ee18b96377/go.mod h1:kNa9WdvYnzFwC79zRpLRMJbdEFlhyM5RPFBBZp/wWH8= -golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= -golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= +golang.org/x/crypto/x509roots/fallback v0.0.0-20250118192723-a8ea4be81f07 h1:Tuk3hxOkRoX4Xwph6/tRU1wGumEsVYM2TZfvAC6MllM= +golang.org/x/crypto/x509roots/fallback v0.0.0-20250118192723-a8ea4be81f07/go.mod h1:kNa9WdvYnzFwC79zRpLRMJbdEFlhyM5RPFBBZp/wWH8= +golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 h1:yqrTHse8TCMW1M1ZCP+VAR/l0kKxwaAIqN/il7x4voA= +golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= golang.org/x/image v0.23.0 h1:HseQ7c2OpPKTPVzNjG5fwJsOTCiiwS4QdsYi5XU6H68= golang.org/x/image v0.23.0/go.mod h1:wJJBTdLfCCf3tiHa1fNxpZmUI4mmoZvwMCPP0ddoNKY= -golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= -golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE= -golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= +golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588=