diff --git a/go.mod b/go.mod index 2da6bcfb6e7..1a01521e5bf 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/PuerkitoBio/goquery v1.8.0 github.com/Soontao/goHttpDigestClient v0.0.0-20170320082612-6d28bb1415c5 github.com/andybalholm/brotli v1.0.4 - github.com/dop251/goja v0.0.0-20230119130012-17fd568758fe + github.com/dop251/goja v0.0.0-20230128084908-78b980256d04 github.com/fatih/color v1.13.0 github.com/go-sourcemap/sourcemap v2.1.4-0.20211119122758-180fcef48034+incompatible github.com/golang/protobuf v1.5.2 diff --git a/go.sum b/go.sum index 1e961b6dc9a..6ab9f752b95 100644 --- a/go.sum +++ b/go.sum @@ -85,8 +85,8 @@ github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRP github.com/dop251/goja v0.0.0-20220405120441-9037c2b61cbf/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= github.com/dop251/goja v0.0.0-20221003171542-5ea1285e6c91/go.mod h1:yRkwfj0CBpOGre+TwBsqPV0IH0Pk73e4PXJOeNDboGs= github.com/dop251/goja v0.0.0-20221106173738-3b8a68ca89b4/go.mod h1:yRkwfj0CBpOGre+TwBsqPV0IH0Pk73e4PXJOeNDboGs= -github.com/dop251/goja v0.0.0-20230119130012-17fd568758fe h1:PsLX9tWRxptk4COd23DJ0bnbXRKPDvBP+A6740Ndxp0= -github.com/dop251/goja v0.0.0-20230119130012-17fd568758fe/go.mod h1:yRkwfj0CBpOGre+TwBsqPV0IH0Pk73e4PXJOeNDboGs= +github.com/dop251/goja v0.0.0-20230128084908-78b980256d04 h1:iQQgQ1wBsFmpu6OjINCY2ekdknKNNpxO/GOzzww2Amk= +github.com/dop251/goja v0.0.0-20230128084908-78b980256d04/go.mod h1:yRkwfj0CBpOGre+TwBsqPV0IH0Pk73e4PXJOeNDboGs= github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= diff --git a/vendor/github.com/dop251/goja/func.go b/vendor/github.com/dop251/goja/func.go index e56ab267cad..23c5ea87639 100644 --- a/vendor/github.com/dop251/goja/func.go +++ b/vendor/github.com/dop251/goja/func.go @@ -733,9 +733,7 @@ func (g *generator) step() (res Value, resultType resultType, ex *Exception) { g.ctx = execCtx{} g.vm.pc = -g.vm.pc + 1 res = g.vm.pop() - g.vm.suspend(&g.ctx, uint32(len(g.vm.tryStack))-g.tryStackLen, - uint32(len(g.vm.iterStack))-g.iterStackLen, - uint32(len(g.vm.refStack))-g.refStackLen) + g.vm.suspend(&g.ctx, g.tryStackLen, g.iterStackLen, g.refStackLen) g.vm.sp = g.vm.sb - 1 g.vm.callStack = g.vm.callStack[:len(g.vm.callStack)-1] // remove the frame with pc == -2, as ret would do } diff --git a/vendor/github.com/dop251/goja/parser/expression.go b/vendor/github.com/dop251/goja/parser/expression.go index 2b2243c50c4..c60c8b2b154 100644 --- a/vendor/github.com/dop251/goja/parser/expression.go +++ b/vendor/github.com/dop251/goja/parser/expression.go @@ -404,9 +404,10 @@ func (self *_parser) parseObjectProperty() ast.Property { switch { case self.token == token.LEFT_PARENTHESIS: return &ast.PropertyKeyed{ - Key: value, - Kind: ast.PropertyKindMethod, - Value: self.parseMethodDefinition(keyStartIdx, ast.PropertyKindMethod, false), + Key: value, + Kind: ast.PropertyKindMethod, + Value: self.parseMethodDefinition(keyStartIdx, ast.PropertyKindMethod, false), + Computed: tkn == token.ILLEGAL, } case self.token == token.COMMA || self.token == token.RIGHT_BRACE || self.token == token.ASSIGN: // shorthand property if self.isBindingId(tkn) { @@ -428,7 +429,7 @@ func (self *_parser) parseObjectProperty() ast.Property { self.errorUnexpectedToken(self.token) } case (literal == "get" || literal == "set" || tkn == token.ASYNC) && self.token != token.COLON: - _, _, keyValue, _ := self.parseObjectPropertyKey() + _, _, keyValue, tkn1 := self.parseObjectPropertyKey() if keyValue == nil { return nil } @@ -445,9 +446,10 @@ func (self *_parser) parseObjectProperty() ast.Property { } return &ast.PropertyKeyed{ - Key: keyValue, - Kind: kind, - Value: self.parseMethodDefinition(keyStartIdx, kind, async), + Key: keyValue, + Kind: kind, + Value: self.parseMethodDefinition(keyStartIdx, kind, async), + Computed: tkn1 == token.ILLEGAL, } } } @@ -849,6 +851,9 @@ func (self *_parser) parseUnaryExpression() ast.Expression { To: self.idx, } } + if self.scope.inFuncParams { + self.error(idx, "Illegal await-expression in formal parameters of async function") + } return &ast.AwaitExpression{ Await: idx, Argument: self.parseUnaryExpression(), diff --git a/vendor/github.com/dop251/goja/parser/scope.go b/vendor/github.com/dop251/goja/parser/scope.go index 024837a70b9..6aae97d144d 100644 --- a/vendor/github.com/dop251/goja/parser/scope.go +++ b/vendor/github.com/dop251/goja/parser/scope.go @@ -11,6 +11,7 @@ type _scope struct { allowLet bool inIteration bool inSwitch bool + inFuncParams bool inFunction bool inAsync bool allowAwait bool diff --git a/vendor/github.com/dop251/goja/parser/statement.go b/vendor/github.com/dop251/goja/parser/statement.go index 29d1578a966..de6cd3346bc 100644 --- a/vendor/github.com/dop251/goja/parser/statement.go +++ b/vendor/github.com/dop251/goja/parser/statement.go @@ -167,16 +167,19 @@ func (self *_parser) parseFunctionParameterList() *ast.ParameterList { opening := self.expect(token.LEFT_PARENTHESIS) var list []*ast.Binding var rest ast.Expression + if !self.scope.inFuncParams { + self.scope.inFuncParams = true + defer func() { + self.scope.inFuncParams = false + }() + } for self.token != token.RIGHT_PARENTHESIS && self.token != token.EOF { if self.token == token.ELLIPSIS { self.next() rest = self.reinterpretAsDestructBindingTarget(self.parseAssignmentExpression()) break } - item := self.parseVariableDeclaration(&list) - if _, ok := item.Initializer.(*ast.AwaitExpression); ok { - self.error(item.Idx0(), "Illegal await-expression in formal parameters of async function") - } + self.parseVariableDeclaration(&list) if self.token != token.RIGHT_PARENTHESIS { self.expect(token.COMMA) } diff --git a/vendor/github.com/dop251/goja/runtime.go b/vendor/github.com/dop251/goja/runtime.go index 468113498da..14f1841b2bb 100644 --- a/vendor/github.com/dop251/goja/runtime.go +++ b/vendor/github.com/dop251/goja/runtime.go @@ -1444,6 +1444,7 @@ func (r *Runtime) RunProgram(p *Program) (result Value, err error) { recursive := len(vm.callStack) > 0 defer func() { if recursive { + vm.sp -= 2 vm.popCtx() } else { vm.callStack = vm.callStack[:len(vm.callStack)-1] @@ -1462,7 +1463,12 @@ func (r *Runtime) RunProgram(p *Program) (result Value, err error) { if recursive { vm.pushCtx() vm.stash = &r.global.stash - vm.sb = vm.sp - 1 + sp := vm.sp + vm.stack.expand(sp + 1) + vm.stack[sp] = _undefined // 'callee' + vm.stack[sp+1] = nil // 'this' + vm.sb = sp + 1 + vm.sp = sp + 2 } else { vm.callStack = append(vm.callStack, context{}) } diff --git a/vendor/github.com/dop251/goja/vm.go b/vendor/github.com/dop251/goja/vm.go index 06d28120164..3a50fd3dd68 100644 --- a/vendor/github.com/dop251/goja/vm.go +++ b/vendor/github.com/dop251/goja/vm.go @@ -66,10 +66,9 @@ type execCtx struct { func (vm *vm) suspend(ectx *execCtx, tryStackLen, iterStackLen, refStackLen uint32) { vm.saveCtx(&ectx.context) ectx.stack = append(ectx.stack[:0], vm.stack[vm.sb-1:vm.sp]...) - if tryStackLen > 0 { - l := len(vm.tryStack) - int(tryStackLen) - ectx.tryStack = append(ectx.tryStack[:0], vm.tryStack[l:]...) - vm.tryStack = vm.tryStack[:l] + if len(vm.tryStack) > int(tryStackLen) { + ectx.tryStack = append(ectx.tryStack[:0], vm.tryStack[tryStackLen:]...) + vm.tryStack = vm.tryStack[:tryStackLen] sp := int32(vm.sb - 1) for i := range ectx.tryStack { tf := &ectx.tryStack[i] @@ -78,15 +77,13 @@ func (vm *vm) suspend(ectx *execCtx, tryStackLen, iterStackLen, refStackLen uint tf.sp -= sp } } - if iterStackLen > 0 { - l := len(vm.iterStack) - int(iterStackLen) - ectx.iterStack = append(ectx.iterStack[:0], vm.iterStack[l:]...) - vm.iterStack = vm.iterStack[:l] + if len(vm.iterStack) > int(iterStackLen) { + ectx.iterStack = append(ectx.iterStack[:0], vm.iterStack[iterStackLen:]...) + vm.iterStack = vm.iterStack[:iterStackLen] } - if refStackLen > 0 { - l := len(vm.refStack) - int(refStackLen) - ectx.refStack = append(ectx.refStack[:0], vm.refStack[l:]...) - vm.refStack = vm.refStack[:l] + if len(vm.refStack) > int(refStackLen) { + ectx.refStack = append(ectx.refStack[:0], vm.refStack[refStackLen:]...) + vm.refStack = vm.refStack[:refStackLen] } } diff --git a/vendor/modules.txt b/vendor/modules.txt index 0088c5e888c..0efee0ae0d8 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -32,7 +32,7 @@ github.com/dgryski/go-rendezvous ## explicit; go 1.13 github.com/dlclark/regexp2 github.com/dlclark/regexp2/syntax -# github.com/dop251/goja v0.0.0-20230119130012-17fd568758fe +# github.com/dop251/goja v0.0.0-20230128084908-78b980256d04 ## explicit; go 1.16 github.com/dop251/goja github.com/dop251/goja/ast