eth/tracers: optimize goja buffer conversion (#25156)

This changes the []byte <-> Uint8Array conversion to use an
ArrayBuffer, avoiding inefficient copying of the slice data in Goja.

Co-authored-by: Felix Lange <fjl@twurst.com>
This commit is contained in:
Sina Mahmoodi 2022-06-23 18:11:47 +02:00 committed by GitHub
parent 0f044f3433
commit 6135c688b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -55,11 +55,7 @@ type fromBufFn = func(vm *goja.Runtime, buf goja.Value, allowString bool) ([]byt
func toBuf(vm *goja.Runtime, bufType goja.Value, val []byte) (goja.Value, error) { func toBuf(vm *goja.Runtime, bufType goja.Value, val []byte) (goja.Value, error) {
// bufType is usually Uint8Array. This is equivalent to `new Uint8Array(val)` in JS. // bufType is usually Uint8Array. This is equivalent to `new Uint8Array(val)` in JS.
res, err := vm.New(bufType, vm.ToValue(val)) return vm.New(bufType, vm.ToValue(vm.NewArrayBuffer(val)))
if err != nil {
return nil, err
}
return vm.ToValue(res), nil
} }
func fromBuf(vm *goja.Runtime, bufType goja.Value, buf goja.Value, allowString bool) ([]byte, error) { func fromBuf(vm *goja.Runtime, bufType goja.Value, buf goja.Value, allowString bool) ([]byte, error) {
@ -70,6 +66,7 @@ func fromBuf(vm *goja.Runtime, bufType goja.Value, buf goja.Value, allowString b
break break
} }
return common.FromHex(obj.String()), nil return common.FromHex(obj.String()), nil
case "Array": case "Array":
var b []byte var b []byte
if err := vm.ExportTo(buf, &b); err != nil { if err := vm.ExportTo(buf, &b); err != nil {
@ -81,10 +78,7 @@ func fromBuf(vm *goja.Runtime, bufType goja.Value, buf goja.Value, allowString b
if !obj.Get("constructor").SameAs(bufType) { if !obj.Get("constructor").SameAs(bufType) {
break break
} }
var b []byte b := obj.Get("buffer").Export().(goja.ArrayBuffer).Bytes()
if err := vm.ExportTo(buf, &b); err != nil {
return nil, err
}
return b, nil return b, nil
} }
return nil, fmt.Errorf("invalid buffer type") return nil, fmt.Errorf("invalid buffer type")
@ -765,7 +759,7 @@ func (co *contractObj) GetValue() goja.Value {
} }
func (co *contractObj) GetInput() goja.Value { func (co *contractObj) GetInput() goja.Value {
input := co.contract.Input input := common.CopyBytes(co.contract.Input)
res, err := co.toBuf(co.vm, input) res, err := co.toBuf(co.vm, input)
if err != nil { if err != nil {
co.vm.Interrupt(err) co.vm.Interrupt(err)