Index: mojo/public/bindings/generators/mojom_cpp_generator.py |
diff --git a/mojo/public/bindings/generators/mojom_cpp_generator.py b/mojo/public/bindings/generators/mojom_cpp_generator.py |
index 99553223ab2f881ac4a4b3a5261ee1f16e1b04e9..5587c477b1d57c1e063f7ac816feed8aa84cc52c 100644 |
--- a/mojo/public/bindings/generators/mojom_cpp_generator.py |
+++ b/mojo/public/bindings/generators/mojom_cpp_generator.py |
@@ -22,19 +22,38 @@ def ReadTemplate(filename): |
return Template(file.read()) |
-def AddForward(forwards, kind): |
- """Adds a forward class declaration line to the |forwards| set.""" |
- if isinstance(kind, mojom.Struct): |
- forwards.add("class %s;" % kind.name.capitalize()) |
- if isinstance(kind, mojom.Array): |
- AddForward(forwards, kind.kind) |
+class Forwards(object): |
+ """Helper class to maintain unique set of forward declarations.""" |
+ def __init__(self): |
+ self.forwards = set() |
+ def Add(self, kind): |
+ if isinstance(kind, mojom.Struct): |
+ self.forwards.add("class %s;" % kind.name.capitalize()) |
+ if isinstance(kind, mojom.Array): |
+ self.Add(kind.kind) |
+ |
+ def __repr__(self): |
+ if len(self.forwards) > 0: |
+ return '\n'.join(sorted(self.forwards)) + '\n' |
+ return "" |
+ |
+ |
+class Lines(object): |
+ """Helper class to maintain list of template expanded lines.""" |
+ def __init__(self, template): |
+ self.template = template |
+ self.lines = [] |
+ |
+ def Add(self, map = {}, **substitutions): |
+ if len(substitutions) > 0: |
+ map = map.copy() |
+ map.update(substitutions) |
+ |
+ self.lines.append(self.template.substitute(map)) |
-def GetForwards(forwards): |
- """Returns a string suitable for substituting into a $FORWARDS section.""" |
- if len(forwards) > 0: |
- return '\n'.join(sorted(forwards)) + '\n' |
- return "" |
+ def __repr__(self): |
+ return '\n'.join(self.lines) |
class CPPGenerator(object): |
@@ -57,15 +76,15 @@ class CPPGenerator(object): |
interface_stub_header_template = ReadTemplate("module_interface_stub.h") |
interface_stub_source_template = ReadTemplate("module_interface_stub.cc") |
interface_stub_case_template = ReadTemplate("module_interface_stub_case") |
- field_template = Template(" $itype ${field}_;") |
- bool_field_template = Template(" uint8_t ${field}_ : 1;") |
+ field_template = Template(" $TYPE ${FIELD}_;") |
+ bool_field_template = Template(" uint8_t ${FIELD}_ : 1;") |
setter_template = \ |
- Template(" void set_$field($stype $field) { ${field}_ = $field; }") |
+ Template(" void set_$FIELD($TYPE $FIELD) { ${FIELD}_ = $FIELD; }") |
getter_template = \ |
- Template(" $gtype $field() const { return ${field}_; }") |
+ Template(" $TYPE $FIELD() const { return ${FIELD}_; }") |
ptr_getter_template = \ |
- Template(" $gtype $field() const { return ${field}_.ptr; }") |
- pad_template = Template(" uint8_t _pad${count}_[$pad];") |
+ Template(" $TYPE $FIELD() const { return ${FIELD}_.ptr; }") |
+ pad_template = Template(" uint8_t _pad${COUNT}_[$PAD];") |
HEADER_SIZE = 8 |
kind_to_type = { |
@@ -112,18 +131,18 @@ class CPPGenerator(object): |
template = cls.ptr_getter_template |
else: |
template = cls.getter_template |
- return template.substitute(field=pf.field.name, gtype=gtype) |
+ return template.substitute(FIELD=pf.field.name, TYPE=gtype) |
@classmethod |
def GetSetterLine(cls, pf): |
stype = cls.GetType(pf.field.kind) |
- return cls.setter_template.substitute(field=pf.field.name, stype=stype) |
+ return cls.setter_template.substitute(FIELD=pf.field.name, TYPE=stype) |
@classmethod |
def GetFieldLine(cls, pf): |
kind = pf.field.kind |
if kind.spec == 'b': |
- return cls.bool_field_template.substitute(field=pf.field.name) |
+ return cls.bool_field_template.substitute(FIELD=pf.field.name) |
itype = None |
if isinstance(kind, mojom.Struct): |
itype = "mojo::internal::StructPointer<%s>" % kind.name.capitalize() |
@@ -133,19 +152,12 @@ class CPPGenerator(object): |
itype = "mojo::internal::StringPointer" |
else: |
itype = cls.kind_to_type[kind] |
- return cls.field_template.substitute(field=pf.field.name, itype=itype) |
+ return cls.field_template.substitute(FIELD=pf.field.name, TYPE=itype) |
@classmethod |
def GetCaseLine(cls, interface, method): |
- method_call = "%s(" % method.name |
- first_param = True |
- for param in method.parameters: |
- if first_param: |
- first_param = False |
- else: |
- method_call += ", " |
- method_call += "params->%s()" % param.name |
- method_call += ");" |
+ params = map(lambda param: "params->%s()" % param.name, method.parameters) |
+ method_call = "%s(%s);" % (method.name, ", ".join(params)) |
return cls.interface_stub_case_template.substitute( |
CLASS = interface.name, |
METHOD = method.name, |
@@ -178,6 +190,8 @@ class CPPGenerator(object): |
self.output_dir = output_dir |
def WriteTemplateToFile(self, template, name, ext, **substitutions): |
+ substitutions['YEAR'] = datetime.date.today().year |
+ substitutions['NAMESPACE'] = self.module.namespace |
if self.output_dir is None: |
file = sys.stdout |
else: |
@@ -195,19 +209,19 @@ class CPPGenerator(object): |
fields = [] |
setters = [] |
getters = [] |
- forwards = set() |
+ forwards = Forwards() |
pad_count = 0 |
num_fields = len(ps.packed_fields) |
for i in xrange(num_fields): |
pf = ps.packed_fields[i] |
fields.append(self.GetFieldLine(pf)) |
- AddForward(forwards, pf.field.kind) |
+ forwards.Add(pf.field.kind) |
if i < (num_fields - 2): |
next_pf = ps.packed_fields[i+1] |
pad = next_pf.offset - (pf.offset + pf.size) |
if pad > 0: |
- fields.append(self.pad_template.substitute(count=pad_count, pad=pad)) |
+ fields.append(self.pad_template.substitute(COUNT=pad_count, PAD=pad)) |
pad_count += 1 |
setters.append(self.GetSetterLine(pf)) |
getters.append(self.GetGetterLine(pf)) |
@@ -217,19 +231,17 @@ class CPPGenerator(object): |
offset = last_field.offset + last_field.size |
pad = mojom_pack.GetPad(offset, 8) |
if pad > 0: |
- fields.append(self.pad_template.substitute(count=pad_count, pad=pad)) |
+ fields.append(self.pad_template.substitute(COUNT=pad_count, PAD=pad)) |
pad_count += 1 |
size = offset + pad |
else: |
size = 0 |
self.WriteTemplateToFile(self.struct_header_template, struct.name, 'h', |
- YEAR = datetime.date.today().year, |
HEADER_GUARD = self.GetHeaderGuard(struct.name), |
- NAMESPACE = self.module.namespace, |
CLASS = struct.name.capitalize(), |
SIZE = size + self.HEADER_SIZE, |
- FORWARDS = GetForwards(forwards), |
+ FORWARDS = forwards, |
SETTERS = '\n'.join(setters), |
GETTERS = '\n'.join(getters), |
FIELDS = '\n'.join(fields)) |
@@ -238,8 +250,6 @@ class CPPGenerator(object): |
struct = ps.struct |
header = self.GetHeaderFile(struct.name) |
self.WriteTemplateToFile(self.struct_source_template, struct.name, 'cc', |
- YEAR = datetime.date.today().year, |
- NAMESPACE = self.module.namespace, |
CLASS = struct.name.capitalize(), |
NUM_FIELDS = len(struct.fields), |
HEADER = header) |
@@ -251,9 +261,7 @@ class CPPGenerator(object): |
self.struct_serialization_header_template, |
struct.name + "_serialization", |
'h', |
- YEAR = datetime.date.today().year, |
HEADER_GUARD = self.GetHeaderGuard(struct.name + "_SERIALIZATION"), |
- NAMESPACE = self.module.namespace, |
CLASS = struct.name.capitalize(), |
FULL_CLASS = "%s::%s" % \ |
(self.module.namespace, struct.name.capitalize()), |
@@ -263,62 +271,52 @@ class CPPGenerator(object): |
struct = ps.struct |
serialization_header = self.GetHeaderFile(struct.name, "serialization") |
class_header = self.GetHeaderFile(struct.name) |
- clones = [] |
- encodes = [] |
- decodes = [] |
+ clones = Lines(self.struct_serialization_clone_template) |
+ encodes = Lines(self.struct_serialization_encode_template) |
+ decodes = Lines(self.struct_serialization_decode_template) |
sizes = " return sizeof(*%s)" % struct.name.lower() |
fields = self.GetSerializedFields(ps) |
for field in fields: |
substitutions = {'NAME': struct.name.lower(), 'FIELD': field.name.lower()} |
sizes += \ |
self.struct_serialization_compute_template.substitute(substitutions) |
- clones.append( |
- self.struct_serialization_clone_template.substitute(substitutions)) |
- encodes.append( |
- self.struct_serialization_encode_template.substitute(substitutions)) |
- decodes.append( |
- self.struct_serialization_decode_template.substitute(substitutions)) |
+ clones.Add(substitutions) |
+ encodes.Add(substitutions) |
+ decodes.Add(substitutions) |
sizes += ";" |
self.WriteTemplateToFile( |
self.struct_serialization_source_template, |
struct.name + "_serialization", |
'cc', |
- YEAR = datetime.date.today().year, |
NAME = struct.name.lower(), |
FULL_CLASS = "%s::%s" % \ |
(self.module.namespace, struct.name.capitalize()), |
SERIALIZATION_HEADER = serialization_header, |
CLASS_HEADER = class_header, |
SIZES = sizes, |
- CLONES = '\n'.join(clones), |
- ENCODES = '\n'.join(encodes), |
- DECODES = '\n'.join(decodes)) |
+ CLONES = clones, |
+ ENCODES = encodes, |
+ DECODES = decodes) |
def GenerateInterfaceHeader(self, interface): |
cpp_methods = [] |
- forwards = set() |
+ forwards = Forwards() |
for method in interface.methods: |
cpp_method = " virtual void %s(" % method.name |
- first_param = True |
+ params = [] |
for param in method.parameters: |
- if first_param == True: |
- first_param = False |
- else: |
- cpp_method += ", " |
- AddForward(forwards, param.kind) |
- cpp_method += "%s %s" % (self.GetConstType(param.kind), param.name) |
- cpp_method += ") = 0;" |
- cpp_methods.append(cpp_method) |
+ forwards.Add(param.kind) |
+ params.append("%s %s" % (self.GetConstType(param.kind), param.name)) |
+ cpp_methods.append( |
+ " virtual void %s(%s) = 0" % (method.name, ", ".join(params))) |
self.WriteTemplateToFile( |
self.interface_header_template, |
interface.name, |
'h', |
- YEAR = datetime.date.today().year, |
HEADER_GUARD = self.GetHeaderGuard(interface.name), |
- NAMESPACE = self.module.namespace, |
CLASS = interface.name.capitalize(), |
- FORWARDS = GetForwards(forwards), |
+ FORWARDS = forwards, |
METHODS = '\n'.join(cpp_methods)) |
def GenerateInterfaceStubHeader(self, interface): |
@@ -327,9 +325,7 @@ class CPPGenerator(object): |
self.interface_stub_header_template, |
interface.name + "_stub", |
'h', |
- YEAR = datetime.date.today().year, |
HEADER_GUARD = self.GetHeaderGuard(interface.name + "_STUB"), |
- NAMESPACE = self.module.namespace, |
CLASS = interface.name.capitalize(), |
HEADER = header) |
@@ -343,8 +339,6 @@ class CPPGenerator(object): |
self.interface_stub_source_template, |
interface.name + "_stub", |
'cc', |
- YEAR = datetime.date.today().year, |
- NAMESPACE = self.module.namespace, |
CLASS = interface.name.capitalize(), |
CASES = '\n'.join(cases), |
STUB_HEADER = stub_header, |