2016-10-20 | Paul Boddie | file changeset files shortlog | Added some more support for generating invocation code, distinguishing between static invocation targets that are identified and whose functions can be obtained directly and other kinds of targets whose functions must be obtained via the special attribute. |
paul@59 | 1 | class C: |
paul@59 | 2 | class D: |
paul@59 | 3 | class E: |
paul@59 | 4 | def m(self, x): |
paul@65 | 5 | self.x = x |
paul@66 | 6 | l = self.x.__len__ |
paul@66 | 7 | s = self.o |
paul@66 | 8 | return self.o.__len__ |
paul@62 | 9 | n = 123 |
paul@66 | 10 | o = "123" |
paul@74 | 11 | |
paul@62 | 12 | p = "456" |
paul@71 | 13 | q = 789 |
paul@59 | 14 | |
paul@74 | 15 | class F(E): |
paul@74 | 16 | def r(self, y): |
paul@74 | 17 | s = self.o |
paul@74 | 18 | C.D.F.t = 234 |
paul@74 | 19 | return self.o.__len__ |
paul@74 | 20 | t = 123 |
paul@75 | 21 | def u(self): |
paul@75 | 22 | return self.o |
paul@75 | 23 | def v(self): |
paul@75 | 24 | return self.u().__len__ |
paul@74 | 25 | |
paul@114 | 26 | def static(): |
paul@59 | 27 | c = C |
paul@59 | 28 | d = C.D |
paul@59 | 29 | e = C.D.E |
paul@59 | 30 | f = C.D.E.m |
paul@62 | 31 | g = C.D.E.n |
paul@62 | 32 | h = C.D.p |
paul@114 | 33 | |
paul@114 | 34 | def static_via_constant(): |
paul@62 | 35 | i = C.D.p.__len__ |
paul@114 | 36 | |
paul@114 | 37 | def assign(): |
paul@71 | 38 | C.D.q = 987 |
paul@114 | 39 | |
paul@114 | 40 | def indirect(): |
paul@114 | 41 | e = C.D.E |
paul@59 | 42 | inst = e() |
paul@59 | 43 | method = inst.m |
paul@65 | 44 | return method("5") |
paul@59 | 45 | |
paul@114 | 46 | def broken(): |
paul@114 | 47 | inst2 = C.D.F() |
paul@114 | 48 | l = inst2.u().__len__ |
paul@114 | 49 | |
paul@114 | 50 | static() |
paul@114 | 51 | static_via_constant() |
paul@114 | 52 | assign() |
paul@114 | 53 | result1 = indirect() |
paul@114 | 54 | broken() |
paul@114 | 55 | |
paul@114 | 56 | # Static chains. |
paul@114 | 57 | |
paul@59 | 58 | c = C |
paul@59 | 59 | d = C.D |
paul@59 | 60 | e = C.D.E |
paul@59 | 61 | f = C.D.E.m |
paul@62 | 62 | g = C.D.E.n |
paul@62 | 63 | h = C.D.p |
paul@114 | 64 | |
paul@114 | 65 | # Static via constant. |
paul@114 | 66 | |
paul@62 | 67 | i = C.D.p.__len__ |
paul@114 | 68 | |
paul@114 | 69 | # Static assignment. |
paul@114 | 70 | |
paul@71 | 71 | C.D.q = 987 |
paul@114 | 72 | |
paul@114 | 73 | # Indirect accesses. |
paul@114 | 74 | |
paul@59 | 75 | inst = e() |
paul@59 | 76 | method = inst.m |
paul@65 | 77 | result2 = method("5") |
paul@114 | 78 | |
paul@114 | 79 | # Broken chains. |
paul@114 | 80 | |
paul@114 | 81 | inst2 = C.D.F() |
paul@114 | 82 | l = inst2.u().__len__ |