@@ -2268,15 +2268,59 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
2268
2268
self . mk_fn_ptr ( converted_sig)
2269
2269
}
2270
2270
2271
- // Interns a type/name combination, stores the resulting box in cx.interners,
2272
- // and returns the box as cast to an unsafe ptr (see comments for Ty above).
2273
- pub fn mk_ty ( self , st : TypeVariants < ' tcx > ) -> Ty < ' tcx > {
2274
- let global_interners = if !self . is_global ( ) {
2275
- Some ( & self . global_interners )
2271
+ pub fn mk_ty ( & self , st : TypeVariants < ' tcx > ) -> Ty < ' tcx > {
2272
+ let flags = super :: flags:: FlagComputation :: for_sty ( & st) ;
2273
+
2274
+ // HACK(eddyb) Depend on flags being accurate to
2275
+ // determine that all contents are in the global tcx.
2276
+ // See comments on Lift for why we can't use that.
2277
+ if flags. flags . intersects ( ty:: TypeFlags :: KEEP_IN_LOCAL_TCX ) {
2278
+ let mut interner = self . interners . type_ . borrow_mut ( ) ;
2279
+ if let Some ( & Interned ( ty) ) = interner. get ( & st) {
2280
+ return ty;
2281
+ }
2282
+
2283
+ let ty_struct = TyS {
2284
+ sty : st,
2285
+ flags : flags. flags ,
2286
+ region_depth : flags. depth ,
2287
+ } ;
2288
+
2289
+ // Make sure we don't end up with inference
2290
+ // types/regions in the global tcx.
2291
+ if self . is_global ( ) {
2292
+ bug ! ( "Attempted to intern `{:?}` which contains \
2293
+ inference types/regions in the global type context",
2294
+ & ty_struct) ;
2295
+ }
2296
+
2297
+ // Don't be &mut TyS.
2298
+ let ty: Ty < ' tcx > = self . interners . arena . alloc ( ty_struct) ;
2299
+ interner. insert ( Interned ( ty) ) ;
2300
+ ty
2276
2301
} else {
2277
- None
2278
- } ;
2279
- self . interners . intern_ty ( st, global_interners)
2302
+ let mut interner = self . global_interners . type_ . borrow_mut ( ) ;
2303
+ if let Some ( & Interned ( ty) ) = interner. get ( & st) {
2304
+ return ty;
2305
+ }
2306
+
2307
+ let ty_struct = TyS {
2308
+ sty : st,
2309
+ flags : flags. flags ,
2310
+ region_depth : flags. depth ,
2311
+ } ;
2312
+
2313
+ // This is safe because all the types the ty_struct can point to
2314
+ // already is in the global arena
2315
+ let ty_struct: TyS < ' gcx > = unsafe {
2316
+ mem:: transmute ( ty_struct)
2317
+ } ;
2318
+
2319
+ // Don't be &mut TyS.
2320
+ let ty: Ty < ' gcx > = self . global_interners . arena . alloc ( ty_struct) ;
2321
+ interner. insert ( Interned ( ty) ) ;
2322
+ ty
2323
+ }
2280
2324
}
2281
2325
2282
2326
pub fn mk_mach_int ( self , tm : ast:: IntTy ) -> Ty < ' tcx > {
0 commit comments