aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1998-08-21 14:43:44 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1998-08-21 14:43:44 -0300
commitcc117253c83ec32d226a8f2226d5ca144804f873 (patch)
tree46551b01d3febf98d65d55276d5831a75e2e0062
parent8e226e6a09390a80fde98f192833fc85a5537376 (diff)
downloadlua-cc117253c83ec32d226a8f2226d5ca144804f873.tar.gz
lua-cc117253c83ec32d226a8f2226d5ca144804f873.tar.bz2
lua-cc117253c83ec32d226a8f2226d5ca144804f873.zip
new implementation for error handling: on error, function _ERRORMESSAGE
is called, which in turn calls _ALERT to write a message to stderr.
-rw-r--r--lapi.c17
-rw-r--r--lbuiltin.c19
-rw-r--r--ldo.c33
-rw-r--r--liolib.c87
-rw-r--r--lstate.h3
-rw-r--r--ltm.c4
-rw-r--r--lua.h7
-rw-r--r--manual.tex99
8 files changed, 133 insertions, 136 deletions
diff --git a/lapi.c b/lapi.c
index c74cfba7..8747e67e 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 1.25 1998/06/05 22:17:44 roberto Exp roberto $ 2** $Id: lapi.c,v 1.26 1998/07/12 16:16:02 roberto Exp roberto $
3** Lua API 3** Lua API
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -29,9 +29,8 @@ char lua_ident[] = "$Lua: " LUA_VERSION " " LUA_COPYRIGHT " $\n"
29 29
30 30
31 31
32TObject *luaA_Address (lua_Object o) 32TObject *luaA_Address (lua_Object o) {
33{ 33 return (o != LUA_NOOBJECT) ? Address(o) : NULL;
34 return Address(o);
35} 34}
36 35
37 36
@@ -150,12 +149,12 @@ lua_Object lua_settagmethod (int tag, char *event)
150} 149}
151 150
152 151
153lua_Object lua_seterrormethod (void) 152lua_Object lua_seterrormethod (void) {
154{ 153 lua_Object temp;
155 TObject temp = L->errorim;
156 checkCparams(1); 154 checkCparams(1);
157 L->errorim = *(--L->stack.top); 155 temp = lua_getglobal("_ERRORMESSAGE");
158 return put_luaObject(&temp); 156 lua_setglobal("_ERRORMESSAGE");
157 return temp;
159} 158}
160 159
161 160
diff --git a/lbuiltin.c b/lbuiltin.c
index 43023e8e..58c9509c 100644
--- a/lbuiltin.c
+++ b/lbuiltin.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lbuiltin.c,v 1.32 1998/06/29 18:24:06 roberto Exp roberto $ 2** $Id: lbuiltin.c,v 1.33 1998/07/12 16:16:43 roberto Exp roberto $
3** Built-in functions 3** Built-in functions
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -192,6 +192,19 @@ static void luaI_print (void) {
192} 192}
193 193
194 194
195static void luaB_message (void) {
196 fputs(luaL_check_string(1), stderr);
197}
198
199
200static void error_message (void) {
201 char buff[200];
202 sprintf(buff, "lua error: %.180s\n", luaL_check_string(1));
203 lua_pushstring(buff);
204 lua_call("_ALERT");
205}
206
207
195static void luaI_type (void) 208static void luaI_type (void)
196{ 209{
197 lua_Object o = luaL_nonnullarg(1); 210 lua_Object o = luaL_nonnullarg(1);
@@ -568,6 +581,7 @@ static struct luaL_reg int_funcs[] = {
568 {"copytagmethods", copytagmethods}, 581 {"copytagmethods", copytagmethods},
569 {"dostring", internaldostring}, 582 {"dostring", internaldostring},
570 {"error", luaI_error}, 583 {"error", luaI_error},
584 {"_ERRORMESSAGE", error_message},
571 {"foreach", foreach}, 585 {"foreach", foreach},
572 {"foreachvar", foreachvar}, 586 {"foreachvar", foreachvar},
573 {"getglobal", getglobal}, 587 {"getglobal", getglobal},
@@ -588,7 +602,8 @@ static struct luaL_reg int_funcs[] = {
588 {"tonumber", luaB_tonumber}, 602 {"tonumber", luaB_tonumber},
589 {"tostring", to_string}, 603 {"tostring", to_string},
590 {"tag", luatag}, 604 {"tag", luatag},
591 {"type", luaI_type} 605 {"type", luaI_type},
606 {"_ALERT", luaB_message}
592}; 607};
593 608
594 609
diff --git a/ldo.c b/ldo.c
index 20b769d8..9a07e7e1 100644
--- a/ldo.c
+++ b/ldo.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldo.c,v 1.27 1998/06/19 18:47:06 roberto Exp roberto $ 2** $Id: ldo.c,v 1.28 1998/07/12 16:14:34 roberto Exp roberto $
3** Stack and Call structure of Lua 3** Stack and Call structure of Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -17,6 +17,7 @@
17#include "lobject.h" 17#include "lobject.h"
18#include "lparser.h" 18#include "lparser.h"
19#include "lstate.h" 19#include "lstate.h"
20#include "lstring.h"
20#include "ltm.h" 21#include "ltm.h"
21#include "lua.h" 22#include "lua.h"
22#include "luadebug.h" 23#include "luadebug.h"
@@ -32,27 +33,13 @@
32 33
33 34
34 35
35/*
36** Error messages
37*/
38
39static void stderrorim (void)
40{
41 fprintf(stderr, "lua error: %s\n", lua_getstring(lua_getparam(1)));
42}
43
44
45
46#define STACK_UNIT 128 36#define STACK_UNIT 128
47 37
48 38
49void luaD_init (void) 39void luaD_init (void) {
50{
51 L->stack.stack = luaM_newvector(STACK_UNIT, TObject); 40 L->stack.stack = luaM_newvector(STACK_UNIT, TObject);
52 L->stack.top = L->stack.stack; 41 L->stack.top = L->stack.stack;
53 L->stack.last = L->stack.stack+(STACK_UNIT-1); 42 L->stack.last = L->stack.stack+(STACK_UNIT-1);
54 ttype(&L->errorim) = LUA_T_CPROTO;
55 fvalue(&L->errorim) = stderrorim;
56} 43}
57 44
58 45
@@ -246,12 +233,13 @@ void luaD_travstack (int (*fn)(TObject *))
246 233
247 234
248 235
249static void message (char *s) 236static void message (char *s) {
250{ 237 TObject *em = &(luaS_new("_ERRORMESSAGE")->u.s.globalval);
251 TObject im = L->errorim; 238 if (ttype(em) != LUA_T_NIL) {
252 if (ttype(&im) != LUA_T_NIL) { 239 *L->stack.top = *em;
240 incr_top;
253 lua_pushstring(s); 241 lua_pushstring(s);
254 luaD_callTM(&im, 1, 0); 242 luaD_calln(1, 0);
255 } 243 }
256} 244}
257 245
@@ -264,7 +252,8 @@ void lua_error (char *s)
264 if (L->errorJmp) 252 if (L->errorJmp)
265 longjmp(*((jmp_buf *)L->errorJmp), 1); 253 longjmp(*((jmp_buf *)L->errorJmp), 1);
266 else { 254 else {
267 fprintf (stderr, "lua: exit(1). Unable to recover\n"); 255 lua_pushstring("lua: exit(1). Unable to recover.\n");
256 lua_call("_ALERT");
268 exit(1); 257 exit(1);
269 } 258 }
270} 259}
diff --git a/liolib.c b/liolib.c
index d252931c..0fbc425f 100644
--- a/liolib.c
+++ b/liolib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: liolib.c,v 1.20 1998/06/05 22:17:44 roberto Exp roberto $ 2** $Id: liolib.c,v 1.21 1998/06/18 17:04:28 roberto Exp roberto $
3** Standard I/O (and system) library 3** Standard I/O (and system) library
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -353,71 +353,75 @@ static void io_debug (void)
353} 353}
354 354
355 355
356static void lua_printstack (FILE *f) 356#define MESSAGESIZE 150
357{ 357#define MAXMESSAGE (MESSAGESIZE*10)
358
359static void errorfb (void) {
360 char buff[MAXMESSAGE];
358 int level = 1; /* skip level 0 (it's this function) */ 361 int level = 1; /* skip level 0 (it's this function) */
359 lua_Object func; 362 lua_Object func;
363 sprintf(buff, "lua: %.200s\n", lua_getstring(lua_getparam(1)));
360 while ((func = lua_stackedfunction(level++)) != LUA_NOOBJECT) { 364 while ((func = lua_stackedfunction(level++)) != LUA_NOOBJECT) {
361 char *name; 365 char *name;
362 int currentline; 366 int currentline;
363 char *filename; 367 char *chunkname;
364 int linedefined; 368 int linedefined;
365 lua_funcinfo(func, &filename, &linedefined); 369 lua_funcinfo(func, &chunkname, &linedefined);
366 fprintf(f, (level==2) ? "Active Stack:\n\t" : "\t"); 370 strcat(buff, (level==2) ? "Active Stack:\n\t" : "\t");
371 if (strlen(buff) > MAXMESSAGE-MESSAGESIZE) {
372 strcat(buff, "...\n");
373 break; /* buffer is full */
374 }
367 switch (*lua_getobjname(func, &name)) { 375 switch (*lua_getobjname(func, &name)) {
368 case 'g': 376 case 'g':
369 fprintf(f, "function %s", name); 377 sprintf(buff+strlen(buff), "function %.50s", name);
370 break; 378 break;
371 case 't': 379 case 't':
372 fprintf(f, "`%s' tag method", name); 380 sprintf(buff+strlen(buff), "`%.50s' tag method", name);
373 break; 381 break;
374 default: { 382 default: {
375 if (linedefined == 0) 383 if (linedefined == 0)
376 fprintf(f, "main of %s", filename); 384 sprintf(buff+strlen(buff), "main of %.50s", chunkname);
377 else if (linedefined < 0) 385 else if (linedefined < 0)
378 fprintf(f, "%s", filename); 386 sprintf(buff+strlen(buff), "%.50s", chunkname);
379 else 387 else
380 fprintf(f, "function (%s:%d)", filename, linedefined); 388 sprintf(buff+strlen(buff), "function (%.50s:%d)",
381 filename = NULL; 389 chunkname, linedefined);
390 chunkname = NULL;
382 } 391 }
383 } 392 }
384 if ((currentline = lua_currentline(func)) > 0) 393 if ((currentline = lua_currentline(func)) > 0)
385 fprintf(f, " at line %d", currentline); 394 sprintf(buff+strlen(buff), " at line %d", currentline);
386 if (filename) 395 if (chunkname)
387 fprintf(f, " [in file %s]", filename); 396 sprintf(buff+strlen(buff), " [in chunk %.50s]", chunkname);
388 fprintf(f, "\n"); 397 strcat(buff, "\n");
389 } 398 }
390} 399 lua_pushstring(buff);
391 400 lua_call("_ALERT");
392
393static void errorfb (void)
394{
395 fprintf(stderr, "lua: %s\n", lua_getstring(lua_getparam(1)));
396 lua_printstack(stderr);
397} 401}
398 402
399 403
400 404
401static struct luaL_reg iolib[] = { 405static struct luaL_reg iolib[] = {
402{"setlocale", setloc}, 406 {"setlocale", setloc},
403{"execute", io_execute}, 407 {"execute", io_execute},
404{"remove", io_remove}, 408 {"remove", io_remove},
405{"rename", io_rename}, 409 {"rename", io_rename},
406{"tmpname", io_tmpname}, 410 {"tmpname", io_tmpname},
407{"getenv", io_getenv}, 411 {"getenv", io_getenv},
408{"date", io_date}, 412 {"date", io_date},
409{"clock", io_clock}, 413 {"clock", io_clock},
410{"exit", io_exit}, 414 {"exit", io_exit},
411{"debug", io_debug}, 415 {"debug", io_debug},
412{"print_stack", errorfb} 416 {"_ERRORMESSAGE", errorfb}
413}; 417};
414 418
415static struct luaL_reg iolibtag[] = { 419static struct luaL_reg iolibtag[] = {
416{"readfrom", io_readfrom}, 420 {"readfrom", io_readfrom},
417{"writeto", io_writeto}, 421 {"writeto", io_writeto},
418{"appendto", io_appendto}, 422 {"appendto", io_appendto},
419{"read", io_read}, 423 {"read", io_read},
420{"write", io_write} 424 {"write", io_write}
421}; 425};
422 426
423static void openwithtags (void) 427static void openwithtags (void)
@@ -439,10 +443,7 @@ static void openwithtags (void)
439 setfile(stderr, "_STDERR", iotag); 443 setfile(stderr, "_STDERR", iotag);
440} 444}
441 445
442void lua_iolibopen (void) 446void lua_iolibopen (void) {
443{
444 luaL_openlib(iolib, (sizeof(iolib)/sizeof(iolib[0]))); 447 luaL_openlib(iolib, (sizeof(iolib)/sizeof(iolib[0])));
445 openwithtags(); 448 openwithtags();
446 lua_pushcfunction(errorfb);
447 lua_seterrormethod();
448} 449}
diff --git a/lstate.h b/lstate.h
index 129dc43b..41acf0b8 100644
--- a/lstate.h
+++ b/lstate.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstate.h,v 1.10 1998/06/19 16:14:09 roberto Exp roberto $ 2** $Id: lstate.h,v 1.11 1998/06/24 13:33:00 roberto Exp roberto $
3** Global State 3** Global State
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -61,7 +61,6 @@ struct lua_State {
61 struct C_Lua_Stack Cblocks[MAX_C_BLOCKS]; 61 struct C_Lua_Stack Cblocks[MAX_C_BLOCKS];
62 int numCblocks; /* number of nested Cblocks */ 62 int numCblocks; /* number of nested Cblocks */
63 /* global state */ 63 /* global state */
64 TObject errorim; /* error tag method */
65 GCnode rootproto; /* list of all prototypes */ 64 GCnode rootproto; /* list of all prototypes */
66 GCnode rootcl; /* list of all closures */ 65 GCnode rootcl; /* list of all closures */
67 GCnode roottable; /* list of all tables */ 66 GCnode roottable; /* list of all tables */
diff --git a/ltm.c b/ltm.c
index cc290dde..94e3d041 100644
--- a/ltm.c
+++ b/ltm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltm.c,v 1.15 1998/03/11 13:59:50 roberto Exp roberto $ 2** $Id: ltm.c,v 1.16 1998/06/18 16:57:03 roberto Exp roberto $
3** Tag methods 3** Tag methods
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -158,8 +158,6 @@ void luaT_settagmethod (int t, char *event, TObject *func)
158char *luaT_travtagmethods (int (*fn)(TObject *)) 158char *luaT_travtagmethods (int (*fn)(TObject *))
159{ 159{
160 int e; 160 int e;
161 if (fn(&L->errorim))
162 return "error";
163 for (e=IM_GETTABLE; e<=IM_FUNCTION; e++) { /* ORDER IM */ 161 for (e=IM_GETTABLE; e<=IM_FUNCTION; e++) { /* ORDER IM */
164 int t; 162 int t;
165 for (t=0; t>=L->last_tag; t--) 163 for (t=0; t>=L->last_tag; t--)
diff --git a/lua.h b/lua.h
index 477627ef..fa2baaf3 100644
--- a/lua.h
+++ b/lua.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lua.h,v 1.22 1998/06/15 21:34:14 roberto Exp roberto $ 2** $Id: lua.h,v 1.23 1998/06/18 16:51:53 roberto Exp roberto $
3** Lua - An Extensible Extension Language 3** Lua - An Extensible Extension Language
4** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil 4** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil
5** e-mail: lua@tecgraf.puc-rio.br 5** e-mail: lua@tecgraf.puc-rio.br
@@ -11,7 +11,7 @@
11#ifndef lua_h 11#ifndef lua_h
12#define lua_h 12#define lua_h
13 13
14#define LUA_VERSION "Lua 3.1" 14#define LUA_VERSION "Lua 3.2 (alpha)"
15#define LUA_COPYRIGHT "Copyright (C) 1994-1998 TeCGraf, PUC-Rio" 15#define LUA_COPYRIGHT "Copyright (C) 1994-1998 TeCGraf, PUC-Rio"
16#define LUA_AUTHORS "W. Celes, R. Ierusalimschy & L. H. de Figueiredo" 16#define LUA_AUTHORS "W. Celes, R. Ierusalimschy & L. H. de Figueiredo"
17 17
@@ -32,7 +32,6 @@ lua_State *lua_setstate (lua_State *st);
32 32
33lua_Object lua_settagmethod (int tag, char *event); /* In: new method */ 33lua_Object lua_settagmethod (int tag, char *event); /* In: new method */
34lua_Object lua_gettagmethod (int tag, char *event); 34lua_Object lua_gettagmethod (int tag, char *event);
35lua_Object lua_seterrormethod (void); /* In: new method */
36 35
37int lua_newtag (void); 36int lua_newtag (void);
38int lua_copytagmethods (int tagto, int tagfrom); 37int lua_copytagmethods (int tagto, int tagfrom);
@@ -125,6 +124,8 @@ int (lua_clonetag) (int t);
125#define lua_clonetag(t) lua_copytagmethods(lua_newtag(), (t)) 124#define lua_clonetag(t) lua_copytagmethods(lua_newtag(), (t))
126 125
127 126
127lua_Object lua_seterrormethod (void); /* In: new method */
128
128/* ========================================================================== 129/* ==========================================================================
129** for compatibility with old versions. Avoid using these macros/functions 130** for compatibility with old versions. Avoid using these macros/functions
130** If your program does need any of these, define LUA_COMPAT2_5 131** If your program does need any of these, define LUA_COMPAT2_5
diff --git a/manual.tex b/manual.tex
index 50d4e67e..5f56593c 100644
--- a/manual.tex
+++ b/manual.tex
@@ -1,8 +1,10 @@
1% $Id: manual.tex,v 1.16 1998/06/19 18:47:06 roberto Exp roberto $ 1% $Id: manual.tex,v 1.17 1998/06/29 18:09:28 roberto Exp roberto $
2 2
3\documentclass[11pt]{article} 3\documentclass[11pt]{article}
4\usepackage{fullpage,bnf} 4\usepackage{fullpage,bnf}
5 5
6\catcode`\_=12
7
6\newcommand{\See}[1]{Section~\ref{#1}} 8\newcommand{\See}[1]{Section~\ref{#1}}
7\newcommand{\see}[1]{(see \See{#1})} 9\newcommand{\see}[1]{(see \See{#1})}
8\newcommand{\M}[1]{\emph{#1}} 10\newcommand{\M}[1]{\emph{#1}}
@@ -19,7 +21,7 @@
19 21
20\newcommand{\ff}{$\bullet$\ } 22\newcommand{\ff}{$\bullet$\ }
21 23
22\newcommand{\Version}{3.1} 24\newcommand{\Version}{3.2 (alpha)}
23 25
24\makeindex 26\makeindex
25 27
@@ -39,7 +41,7 @@ Waldemar Celes
39\tecgraf\ --- Computer Science Department --- PUC-Rio 41\tecgraf\ --- Computer Science Department --- PUC-Rio
40} 42}
41 43
42%\date{\small \verb$Date: 1998/06/19 18:47:06 $} 44%\date{\small \verb$Date: 1998/06/29 18:09:28 $}
43 45
44\maketitle 46\maketitle
45 47
@@ -810,7 +812,7 @@ If the function is called in a place that can hold many values
810(syntactically denoted by the non-terminal \M{exp}), 812(syntactically denoted by the non-terminal \M{exp}),
811then no adjustment is made. 813then no adjustment is made.
812Note that the only place that can hold many values 814Note that the only place that can hold many values
813is the last expression (or the only one) in an assignment 815is the last (or the only) expression in an assignment
814or in a return statement; see examples below. 816or in a return statement; see examples below.
815\begin{verbatim} 817\begin{verbatim}
816 f(); -- adjusted to 0 818 f(); -- adjusted to 0
@@ -1263,22 +1265,20 @@ Because Lua is an extension language,
1263all Lua actions start from C code in the host program 1265all Lua actions start from C code in the host program
1264calling a function from the Lua library. 1266calling a function from the Lua library.
1265Whenever an error occurs during Lua compilation or execution, 1267Whenever an error occurs during Lua compilation or execution,
1266the \Def{error method} is called, 1268function \verb|_ERRORMESSAGE| is called \Deffunc{_ERRORMESSAGE}
1269(provided it is different from \nil),
1267and then the corresponding function from the library 1270and then the corresponding function from the library
1268(\verb|lua_dofile|, \verb|lua_dostring|, 1271(\verb|lua_dofile|, \verb|lua_dostring|,
1269\verb|lua_dobuffer|, or \verb|lua_callfunction|) 1272\verb|lua_dobuffer|, or \verb|lua_callfunction|)
1270is terminated, returning an error condition. 1273is terminated, returning an error condition.
1271 1274
1272The only argument to the error method is a string 1275The only argument to \verb|_ERRORMESSAGE| is a string
1273describing the error. 1276describing the error.
1274The default method prints this message to \verb|stderr|. 1277The default definition for this function calls \verb|_ALERT|,
1275If needed, it is possible to change the error method with the 1278which prints the message to \verb|stderr| \see{alert}.
1276function \verb|seterrormethod|, 1279The standard I/O library redefines \verb|_ERRORMESSAGE|,
1277which gets the new error handler as its only parameter 1280and uses the debug facilities \see{debugI}
1278\see{pdf-seterrormethod}. 1281to print some extra information,
1279The standard I/O library uses this facility to redefine the error method,
1280using the debug facilities \see{debugI},
1281in order to print some extra information,
1282such as the call stack. 1282such as the call stack.
1283 1283
1284To provide more information about errors, 1284To provide more information about errors,
@@ -1347,11 +1347,11 @@ For that, you must set \verb|lua_state| back to \verb|NULL| before
1347calling \verb|lua_open|. 1347calling \verb|lua_open|.
1348An easy way to do that is defining an auxiliary function: 1348An easy way to do that is defining an auxiliary function:
1349\begin{verbatim} 1349\begin{verbatim}
1350lua_State *lua_newstate (void) { 1350 lua_State *lua_newstate (void) {
1351 lua_State *old = lua_setstate(NULL); 1351 lua_State *old = lua_setstate(NULL);
1352 lua_open(); 1352 lua_open();
1353 return lua_setstate(old); 1353 return lua_setstate(old);
1354} 1354 }
1355\end{verbatim} 1355\end{verbatim}
1356This function creates a new state without changing the current state 1356This function creates a new state without changing the current state
1357of the interpreter. 1357of the interpreter.
@@ -1373,14 +1373,14 @@ If \verb|lua_state| is already \verb|NULL|,
1373\verb|lua_close| has no effect. 1373\verb|lua_close| has no effect.
1374 1374
1375If you are using multiple states, 1375If you are using multiple states,
1376you may find useful the following function, 1376you may find useful to define the following function,
1377which releases a given state: 1377which releases a given state:
1378\begin{verbatim} 1378\begin{verbatim}
1379void lua_freestate (lua_State *st) { 1379 void lua_freestate (lua_State *st) {
1380 lua_State *old = lua_setstate(st); 1380 lua_State *old = lua_setstate(st);
1381 lua_close(); 1381 lua_close();
1382 if (old != st) lua_setstate(old); 1382 if (old != st) lua_setstate(old);
1383} 1383 }
1384\end{verbatim} 1384\end{verbatim}
1385 1385
1386\subsection{Exchanging Values between C and Lua} \label{valuesCLua} 1386\subsection{Exchanging Values between C and Lua} \label{valuesCLua}
@@ -1736,18 +1736,10 @@ If the C function has been called from Lua,
1736then the corresponding Lua execution terminates, 1736then the corresponding Lua execution terminates,
1737as if an error had occurred inside Lua code. 1737as if an error had occurred inside Lua code.
1738Otherwise, the whole program terminates with a call to \verb|exit(1)|. 1738Otherwise, the whole program terminates with a call to \verb|exit(1)|.
1739The \verb|message| is passed to the error handler method. 1739The \verb|message| is passed to the error handler function,
1740\verb|_ERRORMESSAGE|.
1740If \verb|message| is \verb|NULL|, 1741If \verb|message| is \verb|NULL|,
1741the error handler method is not called. 1742\verb|_ERRORMESSAGE| is not called.
1742
1743The error handler method \see{error} can be
1744changed with: \Deffunc{lua_seterrormethod}
1745\begin{verbatim}
1746lua_Object lua_seterrormethod (void);
1747\end{verbatim}
1748This function sets the object at the top of C2lua
1749as the new error method,
1750and returns the old error method value.
1751 1743
1752Tag methods can be changed with: \Deffunc{lua_settagmethod} 1744Tag methods can be changed with: \Deffunc{lua_settagmethod}
1753\begin{verbatim} 1745\begin{verbatim}
@@ -1885,7 +1877,7 @@ and \verb|lua_iolibopen|, declared in \verb|lualib.h|.
1885 1877
1886\subsection{Predefined Functions} \label{predefined} 1878\subsection{Predefined Functions} \label{predefined}
1887 1879
1888\subsubsection*{\ff \T{call (func, arg [, mode [, errmethod]])}}\Deffunc{call} 1880\subsubsection*{\ff \T{call (func, arg [, mode [, errhandler]])}}\Deffunc{call}
1889\label{pdf-call} 1881\label{pdf-call}
1890This function calls function \verb|func| with 1882This function calls function \verb|func| with
1891the arguments given by the table \verb|arg|. 1883the arguments given by the table \verb|arg|.
@@ -1917,14 +1909,15 @@ if an error occurs during the function call,
1917the error is propagated. 1909the error is propagated.
1918If the string \verb|mode| contains \verb|"x"|, 1910If the string \verb|mode| contains \verb|"x"|,
1919then the call is \emph{protected}.\index{protected calls} 1911then the call is \emph{protected}.\index{protected calls}
1920In this mode, function \verb|call| does not generate an error, 1912In this mode, function \verb|call| does not propagate an error,
1921whatever happens during the call. 1913whatever happens during the call.
1922Instead, it returns \nil\ to signal the error 1914Instead, it returns \nil\ to signal the error
1923(besides calling the appropriated error method). 1915(besides calling the appropriated error handler).
1924 1916
1925If provided, \verb|errmethod| is temporarily set as the error method, 1917If provided,
1926while \verb|func| runs. 1918\verb|errhandler| is temporarily set as the error function
1927As a particular case, if \verb|errmethod| is \nil, 1919\verb|_ERRORMESSAGE|, while \verb|func| runs.
1920As a particular example, if \verb|errhandler| is \nil,
1928no error messages will be issued during the execution of the called function. 1921no error messages will be issued during the execution of the called function.
1929 1922
1930\subsubsection*{\ff \T{collectgarbage ([limit])}}\Deffunc{collectgarbage} 1923\subsubsection*{\ff \T{collectgarbage ([limit])}}\Deffunc{collectgarbage}
@@ -2055,9 +2048,16 @@ This function receives any number of arguments,
2055and prints their values using the strings returned by \verb|tostring|. 2048and prints their values using the strings returned by \verb|tostring|.
2056This function is not intended for formatted output, 2049This function is not intended for formatted output,
2057but only as a quick way to show a value, 2050but only as a quick way to show a value,
2058for instance for error messages or debugging. 2051for instance for debugging.
2059See \See{libio} for functions for formatted output. 2052See \See{libio} for functions for formatted output.
2060 2053
2054\subsubsection*{\ff \T{_ALERT (message)}}\Deffunc{alert}\label{alert}
2055This function prints its only string argument to \IndexVerb{stderr}.
2056All error messages in Lua are printed through this function.
2057Therefore, a program may redefine it
2058to change the way such messages are shown
2059(for instance, for systems without \verb|stderr|).
2060
2061\subsubsection*{\ff \T{tonumber (e [, base])}}\Deffunc{tonumber} 2061\subsubsection*{\ff \T{tonumber (e [, base])}}\Deffunc{tonumber}
2062This function receives one argument, 2062This function receives one argument,
2063and tries to convert it to a number. 2063and tries to convert it to a number.
@@ -2164,13 +2164,6 @@ Its full semantics is explained in \See{tag-method}.
2164The string \verb|name| does not need to be a 2164The string \verb|name| does not need to be a
2165syntactically valid variable name. 2165syntactically valid variable name.
2166 2166
2167\subsubsection*{\ff \T{seterrormethod (newmethod)}}
2168\label{pdf-seterrormethod}
2169Sets the error handler \see{error}.
2170\verb|newmethod| must be a function or \nil,
2171in which case the error handler does nothing.
2172Returns the old error handler.
2173
2174\subsubsection*{\ff \T{settagmethod (tag, event, newmethod)}} 2167\subsubsection*{\ff \T{settagmethod (tag, event, newmethod)}}
2175\Deffunc{settagmethod} 2168\Deffunc{settagmethod}
2176This function sets a new tag method to the given pair \M{(tag, event)}. 2169This function sets a new tag method to the given pair \M{(tag, event)}.
@@ -2930,7 +2923,7 @@ so any existing program that opens at least one standard
2930library before calling Lua does not need to be modified. 2923library before calling Lua does not need to be modified.
2931 2924
2932\item Function \verb|dostring| no longer accepts an optional second argument, 2925\item Function \verb|dostring| no longer accepts an optional second argument,
2933with a temporary error method. 2926with a temporary error handler.
2934This facility is now provided by function \verb|call|. 2927This facility is now provided by function \verb|call|.
2935 2928
2936\item Function \verb|gsub| no longer accepts an optional fourth argument 2929\item Function \verb|gsub| no longer accepts an optional fourth argument
@@ -2951,8 +2944,10 @@ programs should use an explicit assignment instead, such as
2951 2944
2952\end{itemize} 2945\end{itemize}
2953 2946
2947% restore underscore to usual meaning
2948\catcode`\_=8
2949
2954\newcommand{\indexentry}[2]{\item {#1} #2} 2950\newcommand{\indexentry}[2]{\item {#1} #2}
2955%\catcode`\_=12
2956\begin{theindex} 2951\begin{theindex}
2957\input{manual.id} 2952\input{manual.id}
2958\end{theindex} 2953\end{theindex}