@@ -259,7 +259,42 @@ fn builtin_locals(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
259
259
// builtin_oct
260
260
// builtin_open
261
261
// builtin_ord
262
- // builtin_pow
262
+
263
+ fn builtin_pow ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
264
+ arg_check ! (
265
+ vm,
266
+ args,
267
+ required = [ ( x, None ) , ( y, None ) ] ,
268
+ optional=[ ( mod_value, Some ( vm. ctx. int_type( ) ) ) ]
269
+ ) ;
270
+ let pow_method_name = "__pow__" . to_string ( ) ;
271
+ let result = match vm. get_attribute ( x. clone ( ) , & pow_method_name) {
272
+ Ok ( attrib) => vm. invoke ( attrib, PyFuncArgs :: new ( vec ! [ y. clone( ) ] , vec ! [ ] ) ) ,
273
+ Err ( ..) => Err ( vm. new_type_error ( "unsupported operand type(s) for pow" . to_string ( ) ) )
274
+ } ;
275
+ //Check if the 3rd argument is defined and perform modulus on the result
276
+ //this should be optimized in the future to perform a "power-mod" algorithm in
277
+ //order to improve performance
278
+ match mod_value {
279
+ Some ( mod_value) => {
280
+ let mod_method_name = "__mod__" . to_string ( ) ;
281
+ match vm. get_attribute (
282
+ result. expect ( "result not defined" ) . clone ( ) ,
283
+ & mod_method_name
284
+ ) {
285
+ Ok ( value) => vm. invoke (
286
+ value,
287
+ PyFuncArgs :: new ( vec ! [ mod_value. clone( ) ] , vec ! [ ] )
288
+ ) ,
289
+ Err ( ..) => Err (
290
+ vm. new_type_error ( "unsupported operand type(s) for mod" . to_string ( ) )
291
+ )
292
+ }
293
+ }
294
+ None => result
295
+ }
296
+ }
297
+
263
298
264
299
pub fn builtin_print ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
265
300
trace ! ( "print called with {:?}" , args) ;
@@ -350,6 +385,7 @@ pub fn make_module(ctx: &PyContext) -> PyObjectRef {
350
385
dict. insert ( String :: from ( "len" ) , ctx. new_rustfunc ( builtin_len) ) ;
351
386
dict. insert ( String :: from ( "list" ) , ctx. list_type ( ) ) ;
352
387
dict. insert ( String :: from ( "locals" ) , ctx. new_rustfunc ( builtin_locals) ) ;
388
+ dict. insert ( String :: from ( "pow" ) , ctx. new_rustfunc ( builtin_pow) ) ;
353
389
dict. insert ( String :: from ( "print" ) , ctx. new_rustfunc ( builtin_print) ) ;
354
390
dict. insert ( String :: from ( "range" ) , ctx. new_rustfunc ( builtin_range) ) ;
355
391
dict. insert ( String :: from ( "repr" ) , ctx. new_rustfunc ( builtin_repr) ) ;
0 commit comments