Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cc72e981 authored by Paul Duffin's avatar Paul Duffin
Browse files

Use deep copy when copying bpPropertySets

Previously, only a shallow copy was made so the copy ends up sharing
some contents with the original. That was a potential source of bugs
as the copy was being made in order to be mutated.

This change switches to a deep copy; renaming the methods from
copy -> deepCopy to clarify the intent.

Makes the bpPropertySet member of bpModule a *bpPropertySet to avoid
unnecessary copying of bpPropertySet.

Bug: 142940300
Test: m nothing
Change-Id: I3f2eaa9fffab4e61d5a7cec81aa42fee9fdfec44
parent dca59a51
Loading
Loading
Loading
Loading
+19 −8
Original line number Diff line number Diff line
@@ -51,13 +51,23 @@ func (s *bpPropertySet) getValue(name string) interface{} {
	return s.properties[name]
}

func (s *bpPropertySet) copy() bpPropertySet {
func (s *bpPropertySet) deepCopy() *bpPropertySet {
	propertiesCopy := make(map[string]interface{})
	for p, v := range s.properties {
		propertiesCopy[p] = v
		var valueCopy interface{}
		if ps, ok := v.(*bpPropertySet); ok {
			valueCopy = ps.deepCopy()
		} else if values, ok := v.([]string); ok {
			valuesCopy := make([]string, len(values))
			copy(valuesCopy, values)
			valueCopy = valuesCopy
		} else {
			valueCopy = v
		}
		propertiesCopy[p] = valueCopy
	}

	return bpPropertySet{
	return &bpPropertySet{
		properties: propertiesCopy,
		order:      append([]string(nil), s.order...),
	}
@@ -95,15 +105,15 @@ func (s *bpPropertySet) insertAfter(position string, name string, value interfac
}

type bpModule struct {
	bpPropertySet
	*bpPropertySet
	moduleType string
}

var _ android.BpModule = (*bpModule)(nil)

func (m *bpModule) copy() *bpModule {
func (m *bpModule) deepCopy() *bpModule {
	return &bpModule{
		bpPropertySet: m.bpPropertySet.copy(),
		bpPropertySet: m.bpPropertySet.deepCopy(),
		moduleType:    m.moduleType,
	}
}
@@ -135,7 +145,8 @@ func (f *bpFile) AddModule(module android.BpModule) {
func (f *bpFile) newModule(moduleType string) *bpModule {
	module := &bpModule{
		moduleType:    moduleType,
		bpPropertySet: &bpPropertySet{},
	}
	(&module.bpPropertySet).init()
	module.bpPropertySet.init()
	return module
}
+2 −2
Original line number Diff line number Diff line
@@ -196,7 +196,7 @@ func (s *sdk) buildSnapshot(ctx android.ModuleContext) android.OutputPath {

	for _, unversioned := range builder.prebuiltOrder {
		// Copy the unversioned module so it can be modified to make it versioned.
		versioned := unversioned.copy()
		versioned := unversioned.deepCopy()
		name := versioned.properties["name"].(string)
		versioned.setProperty("name", builder.versionedSdkMemberName(name))
		versioned.insertAfter("name", "sdk_member_name", name)
@@ -286,7 +286,7 @@ func generateBpContents(contents *generatedContents, bpFile *bpFile) {
	for _, bpModule := range bpFile.order {
		contents.Printfln("")
		contents.Printfln("%s {", bpModule.moduleType)
		outputPropertySet(contents, &bpModule.bpPropertySet)
		outputPropertySet(contents, bpModule.bpPropertySet)
		contents.Printfln("}")
	}
}