@@ -20,12 +20,13 @@ use crate::obj::objtype::{self, PyClassRef};
20
20
use crate :: frame:: Scope ;
21
21
use crate :: function:: { Args , KwArgs , OptionalArg , PyFuncArgs } ;
22
22
use crate :: pyobject:: {
23
- IdProtocol , ItemProtocol , PyIterable , PyObjectRef , PyResult , PyValue , TryFromObject ,
23
+ Either , IdProtocol , ItemProtocol , PyIterable , PyObjectRef , PyResult , PyValue , TryFromObject ,
24
24
TypeProtocol ,
25
25
} ;
26
26
use crate :: vm:: VirtualMachine ;
27
27
28
28
use crate :: obj:: objcode:: PyCodeRef ;
29
+ use crate :: obj:: objtuple:: PyTupleRef ;
29
30
#[ cfg( not( target_arch = "wasm32" ) ) ]
30
31
use crate :: stdlib:: io:: io_open;
31
32
@@ -312,19 +313,42 @@ 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 builtin_isinstance (
317
+ obj : PyObjectRef ,
318
+ typ : Either < PyClassRef , PyTupleRef > ,
319
+ vm : & VirtualMachine ,
320
+ ) -> PyResult < bool > {
321
+ match typ {
322
+ Either :: A ( ref cls) => vm. isinstance ( & obj, cls) ,
323
+ Either :: B ( ref tuple) => {
324
+ for cls_obj in tuple. elements . borrow ( ) . iter ( ) {
325
+ let cls = PyClassRef :: try_from_object ( vm, cls_obj. clone ( ) ) ?;
326
+ if vm. isinstance ( & obj, & cls) ? {
327
+ return Ok ( true ) ;
328
+ }
329
+ }
330
+ Ok ( false )
331
+ }
332
+ }
317
333
}
318
334
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
- ) ;
325
-
326
- let issubclass = vm. issubclass ( subclass, cls) ?;
327
- Ok ( vm. context ( ) . new_bool ( issubclass) )
335
+ fn builtin_issubclass (
336
+ subclass : PyClassRef ,
337
+ typ : Either < PyClassRef , PyTupleRef > ,
338
+ vm : & VirtualMachine ,
339
+ ) -> PyResult < bool > {
340
+ match typ {
341
+ Either :: A ( ref cls) => vm. issubclass ( & subclass, cls) ,
342
+ Either :: B ( ref tuple) => {
343
+ for cls_obj in tuple. elements . borrow ( ) . iter ( ) {
344
+ let cls = PyClassRef :: try_from_object ( vm, cls_obj. clone ( ) ) ?;
345
+ if vm. issubclass ( & subclass, & cls) ? {
346
+ return Ok ( true ) ;
347
+ }
348
+ }
349
+ Ok ( false )
350
+ }
351
+ }
328
352
}
329
353
330
354
fn builtin_iter ( vm : & VirtualMachine , args : PyFuncArgs ) -> PyResult {
0 commit comments