36533f7c3f
Fixes for new geth version
39 lines
1.3 KiB
Go
39 lines
1.3 KiB
Go
package obj
|
|
|
|
import (
|
|
"reflect"
|
|
|
|
"github.com/polydawn/refmt/obj/atlas"
|
|
. "github.com/polydawn/refmt/tok"
|
|
)
|
|
|
|
type unmarshalMachineTransform struct {
|
|
trFunc atlas.UnmarshalTransformFunc
|
|
recv_rt reflect.Type
|
|
delegate UnmarshalMachine // machine for handling the recv type, stepped to completion before transform applied.
|
|
|
|
target_rv reflect.Value // given on Reset, retained until last step, and set into after using trFunc
|
|
recv_rv reflect.Value // if set, handle to slot where slice is stored; content must be placed into target at end.
|
|
}
|
|
|
|
func (mach *unmarshalMachineTransform) Reset(slab *unmarshalSlab, rv reflect.Value, _ reflect.Type) error {
|
|
mach.target_rv = rv
|
|
mach.recv_rv = reflect.New(mach.recv_rt).Elem() // REVIEW: this behavior with ptr vs not for in_rt. the star-star case is prob not what want.
|
|
return mach.delegate.Reset(slab, mach.recv_rv, mach.recv_rt)
|
|
}
|
|
|
|
func (mach *unmarshalMachineTransform) Step(driver *Unmarshaller, slab *unmarshalSlab, tok *Token) (done bool, err error) {
|
|
done, err = mach.delegate.Step(driver, slab, tok)
|
|
if err != nil {
|
|
return
|
|
}
|
|
if !done {
|
|
return
|
|
}
|
|
// on the last step, use transform, and finally set in real target.
|
|
tr_rv, err := mach.trFunc(mach.recv_rv)
|
|
// do attempt the set even if error. user may appreciate partial progress.
|
|
mach.target_rv.Set(tr_rv)
|
|
return true, err
|
|
}
|