mirror of https://github.com/rusefi/lua.git
new section describing the debug interface.
This commit is contained in:
parent
369c5fe3c0
commit
f4d67761f1
151
manual.tex
151
manual.tex
|
@ -1,4 +1,4 @@
|
||||||
% $Id: manual.tex,v 1.5 1996/02/05 14:52:47 roberto Exp roberto $
|
% $Id: manual.tex,v 1.6 1996/02/05 21:32:19 roberto Exp roberto $
|
||||||
|
|
||||||
\documentstyle[A4,11pt,bnf]{article}
|
\documentstyle[A4,11pt,bnf]{article}
|
||||||
|
|
||||||
|
@ -32,11 +32,10 @@ Waldemar Celes Filho
|
||||||
Departamento de Inform\'atica --- PUC-Rio
|
Departamento de Inform\'atica --- PUC-Rio
|
||||||
}
|
}
|
||||||
|
|
||||||
\date{\small \verb$Date: 1996/02/05 14:52:47 $}
|
\date{\small \verb$Date: 1996/02/05 21:32:19 $}
|
||||||
|
|
||||||
\maketitle
|
\maketitle
|
||||||
|
|
||||||
|
|
||||||
\begin{abstract}
|
\begin{abstract}
|
||||||
\noindent
|
\noindent
|
||||||
Lua is an extension programming language designed to be used
|
Lua is an extension programming language designed to be used
|
||||||
|
@ -572,7 +571,7 @@ into the variable \verb'var'.
|
||||||
Parameters act as local variables,
|
Parameters act as local variables,
|
||||||
initialized with the argument values.
|
initialized with the argument values.
|
||||||
\begin{Produc}
|
\begin{Produc}
|
||||||
\produc{parlist1}{'name' \rep{\ter{,} name}}
|
\produc{parlist1}{name \rep{\ter{,} name}}
|
||||||
\end{Produc}
|
\end{Produc}
|
||||||
|
|
||||||
Results are returned using the \verb'return' statement (\see{return}).
|
Results are returned using the \verb'return' statement (\see{return}).
|
||||||
|
@ -704,11 +703,12 @@ is terminated returning an error condition.
|
||||||
The only argument to the error fallback function is a string describing
|
The only argument to the error fallback function is a string describing
|
||||||
the error.
|
the error.
|
||||||
The standard I/O library redefines this fallback,
|
The standard I/O library redefines this fallback,
|
||||||
using the debug API, in order to print some extra informations,
|
using the debug facilities (\see{debugI},
|
||||||
|
in order to print some extra informations,
|
||||||
like the stack of calls.
|
like the stack of calls.
|
||||||
For more information about an error,
|
For more information about an error,
|
||||||
the Lua program can include the compilation pragma \verb'$debug'.
|
the Lua program can include the compilation pragma \verb'$debug'.
|
||||||
\index{debug pragma}
|
\index{debug pragma}\label{pragma}
|
||||||
This pragma must be written in a line by itself.
|
This pragma must be written in a line by itself.
|
||||||
When an error occurs in a program compiled with this option,
|
When an error occurs in a program compiled with this option,
|
||||||
the error routine is able to print also the lines where the calls
|
the error routine is able to print also the lines where the calls
|
||||||
|
@ -1454,6 +1454,135 @@ hours ([0-23]), minutes, and seconds.
|
||||||
% This function then returns and the execution of the program continues.
|
% This function then returns and the execution of the program continues.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
\section{The Debuger Interface} \label{debugI}
|
||||||
|
|
||||||
|
Lua has no built in debuger facilities.
|
||||||
|
Instead, it offers a special interface,
|
||||||
|
by means of functions and {\em hooks},
|
||||||
|
which allows the construction of different
|
||||||
|
kinds of debugers, profiles, and other tools
|
||||||
|
that need ``inside'' information from the interpreter.
|
||||||
|
This interface is declared in the file \verb'luadebug.h'.
|
||||||
|
|
||||||
|
\subsection{Stack and Function Information}
|
||||||
|
|
||||||
|
The main function to get information about the interpreter stack
|
||||||
|
is
|
||||||
|
\begin{verbatim}
|
||||||
|
lua_Function lua_stackedfunction (int level);
|
||||||
|
\end{verbatim}
|
||||||
|
It returns a handle (\verb'lua_Function') to the {\em activation record}
|
||||||
|
of the function executing at a given level.
|
||||||
|
Level 0 is the current running function,
|
||||||
|
while level $n+1$ is the function that has called level $n$.
|
||||||
|
When called with a level greater than the stack depth,
|
||||||
|
\verb'lua_stackedfunction' returns \verb'LUA_NOOBJECT'.
|
||||||
|
|
||||||
|
The type \verb'lua_Function' is just another name
|
||||||
|
to \verb'lua_Object'.
|
||||||
|
Although, in this library,
|
||||||
|
a \verb'lua_Function' can be used wherever a \verb'lua_Object' is required,
|
||||||
|
a parameter \verb'lua_Function' accepts only a handle returned by
|
||||||
|
\verb'lua_stackedfunction'.
|
||||||
|
|
||||||
|
Three other functions produce extra information about a function:
|
||||||
|
\begin{verbatim}
|
||||||
|
void lua_funcinfo (lua_Object func, char **filename, int *linedefined);
|
||||||
|
int lua_currentline (lua_Function func);
|
||||||
|
char *lua_getobjname (lua_Object o, char **name);
|
||||||
|
\end{verbatim}
|
||||||
|
\verb'lua_funcinfo' gives the file name and the line where the
|
||||||
|
given function has been defined.
|
||||||
|
If the ``function'' is in fact the main code of a chunk,
|
||||||
|
\verb'linedefined' is 0.
|
||||||
|
If the function is a C function,
|
||||||
|
\verb'linedefined' is -1, and \verb'filename' is \verb'"(C)"'.
|
||||||
|
|
||||||
|
The function \verb'lua_currentline' gives the current line where
|
||||||
|
a given function is executing.
|
||||||
|
It only works if the function has been pre-compiled with debug
|
||||||
|
information (\see{pragma}).
|
||||||
|
When no line information is available, it returns -1.
|
||||||
|
|
||||||
|
Function \verb'lua_getobjname' tries to find a reasonable name for
|
||||||
|
a given function.
|
||||||
|
Because functions in Lua are first class values,
|
||||||
|
they do not have a fixed name.
|
||||||
|
Some functions may be the value of many global variables,
|
||||||
|
while others may be stored only in a table field.
|
||||||
|
Function \verb'lua_getobjname' first checks whether the given
|
||||||
|
function is a fallback.
|
||||||
|
If so, it returns the string \verb'"fallback"',
|
||||||
|
and \verb'name' is set to point to the fallback name.
|
||||||
|
Otherwise, if the given function is the value of a global variable,
|
||||||
|
\verb'lua_getobjname' returns the string \verb'"global"',
|
||||||
|
while \verb'name' points to the variable name.
|
||||||
|
If the given function is neither a fallback nor a global variable,
|
||||||
|
\verb'lua_getobjname' returns the empty string,
|
||||||
|
and \verb'name' is set to \verb'NULL'.
|
||||||
|
|
||||||
|
\subsection{Manipulating Local Variables}
|
||||||
|
|
||||||
|
The following functions allow the manipulation of the
|
||||||
|
local variables of a given activation record.
|
||||||
|
They only work if the function has been pre-compiled with debug
|
||||||
|
information (\see{pragma}).
|
||||||
|
\begin{verbatim}
|
||||||
|
lua_Object lua_getlocal (lua_Function func, int local_number, char **name);
|
||||||
|
int lua_setlocal (lua_Function func, int local_number);
|
||||||
|
\end{verbatim}
|
||||||
|
The first one returns the value of a local variable,
|
||||||
|
and sets \verb'name' to point to the variable name.
|
||||||
|
\verb'local_number' is an index for local variables.
|
||||||
|
The first parameter has index 1, and so on, until the
|
||||||
|
last active local variable.
|
||||||
|
When called with a \verb'local_number' greater than the
|
||||||
|
number of active local variables,
|
||||||
|
or if the activation record has no debug information,
|
||||||
|
\verb'lua_getlocal' returns \verb'LUA_NOOBJECT'.
|
||||||
|
|
||||||
|
The function \verb'lua_setlocal' sets the local variable
|
||||||
|
\verb'local_number' to the value previously pushed on the stack
|
||||||
|
(\see{valuesCLua}).
|
||||||
|
If the function succeeds it returns 1.
|
||||||
|
If \verb'local_number' is greater than the number
|
||||||
|
of active local variables,
|
||||||
|
or if the activation record has no debug information,
|
||||||
|
this function fails and returns 0.
|
||||||
|
|
||||||
|
\subsection{Hooks}
|
||||||
|
|
||||||
|
The Lua interpreter offers two hooks for debug purposes:
|
||||||
|
\begin{verbatim}
|
||||||
|
typedef void (*lua_CHFunction) (lua_Function func, char *file, int line);
|
||||||
|
typedef void (*lua_LHFunction) (int line);
|
||||||
|
\end{verbatim}
|
||||||
|
The first one is called whenever the interpreter enters or leaves a
|
||||||
|
function.
|
||||||
|
When entering a function,
|
||||||
|
its parameters are a handle to the function activation record,
|
||||||
|
plus the file and the line where the function is defined (the same
|
||||||
|
information which is provided by \verb'lua_funcinfo');
|
||||||
|
when leaving a function, \verb'func' is \verb'LUA_NOOBJECT',
|
||||||
|
\verb'file' is \verb'"(return)"', and \verb'line' is 0.
|
||||||
|
|
||||||
|
The other hook is called every time the interpreter changes
|
||||||
|
the line of code it is executing.
|
||||||
|
Its only parameter is the line number
|
||||||
|
(the same information which is provided by the call
|
||||||
|
\verb'lua_currentline(lua_stackedfunction(0))').
|
||||||
|
This second hook is only called if the active function
|
||||||
|
has been pre-compiled with debug information (\see{pragma}).
|
||||||
|
|
||||||
|
To set these hooks, there are the functions:
|
||||||
|
\begin{verbatim}
|
||||||
|
lua_LHFunction lua_setlinehook (lua_LHFunction hook);
|
||||||
|
lua_CHFunction lua_setcallhook (lua_CHFunction hook);
|
||||||
|
\end{verbatim}
|
||||||
|
Both return the previous hook.
|
||||||
|
|
||||||
|
|
||||||
\section{Some Examples}
|
\section{Some Examples}
|
||||||
|
|
||||||
This section gives examples showing some features of Lua.
|
This section gives examples showing some features of Lua.
|
||||||
|
@ -1473,7 +1602,8 @@ Arrays can be indexed by 0, negative numbers, or any other value (but \nil).
|
||||||
Records are also trivially implemented by the syntactic sugar
|
Records are also trivially implemented by the syntactic sugar
|
||||||
\verb'a.x'.
|
\verb'a.x'.
|
||||||
|
|
||||||
The best way to implement a set is to use the indices of a table.
|
The best way to implement a set is to store
|
||||||
|
its elements as indices of a table.
|
||||||
The statement \verb's = {}' creates an empty set \verb's'.
|
The statement \verb's = {}' creates an empty set \verb's'.
|
||||||
The statement \verb's[x] = 1' inserts the value of \verb'x' into
|
The statement \verb's[x] = 1' inserts the value of \verb'x' into
|
||||||
the set \verb's'.
|
the set \verb's'.
|
||||||
|
@ -1874,8 +2004,8 @@ The authors would like to thank CENPES/PETROBR\'AS which,
|
||||||
jointly with TeCGraf, used extensively early versions of
|
jointly with TeCGraf, used extensively early versions of
|
||||||
this system and gave valuable comments.
|
this system and gave valuable comments.
|
||||||
The authors would also like to thank Carlos Henrique Levy,
|
The authors would also like to thank Carlos Henrique Levy,
|
||||||
who found the name of the game%
|
who found the name of the game.
|
||||||
\footnote{BTW, Lua means {\em moon} in Portuguese.}.
|
Lua means {\em moon} in Portuguese.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1945,7 +2075,10 @@ Special care should be taken with macros like
|
||||||
\verb'lua_getindexed' and \verb'lua_getfield'.
|
\verb'lua_getindexed' and \verb'lua_getfield'.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
|
\pagebreak
|
||||||
|
\tableofcontents
|
||||||
\newcommand{\indexentry}[2]{\item {#1} #2}
|
\newcommand{\indexentry}[2]{\item {#1} #2}
|
||||||
|
%\catcode`\_=12
|
||||||
\begin{theindex}
|
\begin{theindex}
|
||||||
\input{manual.idx}
|
\input{manual.idx}
|
||||||
\end{theindex}
|
\end{theindex}
|
||||||
|
|
Loading…
Reference in New Issue