3.1 --- a/micropython/data.py Mon Jul 01 00:47:43 2013 +0200
3.2 +++ b/micropython/data.py Mon Jul 01 02:10:23 2013 +0200
3.3 @@ -554,7 +554,7 @@
3.4
3.5 "A base class for common/normal classes and the type class."
3.6
3.7 - def __init__(self, name, parent=None, module=None, node=None):
3.8 + def __init__(self, name, parent=None, module=None, node=None, original_name=None):
3.9
3.10 """
3.11 Initialise the class with the given 'name', optional 'parent' object,
3.12 @@ -566,6 +566,7 @@
3.13 self.name = name
3.14 self.parent = parent
3.15 self.astnode = node
3.16 + self.original_name = original_name or name
3.17
3.18 # Superclasses, descendants and attributes.
3.19
3.20 @@ -975,7 +976,7 @@
3.21 "An inspected function."
3.22
3.23 def __init__(self, name, parent, argnames, defaults, has_star, has_dstar,
3.24 - dynamic_def=0, module=None, node=None):
3.25 + dynamic_def=0, module=None, node=None, original_name=None):
3.26
3.27 """
3.28 Initialise the function with the given 'name', 'parent', list of
3.29 @@ -995,6 +996,8 @@
3.30 self.name = name
3.31 self._is_lambda = False
3.32
3.33 + self.original_name = original_name or name
3.34 +
3.35 self.parent = parent
3.36 self.argnames = argnames
3.37 self.defaults = defaults
3.38 @@ -1487,10 +1490,12 @@
3.39 # Where names are reused in a namespace, differentiate between classes
3.40 # using a name index.
3.41
3.42 + original_name = name
3.43 +
3.44 if parent.has_key(name):
3.45 name = "%s#%d" % (name, parent[name].assignments + 1)
3.46
3.47 - cls = Class(name, parent, module, node)
3.48 + cls = Class(name, parent, module, node, original_name)
3.49
3.50 # Add a reference for the class's "shadow" name.
3.51
3.52 @@ -1498,6 +1503,31 @@
3.53
3.54 return cls
3.55
3.56 +# Function construction.
3.57 +
3.58 +def get_function(name, parent, argnames, defaults, has_star, has_dstar,
3.59 + dynamic_def=0, module=None, node=None):
3.60 +
3.61 + """
3.62 + Return a Function instance for the class with the given 'name', 'parent',
3.63 + and other details.
3.64 + """
3.65 +
3.66 + original_name = name
3.67 +
3.68 + if parent.has_key(name):
3.69 + name = "%s#%d" % (name, parent[name].assignments + 1)
3.70 +
3.71 + fn = Function(name, parent, argnames, defaults, has_star, has_dstar,
3.72 + dynamic_def, module, node, original_name)
3.73 +
3.74 + # Add a reference for the function's "shadow" name.
3.75 +
3.76 + if name:
3.77 + parent.use_specific_attribute(parent.full_name(), name)
3.78 +
3.79 + return fn
3.80 +
3.81 # Lambda sequence numbering.
3.82
3.83 lambda_index = 0
5.1 --- a/micropython/syspython.py Mon Jul 01 00:47:43 2013 +0200
5.2 +++ b/micropython/syspython.py Mon Jul 01 02:10:23 2013 +0200
5.3 @@ -299,7 +299,7 @@
5.4 compiler.ast.Assign(
5.5 [special_name(alias or name)],
5.6 compiler.ast.CallFunc(
5.7 - special_name("__loadattribute__"),
5.8 + special_name("__loadattr__"),
5.9 [special_name(node.modname), special_name(name)]
5.10 )
5.11 )
5.12 @@ -314,10 +314,19 @@
5.13 self.units.append(node.unit)
5.14
5.15 try:
5.16 - # Ignore functions when generating the main function.
5.17 + if self.in_main:
5.18 +
5.19 + # Generate rebindings of functions.
5.20
5.21 - if self.in_main:
5.22 - return compiler.ast.Stmt([])
5.23 + fn = node.unit
5.24 + if fn.name == fn.original_name:
5.25 + return compiler.ast.Stmt([])
5.26 + else:
5.27 + return compiler.ast.CallFunc(
5.28 + special_name("__storeattr__"),
5.29 + [quoted_ref(fn.parent), special_name(fn.original_name),
5.30 + quoted_ref(fn)]
5.31 + )
5.32 else:
5.33 return self._visitFunctionDefinition(node)
5.34 finally: