9
9
10
10
package py
11
11
12
+ import (
13
+ "fmt"
14
+ )
15
+
12
16
// Types for methods
13
17
14
18
// Called with self and a tuple of args
@@ -143,7 +147,7 @@ func (m *Method) Call(self Object, args Tuple) (Object, error) {
143
147
}
144
148
return f (self , args [0 ])
145
149
}
146
- panic ("Unknown method type" )
150
+ panic (fmt . Sprintf ( "Unknown method type: %T" , m . method ) )
147
151
}
148
152
149
153
// Call the method with the given arguments
@@ -159,7 +163,70 @@ func (m *Method) CallWithKeywords(self Object, args Tuple, kwargs StringDict) (O
159
163
func (Object , Object ) (Object , error ):
160
164
return nil , ExceptionNewf (TypeError , "%s() takes no keyword arguments" , m .Name )
161
165
}
162
- panic ("Unknown method type" )
166
+ panic (fmt .Sprintf ("Unknown method type: %T" , m .method ))
167
+ }
168
+
169
+ // Return a new Method with the bound method passed in, or an error
170
+ //
171
+ // This needs to convert the methods into internally callable python
172
+ // methods
173
+ func newBoundMethod (name string , fn interface {}) (Object , error ) {
174
+ m := & Method {
175
+ Name : name ,
176
+ }
177
+ switch f := fn .(type ) {
178
+ case func (args Tuple ) (Object , error ):
179
+ m .method = func (_ Object , args Tuple ) (Object , error ) {
180
+ return f (args )
181
+ }
182
+ // M__call__(args Tuple, kwargs StringDict) (Object, error)
183
+ case func (args Tuple , kwargs StringDict ) (Object , error ):
184
+ m .method = func (_ Object , args Tuple , kwargs StringDict ) (Object , error ) {
185
+ return f (args , kwargs )
186
+ }
187
+ // M__str__() (Object, error)
188
+ case func () (Object , error ):
189
+ m .method = func (_ Object ) (Object , error ) {
190
+ return f ()
191
+ }
192
+ // M__add__(other Object) (Object, error)
193
+ case func (Object ) (Object , error ):
194
+ m .method = func (_ Object , other Object ) (Object , error ) {
195
+ return f (other )
196
+ }
197
+ // M__getattr__(name string) (Object, error)
198
+ case func (string ) (Object , error ):
199
+ m .method = func (_ Object , stringObject Object ) (Object , error ) {
200
+ name , err := StrAsString (stringObject )
201
+ if err != nil {
202
+ return nil , err
203
+ }
204
+ return f (name )
205
+ }
206
+ // M__get__(instance, owner Object) (Object, error)
207
+ case func (Object , Object ) (Object , error ):
208
+ m .method = func (_ Object , args Tuple ) (Object , error ) {
209
+ var a , b Object
210
+ err := UnpackTuple (args , nil , name , 2 , 2 , & a , & b )
211
+ if err != nil {
212
+ return nil , err
213
+ }
214
+ return f (a , b )
215
+ }
216
+ // M__new__(cls, args, kwargs Object) (Object, error)
217
+ case func (Object , Object , Object ) (Object , error ):
218
+ m .method = func (_ Object , args Tuple ) (Object , error ) {
219
+ var a , b , c Object
220
+ err := UnpackTuple (args , nil , name , 3 , 3 , & a , & b , & c )
221
+ if err != nil {
222
+ return nil , err
223
+ }
224
+ return f (a , b , c )
225
+ }
226
+ default :
227
+ return nil , fmt .Errorf ("Unknown bound method type for %q: %T" , name , fn )
228
+ }
229
+ return m , nil
163
230
}
164
231
165
232
// Call a method
0 commit comments