+ It will declare any temporary variable
+ '''
+
+ def __init__(self, inflector):
+ self.inflector = inflector
+
+ def temp_name(self, pname):
+ '''Return the name of a temporary variable to hold the state.'''
+
+ return pname[3:].lower()
+
+ def visit_const(self, const, pname):
+ return self.visit(const.type, pname)
+
+ def visit_scalar(self, type, pname):
+ temp_name = self.temp_name(pname)
+ elem_type = self.inflector.reduced_type(type)
+ inflection = self.inflector.inflect(type)
+ if inflection.endswith('v'):
+ print ' %s %s = 0;' % (elem_type, temp_name)
+ print ' %s(%s, &%s);' % (inflection, pname, temp_name)
+ else:
+ print ' %s %s = %s(%s);' % (elem_type, temp_name, inflection, pname)
+ return temp_name
+
+ def visit_string(self, string, pname):
+ temp_name = self.temp_name(pname)
+ inflection = self.inflector.inflect(string)
+ assert not inflection.endswith('v')
+ print ' %s %s = (%s)%s(%s);' % (string, temp_name, string, inflection, pname)
+ return temp_name
+
+ def visit_alias(self, alias, pname):
+ return self.visit_scalar(alias, pname)
+
+ def visit_enum(self, enum, pname):
+ return self.visit(GLint, pname)
+
+ def visit_bitmask(self, bitmask, pname):
+ return self.visit(GLint, pname)
+
+ def visit_array(self, array, pname):
+ temp_name = self.temp_name(pname)
+ if array.length == '1':
+ return self.visit(array.type)
+ elem_type = self.inflector.reduced_type(array.type)
+ inflection = self.inflector.inflect(array.type)
+ assert inflection.endswith('v')
+ print ' %s %s[%s];' % (elem_type, temp_name, array.length)
+ print ' memset(%s, 0, %s * sizeof *%s);' % (temp_name, array.length, temp_name)
+ print ' %s(%s, %s);' % (inflection, pname, temp_name)
+ return temp_name
+
+ def visit_opaque(self, pointer, pname):
+ temp_name = self.temp_name(pname)
+ inflection = self.inflector.inflect(pointer)
+ assert inflection.endswith('v')
+ print ' GLvoid *%s;' % temp_name
+ print ' %s(%s, &%s);' % (inflection, pname, temp_name)
+ return temp_name