diff --git a/eth/tracers/js/goja.go b/eth/tracers/js/goja.go index a7db4d127a..e96a672244 100644 --- a/eth/tracers/js/goja.go +++ b/eth/tracers/js/goja.go @@ -22,6 +22,7 @@ import ( "fmt" "math/big" "slices" + "sync" "github.com/XinFinOrg/XDPoSChain/common" "github.com/XinFinOrg/XDPoSChain/common/hexutil" @@ -57,9 +58,17 @@ func init() { tracers.DefaultDirectory.RegisterJSEval(newJsTracer) } -// bigIntProgram is compiled once and the exported function mostly invoked to convert -// hex strings into big ints. -var bigIntProgram = goja.MustCompile("bigInt", bigIntegerJS, false) +var compiledBigInt *goja.Program +var compileOnce sync.Once + +// getBigIntProgram compiles the bigint library, if needed, and returns the compiled +// goja program. +func getBigIntProgram() *goja.Program { + compileOnce.Do(func() { + compiledBigInt = goja.MustCompile("bigInt", bigIntegerJS, false) + }) + return compiledBigInt +} type toBigFn = func(vm *goja.Runtime, val string) (goja.Value, error) type toBufFn = func(vm *goja.Runtime, val []byte) (goja.Value, error) @@ -563,7 +572,7 @@ func (t *jsTracer) setBuiltinFunctions() { func (t *jsTracer) setTypeConverters() error { // Inject bigint logic. // TODO: To be replaced after goja adds support for native JS bigint. - toBigCode, err := t.vm.RunProgram(bigIntProgram) + toBigCode, err := t.vm.RunProgram(getBigIntProgram()) if err != nil { return err }