@@ -325,8 +325,14 @@ mod special_idents {
325
325
type ident_interner = util:: interner:: interner < @~str > ;
326
326
327
327
/** Key for thread-local data for sneaking interner information to the
328
- * serializer/deserializer. It sounds like a hack because it is one. */
329
- fn interner_key ( +_x : @@ident_interner ) { }
328
+ * serializer/deserializer. It sounds like a hack because it is one.
329
+ * Bonus ultra-hack: functions as keys don't work across crates,
330
+ * so we have to use a unique number. See taskgroup_key! in task.rs
331
+ * for another case of this. */
332
+ macro_rules! interner_key (
333
+ ( ) => ( unsafe :: transmute:: <( uint, uint) , & fn ( +@@token:: ident_interner) >(
334
+ ( -3 as uint, 0 u) ) )
335
+ )
330
336
331
337
fn mk_ident_interner ( ) -> ident_interner {
332
338
/* the indices here must correspond to the numbers in special_idents */
@@ -343,8 +349,8 @@ fn mk_ident_interner() -> ident_interner {
343
349
|x, y| str:: eq ( * x, * y) , init_vec) ;
344
350
345
351
/* having multiple interners will just confuse the serializer */
346
- unsafe { assert task:: local_data_get ( interner_key) == none } ;
347
- unsafe { task:: local_data_set ( interner_key, @rv) } ;
352
+ unsafe { assert task:: local_data_get ( interner_key ! ( ) ) == none } ;
353
+ unsafe { task:: local_data_set ( interner_key ! ( ) , @rv) } ;
348
354
rv
349
355
}
350
356
0 commit comments