1.1 --- a/micropython/inspect.py Sat Aug 07 02:06:15 2010 +0200
1.2 +++ b/micropython/inspect.py Mon Aug 09 01:23:05 2010 +0200
1.3 @@ -408,6 +408,12 @@
1.4
1.5 # Generic support for classes of operations.
1.6
1.7 + def _ensureOperators(self):
1.8 + if not self.has_key("$operator"):
1.9 + module = self.importer.load("operator")
1.10 + self["$operator"] = module
1.11 + return self["$operator"].get_value()
1.12 +
1.13 def _visitUnary(self, node):
1.14
1.15 "Accounting method for the unary operator 'node'."
1.16 @@ -420,9 +426,9 @@
1.17
1.18 "Accounting method for the binary operator 'node'."
1.19
1.20 - left_method, right_method = binary_methods[node.__class__.__name__]
1.21 - self.use_name(left_method, node)
1.22 - self.use_name(right_method, node)
1.23 + operator_module = self._ensureOperators()
1.24 + operator_fn = operator_functions[node.__class__.__name__]
1.25 + self.use_specific_attribute(operator_module.full_name(), operator_fn)
1.26 return self.OP(node)
1.27
1.28 def _visitFunction(self, node, name):
1.29 @@ -565,10 +571,9 @@
1.30
1.31 # Accounting.
1.32
1.33 - aug_method, (left_method, right_method) = augassign_methods[node.op]
1.34 - self.use_name(aug_method, node)
1.35 - self.use_name(left_method, node)
1.36 - self.use_name(right_method, node)
1.37 + operator_fn = operator_functions.get(node.op)
1.38 + operator_module = self._ensureOperators()
1.39 + self.use_specific_attribute(operator_module.full_name(), operator_fn)
1.40
1.41 # Process the assignment.
1.42
1.43 @@ -676,15 +681,19 @@
1.44 for op in node.ops:
1.45 op_name, next_node = op
1.46
1.47 - # Get the applicable methods.
1.48 + # Define name/attribute usage.
1.49 + # Get the applicable operation.
1.50
1.51 - methods = comparison_methods[op_name]
1.52 + operator_fn = operator_functions.get(op_name)
1.53 +
1.54 + # For operators, reference the specific function involved.
1.55
1.56 - # Define name/attribute usage.
1.57 + if operator_fn is not None:
1.58 + operator_module = self._ensureOperators()
1.59 + self.use_specific_attribute(operator_module.full_name(), operator_fn)
1.60
1.61 - if methods is not None:
1.62 - self.use_name(methods[0], this_node)
1.63 - self.use_name(methods[1], next_node)
1.64 + # Define __contains__ usage on the next node.
1.65 +
1.66 elif op_name.endswith("in"):
1.67 self.use_name("__contains__", next_node)
1.68