1.1 --- a/encoders.py Wed Dec 07 17:00:12 2016 +0100
1.2 +++ b/encoders.py Wed Dec 07 17:02:06 2016 +0100
1.3 @@ -344,6 +344,10 @@
1.4
1.5 return "__constvalue%d" % n
1.6
1.7 +# Track all encoded paths, detecting and avoiding conflicts.
1.8 +
1.9 +all_encoded_paths = {}
1.10 +
1.11 def encode_path(path):
1.12
1.13 "Encode 'path' as an output program object, translating special symbols."
1.14 @@ -351,7 +355,26 @@
1.15 if path in reserved_words:
1.16 return "__%s" % path
1.17 else:
1.18 - return path.replace("#", "__").replace("$", "__").replace(".", "_")
1.19 + part_encoded = path.replace("#", "__").replace("$", "__")
1.20 + encoded = part_encoded.replace(".", "_")
1.21 +
1.22 + # Test for a conflict with the encoding of a different path, re-encoding
1.23 + # if necessary.
1.24 +
1.25 + previous = all_encoded_paths.get(encoded)
1.26 + replacement = "_"
1.27 +
1.28 + while previous:
1.29 + if path == previous:
1.30 + return encoded
1.31 + replacement += "_"
1.32 + encoded = part_encoded.replace(".", replacement)
1.33 + previous = all_encoded_paths.get(encoded)
1.34 +
1.35 + # Store any new or re-encoded path.
1.36 +
1.37 + all_encoded_paths[encoded] = path
1.38 + return encoded
1.39
1.40 def encode_predefined_reference(path):
1.41