1.1 --- a/lib/builtins.py Wed Aug 11 00:04:11 2010 +0200
1.2 +++ b/lib/builtins.py Sun Aug 15 21:49:47 2010 +0200
1.3 @@ -460,10 +460,7 @@
1.4
1.5 "Implementation of range."
1.6
1.7 - l = []
1.8 - for i in xrange(start_or_end, end, step):
1.9 - l.append(i)
1.10 - return l
1.11 + return list(xrange(start_or_end, end, step))
1.12
1.13 def raw_input(prompt=None): pass
1.14 def reduce(function, sequence, initial=None): pass
3.1 --- a/micropython/data.py Wed Aug 11 00:04:11 2010 +0200
3.2 +++ b/micropython/data.py Sun Aug 15 21:49:47 2010 +0200
3.3 @@ -1303,18 +1303,13 @@
3.4
3.5 # Initialise attribute usage.
3.6
3.7 - for arg in argnames:
3.8 + if node is not None:
3.9 + for arg in argnames:
3.10
3.11 - # Define attribute users.
3.12 + # Define attribute users.
3.13
3.14 - if node is not None:
3.15 self._define_attribute_user_for_name(node, arg)
3.16
3.17 - # Or just record the usage.
3.18 -
3.19 - else:
3.20 - self.attributes_used[-1][arg] = set()
3.21 -
3.22 # Caches.
3.23
3.24 self.localnames = None # cache for locals
3.25 @@ -1520,7 +1515,7 @@
3.26 "Make an instantiator function from a method, keeping all arguments."
3.27
3.28 function = Function(self.parent.name, self.parent.parent, self.argnames, self.defaults,
3.29 - self.has_star, self.has_dstar, self.dynamic_def, self.module, self.astnode)
3.30 + self.has_star, self.has_dstar, self.dynamic_def, self.module)
3.31 function.default_attrs = self.default_attrs
3.32 return function
3.33
4.1 --- a/micropython/inspect.py Wed Aug 11 00:04:11 2010 +0200
4.2 +++ b/micropython/inspect.py Sun Aug 15 21:49:47 2010 +0200
4.3 @@ -108,7 +108,6 @@
4.4
4.5 # Namespace state.
4.6
4.7 - self.in_init = 0 # Find instance attributes in __init__ methods.
4.8 self.in_method = 0 # Find instance attributes in all methods.
4.9 self.in_function = 0 # Note function presence, affecting definitions.
4.10 self.in_loop = 0 # Note loop "membership", affecting assignments.
4.11 @@ -409,28 +408,25 @@
4.12 # Generic support for classes of operations.
4.13
4.14 def _ensureOperators(self):
4.15 - if not self.has_key("$operator"):
4.16 + attr, scope, namespace = self._get_with_scope("$operator")
4.17 + if attr is None:
4.18 module = self.importer.load("operator")
4.19 self["$operator"] = module
4.20 - return self["$operator"].get_value()
4.21 + else:
4.22 + module = attr.get_value()
4.23 + return module
4.24
4.25 def _visitUnary(self, node):
4.26
4.27 - "Accounting method for the unary operator 'node'."
4.28 -
4.29 - method = unary_methods[node.__class__.__name__]
4.30 - self.use_name(method, node)
4.31 - return self.OP(node)
4.32 -
4.33 - def _visitBinary(self, node):
4.34 -
4.35 - "Accounting method for the binary operator 'node'."
4.36 + "Accounting method for the operator 'node'."
4.37
4.38 operator_module = self._ensureOperators()
4.39 operator_fn = operator_functions[node.__class__.__name__]
4.40 self.use_specific_attribute(operator_module.full_name(), operator_fn)
4.41 return self.OP(node)
4.42
4.43 + _visitBinary = _visitUnary
4.44 +
4.45 def _visitFunction(self, node, name):
4.46
4.47 """
4.48 @@ -487,8 +483,6 @@
4.49 # Previous namespace is the class.
4.50
4.51 if self.in_class(namespaces):
4.52 - if namespaces[-1].name == "__init__":
4.53 - self.in_init = 1
4.54 self.in_method = 1
4.55
4.56 in_function = self.in_function
4.57 @@ -501,7 +495,6 @@
4.58
4.59 self.in_loop = in_loop
4.60 self.in_function = in_function
4.61 - self.in_init = 0
4.62 self.in_method = 0
4.63
4.64 # Specific handler methods.
5.1 --- a/micropython/report.py Wed Aug 11 00:04:11 2010 +0200
5.2 +++ b/micropython/report.py Sun Aug 15 21:49:47 2010 +0200
5.3 @@ -60,6 +60,7 @@
5.4 .comment { color: blue; }
5.5 .class-name { color: cyan; }
5.6 .function-name { color: cyan; }
5.7 + .specific-ref { color: #07F; }
5.8 .str { color: #FF00FF; }
5.9 .doc { color: #FF00FF; margin-top: 1em; margin-bottom: 1em; }
5.10
5.11 @@ -202,9 +203,6 @@
5.12 self.stream.write('"""')
5.13 self.stream.write("</pre>\n")
5.14
5.15 - def _summary_link(self, module_name, full_name, name, classes=None):
5.16 - self._name_link("%s-summary" % module_name, full_name, name, classes)
5.17 -
5.18 def _object_name_def(self, module, obj, classes=None):
5.19
5.20 """
5.21 @@ -214,9 +212,21 @@
5.22
5.23 self._summary_link(module.full_name(), obj.full_name(), obj.name, classes)
5.24
5.25 + def _object_name_ref(self, module, obj, classes=None):
5.26 +
5.27 + """
5.28 + Link to the definition for 'module' using 'obj'. The optional 'classes'
5.29 + can be used to customise the CSS classes employed.
5.30 + """
5.31 +
5.32 + self._name_link(module.full_name(), obj.full_name(), obj.name, classes)
5.33 +
5.34 + def _summary_link(self, module_name, full_name, name, classes=None):
5.35 + self._name_link("%s-summary" % module_name, full_name, name, classes)
5.36 +
5.37 def _name_link(self, module_name, full_name, name, classes=None):
5.38 self.stream.write("<a class='%s' href='%s%sxhtml#%s'>%s</a>" % (
5.39 - classes or "name", module_name, os.path.extsep,
5.40 + classes or "specific-ref", module_name, os.path.extsep,
5.41 self._attr(full_name), self._text(name)))
5.42
5.43 def _scope(self, scope):
5.44 @@ -283,7 +293,6 @@
5.45 "Write the summary to the given 'stream'."
5.46
5.47 self.stream = stream
5.48 - self._init_details()
5.49 self.stream.write(html_header % {"full_name" : self.module.full_name()})
5.50 self._write_classes(self.module)
5.51 self.stream.write(html_footer)
5.52 @@ -316,31 +325,17 @@
5.53 self.stream.write(obj.name)
5.54 self.stream.write("</th>\n")
5.55
5.56 - # ...and all known attribute names.
5.57 + # ...and instance attribute names in order.
5.58
5.59 - obj_attributes = obj.all_attribute_names()
5.60 + attrs = obj.instance_attributes().values()
5.61 + attrs.sort(cmp=lambda x, y: cmp(x.position, y.position))
5.62
5.63 - for name in self.attribute_names:
5.64 - if name in obj_attributes:
5.65 - self.stream.write("<th class='summary-attr'>%s</th>\n" % self._text(name))
5.66 - else:
5.67 - self.stream.write("<th></th>\n")
5.68 + for attr in attrs:
5.69 + self.stream.write("<th class='summary-attr'>%s</th>\n" % self._text(attr.name))
5.70 +
5.71 self.stream.write("</tr>\n")
5.72 -
5.73 self.stream.write("</tbody>\n")
5.74
5.75 - def _init_details(self):
5.76 - names = set()
5.77 -
5.78 - # Visit all classes.
5.79 -
5.80 - for obj in self.module.all_objects:
5.81 - if isinstance(obj, Class):
5.82 - names.update(obj.all_attribute_names())
5.83 -
5.84 - self.attribute_names = list(names)
5.85 - self.attribute_names.sort()
5.86 -
5.87 # Source code classes.
5.88
5.89 class AnnotatedSource(ASTVisitor, Writer):
5.90 @@ -427,7 +422,7 @@
5.91 if not first:
5.92 self.stream.write(", ")
5.93
5.94 - self._object_name_def(base.module, base)
5.95 + self._object_name_ref(base.module, base)
5.96
5.97 first = 0
5.98 self.stream.write(")")
5.99 @@ -439,7 +434,18 @@
5.100
5.101 self.stream.write("<div class='body nowrap'>\n")
5.102 self._doc(node)
5.103 - self.dispatch(node.code)
5.104 +
5.105 + # NOTE: Some streams may not support tell.
5.106 +
5.107 + x = self.stream.tell()
5.108 +
5.109 + self.default(node.code)
5.110 +
5.111 + # Check for no output.
5.112 +
5.113 + if x == self.stream.tell():
5.114 + self.visitPass(None)
5.115 +
5.116 self.stream.write("</div>\n")
5.117 self.stream.write("</div>\n")
5.118
5.119 @@ -902,6 +908,71 @@
5.120 else:
5.121 self._span(node.name)
5.122
5.123 + def visitNot(self, node):
5.124 + self._span_start("not")
5.125 + self._keyword("not")
5.126 + self.dispatch(node.expr)
5.127 + self._span_end()
5.128 +
5.129 + def visitOr(self, node):
5.130 + self._span_start("or")
5.131 + first = 1
5.132 + for n in node.nodes:
5.133 + if not first:
5.134 + self._keyword("or", 1)
5.135 + self.dispatch(n)
5.136 + first = 0
5.137 + self._span_end()
5.138 +
5.139 + def visitPower(self, node):
5.140 + self._visitBinary(node, "power", "**")
5.141 +
5.142 + def visitSlice(self, node):
5.143 + self._span_start("slice")
5.144 + self.dispatch(node.expr)
5.145 + self.stream.write("[")
5.146 + if node.lower:
5.147 + self.dispatch(node.lower)
5.148 + self.stream.write(":")
5.149 + if node.upper:
5.150 + self.dispatch(node.upper)
5.151 + # NOTE: Step?
5.152 + self.stream.write("]")
5.153 + self._span_end()
5.154 +
5.155 + def visitSliceobj(self, node):
5.156 + self._span_start("sliceobj")
5.157 + first = 1
5.158 + for n in node.nodes:
5.159 + if not first:
5.160 + self.stream.write(":")
5.161 + self.dispatch(n)
5.162 + self._span_end()
5.163 +
5.164 + def visitSub(self, node):
5.165 + self._visitBinary(node, "sub", "-")
5.166 +
5.167 + def visitSubscript(self, node):
5.168 + self._span_start("subscript")
5.169 + self.dispatch(node.expr)
5.170 + self.stream.write("[")
5.171 + first = 1
5.172 + for sub in node.subs:
5.173 + if not first:
5.174 + self.stream.write(", ")
5.175 + self.dispatch(sub)
5.176 + first = 0
5.177 + self.stream.write("]")
5.178 + self._span_end()
5.179 +
5.180 + visitTuple = visitAssTuple
5.181 +
5.182 + def visitUnaryAdd(self, node):
5.183 + self._visitUnary(node, "add", "+")
5.184 +
5.185 + def visitUnarySub(self, node):
5.186 + self._visitUnary(node, "sub", "-")
5.187 +
5.188 # Output preparation methods.
5.189
5.190 def _sequence(self, node):