@@ -34,13 +34,11 @@ var (
3434func PatchMethod (target , redirection interface {}) (* Patch , error ) {
3535 tValue := getValueFrom (target )
3636 rValue := getValueFrom (redirection )
37- err := isPatchable (& tValue , & rValue )
38- if err != nil {
37+ if err := isPatchable (& tValue , & rValue ); err != nil {
3938 return nil , err
4039 }
4140 patch := & Patch {target : & tValue , redirection : & rValue }
42- err = applyPatch (patch )
43- if err != nil {
41+ if err := applyPatch (patch ); err != nil {
4442 return nil , err
4543 }
4644 return patch , nil
@@ -54,37 +52,32 @@ func PatchInstanceMethodByName(target reflect.Type, methodName string, redirecti
5452 if ! ok {
5553 return nil , errors .New (fmt .Sprintf ("Method '%v' not found" , methodName ))
5654 }
57- return PatchMethodByReflect (method , redirection )
55+ return PatchMethodByReflect (method . Func , redirection )
5856}
59- func PatchMethodByReflect (target reflect.Method , redirection interface {}) (* Patch , error ) {
60- tValue := & target . Func
57+ func PatchMethodByReflect (target reflect.Value , redirection interface {}) (* Patch , error ) {
58+ tValue := & target
6159 rValue := getValueFrom (redirection )
62- err := isPatchable (tValue , & rValue )
63- if err != nil {
60+ if err := isPatchable (tValue , & rValue ); err != nil {
6461 return nil , err
6562 }
6663 patch := & Patch {target : tValue , redirection : & rValue }
67- err = applyPatch (patch )
68- if err != nil {
64+ if err := applyPatch (patch ); err != nil {
6965 return nil , err
7066 }
7167 return patch , nil
7268}
73- func PatchMethodWithMakeFunc (target reflect.Method , fn func (args []reflect.Value ) (results []reflect.Value )) (* Patch , error ) {
74- rValue := reflect .MakeFunc (target .Type , fn )
75- return PatchMethodByReflect (target , rValue )
69+ func PatchMethodWithMakeFunc (target reflect.Value , fn func (args []reflect.Value ) (results []reflect.Value )) (* Patch , error ) {
70+ return PatchMethodByReflect (target , reflect .MakeFunc (target .Type (), fn ))
7671}
7772
7873func (p * Patch ) Patch () error {
7974 if p == nil {
8075 return errors .New ("patch is nil" )
8176 }
82- err := isPatchable (p .target , p .redirection )
83- if err != nil {
77+ if err := isPatchable (p .target , p .redirection ); err != nil {
8478 return err
8579 }
86- err = applyPatch (p )
87- if err != nil {
80+ if err := applyPatch (p ); err != nil {
8881 return err
8982 }
9083 return nil
@@ -103,7 +96,7 @@ func isPatchable(target, redirection *reflect.Value) error {
10396 if target .Type () != redirection .Type () {
10497 return errors .New (fmt .Sprintf ("the target and/or redirection doesn't have the same type: %s != %s" , target .Type (), redirection .Type ()))
10598 }
106- if _ , ok := patches [getSafePointer (target )]; ok {
99+ if _ , ok := patches [getSafeCodePointer (target )]; ok {
107100 return errors .New ("the target is already patched" )
108101 }
109102 return nil
@@ -112,7 +105,7 @@ func isPatchable(target, redirection *reflect.Value) error {
112105func applyPatch (patch * Patch ) error {
113106 patchLock .Lock ()
114107 defer patchLock .Unlock ()
115- tPointer := getSafePointer (patch .target )
108+ tPointer := getSafeCodePointer (patch .target )
116109 rPointer := getInternalPtrFromValue (patch .redirection )
117110 rPointerJumpBytes , err := getJumpFuncBytes (rPointer )
118111 if err != nil {
@@ -121,8 +114,7 @@ func applyPatch(patch *Patch) error {
121114 tPointerBytes := getMemorySliceFromPointer (tPointer , len (rPointerJumpBytes ))
122115 targetBytes := make ([]byte , len (tPointerBytes ))
123116 copy (targetBytes , tPointerBytes )
124- err = copyDataToPtr (tPointer , rPointerJumpBytes )
125- if err != nil {
117+ if err := copyDataToPtr (tPointer , rPointerJumpBytes ); err != nil {
126118 return err
127119 }
128120 patch .targetBytes = targetBytes
@@ -136,7 +128,7 @@ func applyUnpatch(patch *Patch) error {
136128 if patch .targetBytes == nil || len (patch .targetBytes ) == 0 {
137129 return errors .New ("the target is not patched" )
138130 }
139- tPointer := getSafePointer (patch .target )
131+ tPointer := getSafeCodePointer (patch .target )
140132 if _ , ok := patches [tPointer ]; ! ok {
141133 return errors .New ("the target is not patched" )
142134 }
@@ -164,7 +156,7 @@ func getMemorySliceFromPointer(p unsafe.Pointer, length int) []byte {
164156 }))
165157}
166158
167- func getSafePointer (value * reflect.Value ) unsafe.Pointer {
159+ func getSafeCodePointer (value * reflect.Value ) unsafe.Pointer {
168160 p := getInternalPtrFromValue (value )
169161 if p != nil {
170162 p = * (* unsafe .Pointer )(p )
0 commit comments