// Copyright 2010 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.

// Go definitions of internal structures. Master is runtime.h

// TODO(lvd): automate conversion to all the _defs.go files

package runtime

import "unsafe"

const (
	gidle = iota
	grunnable
	grunning
	gsyscall
	gwaiting
	gmoribund
	gdead
	grecovery
)

// const ( Structrnd = sizeof(uintptr) )

type string_ struct {
	str *byte
	len int32
}

type iface struct {
	tab  *itab
	data unsafe.Pointer
}

type eface struct {
	type_ *Type
	data  unsafe.Pointer
}

type complex64 struct {
	real float32
	imag float32
}

type complex128 struct {
	real float64
	imag float64
}

type slice struct {
	array *byte
	len   uint32
	cap   uint32
}

type gobuf struct {
	sp unsafe.Pointer
	pc unsafe.Pointer
	g  *g_
}

type g_ struct {
	stackguard  unsafe.Pointer
	stackbase   unsafe.Pointer
	defer_      *defer_
	panic_      *panic_
	sched       gobuf
	stack0      unsafe.Pointer
	entry       unsafe.Pointer
	alllink     *g_
	param       unsafe.Pointer
	status      int16
	goid        int32
	selgen      uint32
	schedlink   *g_
	readyonstop bool
	ispanic     bool
	m           *m_
	lockedm     *m_
	sig         int32
	sigcode0    uintptr
	sigcode1    uintptr
}

type m_ struct {
	g0            *g_
	morepc        unsafe.Pointer
	moreargp      unsafe.Pointer
	morebuf       gobuf
	moreframesize uint32
	moreargsize   uint32
	cret          uintptr
	procid        uint64
	gsignal       *g_
	tls           [8]uint32
	sched         gobuf
	curg          *g_
	id            int32
	mallocing     int32
	gcing         int32
	locks         int32
	nomemprof     int32
	waitnextg     int32
	havenextg     note
	nextg         *g_
	alllink       *m_
	schedlink     *m_
	machport      uint32
	mcache        *mCache
	lockedg       *g_
	freg          [8]uint64
	// gostack	unsafe.Pointer  // __WINDOWS__
}

type stktop struct {
	stackguard *uint8
	stackbase  *uint8
	gobuf      gobuf
	args       uint32
	fp         *uint8
	free       bool
	panic_     bool
}

type alg struct {
	hash  func(uint32, unsafe.Pointer) uintptr
	equal func(uint32, unsafe.Pointer, unsafe.Pointer) uint32
	print func(uint32, unsafe.Pointer)
	copy  func(uint32, unsafe.Pointer, unsafe.Pointer)
}

type sigtab struct {
	flags int32
	name  *int8
}

const (
	sigCatch = (1 << iota)
	sigIgnore
	sigRestart
	sigQueue
	sigPanic
)

type Func struct {
	name   string
	typ    string
	src    string
	pcln   []byte
	entry  uintptr
	pc0    uintptr
	ln0    int32
	frame  int32
	args   int32
	locals int32
}

const (
	aMEM = iota
	aNOEQ
	aSTRING
	aINTER
	aNILINTER
	aMEMWORD
	amax
)

type defer_ struct {
	siz  int32
	sp   unsafe.Pointer
	pc   unsafe.Pointer
	fn   unsafe.Pointer
	link *defer_
	args [8]byte // padded to actual size
}

type panic_ struct {
	arg       eface
	stackbase unsafe.Pointer
	link      *panic_
	recovered bool
}

/*
 * External data.
 */

var (
	algarray    [amax]alg
	emptystring string
	allg        *g_
	allm        *m_
	goidgen     int32
	gomaxprocs  int32
	panicking   int32
	fd          int32
	gcwaiting   int32
	goos        *int8
)
