1.1 --- a/micropython/data.py Wed Jul 04 01:25:34 2012 +0200
1.2 +++ b/micropython/data.py Fri Jul 06 01:52:10 2012 +0200
1.3 @@ -1061,13 +1061,19 @@
1.4 return [v for (c, v) in self.context_values]
1.5
1.6 def get_context(self):
1.7 - if len(self.context_values) == 1:
1.8 +
1.9 + "Get the context referenced by the attribute."
1.10 +
1.11 + if self.assignments == 1 and len(self.context_values) == 1:
1.12 return self.get_contexts()[0]
1.13 else:
1.14 return None
1.15
1.16 def get_value(self):
1.17 - if len(self.context_values) == 1:
1.18 +
1.19 + "Get the value referenced by the attribute."
1.20 +
1.21 + if self.assignments == 1 and len(self.context_values) == 1:
1.22 return self.get_values()[0]
1.23 else:
1.24 return None
1.25 @@ -1089,18 +1095,20 @@
1.26 not (make_instance(), make_instance()) in context_values:
1.27 return
1.28
1.29 + self.update_assignments(len(set(context_values)), single_assignment)
1.30 + self.context_values.update(context_values)
1.31 +
1.32 + def update_assignments(self, n, single_assignment):
1.33 if self.assignments is None:
1.34 if single_assignment:
1.35 - self.assignments = len(set(context_values))
1.36 + self.assignments = n
1.37 else:
1.38 - self.assignments = AtLeast(len(set(context_values)))
1.39 + self.assignments = AtLeast(n)
1.40 else:
1.41 if single_assignment:
1.42 - self.assignments += 1
1.43 + self.assignments += n
1.44 else:
1.45 - self.assignments += AtLeast(1)
1.46 -
1.47 - self.context_values.update(context_values)
1.48 + self.assignments += AtLeast(n)
1.49
1.50 def is_constant(self):
1.51
1.52 @@ -2061,6 +2069,24 @@
1.53
1.54 return dict(self)
1.55
1.56 + def modify_name(self, name):
1.57 +
1.58 + """
1.59 + Modify a global 'name' invalidating various assumptions about its
1.60 + behaviour based on the module namespace being "safe" and suitable for
1.61 + attribute usage and constant value observations.
1.62 + """
1.63 +
1.64 + self.modified_names.add(name)
1.65 +
1.66 + # Establish an attribute directly in the namespace if not present.
1.67 +
1.68 + if not self.namespace.has_key(name):
1.69 + self.namespace[name] = Attr(None, self, name)
1.70 +
1.71 + attr = self.namespace[name]
1.72 + attr.update_assignments(1, False)
1.73 +
1.74 # Attribute usage methods that apply to module globals in certain
1.75 # circumstances.
1.76