1.1 --- a/translator.py Tue Nov 22 17:20:56 2016 +0100
1.2 +++ b/translator.py Tue Nov 22 17:36:39 2016 +0100
1.3 @@ -78,6 +78,10 @@
1.4
1.5 "A reference to a name in the translation."
1.6
1.7 + def __init__(self, name, ref, expr=None, parameter=None):
1.8 + results.ResolvedNameRef.__init__(self, name, ref, expr)
1.9 + self.parameter = parameter
1.10 +
1.11 def __str__(self):
1.12
1.13 "Return an output representation of the referenced name."
1.14 @@ -114,7 +118,7 @@
1.15 # All other assignments involve the names as they were given.
1.16
1.17 else:
1.18 - return "%s = %s" % (attrname, self.expr)
1.19 + return "(%s%s) = %s" % (self.parameter and "*" or "", attrname, self.expr)
1.20
1.21 # Expressions.
1.22
1.23 @@ -132,7 +136,7 @@
1.24 # All other accesses involve the names as they were given.
1.25
1.26 else:
1.27 - return attrname
1.28 + return "(%s%s)" % (self.parameter and "*" or "", attrname)
1.29
1.30 class TrConstantValueRef(results.ConstantValueRef, TranslationResult):
1.31
1.32 @@ -298,6 +302,12 @@
1.33 class_name, method_name = path.rsplit(".", 1)
1.34 return self.importer.classes.has_key(class_name) and class_name
1.35
1.36 + def in_method(self):
1.37 +
1.38 + "Return whether the current namespace provides a method."
1.39 +
1.40 + return self.in_function and self.is_method(self.get_namespace_path())
1.41 +
1.42 # Namespace recording.
1.43
1.44 def record_namespaces(self, node):
1.45 @@ -1089,11 +1099,18 @@
1.46 locals = self.importer.function_locals.get(self.get_namespace_path())
1.47 ref = locals and locals.get(n.name)
1.48
1.49 + # Determine whether the name refers to a parameter. The generation of
1.50 + # parameter references is different from other names.
1.51 +
1.52 + parameters = self.importer.function_parameters.get(self.get_namespace_path())
1.53 + parameter = n.name == "self" and self.in_method() or \
1.54 + parameters and n.name in parameters
1.55 +
1.56 # Qualified names are used for resolved static references or for
1.57 # static namespace members. The reference should be configured to return
1.58 # such names.
1.59
1.60 - return TrResolvedNameRef(n.name, ref, expr=expr)
1.61 + return TrResolvedNameRef(n.name, ref, expr=expr, parameter=parameter)
1.62
1.63 def process_not_node(self, n):
1.64
1.65 @@ -1373,13 +1390,12 @@
1.66 names.sort()
1.67 self.writeline("__attr %s;" % ", ".join(names))
1.68
1.69 - self.write_parameters(name, True)
1.70 + self.write_parameters(name)
1.71
1.72 def end_function(self, name):
1.73
1.74 "End the function having the given 'name'."
1.75
1.76 - self.write_parameters(name, False)
1.77 self.indent -= 1
1.78 print >>self.out, "}"
1.79 print >>self.out
1.80 @@ -1397,12 +1413,11 @@
1.81 self.writeline("__attr %s__tmp_result;" % targets)
1.82 self.writeline("__exc __tmp_exc;")
1.83
1.84 - def write_parameters(self, name, define=True):
1.85 + def write_parameters(self, name):
1.86
1.87 """
1.88 For the function having the given 'name', write definitions of
1.89 - parameters found in the arguments array if 'define' is set to a true
1.90 - value, or write "undefinitions" if 'define' is set to a false value.
1.91 + parameters found in the arguments array.
1.92 """
1.93
1.94 parameters = self.importer.function_parameters[name]
1.95 @@ -1410,18 +1425,12 @@
1.96 # Generate any self reference.
1.97
1.98 if self.is_method(name):
1.99 - if define:
1.100 - self.writeline("#define self (__args[0])")
1.101 - else:
1.102 - self.writeline("#undef self")
1.103 + self.writeline("__attr * const self = &__args[0];")
1.104
1.105 # Generate aliases for the parameters.
1.106
1.107 for i, parameter in enumerate(parameters):
1.108 - if define:
1.109 - self.writeline("#define %s (__args[%d])" % (encode_path(parameter), i+1))
1.110 - else:
1.111 - self.writeline("#undef %s" % encode_path(parameter))
1.112 + self.writeline("__attr * const %s = &__args[%d];" % (encode_path(parameter), i+1))
1.113
1.114 def start_if(self, first, test_ref):
1.115 self.writestmt("%sif (__BOOL(%s))" % (not first and "else " or "", test_ref))