2016-10-29 | Paul Boddie | raw annotate files changeset graph | Fixed attribute access numbering, local name assignments, and the generation of contexts in attributes obtained for static objects. Added return statements at the end of functions, avoiding superfluous statements if any return statement already exists. Introduced initial exception code generation and more reasonable boolean tests. Introduced #undef directives to undefine local names at the end of functions. Introduced more attribute access testing functions, making their results usable. Fixed lone access instruction arguments that are static objects, making them references. |
1 class C: 2 class D: 3 class E: 4 def m(self, x): 5 self.x = x 6 l = self.x.__len__ 7 s = self.o 8 return self.o.__len__ 9 n = 123 10 o = "123" 11 12 p = "456" 13 q = 789 14 15 class F(E): 16 def r(self, y): 17 s = self.o 18 C.D.F.t = 234 19 return self.o.__len__ 20 t = 123 21 def u(self): 22 return self.o 23 def v(self): 24 return self.u().__len__ 25 26 def static(): 27 c = C 28 d = C.D 29 e = C.D.E 30 f = C.D.E.m 31 g = C.D.E.n 32 h = C.D.p 33 34 def static_via_constant(): 35 i = C.D.p.__len__ 36 37 def assign(): 38 C.D.q = 987 39 40 def indirect(): 41 e = C.D.E 42 inst = e() 43 method = inst.m 44 return method("5") 45 46 def broken(): 47 inst2 = C.D.F() 48 l = inst2.u().__len__ 49 50 static() 51 static_via_constant() 52 assign() 53 result1 = indirect() 54 broken() 55 56 # Static chains. 57 58 c = C 59 d = C.D 60 e = C.D.E 61 f = C.D.E.m 62 g = C.D.E.n 63 h = C.D.p 64 65 # Static via constant. 66 67 i = C.D.p.__len__ 68 69 # Static assignment. 70 71 C.D.q = 987 72 73 # Indirect accesses. 74 75 inst = e() 76 method = inst.m 77 result2 = method("5") 78 79 # Broken chains. 80 81 inst2 = C.D.F() 82 l = inst2.u().__len__