1.1 --- a/micropython/data.py Tue Jun 02 20:17:59 2009 +0200
1.2 +++ b/micropython/data.py Wed Jun 03 00:48:57 2009 +0200
1.3 @@ -44,7 +44,7 @@
1.4 where each such object is defined.
1.5 """
1.6
1.7 -from micropython.program import DataObject
1.8 +from micropython.program import DataObject, ReplaceableContext, PlaceholderContext
1.9
1.10 def shortrepr(obj):
1.11 if obj is None:
1.12 @@ -184,17 +184,34 @@
1.13 attr = self.namespace[name]
1.14
1.15 # Handle attribute assignment as well as assignment of basic objects.
1.16 + # Attempt to fix the context if not explicitly defined.
1.17
1.18 if isinstance(attr_or_value, Attr):
1.19 + context_values = self.get_updated_context_values(attr_or_value.context_values)
1.20 + else:
1.21 + context_values = self.get_updated_context_values([self.get_context_and_value(attr_or_value)])
1.22
1.23 - # Attempt to fix the context if not explicitly defined.
1.24 + attr.update(context_values, single_assignment)
1.25 +
1.26 + def get_context_and_value(self, value):
1.27 +
1.28 + "Return a context, value tuple for the given 'value'."
1.29 +
1.30 + # Functions have a replaceable context.
1.31
1.32 - context_values = self.get_updated_context_values(attr_or_value.context_values)
1.33 + if isinstance(value, Function):
1.34 + return (ReplaceableContext, value)
1.35 +
1.36 + # Classes use placeholder contexts which cannot be replaced but which
1.37 + # do not communicate useful contextual information.
1.38 +
1.39 + elif isinstance(value, Class):
1.40 + return (PlaceholderContext, value)
1.41 +
1.42 + # Other values employ themselves as the context.
1.43
1.44 else:
1.45 - context_values = self.get_updated_context_values([(None, attr_or_value)])
1.46 -
1.47 - attr.update(context_values, single_assignment)
1.48 + return (value, value)
1.49
1.50 def get_updated_context_values(self, context_values):
1.51
1.52 @@ -293,10 +310,16 @@
1.53 return [v for (c, v) in self.context_values]
1.54
1.55 def get_context(self):
1.56 - return len(self.context_values) == 1 and self.get_contexts()[0] or None
1.57 + if len(self.context_values) == 1:
1.58 + return self.get_contexts()[0]
1.59 + else:
1.60 + return None
1.61
1.62 def get_value(self):
1.63 - return len(self.context_values) == 1 and self.get_values()[0] or None
1.64 + if len(self.context_values) == 1:
1.65 + return self.get_values()[0]
1.66 + else:
1.67 + return None
1.68
1.69 def update(self, context_values, single_assignment):
1.70
1.71 @@ -623,7 +646,7 @@
1.72
1.73 # Change the ownership of functions.
1.74
1.75 - if context is None and value is not None and isinstance(value, Function):
1.76 + if context is ReplaceableContext and value is not None and isinstance(value, Function):
1.77 results.add((self, value))
1.78 else:
1.79 results.add((context, value))
1.80 @@ -999,7 +1022,7 @@
1.81
1.82 def store_default(self, value):
1.83 attr = Attr(None, self, None)
1.84 - attr.update([(None, value)], 1)
1.85 + attr.update([self.get_context_and_value(value)], 1)
1.86 self.default_attrs.append(attr)
1.87
1.88 def make_global(self, name):