99
1010package py
1111
12+ import (
13+ "fmt"
14+ )
15+
1216// Types for methods
1317
1418// Called with self and a tuple of args
@@ -143,7 +147,7 @@ func (m *Method) Call(self Object, args Tuple) (Object, error) {
143147 }
144148 return f (self , args [0 ])
145149 }
146- panic ("Unknown method type" )
150+ panic (fmt . Sprintf ( "Unknown method type: %T" , m . method ) )
147151}
148152
149153// Call the method with the given arguments
@@ -159,7 +163,70 @@ func (m *Method) CallWithKeywords(self Object, args Tuple, kwargs StringDict) (O
159163 func (Object , Object ) (Object , error ):
160164 return nil , ExceptionNewf (TypeError , "%s() takes no keyword arguments" , m .Name )
161165 }
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
163230}
164231
165232// Call a method
0 commit comments