1.1 --- a/access_plan.py Tue Sep 05 01:32:12 2023 +0200
1.2 +++ b/access_plan.py Tue Sep 05 13:33:27 2023 +0200
1.3 @@ -241,12 +241,14 @@
1.4 attrname = self.get_first_attribute_name()
1.5 assigning = self.assigning_first_attribute()
1.6
1.7 + store = attrname != "__data__" and "__store_via_attr_ref" or "__store_via_attr_ref__"
1.8 +
1.9 # Access via the accessor's class.
1.10
1.11 if self.first_method == "relative-class":
1.12 if assigning:
1.13 emit(("<set_attr_ref>", ("__get_class_attr_ref", accessor, attrname)))
1.14 - emit(("__store_via_attr_ref", "<attr_ref>", "<assexpr>"))
1.15 + emit((store, "<attr_ref>", "<assexpr>"))
1.16 else:
1.17 accessor = ("__load_via_class", accessor, attrname)
1.18
1.19 @@ -255,7 +257,7 @@
1.20 elif self.first_method == "relative-object":
1.21 if assigning:
1.22 emit(("<set_attr_ref>", ("__get_object_attr_ref", accessor, attrname)))
1.23 - emit(("__store_via_attr_ref", "<attr_ref>", "<assexpr>"))
1.24 + emit((store, "<attr_ref>", "<assexpr>"))
1.25 else:
1.26 accessor = ("__load_via_object", accessor, attrname)
1.27
1.28 @@ -280,7 +282,7 @@
1.29 elif self.first_method == "check-object":
1.30 if assigning:
1.31 emit(("<set_attr_ref>", ("__check_and_get_object_attr_ref", accessor, attrname)))
1.32 - emit(("__store_via_attr_ref", "<attr_ref>", "<assexpr>"))
1.33 + emit((store, "<attr_ref>", "<assexpr>"))
1.34 else:
1.35 accessor = ("__check_and_load_via_object", accessor, attrname)
1.36
1.37 @@ -290,7 +292,7 @@
1.38 elif self.first_method == "check-object-class":
1.39 if assigning:
1.40 emit(("<set_attr_ref>", ("__check_and_get_object_attr_ref", accessor, attrname)))
1.41 - emit(("__store_via_attr_ref", "<attr_ref>", "<assexpr>"))
1.42 + emit((store, "<attr_ref>", "<assexpr>"))
1.43 else:
1.44 accessor = ("__check_and_load_via_any", accessor, attrname)
1.45
1.46 @@ -334,16 +336,18 @@
1.47
1.48 if num_remaining > 1 or self.final_method in ("access", "access-invoke", "assign"):
1.49
1.50 + store = attrname != "__data__" and "__store_via_attr_ref" or "__store_via_attr_ref__"
1.51 +
1.52 if traversal_mode == "class":
1.53 if assigning:
1.54 emit(("<set_attr_ref>", ("__get_class_attr_ref", accessor, attrname)))
1.55 - emit(("__store_via_attr_ref", "<attr_ref>", "<assexpr>"))
1.56 + emit((store, "<attr_ref>", "<assexpr>"))
1.57 else:
1.58 accessor = ("__load_via_class", accessor, attrname)
1.59 else:
1.60 if assigning:
1.61 emit(("<set_attr_ref>", ("__get_object_attr_ref", accessor, attrname)))
1.62 - emit(("__store_via_attr_ref", "<attr_ref>", "<assexpr>"))
1.63 + emit((store, "<attr_ref>", "<assexpr>"))
1.64 else:
1.65 accessor = ("__load_via_object", accessor, attrname)
1.66
1.67 @@ -392,11 +396,12 @@
1.68 # Constrain instructions involving certain special
1.69 # attribute names.
1.70
1.71 + store = attrname != "__data__" and "__store_via_attr_ref" or "__store_via_attr_ref__"
1.72 to_search = attrname != "__data__" and "any" or "object"
1.73
1.74 if assigning:
1.75 emit(("<set_attr_ref>", ("__check_and_get_object_attr_ref", accessor, attrname)))
1.76 - emit(("__store_via_attr_ref", "<attr_ref>", "<assexpr>"))
1.77 + emit((store, "<attr_ref>", "<assexpr>"))
1.78 else:
1.79 accessor = ("__check_and_load_via_%s" % to_search, accessor, attrname)
1.80
1.81 @@ -423,8 +428,9 @@
1.82
1.83 if self.final_method == "static-assign":
1.84 parent, attrname = self.origin.rsplit(".", 1)
1.85 + store = attrname != "__data__" and "__store_via_attr_ref" or "__store_via_attr_ref__"
1.86 emit(("<set_attr_ref>", ("__get_object_attr_ref", parent, attrname)))
1.87 - emit(("__store_via_attr_ref", "<attr_ref>", "<assexpr>"))
1.88 + emit((store, "<attr_ref>", "<assexpr>"))
1.89
1.90 # Invoked attributes employ a separate context.
1.91