Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.54 KB | None | 0 0
  1. #![feature(raw)]
  2. #![deny(bare_trait_objects)]
  3.  
  4. macro_rules! const_transmute {(
  5. [$src:ty => $dst:ty] ($expr:expr)
  6. ) => ({
  7. const _GUARD: [();
  8. mem::size_of::<$src>()
  9. ] = [();
  10. mem::size_of::<$dst>()
  11. ];
  12.  
  13. union Transmute {
  14. src: $src,
  15. dst: $dst,
  16. }
  17.  
  18. Transmute {
  19. src: $expr,
  20. }.dst
  21. })}
  22.  
  23. use ::std::*;
  24.  
  25. pub
  26. trait Trait {
  27. fn method_1 (&'_ self);
  28. fn method_2 (&'_ self, _: i32) -> i32;
  29. }
  30.  
  31. struct Double;
  32. impl Trait for Double {
  33. fn method_1 (self: &'_ Self)
  34. {
  35. eprintln!("Double");
  36. }
  37. fn method_2 (self: &'_ Self, x: i32) -> i32 { 2 * x }
  38. }
  39.  
  40. struct Triple;
  41. impl Trait for Triple {
  42. fn method_1 (self: &'_ Self)
  43. {
  44. eprintln!("Triple");
  45. }
  46. fn method_2 (self: &'_ Self, x: i32) -> i32 { 3 * x }
  47. }
  48.  
  49. fn foo (object: &'_ dyn Trait)
  50. {
  51. object.method_1();
  52. let _ = object.method_2(42);
  53. }
  54.  
  55. const DOUBLE: Double = Double; // this is the hard part
  56.  
  57. const AT_DYN_TRAIT: &'static dyn Trait = (&DOUBLE);
  58. const DYN_TRAIT_VTABLE: *mut () = unsafe {
  59. const_transmute!([&'static dyn Trait => raw::TraitObject](
  60. AT_DYN_TRAIT
  61. )).vtable
  62. };
  63.  
  64. fn main ()
  65. {
  66. dbg!(DYN_TRAIT_VTABLE);
  67. foo(&Double);
  68. eprintln!("vtable: {:p}",
  69. unsafe { mem::transmute::<&dyn Trait, raw::TraitObject>(&Double) }.vtable,
  70. // unsafe { **(mem::transmute::<&dyn Trait, raw::TraitObject>(&Double).vtable as *mut *mut usize) },
  71. );
  72. foo(&Triple);
  73. eprintln!("vtable: {:p}",
  74. unsafe { mem::transmute::<&dyn Trait, raw::TraitObject>(&Triple) }.vtable,
  75. );
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement