예제 #1
0
파일: debug.go 프로젝트: halturin/luajit
// Returns information about a specific function or function invocation.
//
// To get information about a function invocation, the parameter ar must be
// a valid activation record that was filled by a previous call to Getstack
// or given as argument to a hook.
//
// To get information about a function you push it onto the stack and start
// the what string with the character '>'. (In that case, Getinfo pops the
// function in the top of the stack.) For instance, to know in which line
// a function f was defined, you can write the following code:
//
// 	d := luajit.Newdebug(s)
// 	s.Getfield(luajit.Globalsindex, "f")  // get global 'f'
// 	d.Getinfo(">S")
// 	fmt.Printf("%d\n", d.Linedefined);
//
// Each character in the string what selects some fields of the structure
// ar to be filled or a value to be pushed on the stack:
//
// 	'n'	fills in the field Name and Namewhat
// 	'S'	fills in the fields Source, Shortsrc, Linedefined,
// 		Lastlinedefined, and What
// 	'l'	fills in the field Currentline
// 	'u'	fills in the field Nups
// 	'f'	pushes onto the stack the function that is running at the
// 		given level
// 	'L'	pushes onto the stack a table whose indices are the numbers of
// 		the lines that are valid on the function. (A valid line is a line
// 		with some associated code, that is, a line where you can put a break
// 		point. Invalid lines include empty lines and comments.)
//
func (d *Debug) Getinfo(what string) error {
	cs := C.CString(what)
	defer C.free(unsafe.Pointer(cs))
	if int(C.lua_getinfo(d.l, cs, d.d)) == 0 {
		return errors.New("The significant owl hoots in the night.")
	}
	d.update()
	return nil
}
예제 #2
0
파일: lua.go 프로젝트: szll/golua
// Returns the current stack trace
func (L *State) StackTrace() []LuaStackEntry {
	r := []LuaStackEntry{}
	var d C.lua_Debug
	Sln := C.CString("Sln")
	defer C.free(unsafe.Pointer(Sln))

	for depth := 0; C.lua_getstack(L.s, C.int(depth), &d) > 0; depth++ {
		C.lua_getinfo(L.s, Sln, &d)
		ssb := make([]byte, C.LUA_IDSIZE)
		for i := 0; i < C.LUA_IDSIZE; i++ {
			ssb[i] = byte(d.short_src[i])
			if ssb[i] == 0 {
				ssb = ssb[:i]
				break
			}
		}
		ss := string(ssb)

		r = append(r, LuaStackEntry{C.GoString(d.name), C.GoString(d.source), ss, int(d.currentline)})
	}

	return r
}