cython
1# mode: run
2# tag: assign, exttype
3
4cdef struct X:
5int ix
6X* x
7
8
9cdef class A:
10cdef int i
11cdef list l
12cdef object o
13cdef X x
14
15def assign_A(self):
16"""
17>>> A().assign_A()
18(2, [1, 2, 3])
19"""
20a = A()
21a.i = 1
22a.l = [1, 2, 3]
23a.o = a.l
24a.o = a.o
25a.l = a.o
26a.i = a.l[1]
27return a.i, a.l
28
29def assign_A_struct(self):
30"""
31>>> A().assign_A_struct()
32(5, 2, 2, 5)
33"""
34cdef X x
35a = A()
36a.x.ix = 2
37a.x.x = &x
38x.ix = 5
39x.x = &a.x
40assert a.x.x.x is &a.x
41
42a.x.x.x.x.x.x.x = a.x.x.x.x
43assert x.x is &x
44assert x.x.x is &x
45assert a.x.x is &x
46
47a.x.x.x.x.x.x.x, a.x.x.x = a.x.x.x.x, &a.x # replay+undo :)
48assert x.x is &a.x
49assert x.x.x is &x
50return x.ix, x.x.ix, a.x.ix, a.x.x.ix
51
52
53cdef class B(A):
54cdef int ib
55cdef object ob
56cdef A a
57
58def assign_B(self):
59"""
60>>> B().assign_B()
61(1, 2, 5, 9, 2)
62"""
63b = B()
64b.i = 1
65b.ib = 2
66b.l = [b.i, b.ib]
67b.o = b.l
68b.ob = b.o
69assert b.ob == b.l
70b.o = b.ob = b.l
71
72b.a = A() # only one reference!
73b.a.o = 5
74b.a.i = 5
75b.a, b.a.i = A(), b.a.i # overwrite b.a but keep b.a.i
76assert b.a.i == 5
77assert b.a.o is None
78b.a.o = 9
79b.a, b.a.i, b.a.o = A(), b.a.i, b.a.o
80return b.i, b.ib, b.a.i, b.a.o, b.o[1]
81
82def cross_assign_Ba(self):
83"""
84>>> B().cross_assign_Ba()
852
86"""
87b = B()
88b.a = A()
89b.a.i = 1
90b.a.o = A() # only one reference!
91(<A>b.a.o).i = 2
92b.a = b.a.o
93return b.a.i
94
95def cascaded_assign_B(self):
96"""
97>>> B().cascaded_assign_B()
98(2, 2)
99"""
100cdef B b = B()
101b.ib = 1
102b.a = A()
103b.a.o = B() # only one reference!
104(<B>b.a.o).ib = 2
105b = b.ob = b.a.o
106return b.ib, (<B>b.ob).ib
107