Loading android/sdk.go +9 −0 Original line number Diff line number Diff line Loading @@ -351,6 +351,15 @@ type SdkMemberType interface { // values that differ by arch, fields not tagged as such must have common values across // all variants. // // * Additional field tags can be specified on a field that will ignore certain values // for the purpose of common value optimization. A value that is ignored must have the // default value for the property type. This is to ensure that significant value are not // ignored by accident. The purpose of this is to allow the snapshot generation to reflect // the behavior of the runtime. e.g. if a property is ignored on the host then a property // that is common for android can be treated as if it was common for android and host as // the setting for host is ignored anyway. // * `sdk:"ignored-on-host" - this indicates the property is ignored on the host variant. // // * The sdk module type populates the BpModule structure, creating the arch specific // structure and calls AddToPropertySet(...) on the properties struct to add the member // specific properties in the correct place in the structure. Loading sdk/sdk_test.go +4 −1 Original line number Diff line number Diff line Loading @@ -289,9 +289,12 @@ func TestCommonValueOptimization(t *testing.T) { } extractor := newCommonValueExtractor(common) extractor.extractCommonProperties(common, structs) h := TestHelper{t} err := extractor.extractCommonProperties(common, structs) h.AssertDeepEquals("unexpected error", nil, err) h.AssertDeepEquals("common properties not correct", &testPropertiesStruct{ name: "common", Loading sdk/update.go +45 −0 Original line number Diff line number Diff line Loading @@ -1215,11 +1215,26 @@ func (s *sdk) getPossibleOsTypes() []android.OsType { // struct (or one of its embedded structs). type fieldAccessorFunc func(structValue reflect.Value) reflect.Value // Checks the metadata to determine whether the property should be ignored for the // purposes of common value extraction or not. type extractorMetadataPredicate func(metadata propertiesContainer) bool // Indicates whether optimizable properties are provided by a host variant or // not. type isHostVariant interface { isHostVariant() bool } // A property that can be optimized by the commonValueExtractor. type extractorProperty struct { // The name of the field for this property. name string // Filter that can use metadata associated with the properties being optimized // to determine whether the field should be ignored during common value // optimization. filter extractorMetadataPredicate // Retrieves the value on which common value optimization will be performed. getter fieldAccessorFunc Loading Loading @@ -1273,6 +1288,20 @@ func (e *commonValueExtractor) gatherFields(structType reflect.Type, containingS continue } var filter extractorMetadataPredicate // Add a filter if proptools.HasTag(field, "sdk", "ignored-on-host") { filter = func(metadata propertiesContainer) bool { if m, ok := metadata.(isHostVariant); ok { if m.isHostVariant() { return false } } return true } } // Save a copy of the field index for use in the function. fieldIndex := f Loading Loading @@ -1304,6 +1333,7 @@ func (e *commonValueExtractor) gatherFields(structType reflect.Type, containingS } else { property := extractorProperty{ name, filter, fieldGetter, reflect.Zero(field.Type), proptools.HasTag(field, "android", "arch_variant"), Loading Loading @@ -1372,6 +1402,12 @@ func (e *commonValueExtractor) extractCommonProperties(commonProperties interfac for _, property := range e.properties { fieldGetter := property.getter filter := property.filter if filter == nil { filter = func(metadata propertiesContainer) bool { return true } } // Check to see if all the structures have the same value for the field. The commonValue // is nil on entry to the loop and if it is nil on exit then there is no common value or Loading @@ -1389,6 +1425,15 @@ func (e *commonValueExtractor) extractCommonProperties(commonProperties interfac itemValue := reflect.ValueOf(container.optimizableProperties()) fieldValue := fieldGetter(itemValue) if !filter(container) { expectedValue := property.emptyValue.Interface() actualValue := fieldValue.Interface() if !reflect.DeepEqual(expectedValue, actualValue) { return fmt.Errorf("field %q is supposed to be ignored for %q but is set to %#v instead of %#v", property, container, actualValue, expectedValue) } continue } if commonValue == nil { // Use the first value as the commonProperties value. commonValue = &fieldValue Loading Loading
android/sdk.go +9 −0 Original line number Diff line number Diff line Loading @@ -351,6 +351,15 @@ type SdkMemberType interface { // values that differ by arch, fields not tagged as such must have common values across // all variants. // // * Additional field tags can be specified on a field that will ignore certain values // for the purpose of common value optimization. A value that is ignored must have the // default value for the property type. This is to ensure that significant value are not // ignored by accident. The purpose of this is to allow the snapshot generation to reflect // the behavior of the runtime. e.g. if a property is ignored on the host then a property // that is common for android can be treated as if it was common for android and host as // the setting for host is ignored anyway. // * `sdk:"ignored-on-host" - this indicates the property is ignored on the host variant. // // * The sdk module type populates the BpModule structure, creating the arch specific // structure and calls AddToPropertySet(...) on the properties struct to add the member // specific properties in the correct place in the structure. Loading
sdk/sdk_test.go +4 −1 Original line number Diff line number Diff line Loading @@ -289,9 +289,12 @@ func TestCommonValueOptimization(t *testing.T) { } extractor := newCommonValueExtractor(common) extractor.extractCommonProperties(common, structs) h := TestHelper{t} err := extractor.extractCommonProperties(common, structs) h.AssertDeepEquals("unexpected error", nil, err) h.AssertDeepEquals("common properties not correct", &testPropertiesStruct{ name: "common", Loading
sdk/update.go +45 −0 Original line number Diff line number Diff line Loading @@ -1215,11 +1215,26 @@ func (s *sdk) getPossibleOsTypes() []android.OsType { // struct (or one of its embedded structs). type fieldAccessorFunc func(structValue reflect.Value) reflect.Value // Checks the metadata to determine whether the property should be ignored for the // purposes of common value extraction or not. type extractorMetadataPredicate func(metadata propertiesContainer) bool // Indicates whether optimizable properties are provided by a host variant or // not. type isHostVariant interface { isHostVariant() bool } // A property that can be optimized by the commonValueExtractor. type extractorProperty struct { // The name of the field for this property. name string // Filter that can use metadata associated with the properties being optimized // to determine whether the field should be ignored during common value // optimization. filter extractorMetadataPredicate // Retrieves the value on which common value optimization will be performed. getter fieldAccessorFunc Loading Loading @@ -1273,6 +1288,20 @@ func (e *commonValueExtractor) gatherFields(structType reflect.Type, containingS continue } var filter extractorMetadataPredicate // Add a filter if proptools.HasTag(field, "sdk", "ignored-on-host") { filter = func(metadata propertiesContainer) bool { if m, ok := metadata.(isHostVariant); ok { if m.isHostVariant() { return false } } return true } } // Save a copy of the field index for use in the function. fieldIndex := f Loading Loading @@ -1304,6 +1333,7 @@ func (e *commonValueExtractor) gatherFields(structType reflect.Type, containingS } else { property := extractorProperty{ name, filter, fieldGetter, reflect.Zero(field.Type), proptools.HasTag(field, "android", "arch_variant"), Loading Loading @@ -1372,6 +1402,12 @@ func (e *commonValueExtractor) extractCommonProperties(commonProperties interfac for _, property := range e.properties { fieldGetter := property.getter filter := property.filter if filter == nil { filter = func(metadata propertiesContainer) bool { return true } } // Check to see if all the structures have the same value for the field. The commonValue // is nil on entry to the loop and if it is nil on exit then there is no common value or Loading @@ -1389,6 +1425,15 @@ func (e *commonValueExtractor) extractCommonProperties(commonProperties interfac itemValue := reflect.ValueOf(container.optimizableProperties()) fieldValue := fieldGetter(itemValue) if !filter(container) { expectedValue := property.emptyValue.Interface() actualValue := fieldValue.Interface() if !reflect.DeepEqual(expectedValue, actualValue) { return fmt.Errorf("field %q is supposed to be ignored for %q but is set to %#v instead of %#v", property, container, actualValue, expectedValue) } continue } if commonValue == nil { // Use the first value as the commonProperties value. commonValue = &fieldValue Loading