| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package serialization | 5 package serialization |
| 6 | 6 |
| 7 import ( | 7 import ( |
| 8 "bytes" | 8 "bytes" |
| 9 "compress/gzip" | 9 "compress/gzip" |
| 10 "encoding/base64" | 10 "encoding/base64" |
| 11 "fmt" | 11 "fmt" |
| 12 "mojo/public/go/bindings" | 12 "mojo/public/go/bindings" |
| 13 "mojom/mojom_parser/generated/mojom_files" | 13 "mojom/mojom_parser/generated/mojom_files" |
| 14 "mojom/mojom_parser/generated/mojom_types" | 14 "mojom/mojom_parser/generated/mojom_types" |
| 15 "mojom/mojom_parser/mojom" | 15 "mojom/mojom_parser/mojom" |
| 16 myfmt "third_party/golang/src/fmt" | 16 myfmt "third_party/golang/src/fmt" |
| 17 ) | 17 ) |
| 18 | 18 |
| 19 ////////////////////////////////////////////////// | 19 ////////////////////////////////////////////////// |
| 20 /// Mojom Descriptor Serialization | 20 /// Mojom Descriptor Serialization |
| 21 ////////////////////////////////////////////////// | 21 ////////////////////////////////////////////////// |
| 22 | 22 |
| 23 // This variable may be set to false in order to omit emitting line and | 23 // This variable may be set to false in order to omit emitting line and |
| 24 // column numbers. | 24 // column numbers. This is useful in tests. |
| 25 var emitLineAndColumnNumbers bool = true | 25 var emitLineAndColumnNumbers bool = true |
| 26 | 26 |
| 27 // This variable may be set to false in order to omit emitting computed |
| 28 // packing. This is useful in tests. |
| 29 var emitComputedPackingData bool = true |
| 30 |
| 27 // This variable may be set to false in order to omit emitting serialized | 31 // This variable may be set to false in order to omit emitting serialized |
| 28 // runtime type info. | 32 // runtime type info. This is useful in tests. |
| 29 var emitSerializedRuntimeTypeInfo bool = true | 33 var emitSerializedRuntimeTypeInfo bool = true |
| 30 | 34 |
| 31 // By default we do not populate the complete type set of each top-level interfa
ce | 35 // By default we do not populate the complete type set of each top-level interfa
ce |
| 32 // because doing so is expensive and we are not currently using the the data. | 36 // because doing so is expensive and we are not currently using the the data. |
| 33 var populateCompleteTypeSet bool = false | 37 var populateCompleteTypeSet bool = false |
| 34 | 38 |
| 35 // Serialize serializes the MojomDescriptor into a binary form that is passed to
the | 39 // Serialize serializes the MojomDescriptor into a binary form that is passed to
the |
| 36 // backend of the compiler in order to invoke the code generators. | 40 // backend of the compiler in order to invoke the code generators. |
| 37 // To do this we use Mojo serialization. | 41 // To do this we use Mojo serialization. |
| 38 // If |debug| is true we also return a human-readable representation | 42 // If |debug| is true we also return a human-readable representation |
| 39 // of the serialized mojom_types.FileGraph. | 43 // of the serialized mojom_types.FileGraph. |
| 40 // This function is not thread safe. | 44 // This function is not thread safe. |
| 41 func Serialize(d *mojom.MojomDescriptor, debug bool) (bytes []byte, debugString
string, err error) { | 45 func Serialize(d *mojom.MojomDescriptor, debug bool) (bytes []byte, debugString
string, err error) { |
| 42 » return serialize(d, debug, true, true, false) | 46 » return serialize(d, debug, true, true, true, false) |
| 43 } | 47 } |
| 44 | 48 |
| 45 // serialize() is a package-private version of the public method Serialize(). | 49 // serialize() is a package-private version of the public method Serialize(). |
| 46 // It is intended for use in tests because it allows setting of the variables | 50 // It is intended for use in tests because it allows setting of the variables |
| 47 // emitLineAndColumnNumbers, emitSerializedRuntimeTypeInfo and populateCompleteT
ypeSet. | 51 // emitLineAndColumnNumbers, emitComputedPackingData, emitSerializedRuntimeTypeI
nfo |
| 52 // and populateCompleteTypeSet. |
| 48 // This function is not thread safe because it sets and accesses these global | 53 // This function is not thread safe because it sets and accesses these global |
| 49 // variables. | 54 // variables. |
| 50 func serialize(d *mojom.MojomDescriptor, debug, | 55 func serialize(d *mojom.MojomDescriptor, debug, |
| 51 » emitLineAndColumnNumbersParam, emitSerializedRuntimeTypeInfoParam, | 56 » emitLineAndColumnNumbersParam, emitComputedPackingDataParam, emitSeriali
zedRuntimeTypeInfoParam, |
| 52 populateCompleteTypeSetParam bool) (bytes []byte, debugString string, er
r error) { | 57 populateCompleteTypeSetParam bool) (bytes []byte, debugString string, er
r error) { |
| 53 | 58 |
| 54 // Save the global state and then set it based on the parameters. | 59 // Save the global state and then set it based on the parameters. |
| 55 saveEmitLineAndColumnNumbers := emitLineAndColumnNumbers | 60 saveEmitLineAndColumnNumbers := emitLineAndColumnNumbers |
| 56 emitLineAndColumnNumbers = emitLineAndColumnNumbersParam | 61 emitLineAndColumnNumbers = emitLineAndColumnNumbersParam |
| 62 saveEmitComputedPackingData := emitComputedPackingData |
| 63 emitComputedPackingData = emitComputedPackingDataParam |
| 57 saveEmitSerializedRuntimeTypeInfo := emitSerializedRuntimeTypeInfo | 64 saveEmitSerializedRuntimeTypeInfo := emitSerializedRuntimeTypeInfo |
| 58 emitSerializedRuntimeTypeInfo = emitSerializedRuntimeTypeInfoParam | 65 emitSerializedRuntimeTypeInfo = emitSerializedRuntimeTypeInfoParam |
| 59 savePopulateCompleteTypeSet := populateCompleteTypeSet | 66 savePopulateCompleteTypeSet := populateCompleteTypeSet |
| 60 populateCompleteTypeSet = populateCompleteTypeSetParam | 67 populateCompleteTypeSet = populateCompleteTypeSetParam |
| 61 | 68 |
| 62 fileGraph := translateDescriptor(d) | 69 fileGraph := translateDescriptor(d) |
| 63 if debug { | 70 if debug { |
| 64 debugString = myfmt.Sprintf("%#v", fileGraph) | 71 debugString = myfmt.Sprintf("%#v", fileGraph) |
| 65 } | 72 } |
| 66 encoder := bindings.NewEncoder() | 73 encoder := bindings.NewEncoder() |
| 67 encoder.SetDeterministic(true) | 74 encoder.SetDeterministic(true) |
| 68 fileGraph.Encode(encoder) | 75 fileGraph.Encode(encoder) |
| 69 bytes, _, err = encoder.Data() | 76 bytes, _, err = encoder.Data() |
| 70 | 77 |
| 71 // Restore the original values of the global state. | 78 // Restore the original values of the global state. |
| 72 emitLineAndColumnNumbers = saveEmitLineAndColumnNumbers | 79 emitLineAndColumnNumbers = saveEmitLineAndColumnNumbers |
| 80 emitComputedPackingData = saveEmitComputedPackingData |
| 73 emitSerializedRuntimeTypeInfo = saveEmitSerializedRuntimeTypeInfo | 81 emitSerializedRuntimeTypeInfo = saveEmitSerializedRuntimeTypeInfo |
| 74 populateCompleteTypeSet = savePopulateCompleteTypeSet | 82 populateCompleteTypeSet = savePopulateCompleteTypeSet |
| 75 return | 83 return |
| 76 } | 84 } |
| 77 | 85 |
| 78 // translateDescriptor translates from a mojom.MojomDescriptor (the pure Go | 86 // translateDescriptor translates from a mojom.MojomDescriptor (the pure Go |
| 79 // representation used by the parser) to a mojom_files.MojomFileGraph (the | 87 // representation used by the parser) to a mojom_files.MojomFileGraph (the |
| 80 // Mojo Go representation used for serialization.) | 88 // Mojo Go representation used for serialization.) |
| 81 func translateDescriptor(d *mojom.MojomDescriptor) *mojom_files.MojomFileGraph { | 89 func translateDescriptor(d *mojom.MojomDescriptor) *mojom_files.MojomFileGraph { |
| 82 fileGraph := mojom_files.MojomFileGraph{} | 90 fileGraph := mojom_files.MojomFileGraph{} |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 | 291 |
| 284 func translateMojomStruct(s *mojom.MojomStruct) mojom_types.MojomStruct { | 292 func translateMojomStruct(s *mojom.MojomStruct) mojom_types.MojomStruct { |
| 285 mojomStruct := mojom_types.MojomStruct{} | 293 mojomStruct := mojom_types.MojomStruct{} |
| 286 mojomStruct.DeclData = translateDeclarationData(&s.DeclarationData) | 294 mojomStruct.DeclData = translateDeclarationData(&s.DeclarationData) |
| 287 mojomStruct.DeclData.ContainedDeclarations = translateContainedDeclarati
ons(&s.NestedDeclarations) | 295 mojomStruct.DeclData.ContainedDeclarations = translateContainedDeclarati
ons(&s.NestedDeclarations) |
| 288 | 296 |
| 289 for _, field := range s.FieldsInOrdinalOrder() { | 297 for _, field := range s.FieldsInOrdinalOrder() { |
| 290 mojomStruct.Fields = append(mojomStruct.Fields, translateStructF
ield(field)) | 298 mojomStruct.Fields = append(mojomStruct.Fields, translateStructF
ield(field)) |
| 291 } | 299 } |
| 292 | 300 |
| 293 » // TODO(rudominer) Implement VersionInfo. | 301 » if emitComputedPackingData { |
| 294 » //mojomStruct.Value.VersionInfo = new([]mojom_types.StructVersion) | 302 » » versionInfo := s.VersionInfo() |
| 303 » » mojomStruct.VersionInfo = new([]mojom_types.StructVersion) |
| 304 » » for _, version := range versionInfo { |
| 305 » » » (*mojomStruct.VersionInfo) = append(*mojomStruct.Version
Info, |
| 306 » » » » translateStructVersion(version)) |
| 307 » » } |
| 308 » } |
| 295 | 309 |
| 296 return mojomStruct | 310 return mojomStruct |
| 297 } | 311 } |
| 298 | 312 |
| 313 func translateStructVersion(v mojom.StructVersion) mojom_types.StructVersion { |
| 314 return mojom_types.StructVersion{ |
| 315 VersionNumber: v.VersionNumber, |
| 316 NumFields: v.NumFields, |
| 317 NumBytes: v.NumBytes, |
| 318 } |
| 319 } |
| 320 |
| 299 func translateStructField(f *mojom.StructField) (field mojom_types.StructField)
{ | 321 func translateStructField(f *mojom.StructField) (field mojom_types.StructField)
{ |
| 300 field.DeclData = translateDeclarationData(&f.DeclarationData) | 322 field.DeclData = translateDeclarationData(&f.DeclarationData) |
| 301 field.Type = translateTypeRef(f.FieldType) | 323 field.Type = translateTypeRef(f.FieldType) |
| 302 if f.DefaultValue != nil { | 324 if f.DefaultValue != nil { |
| 303 field.DefaultValue = translateDefaultFieldValue(f.DefaultValue) | 325 field.DefaultValue = translateDefaultFieldValue(f.DefaultValue) |
| 304 } | 326 } |
| 305 » // TODO(rudominer) Implement field offsets. | 327 » if emitComputedPackingData { |
| 306 » field.Offset = f.Offset | 328 » » // TODO(rudominer) Check the allowed size of offsets. The type u
sed in |
| 329 » » // mojom_types.mojom might need to be changed. |
| 330 » » field.Offset = int32(f.Offset()) |
| 331 » » field.Bit = int8(f.Bit()) |
| 332 » » field.MinVersion = f.MinVersion() |
| 333 » } |
| 307 return | 334 return |
| 308 } | 335 } |
| 309 | 336 |
| 310 func translateDefaultFieldValue(v mojom.ValueRef) mojom_types.DefaultFieldValue
{ | 337 func translateDefaultFieldValue(v mojom.ValueRef) mojom_types.DefaultFieldValue
{ |
| 311 switch v := v.(type) { | 338 switch v := v.(type) { |
| 312 case mojom.LiteralValue: | 339 case mojom.LiteralValue: |
| 313 if v.IsDefault() { | 340 if v.IsDefault() { |
| 314 return &mojom_types.DefaultFieldValueDefaultKeyword{mojo
m_types.DefaultKeyword{}} | 341 return &mojom_types.DefaultFieldValueDefaultKeyword{mojo
m_types.DefaultKeyword{}} |
| 315 } | 342 } |
| 316 return &mojom_types.DefaultFieldValueValue{translateLiteralValue
(v)} | 343 return &mojom_types.DefaultFieldValueValue{translateLiteralValue
(v)} |
| (...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 | 728 |
| 702 // stringPointer is a convenience function for creating a pointer to a string wh
ose value | 729 // stringPointer is a convenience function for creating a pointer to a string wh
ose value |
| 703 // is the specified string. It may be used in situations where the compiler will | 730 // is the specified string. It may be used in situations where the compiler will |
| 704 // not allow you to take the address of a string value directly, such as the | 731 // not allow you to take the address of a string value directly, such as the |
| 705 // return value of a function. It is necessary to create pointers to strings bec
ause | 732 // return value of a function. It is necessary to create pointers to strings bec
ause |
| 706 // that is how the Mojom type |string?| (i.e. nullable string) is represented in | 733 // that is how the Mojom type |string?| (i.e. nullable string) is represented in |
| 707 // in the Mojom Go bindings. | 734 // in the Mojom Go bindings. |
| 708 func stringPointer(s string) *string { | 735 func stringPointer(s string) *string { |
| 709 return &s | 736 return &s |
| 710 } | 737 } |
| OLD | NEW |