package dwarfbuilder

import (
	"bytes"

	"github.com/go-delve/delve/pkg/dwarf/leb128"
	"github.com/go-delve/delve/pkg/dwarf/op"
)

// LocEntry represents one entry of debug_loc.
type LocEntry struct {
	Lowpc  uint64
	Highpc uint64
	Loc    []byte
}

// LocationBlock returns a DWARF expression corresponding to the list of
// arguments.
func LocationBlock(args ...any) []byte {
	var buf bytes.Buffer
	for _, arg := range args {
		switch x := arg.(type) {
		case op.Opcode:
			buf.WriteByte(byte(x))
		case int:
			leb128.EncodeSigned(&buf, int64(x))
		case uint:
			leb128.EncodeUnsigned(&buf, uint64(x))
		default:
			panic("unsupported value type")
		}
	}
	return buf.Bytes()
}
