15
15
use metadata:: decoder;
16
16
use metadata:: loader;
17
17
18
+ use std:: cell:: RefCell ;
18
19
use std:: hashmap:: HashMap ;
19
20
use syntax:: ast;
20
21
use syntax:: parse:: token:: ident_interner;
@@ -60,7 +61,7 @@ pub struct CrateSource {
60
61
}
61
62
62
63
pub struct CStore {
63
- priv metas : HashMap < ast:: CrateNum , @crate_metadata > ,
64
+ priv metas : RefCell < HashMap < ast:: CrateNum , @crate_metadata > > ,
64
65
priv extern_mod_crate_map : extern_mod_crate_map ,
65
66
priv used_crate_sources : ~[ CrateSource ] ,
66
67
priv used_libraries : ~[ ( ~str , NativeLibaryKind ) ] ,
@@ -74,7 +75,7 @@ type extern_mod_crate_map = HashMap<ast::NodeId, ast::CrateNum>;
74
75
impl CStore {
75
76
pub fn new ( intr : @ident_interner ) -> CStore {
76
77
CStore {
77
- metas : HashMap :: new ( ) ,
78
+ metas : RefCell :: new ( HashMap :: new ( ) ) ,
78
79
extern_mod_crate_map : HashMap :: new ( ) ,
79
80
used_crate_sources : ~[ ] ,
80
81
used_libraries : ~[ ] ,
@@ -84,7 +85,8 @@ impl CStore {
84
85
}
85
86
86
87
pub fn get_crate_data ( & self , cnum : ast:: CrateNum ) -> @crate_metadata {
87
- * self . metas . get ( & cnum)
88
+ let metas = self . metas . borrow ( ) ;
89
+ * metas. get ( ) . get ( & cnum)
88
90
}
89
91
90
92
pub fn get_crate_hash ( & self , cnum : ast:: CrateNum ) -> @str {
@@ -98,15 +100,18 @@ impl CStore {
98
100
}
99
101
100
102
pub fn set_crate_data ( & mut self , cnum : ast:: CrateNum , data : @crate_metadata ) {
101
- self . metas . insert ( cnum, data) ;
103
+ let mut metas = self . metas . borrow_mut ( ) ;
104
+ metas. get ( ) . insert ( cnum, data) ;
102
105
}
103
106
104
107
pub fn have_crate_data ( & self , cnum : ast:: CrateNum ) -> bool {
105
- self . metas . contains_key ( & cnum)
108
+ let metas = self . metas . borrow ( ) ;
109
+ metas. get ( ) . contains_key ( & cnum)
106
110
}
107
111
108
112
pub fn iter_crate_data ( & self , i : |ast:: CrateNum , @crate_metadata|) {
109
- for ( & k, & v) in self . metas . iter ( ) {
113
+ let metas = self . metas . borrow ( ) ;
114
+ for ( & k, & v) in metas. get ( ) . iter ( ) {
110
115
i ( k, v) ;
111
116
}
112
117
}
0 commit comments