Chromium Code Reviews| Index: mojo/public/tools/bindings/generators/mojom_python_generator.py |
| diff --git a/mojo/public/tools/bindings/generators/mojom_python_generator.py b/mojo/public/tools/bindings/generators/mojom_python_generator.py |
| index 75992a3842cada0491294bb7d13b610e073035d0..e0b3aea3ec0653f80de5fe2db10c6c4f3467263b 100644 |
| --- a/mojo/public/tools/bindings/generators/mojom_python_generator.py |
| +++ b/mojo/public/tools/bindings/generators/mojom_python_generator.py |
| @@ -40,17 +40,33 @@ _kind_to_type = { |
| # int64 integers are not handled by array.array. int64/uint64 array are |
| # supported but storage is not optimized (ie. they are plain python list, not |
| # array.array) |
| -_kind_to_typecode = { |
| - mojom.INT8: "'b'", |
| - mojom.UINT8: "'B'", |
| - mojom.INT16: "'h'", |
| - mojom.UINT16: "'H'", |
| - mojom.INT32: "'i'", |
| - mojom.UINT32: "'I'", |
| - mojom.FLOAT: "'f'", |
| - mojom.DOUBLE: "'d'", |
| +_kind_to_typecode_for_array = { |
|
sdefresne
2014/09/15 08:46:54
nit: _kind_to_typecode_for_native_array
qsr
2014/09/15 11:01:53
Done.
|
| + mojom.INT8: "b", |
| + mojom.UINT8: "B", |
| + mojom.INT16: "h", |
| + mojom.UINT16: "H", |
| + mojom.INT32: "i", |
| + mojom.UINT32: "I", |
| + mojom.FLOAT: "f", |
| + mojom.DOUBLE: "d", |
| } |
| +_kind_to_typecode = dict(_kind_to_typecode_for_array) |
| +_kind_to_typecode.update({ |
| + mojom.INT64: "q", |
| + mojom.UINT64: "Q", |
| + mojom.HANDLE: "i", |
| + mojom.DCPIPE: "i", |
| + mojom.DPPIPE: "i", |
| + mojom.MSGPIPE: "i", |
| + mojom.SHAREDBUFFER: "i", |
| + mojom.NULLABLE_HANDLE: "i", |
| + mojom.NULLABLE_DCPIPE: "i", |
| + mojom.NULLABLE_DPPIPE: "i", |
| + mojom.NULLABLE_MSGPIPE: "i", |
| + mojom.NULLABLE_SHAREDBUFFER: "i", |
| +}) |
| + |
| def NameToComponent(name): |
| # insert '_' between anything and a Title name (e.g, HTTPEntry2FooBar -> |
| @@ -113,18 +129,21 @@ def GetStructClass(kind): |
| def GetFieldType(kind, field=None): |
| if mojom.IsAnyArrayKind(kind): |
| - if kind.kind in _kind_to_typecode: |
| - arguments = [ _kind_to_typecode[kind.kind] ] |
| - else: |
| - arguments = [ GetFieldType(kind.kind) ] |
| + arguments = [] |
| + if kind.kind in _kind_to_typecode_for_array: |
| + arguments.append('\'%s\'' %_kind_to_typecode_for_array[kind.kind]) |
|
sdefresne
2014/09/15 08:46:54
nit: you can use '%r' instead of '\'%s\'' to get a
qsr
2014/09/15 11:01:53
Done.
|
| + elif kind.kind != mojom.BOOL: |
| + arguments.append(GetFieldType(kind.kind)) |
| if mojom.IsNullableKind(kind): |
| arguments.append("nullable=True") |
| if mojom.IsFixedArrayKind(kind): |
| arguments.append("length=%d" % kind.length) |
| - if kind.kind in _kind_to_typecode: |
| - return "_descriptor.NativeArrayType(%s)" % ", ".join(arguments) |
| - else: |
| - return "_descriptor.PointerArrayType(%s)" % ", ".join(arguments) |
| + array_type = 'GenericArrayType' |
| + if kind.kind == mojom.BOOL: |
| + array_type = 'BooleanArrayType' |
| + elif kind.kind in _kind_to_typecode_for_array: |
| + array_type = 'NativeArrayType' |
| + return "_descriptor.%s(%s)" % (array_type, ", ".join(arguments)) |
| if mojom.IsStructKind(kind): |
| arguments = [ GetStructClass(kind) ] |
| @@ -137,19 +156,45 @@ def GetFieldType(kind, field=None): |
| return _kind_to_type.get(kind, "_descriptor.TYPE_NONE") |
| +def GetPackedFormatString(struct): |
| + res = '=' |
| + for byte in struct.bytes: |
| + if len(byte.packed_fields) > 1: |
| + res += 'B' |
| + else: |
| + for packed_field in byte.packed_fields: |
| + kind = packed_field.field.kind |
| + if mojom.IsEnumKind(kind): |
| + res += 'i' |
| + else: |
| + res += _kind_to_typecode.get(packed_field.field.kind, 'Q') |
| + if byte.is_padding: |
| + res += 'x' |
| + return res |
| + |
| def GetFieldDescriptor(packed_field): |
| field = packed_field.field |
| + class_name = 'SingleFieldGroup' |
| + if field.kind == mojom.BOOL: |
| + class_name = 'FieldDescriptor' |
| arguments = [ '\'%s\'' % field.name ] |
| arguments.append(GetFieldType(field.kind, field)) |
| - arguments.append(str(packed_field.offset)) |
| - if field.kind == mojom.BOOL: |
| - arguments.append('bit_offset=%d' % packed_field.bit) |
| + arguments.append(str(packed_field.field.ordinal)) |
| if field.default: |
| if mojom.IsStructKind(field.kind): |
| arguments.append('default_value=True') |
| else: |
| arguments.append('default_value=%s' % ExpressionToText(field.default)) |
| - return '_descriptor.FieldDescriptor(%s)' % ', '.join(arguments) |
| + return '_descriptor.%s(%s)' % (class_name, ', '.join(arguments)) |
| + |
| +def GetFieldGroup(byte): |
| + if len(byte.packed_fields) > 1: |
| + descriptors = map(GetFieldDescriptor, byte.packed_fields) |
| + return '_descriptor.BooleanGroup([%s])' % ', '.join(descriptors) |
| + for packed_field in byte.packed_fields: |
| + return GetFieldDescriptor(packed_field) |
|
sdefresne
2014/09/15 11:14:46
This return in a for loop is strange. Do you only
qsr
2014/09/15 11:42:00
Refactored by asserting the list has a single elem
|
| + print byte |
|
sdefresne
2014/09/15 08:46:55
Are those two lines debug? Since the last line is
qsr
2014/09/15 11:01:53
The assert False is correct, the print was just fo
sdefresne
2014/09/15 11:14:46
Oh, you mean this line should not be reached? What
qsr
2014/09/15 11:42:00
Removed, asserting the list has a single element i
|
| + assert False |
| def ComputeStaticValues(module): |
| in_progress = set() |
| @@ -229,12 +274,16 @@ def ComputeStaticValues(module): |
| return module |
| +_HEADER_SIZE = 8 |
| + |
| class Generator(generator.Generator): |
| python_filters = { |
| 'expression_to_text': ExpressionToText, |
| - 'field_descriptor': GetFieldDescriptor, |
| + 'field_group': GetFieldGroup, |
| 'name': GetNameForElement, |
| + 'packed_format_string': GetPackedFormatString, |
| + 'struct_size': lambda ps: ps.GetTotalSize() + _HEADER_SIZE, |
| } |
| @UseJinja('python_templates/module.py.tmpl', filters=python_filters) |