func (state *State) GetMetaTableAt(index int) bool {
	if meta := state.getmetatable(state.get(index), true); !IsNone(meta) {
		state.Push(meta)
		return true
	}
	return false
}
If the value at the given index has a metatable, the function pushes that metatable onto
the stack and returns 1. Otherwise, the function returns 0 and pushes nothing on the stack.

See https://www.lua.org/manual/5.3/manual.html#lua_getmetatable
package lua
import (
	"fmt"
	"github.com/Azure/golua/lua/binary"
)
func (state *State) Dump(strip bool) []byte {
	if cls, ok := state.get(-1).(*Closure); ok {
		if cls.isLua() {
			return binary.Dump(cls.binary, strip)
		}
	}
	return nil
}
func (state *State) SetUpValue(fnIndex, upIndex int) (name string) {
	if cls, ok := state.get(fnIndex).(*Closure); ok {
		if upAt := upIndex - 1; upAt < len(cls.upvals) {
			upvalue := state.frame().pop()
			cls.setUp(upAt, upvalue)
			name = cls.upName(upAt)
		}
	}
	return
}
func (state *State) LoadChunk(filename string, source interface{}, mode Mode) error {
	cls, err := state.load(filename, source)
	if err != nil {
		return err
	}
	state.frame().push(cls)
	return nil
}
func (state *State) ExecChunk(filename string, source interface{}, mode Mode) error {
	if err := state.LoadChunk(filename, source, mode); err != nil {
		return err
	}
	state.Call(0, -1)
	return nil
}
func (state *State) Register(name string, fn Func) {
	state.Push(newGoClosure(fn, 0))
	state.SetGlobal(name)
}
func (state *State) AtPanic(panicFn Func) Func {
	prevFn := state.global.panicFn
	state.global.panicFn = panicFn
	return prevFn
}
func (state *State) Status() ThreadStatus { unimplemented("Status"); return ThreadError }
func (state *State) Error() int { return state.errorf("%v", state.frame().pop()) }
func (state *State) Close() {   }
func (state *State) Version() *float64 { unimplemented("Version"); return nil }
func (state *State) Arith(op Op) {
	y := state.frame().pop()
	x := state.frame().pop()
	state.frame().push(state.arith(op, x, y))
}
func (state *State) Concat(n int) {
	if n > 1 {
		values := state.frame().popN(n)
		result := state.concat(values)
		state.frame().push(result)
	}
}
func (state *State) Length(index int) int { unimplemented("Length"); return 0 }
func (state *State) Compare(op Op, i1, i2 int) bool {
	return state.compare(op, state.get(i1), state.get(i2), false)
}
func (state *State) GetGlobal(name string) Type {
	val := state.gettable(state.globals(), String(name), false)
	state.frame().push(val)
	return val.Type()
}
func (state *State) SetGlobal(name string) {
	state.settable(state.globals(), String(name), state.Pop(), false)
}
func (state *State) NewTableSize(narr, nrec int) {
	state.frame().push(newTable(state, narr, nrec))
}
func (state *State) NewTable() { state.NewTableSize(0, 0) }
func (state *State) Next(index int) (more bool) {
	tbl, ok := state.get(index).(*table)
	if !ok {
		state.errorf("table expected")
	}
	var k, v Value
	if k, v, more = tbl.next(state.frame().pop()); more {
		state.frame().push(k)
		state.frame().push(v)
	}
	return
}