summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog2
-rw-r--r--babel/localedata.py11
2 files changed, 10 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 5fdfdb6..70fdb2a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -14,6 +14,8 @@ http://svn.edgewall.org/repos/babel/tags/0.9.4/
* Currency symbol definitions that is defined with choice patterns in the
CLDR data are no longer imported, so the symbol code will be used instead.
* Fixed quarter support in date formatting.
+ * Fixed a serious memory leak that was introduces by the support for CLDR
+ aliases in 0.9.3 (ticket #128).
Version 0.9.3
diff --git a/babel/localedata.py b/babel/localedata.py
index 5a76f6a..203bec8 100644
--- a/babel/localedata.py
+++ b/babel/localedata.py
@@ -174,6 +174,9 @@ class Alias(object):
data = data[key]
if isinstance(data, Alias):
data = data.resolve(base)
+ elif isinstance(data, tuple):
+ alias, others = data
+ data = alias.resolve(base)
return data
@@ -185,19 +188,21 @@ class LocaleDataDict(DictMixin, dict):
def __init__(self, data, base=None):
dict.__init__(self, data)
if base is None:
- base = self
+ base = data
self.base = base
def __getitem__(self, key):
- val = dict.__getitem__(self, key)
+ orig = val = dict.__getitem__(self, key)
if isinstance(val, Alias): # resolve an alias
val = val.resolve(self.base)
if isinstance(val, tuple): # Merge a partial dict with an alias
alias, others = val
val = alias.resolve(self.base).copy()
merge(val, others)
- if isinstance(val, dict): # Return a nested alias-resolving dict
+ if type(val) is dict: # Return a nested alias-resolving dict
val = LocaleDataDict(val, base=self.base)
+ if val is not orig:
+ self[key] = val
return val
def copy(self):