PK       ! çìAŽQ  Q    a.gonu „[µü¤        // Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package a

import (
	"errors"
	"strings"
)

var G interface{}

func Unmarshal(data []byte, o interface{}) error {
	G = o
	v, ok := o.(*map[string]interface{})
	if !ok {
		return errors.New("eek")
	}
	vals := make(map[string]interface{})
	s := string(data)
	items := strings.Split(s, " ")
	var err error
	for _, item := range items {
		vals[item] = s
		if item == "error" {
			err = errors.New("ouch")
		}
	}
	*v = vals
	return err
}
PK       ! 'ˆ†Ï‰  ‰    m.gonu „[µü¤        // Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import (
	"os"

	"./b"
)

func main() {
	seed := "some things are better"
	bsl := []byte(seed)
	b.CallReadValues("/dev/null")
	vals, err := b.ReadValues(bsl)
	if vals["better"] != seed || err != nil {
		os.Exit(1)
	}
}
PK       ! î¨B†l  l    b.gonu „[µü¤        // Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package b

import (
	"io/ioutil"

	"./a"
)

var G int

// An inlinable function. To trigger the bug in question this needs
// to be inlined here within the package and also inlined into some
// other package that imports it.
func ReadValues(data []byte) (vals map[string]interface{}, err error) {
	err = a.Unmarshal(data, &vals)
	if len(vals) == 0 {
		vals = map[string]interface{}{}
	}
	return
}

// A local call to the function above, which triggers the "move to heap"
// of the output param.
func CallReadValues(filename string) (map[string]interface{}, error) {
	defer func() { G++ }()
	data, err := ioutil.ReadFile(filename)
	if err != nil {
		return map[string]interface{}{}, err
	}
	return ReadValues(data)
}
PK         ! çìAŽQ  Q                  a.gonu „[µü¤        PK         ! 'ˆ†Ï‰  ‰              …  m.gonu „[µü¤        PK         ! î¨B†l  l              B  b.gonu „[µü¤        PK      Ì   â    