1.1 --- a/optimiser.py Wed Oct 12 18:07:48 2016 +0200
1.2 +++ b/optimiser.py Thu Oct 13 23:27:17 2016 +0200
1.3 @@ -1,7 +1,7 @@
1.4 #!/usr/bin/env python
1.5
1.6 """
1.7 -Optimise object layouts.
1.8 +Optimise object layouts and generate access instruction plans.
1.9
1.10 Copyright (C) 2014, 2015, 2016 Paul Boddie <paul@boddie.org.uk>
1.11
1.12 @@ -392,7 +392,7 @@
1.13 if base:
1.14 original_accessor = base
1.15 else:
1.16 - original_accessor = name
1.17 + original_accessor = "<expr>" # use a generic placeholder
1.18
1.19 # Prepare for any first attribute access.
1.20
1.21 @@ -405,29 +405,31 @@
1.22
1.23 access_first_attribute = final_method == "access" or traversed or attrnames
1.24
1.25 - if context == "final-accessor" or access_first_attribute:
1.26 - emit(("set_accessor", original_accessor))
1.27 -
1.28 # Set the context if already available.
1.29
1.30 if context == "original-accessor":
1.31 emit(("set_context", original_accessor))
1.32 + accessor = "context"
1.33 elif context == "base":
1.34 emit(("set_context", base))
1.35 + accessor = "context"
1.36 + elif context == "final-accessor" or access_first_attribute:
1.37 + emit(("set_accessor", original_accessor))
1.38 + accessor = "accessor"
1.39
1.40 # Apply any test.
1.41
1.42 - if test_type == "specific-type":
1.43 + if test == "specific-type":
1.44 emit(("test_specific_type", accessor, test_type))
1.45 - elif test_type == "specific-instance":
1.46 + elif test == "specific-instance":
1.47 emit(("test_specific_instance", accessor, test_type))
1.48 - elif test_type == "specific-object":
1.49 + elif test == "specific-object":
1.50 emit(("test_specific_object", accessor, test_type))
1.51 - elif test_type == "common-type":
1.52 + elif test == "common-type":
1.53 emit(("test_common_type", accessor, test_type))
1.54 - elif test_type == "common-instance":
1.55 + elif test == "common-instance":
1.56 emit(("test_common_instance", accessor, test_type))
1.57 - elif test_type == "common-object":
1.58 + elif test == "common-object":
1.59 emit(("test_common_object", accessor, test_type))
1.60
1.61 # Perform the first or final access.
1.62 @@ -436,17 +438,17 @@
1.63 if access_first_attribute:
1.64
1.65 if first_method == "relative-class":
1.66 - emit(("set_accessor", ("load_via_class", "accessor", "attrname")))
1.67 + emit(("set_accessor", ("load_via_class", accessor, attrname)))
1.68 elif first_method == "relative-object":
1.69 - emit(("set_accessor", ("load_via_object", "accessor", "attrname")))
1.70 + emit(("set_accessor", ("load_via_object", accessor, attrname)))
1.71 elif first_method == "relative-object-class":
1.72 - emit(("set_accessor", ("get_class_and_load", "accessor", "attrname")))
1.73 + emit(("set_accessor", ("get_class_and_load", accessor, attrname)))
1.74 elif first_method == "check-class":
1.75 - emit(("set_accessor", ("check_and_load_via_class", "accessor", "attrname")))
1.76 + emit(("set_accessor", ("check_and_load_via_class", accessor, attrname)))
1.77 elif first_method == "check-object":
1.78 - emit(("set_accessor", ("check_and_load_via_object", "accessor", "attrname")))
1.79 + emit(("set_accessor", ("check_and_load_via_object", accessor, attrname)))
1.80 elif first_method == "check-object-class":
1.81 - emit(("set_accessor", ("get_class_check_and_load", "accessor", "attrname")))
1.82 + emit(("set_accessor", ("get_class_check_and_load", accessor, attrname)))
1.83
1.84 # Obtain an accessor.
1.85