@@ -11,11 +11,13 @@ use num_traits::Signed;
11
11
use crate :: compile;
12
12
use crate :: import:: import_module;
13
13
use crate :: obj:: objbool;
14
+ use crate :: obj:: objcode:: PyCodeRef ;
14
15
use crate :: obj:: objdict:: PyDictRef ;
15
16
use crate :: obj:: objint:: { self , PyIntRef } ;
16
17
use crate :: obj:: objiter;
17
18
use crate :: obj:: objstr:: { self , PyString , PyStringRef } ;
18
- use crate :: obj:: objtype:: { self , PyClassRef } ;
19
+ use crate :: obj:: objtuple:: PyTuple ;
20
+ use crate :: obj:: objtype:: { self , PyClass , PyClassRef } ;
19
21
20
22
use crate :: frame:: Scope ;
21
23
use crate :: function:: { Args , KwArgs , OptionalArg , PyFuncArgs } ;
@@ -25,7 +27,6 @@ use crate::pyobject::{
25
27
} ;
26
28
use crate :: vm:: VirtualMachine ;
27
29
28
- use crate :: obj:: objcode:: PyCodeRef ;
29
30
#[ cfg( not( target_arch = "wasm32" ) ) ]
30
31
use crate :: stdlib:: io:: io_open;
31
32
@@ -312,19 +313,37 @@ fn builtin_id(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
312
313
313
314
// builtin_input
314
315
315
- fn builtin_isinstance ( obj : PyObjectRef , typ : PyClassRef , vm : & VirtualMachine ) -> PyResult < bool > {
316
- vm. isinstance ( & obj, & typ)
316
+ fn type_test (
317
+ vm : & VirtualMachine ,
318
+ typ : PyObjectRef ,
319
+ test : impl Fn ( & PyClassRef ) -> PyResult < bool > ,
320
+ test_name : & str ,
321
+ ) -> PyResult < bool > {
322
+ match_class ! ( typ,
323
+ cls @ PyClass => test( & cls) ,
324
+ tuple @ PyTuple => {
325
+ for cls_obj in tuple. elements. borrow( ) . iter( ) {
326
+ let cls = PyClassRef :: try_from_object( vm, cls_obj. clone( ) ) ?;
327
+ if test( & cls) ? {
328
+ return Ok ( true ) ;
329
+ }
330
+ }
331
+ Ok ( false )
332
+ } ,
333
+ _ => Err ( vm. new_type_error( format!( "{}() arg 2 must be a type or tuple of types" , test_name) ) )
334
+ )
317
335
}
318
336
319
- fn builtin_issubclass ( vm : & VirtualMachine , args : PyFuncArgs ) -> PyResult {
320
- arg_check ! (
321
- vm,
322
- args,
323
- required = [ ( subclass, Some ( vm. get_type( ) ) ) , ( cls, Some ( vm. get_type( ) ) ) ]
324
- ) ;
337
+ fn builtin_isinstance ( obj : PyObjectRef , typ : PyObjectRef , vm : & VirtualMachine ) -> PyResult < bool > {
338
+ type_test ( vm, typ, |cls| vm. isinstance ( & obj, cls) , "isinstance" )
339
+ }
325
340
326
- let issubclass = vm. issubclass ( subclass, cls) ?;
327
- Ok ( vm. context ( ) . new_bool ( issubclass) )
341
+ fn builtin_issubclass (
342
+ subclass : PyClassRef ,
343
+ typ : PyObjectRef ,
344
+ vm : & VirtualMachine ,
345
+ ) -> PyResult < bool > {
346
+ type_test ( vm, typ, |cls| vm. issubclass ( & subclass, cls) , "issubclass" )
328
347
}
329
348
330
349
fn builtin_iter ( vm : & VirtualMachine , args : PyFuncArgs ) -> PyResult {
0 commit comments