1.1 --- a/micropython/ast.py Mon Mar 31 00:54:03 2008 +0200
1.2 +++ b/micropython/ast.py Sun Apr 06 02:53:43 2008 +0200
1.3 @@ -29,7 +29,7 @@
1.4 except NameError:
1.5 from sets import Set as set
1.6
1.7 -class TranslateError(ProcessingError): pass
1.8 +class TranslateError(NodeProcessingError): pass
1.9
1.10 class Label:
1.11
1.12 @@ -195,9 +195,9 @@
1.13 """
1.14
1.15 self.dispatch(node.expr)
1.16 - self._generateAttr(node.attrname, classes)
1.17 + self._generateAttr(node, node.attrname, classes)
1.18
1.19 - def _generateAttr(self, attrname, classes):
1.20 + def _generateAttr(self, node, attrname, classes):
1.21
1.22 """
1.23 Generate code for the access to 'attrname' using the given 'classes'.
1.24 @@ -222,21 +222,39 @@
1.25
1.26 target = last.attr.value
1.27 target_name = target.full_name()
1.28 - table_entry = self.objtable.table[target_name]
1.29 - pos = table_entry[attrname]
1.30 +
1.31 + try:
1.32 + table_entry = self.objtable.table[target_name]
1.33 + except KeyError:
1.34 + raise TranslateError(self.module.full_name(), node,
1.35 + "No object entry exists for target %r." % target_name)
1.36 +
1.37 + try:
1.38 + pos = table_entry[attrname]
1.39 + except KeyError:
1.40 + raise TranslateError(self.module.full_name(), node,
1.41 + "No attribute entry exists for name %r in target %r." % (attrname, target_name))
1.42 +
1.43 self.replace_op(AttrInstruction(pos))
1.44
1.45 # Where the last operation involves the special 'self' name, check to
1.46 # see if the attribute is acceptably positioned.
1.47
1.48 - elif isinstance(last, LoadName) and last.attr.name == "self" and not self.unit.is_relocated(attrname):
1.49 + elif self.unit.is_method() and isinstance(last, LoadName) and \
1.50 + last.attr.name == "self" and not self.unit.is_relocated(attrname):
1.51 +
1.52 attr = self.unit.parent.all_attributes()[attrname]
1.53 self.new_op(AttrInstruction(attr))
1.54
1.55 # Otherwise, perform a normal operation.
1.56
1.57 else:
1.58 - index = self.objtable.get_index(attrname)
1.59 + try:
1.60 + index = self.objtable.get_index(attrname)
1.61 + except self.objtable.TableError:
1.62 + raise TranslateError(self.module.full_name(), node,
1.63 + "No attribute entry exists for name %r." % attrname)
1.64 +
1.65 self.new_op(AttrIndexInstruction(index))
1.66
1.67 def _startCallFunc(self):
1.68 @@ -437,7 +455,10 @@
1.69
1.70 def _get_builtin(self, name, node):
1.71 if self.builtins is not None:
1.72 - return self.builtins[name]
1.73 + try:
1.74 + return self.builtins[name]
1.75 + except KeyError:
1.76 + raise TranslateError(self.module.full_name(), node, "No __builtins__ definition is available for name %r." % name)
1.77 else:
1.78 raise TranslateError(self.module.full_name(), node, "No __builtins__ module is available for name %r." % name)
1.79
1.80 @@ -534,7 +555,7 @@
1.81
1.82 self._startCallFunc()
1.83 self.new_op(LoadTemp(1))
1.84 - self._generateAttr(left_method, (LoadAttr, LoadAttrIndex))
1.85 + self._generateAttr(node, left_method, (LoadAttr, LoadAttrIndex))
1.86 self.new_op(LoadTemp(1)) # Explicit context as first argument.
1.87 self.new_op(LoadTemp(2))
1.88 self._endCallFunc()
1.89 @@ -548,7 +569,7 @@
1.90 self.set_label(right_label)
1.91 self._startCallFunc()
1.92 self.new_op(LoadTemp(2))
1.93 - self._generateAttr(right_method, (LoadAttr, LoadAttrIndex))
1.94 + self._generateAttr(node, right_method, (LoadAttr, LoadAttrIndex))
1.95 self.new_op(LoadTemp(2)) # Explicit context as first argument.
1.96 self.new_op(LoadTemp(1))
1.97 self._endCallFunc()
1.98 @@ -661,7 +682,7 @@
1.99
1.100 self._startCallFunc()
1.101 self.dispatch(node.list)
1.102 - self._generateAttr("__iter__", (LoadAttr, LoadAttrIndex))
1.103 + self._generateAttr(node, "__iter__", (LoadAttr, LoadAttrIndex))
1.104 self._generateCallFunc([], node)
1.105 self._endCallFunc()
1.106
1.107 @@ -675,7 +696,7 @@
1.108
1.109 self._startCallFunc()
1.110 self.new_op(Duplicate())
1.111 - self._generateAttr("next", (LoadAttr, LoadAttrIndex))
1.112 + self._generateAttr(node, "next", (LoadAttr, LoadAttrIndex))
1.113 self._generateCallFunc([], node)
1.114 self._endCallFunc()
1.115