@@ -7,88 +7,59 @@ use std::io::{Read, Seek, Write};
77use std:: os:: fd:: AsFd ;
88use std:: rc:: { Rc , Weak } ;
99#[ derive( Default ) ]
10- pub struct Counter {
11- pub value : Value < i32 > ,
12- }
13- impl Counter {
14- pub fn bump ( & self ) {
15- ( * self . value . borrow_mut ( ) ) . prefix_inc ( ) ;
16- }
17- pub fn get ( & self ) -> i32 {
18- return ( * self . value . borrow ( ) ) ;
19- }
20- }
21- impl Clone for Counter {
22- fn clone ( & self ) -> Self {
23- let mut this = Self {
24- value : Rc :: new ( RefCell :: new ( ( * self . value . borrow ( ) ) ) ) ,
25- } ;
26- this
27- }
28- }
29- impl ByteRepr for Counter { }
30- #[ derive( Default ) ]
3110pub struct Holder {
32- pub c : Value < Counter > ,
33- pub ref_ : Ptr < Counter > ,
34- }
35- impl Holder {
36- pub fn Holder ( c : Ptr < Counter > ) -> Self {
37- let mut this = Self {
38- c : Rc :: new ( RefCell :: new ( <Counter >:: default ( ) ) ) ,
39- ref_ : ( c) . clone ( ) ,
40- } ;
41- this
42- }
11+ pub v : Value < Vec < i32 > > ,
4312}
4413impl Clone for Holder {
4514 fn clone ( & self ) -> Self {
4615 let mut this = Self {
47- c : Rc :: new ( RefCell :: new ( ( * self . c . borrow ( ) ) . clone ( ) ) ) ,
48- ref_ : ( self . ref_ ) . clone ( ) ,
16+ v : Rc :: new ( RefCell :: new ( ( * self . v . borrow ( ) ) . clone ( ) ) ) ,
4917 } ;
5018 this
5119 }
5220}
5321impl ByteRepr for Holder { }
54- pub fn via_ref_0 ( r : Ptr < Counter > ) {
55- ( { ( * r. upgrade ( ) . deref ( ) ) . bump ( ) } ) ;
56- }
5722pub fn main ( ) {
5823 std:: process:: exit ( main_0 ( ) ) ;
5924}
6025fn main_0 ( ) -> i32 {
61- let c : Value < Counter > = Rc :: new ( RefCell :: new ( < Counter > :: default ( ) ) ) ;
62- let p : Value < Ptr < Counter > > = Rc :: new ( RefCell :: new ( ( c . as_pointer ( ) ) ) ) ;
63- ( { ( * ( * p . borrow ( ) ) . upgrade ( ) . deref ( ) ) . bump ( ) } ) ;
64- ( { ( * ( * p . borrow ( ) ) . upgrade ( ) . deref ( ) ) . bump ( ) } ) ;
65- let arr : Value < Box < [ Counter ] > > = Rc :: new ( RefCell :: new (
66- ( 0 .. 2 )
67- . map ( |_| < Counter > :: default ( ) )
68- . collect :: < Box < [ Counter ] > > ( ) ,
26+ let v : Value < Vec < i32 > > = Rc :: new ( RefCell :: new ( Vec :: new ( ) ) ) ;
27+ ( * v . borrow_mut ( ) ) . push ( 10 ) ;
28+ ( * v . borrow_mut ( ) ) . push ( 20 ) ;
29+ let p : Value < Ptr < Vec < i32 > > > = Rc :: new ( RefCell :: new ( ( v . as_pointer ( ) ) ) ) ;
30+ let a : Value < i32 > = Rc :: new ( RefCell :: new (
31+ ( ( ( ( * p . borrow ( ) ) . to_strong ( ) . as_pointer ( ) ) as Ptr < i32 > )
32+ . offset ( 0_u64 as isize )
33+ . read ( ) ) ,
6934 ) ) ;
70- ( { ( * arr. borrow ( ) ) [ ( 0 ) as usize ] . bump ( ) } ) ;
71- ( { ( * arr. borrow ( ) ) [ ( 1 ) as usize ] . bump ( ) } ) ;
72- let h: Value < Holder > = Rc :: new ( RefCell :: new ( Holder :: Holder ( c. as_pointer ( ) ) ) ) ;
73- ( { ( * ( * h. borrow ( ) ) . c . borrow ( ) ) . bump ( ) } ) ;
74- ( { ( * ( * h. borrow ( ) ) . ref_ . upgrade ( ) . deref ( ) ) . bump ( ) } ) ;
75- ( {
76- let _r: Ptr < Counter > = c. as_pointer ( ) ;
77- via_ref_0 ( _r)
78- } ) ;
79- let sum: Value < i32 > = Rc :: new ( RefCell :: new ( {
80- let _lhs = {
81- let _lhs = {
82- let _lhs = {
83- let _lhs = ( { ( * ( * p. borrow ( ) ) . upgrade ( ) . deref ( ) ) . get ( ) } ) ;
84- _lhs + ( { ( * ( * h. borrow ( ) ) . c . borrow ( ) ) . get ( ) } )
85- } ;
86- _lhs + ( { ( * ( * h. borrow ( ) ) . ref_ . upgrade ( ) . deref ( ) ) . get ( ) } )
87- } ;
88- _lhs + ( { ( * arr. borrow ( ) ) [ ( 0 ) as usize ] . get ( ) } )
89- } ;
90- _lhs + ( { ( * arr. borrow ( ) ) [ ( 1 ) as usize ] . get ( ) } )
91- } ) ) ;
92- println ! ( "{}" , ( * sum. borrow( ) ) ) ;
35+ ( ( ( * p. borrow ( ) ) . to_strong ( ) . as_pointer ( ) ) as Ptr < i32 > )
36+ . offset ( 1_u64 as isize )
37+ . write ( 30 ) ;
38+ let h: Value < Holder > = Rc :: new ( RefCell :: new ( <Holder >:: default ( ) ) ) ;
39+ ( * ( * h. borrow ( ) ) . v . borrow_mut ( ) ) . push ( 40 ) ;
40+ ( * ( * h. borrow ( ) ) . v . borrow_mut ( ) ) . push ( 50 ) ;
41+ let hp: Value < Ptr < Holder > > = Rc :: new ( RefCell :: new ( ( h. as_pointer ( ) ) ) ) ;
42+ let b: Value < i32 > = Rc :: new ( RefCell :: new (
43+ ( ( ( * ( * hp. borrow ( ) ) . upgrade ( ) . deref ( ) ) . v . as_pointer ( ) as Ptr < i32 > )
44+ . offset ( 0_u64 as isize )
45+ . read ( ) ) ,
46+ ) ) ;
47+ ( ( * ( * hp. borrow ( ) ) . upgrade ( ) . deref ( ) ) . v . as_pointer ( ) as Ptr < i32 > )
48+ . offset ( 1_u64 as isize )
49+ . write ( 60 ) ;
50+ assert ! ( ( ( * a. borrow( ) ) == 10 ) ) ;
51+ assert ! (
52+ ( ( ( ( ( * p. borrow( ) ) . to_strong( ) . as_pointer( ) ) as Ptr <i32 >)
53+ . offset( 1_u64 as isize )
54+ . read( ) )
55+ == 30 )
56+ ) ;
57+ assert ! ( ( ( * b. borrow( ) ) == 40 ) ) ;
58+ assert ! (
59+ ( ( ( ( * ( * hp. borrow( ) ) . upgrade( ) . deref( ) ) . v. as_pointer( ) as Ptr <i32 >)
60+ . offset( 1_u64 as isize )
61+ . read( ) )
62+ == 60 )
63+ ) ;
9364 return 0 ;
9465}
0 commit comments