Advertisement
Guest User

Untitled

a guest
Apr 20th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.18 KB | None | 0 0
  1. #![feature(raw, const_transmute)]
  2. #![deny(bare_trait_objects)]
  3.  
  4. use ::std::*;
  5.  
  6. pub
  7. trait Trait {
  8. fn method_1 (&'_ self);
  9. fn method_2 (&'_ self, _: i32) -> i32;
  10. }
  11.  
  12. struct Double;
  13. impl Trait for Double {
  14. fn method_1 (self: &'_ Self)
  15. {
  16. eprintln!("Double");
  17. }
  18. fn method_2 (self: &'_ Self, x: i32) -> i32 { 2 * x }
  19. }
  20.  
  21. struct Triple;
  22. impl Trait for Triple {
  23. fn method_1 (self: &'_ Self)
  24. {
  25. eprintln!("Triple");
  26. }
  27. fn method_2 (self: &'_ Self, x: i32) -> i32 { 3 * x }
  28. }
  29.  
  30. const DOUBLE_AS_DYN_TRAIT_VTABLE: *mut () = unsafe {
  31. mem::transmute::<*const dyn Trait, raw::TraitObject>(
  32. ptr::null::<Double>()
  33. ).vtable
  34. };
  35.  
  36. fn foo (object: &'_ dyn Trait)
  37. {
  38. object.method_1();
  39. let _ = object.method_2(42);
  40. }
  41.  
  42. fn main ()
  43. {
  44. dbg!(DOUBLE_AS_DYN_TRAIT_VTABLE);
  45. foo(&Double);
  46. eprintln!("vtable: {:p}",
  47. unsafe { mem::transmute::<&dyn Trait, raw::TraitObject>(&Double) }.vtable,
  48. // unsafe { **(mem::transmute::<&dyn Trait, raw::TraitObject>(&Double).vtable as *mut *mut usize) },
  49. );
  50. foo(&Triple);
  51. eprintln!("vtable: {:p}",
  52. unsafe { mem::transmute::<&dyn Trait, raw::TraitObject>(&Triple) }.vtable,
  53. );
  54. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement