@@ -4,6 +4,7 @@ use std::collections::HashMap;
4
4
use std:: io:: { self , Write } ;
5
5
6
6
use super :: compile;
7
+ use super :: obj:: objdict;
7
8
use super :: obj:: objstr;
8
9
use super :: obj:: objtype;
9
10
use super :: objbool;
@@ -32,14 +33,40 @@ fn dir_locals(vm: &mut VirtualMachine) -> PyObjectRef {
32
33
get_locals ( vm)
33
34
}
34
35
35
- fn dir_object ( vm : & mut VirtualMachine , _obj : PyObjectRef ) -> PyObjectRef {
36
- let d = vm. new_dict ( ) ;
37
- // TODO: loop over dict of instance, next of class?
38
- // TODO: Implement dir for objects
39
- // for i in obj.iter_items() {
40
- // d.set_item(k, v);
41
- // }
42
- d
36
+ fn dir_object ( vm : & mut VirtualMachine , obj : & PyObjectRef ) -> PyObjectRef {
37
+ // Gather all members here:
38
+ let mut members: Vec < String > = vec ! [ ] ;
39
+
40
+ // Get class attributes:
41
+ let mut base_classes = objtype:: base_classes ( obj) ;
42
+ base_classes. reverse ( ) ;
43
+ for bc in base_classes {
44
+ if let PyObjectKind :: Class {
45
+ name : _,
46
+ dict,
47
+ mro : _,
48
+ } = & bc. borrow ( ) . kind
49
+ {
50
+ let elements = objdict:: get_elements ( dict) ;
51
+ for ( name, _value) in elements {
52
+ members. push ( name. to_string ( ) ) ;
53
+ }
54
+ }
55
+ }
56
+
57
+ // Get instance attributes:
58
+ if let PyObjectKind :: Instance { dict } = & obj. borrow ( ) . kind {
59
+ let elements = objdict:: get_elements ( dict) ;
60
+ for ( name, _value) in elements {
61
+ members. push ( name. to_string ( ) ) ;
62
+ }
63
+ }
64
+
65
+ // Sort members:
66
+ members. sort ( ) ;
67
+
68
+ let members_pystr = members. into_iter ( ) . map ( |m| vm. ctx . new_str ( m) ) . collect ( ) ;
69
+ vm. ctx . new_list ( members_pystr)
43
70
}
44
71
45
72
// builtin_abs
@@ -115,7 +142,7 @@ fn builtin_dir(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
115
142
Ok ( dir_locals ( vm) )
116
143
} else {
117
144
let obj = args. args . into_iter ( ) . next ( ) . unwrap ( ) ;
118
- Ok ( dir_object ( vm, obj) )
145
+ Ok ( dir_object ( vm, & obj) )
119
146
}
120
147
}
121
148
0 commit comments