1.1 --- a/optimiser.py Sat Oct 15 23:34:29 2016 +0200
1.2 +++ b/optimiser.py Sun Oct 16 00:39:20 2016 +0200
1.3 @@ -374,33 +374,38 @@
1.4
1.5 # Set the context if already available.
1.6
1.7 - if context == "original-accessor":
1.8 - emit(("set_context", original_accessor))
1.9 - accessor = "context"
1.10 - elif context == "base":
1.11 - emit(("set_context", base))
1.12 - accessor = "context"
1.13 + if context == "base":
1.14 + accessor = context_var = (base,)
1.15 + elif context == "original-accessor":
1.16 + if original_accessor == "<expr>":
1.17 + emit(("set_accessor", original_accessor))
1.18 + accessor = context_var = ("accessor",)
1.19 + else:
1.20 + accessor = context_var = original_accessor
1.21
1.22 # Assigning does not set the context.
1.23
1.24 elif context in ("final-accessor", "unset") and access_first_attribute:
1.25 - emit(("set_accessor", original_accessor))
1.26 - accessor = "accessor"
1.27 + if original_accessor == "<expr>":
1.28 + emit(("set_accessor", original_accessor))
1.29 + accessor = ("accessor",)
1.30 + else:
1.31 + accessor = original_accessor
1.32
1.33 # Apply any test.
1.34
1.35 if test == "specific-type":
1.36 - emit(("test_specific_type", accessor, test_type))
1.37 + accessor = ("test_specific_type", accessor, test_type)
1.38 elif test == "specific-instance":
1.39 - emit(("test_specific_instance", accessor, test_type))
1.40 + accessor = ("test_specific_instance", accessor, test_type)
1.41 elif test == "specific-object":
1.42 - emit(("test_specific_object", accessor, test_type))
1.43 + accessor = ("test_specific_object", accessor, test_type)
1.44 elif test == "common-type":
1.45 - emit(("test_common_type", accessor, test_type))
1.46 + accessor = ("test_common_type", accessor, test_type)
1.47 elif test == "common-instance":
1.48 - emit(("test_common_instance", accessor, test_type))
1.49 + accessor = ("test_common_instance", accessor, test_type)
1.50 elif test == "common-object":
1.51 - emit(("test_common_object", accessor, test_type))
1.52 + accessor = ("test_common_object", accessor, test_type)
1.53
1.54 # Perform the first or final access.
1.55 # The access only needs performing if the resulting accessor is used.
1.56 @@ -413,37 +418,37 @@
1.57 if assigning:
1.58 emit(("store_via_class", accessor, attrname, "<assexpr>"))
1.59 else:
1.60 - emit(("set_accessor", ("load_via_class", accessor, attrname)))
1.61 + accessor = ("load_via_class", accessor, attrname)
1.62
1.63 elif first_method == "relative-object":
1.64 if assigning:
1.65 emit(("store_via_object", accessor, attrname, "<assexpr>"))
1.66 else:
1.67 - emit(("set_accessor", ("load_via_object", accessor, attrname)))
1.68 + accessor = ("load_via_object", accessor, attrname)
1.69
1.70 elif first_method == "relative-object-class":
1.71 if assigning:
1.72 emit(("get_class_and_store", accessor, attrname, "<assexpr>"))
1.73 else:
1.74 - emit(("set_accessor", ("get_class_and_load", accessor, attrname)))
1.75 + accessor = ("get_class_and_load", accessor, attrname)
1.76
1.77 elif first_method == "check-class":
1.78 if assigning:
1.79 emit(("check_and_store_via_class", accessor, attrname, "<assexpr>"))
1.80 else:
1.81 - emit(("set_accessor", ("check_and_load_via_class", accessor, attrname)))
1.82 + accessor = ("check_and_load_via_class", accessor, attrname)
1.83
1.84 elif first_method == "check-object":
1.85 if assigning:
1.86 emit(("check_and_store_via_object", accessor, attrname, "<assexpr>"))
1.87 else:
1.88 - emit(("set_accessor", ("check_and_load_via_object", accessor, attrname)))
1.89 + accessor = ("check_and_load_via_object", accessor, attrname)
1.90
1.91 elif first_method == "check-object-class":
1.92 if assigning:
1.93 emit(("check_and_store_via_any", accessor, attrname, "<assexpr>"))
1.94 else:
1.95 - emit(("set_accessor", ("check_and_load_via_any", accessor, attrname)))
1.96 + accessor = ("check_and_load_via_any", accessor, attrname)
1.97
1.98 # Traverse attributes using the accessor.
1.99
1.100 @@ -454,7 +459,7 @@
1.101 # Set the context, if appropriate.
1.102
1.103 if remaining == 1 and final_method != "assign" and context == "final-accessor":
1.104 - emit(("set_context", "accessor"))
1.105 + context_var = accessor
1.106
1.107 # Perform the access only if not achieved directly.
1.108
1.109 @@ -462,14 +467,14 @@
1.110
1.111 if traversal_mode == "class":
1.112 if assigning:
1.113 - emit(("store_via_class", "accessor", attrname, "<assexpr>"))
1.114 + emit(("store_via_class", accessor, attrname, "<assexpr>"))
1.115 else:
1.116 - emit(("set_accessor", ("load_via_class", "accessor", attrname)))
1.117 + accessor = ("load_via_class", accessor, attrname)
1.118 else:
1.119 if assigning:
1.120 - emit(("store_via_object", "accessor", attrname, "<assexpr>"))
1.121 + emit(("store_via_object", accessor, attrname, "<assexpr>"))
1.122 else:
1.123 - emit(("set_accessor", ("load_via_object", "accessor", attrname)))
1.124 + accessor = ("load_via_object", accessor, attrname)
1.125
1.126 remaining -= 1
1.127
1.128 @@ -480,30 +485,30 @@
1.129 # Set the context, if appropriate.
1.130
1.131 if remaining == 1 and final_method != "assign" and context == "final-accessor":
1.132 - emit(("set_context", "accessor"))
1.133 + context_var = accessor
1.134
1.135 # Perform the access only if not achieved directly.
1.136
1.137 if remaining > 1 or final_method in ("access", "assign"):
1.138
1.139 if assigning:
1.140 - emit(("check_and_store_via_any", "accessor", attrname, "<assexpr>"))
1.141 + emit(("check_and_store_via_any", accessor, attrname, "<assexpr>"))
1.142 else:
1.143 - emit(("set_accessor", ("check_and_load_via_any", "accessor", attrname)))
1.144 + accessor = ("check_and_load_via_any", accessor, attrname)
1.145
1.146 remaining -= 1
1.147
1.148 if final_method == "static-assign":
1.149 emit(("store_member", origin, "<assexpr>"))
1.150 elif final_method == "static":
1.151 - emit(("set_accessor", ("load_static", origin)))
1.152 + accessor = ("load_static", origin)
1.153
1.154 if context_test == "test":
1.155 - emit(("test_context", "context", "accessor"))
1.156 + emit(("test_context", context_var, accessor))
1.157 elif context_test == "replace":
1.158 - emit(("replace_context", "context", "accessor"))
1.159 - else:
1.160 - emit(("get_accessor",))
1.161 + emit(("replace_context", context_var, accessor))
1.162 + elif final_method not in ("assign", "static-assign"):
1.163 + emit(accessor)
1.164
1.165 self.access_instructions[access_location] = instructions
1.166