aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c34
1 files changed, 20 insertions, 14 deletions
diff --git a/lvm.c b/lvm.c
index 86047f44..3152a74c 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 1.123 2000/08/09 14:49:41 roberto Exp roberto $ 2** $Id: lvm.c,v 1.124 2000/08/09 19:16:57 roberto Exp roberto $
3** Lua virtual machine 3** Lua virtual machine
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -121,7 +121,7 @@ void luaV_gettable (lua_State *L, StkId top) {
121 im = luaT_getimbyObj(L, table, IM_GETTABLE); 121 im = luaT_getimbyObj(L, table, IM_GETTABLE);
122 if (ttype(im) == TAG_NIL) { 122 if (ttype(im) == TAG_NIL) {
123 L->top = top; 123 L->top = top;
124 luaG_indexerror(L, table); 124 luaG_typeerror(L, table, "index");
125 } 125 }
126 } 126 }
127 else { /* object is a table... */ 127 else { /* object is a table... */
@@ -156,7 +156,7 @@ void luaV_settable (lua_State *L, StkId t, StkId top) {
156 L->top = top; 156 L->top = top;
157 im = luaT_getimbyObj(L, t, IM_SETTABLE); 157 im = luaT_getimbyObj(L, t, IM_SETTABLE);
158 if (ttype(im) == TAG_NIL) 158 if (ttype(im) == TAG_NIL)
159 luaG_indexerror(L, t); 159 luaG_typeerror(L, t, "index");
160 } 160 }
161 else { /* object is a table... */ 161 else { /* object is a table... */
162 im = luaT_getim(L, hvalue(t)->htag, IM_SETTABLE); 162 im = luaT_getim(L, hvalue(t)->htag, IM_SETTABLE);
@@ -223,7 +223,7 @@ void luaV_setglobal (lua_State *L, TString *s, StkId top) {
223} 223}
224 224
225 225
226static void call_binTM (lua_State *L, StkId top, IMS event, const char *msg) { 226static int call_binTM (lua_State *L, StkId top, IMS event) {
227 /* try first operand */ 227 /* try first operand */
228 const TObject *im = luaT_getimbyObj(L, top-2, event); 228 const TObject *im = luaT_getimbyObj(L, top-2, event);
229 L->top = top; 229 L->top = top;
@@ -232,16 +232,18 @@ static void call_binTM (lua_State *L, StkId top, IMS event, const char *msg) {
232 if (ttype(im) == TAG_NIL) { 232 if (ttype(im) == TAG_NIL) {
233 im = luaT_getim(L, 0, event); /* try a `global' method */ 233 im = luaT_getim(L, 0, event); /* try a `global' method */
234 if (ttype(im) == TAG_NIL) 234 if (ttype(im) == TAG_NIL)
235 lua_error(L, msg); 235 return 0; /* error */
236 } 236 }
237 } 237 }
238 lua_pushstring(L, luaT_eventname[event]); 238 lua_pushstring(L, luaT_eventname[event]);
239 luaD_callTM(L, im, 3, 1); 239 luaD_callTM(L, im, 3, 1);
240 return 1;
240} 241}
241 242
242 243
243static void call_arith (lua_State *L, StkId top, IMS event) { 244static void call_arith (lua_State *L, StkId top, IMS event) {
244 call_binTM(L, top, event, "unexpected type in arithmetic operation"); 245 if (!call_binTM(L, top, event))
246 luaG_binerror(L, top-2, TAG_NUMBER, "perform arithmetic on");
245} 247}
246 248
247 249
@@ -276,7 +278,8 @@ int luaV_lessthan (lua_State *L, const TObject *l, const TObject *r, StkId top)
276 luaD_checkstack(L, 2); 278 luaD_checkstack(L, 2);
277 *top++ = *l; 279 *top++ = *l;
278 *top++ = *r; 280 *top++ = *r;
279 call_binTM(L, top, IM_LT, "unexpected type in comparison"); 281 if (!call_binTM(L, top, IM_LT))
282 lua_error(L, "unexpected type in comparison");
280 L->top--; 283 L->top--;
281 return (ttype(L->top) != TAG_NIL); 284 return (ttype(L->top) != TAG_NIL);
282 } 285 }
@@ -286,8 +289,10 @@ int luaV_lessthan (lua_State *L, const TObject *l, const TObject *r, StkId top)
286static void strconc (lua_State *L, int total, StkId top) { 289static void strconc (lua_State *L, int total, StkId top) {
287 do { 290 do {
288 int n = 2; /* number of elements handled in this pass (at least 2) */ 291 int n = 2; /* number of elements handled in this pass (at least 2) */
289 if (tostring(L, top-2) || tostring(L, top-1)) 292 if (tostring(L, top-2) || tostring(L, top-1)) {
290 call_binTM(L, top, IM_CONCAT, "unexpected type for concatenation"); 293 if (!call_binTM(L, top, IM_CONCAT))
294 luaG_binerror(L, top-2, TAG_STRING, "concat");
295 }
291 else if (tsvalue(top-1)->u.s.len > 0) { /* if len=0, do nothing */ 296 else if (tsvalue(top-1)->u.s.len > 0) { /* if len=0, do nothing */
292 /* at least two string values; get as many as possible */ 297 /* at least two string values; get as many as possible */
293 lint32 tl = (lint32)tsvalue(top-1)->u.s.len + 298 lint32 tl = (lint32)tsvalue(top-1)->u.s.len +
@@ -508,7 +513,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) {
508 } 513 }
509 514
510 case OP_ADD: 515 case OP_ADD:
511 if (tonumber(top-1) || tonumber(top-2)) 516 if (tonumber(top-2) || tonumber(top-1))
512 call_arith(L, top, IM_ADD); 517 call_arith(L, top, IM_ADD);
513 else 518 else
514 nvalue(top-2) += nvalue(top-1); 519 nvalue(top-2) += nvalue(top-1);
@@ -526,7 +531,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) {
526 break; 531 break;
527 532
528 case OP_SUB: 533 case OP_SUB:
529 if (tonumber(top-1) || tonumber(top-2)) 534 if (tonumber(top-2) || tonumber(top-1))
530 call_arith(L, top, IM_SUB); 535 call_arith(L, top, IM_SUB);
531 else 536 else
532 nvalue(top-2) -= nvalue(top-1); 537 nvalue(top-2) -= nvalue(top-1);
@@ -534,7 +539,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) {
534 break; 539 break;
535 540
536 case OP_MULT: 541 case OP_MULT:
537 if (tonumber(top-1) || tonumber(top-2)) 542 if (tonumber(top-2) || tonumber(top-1))
538 call_arith(L, top, IM_MUL); 543 call_arith(L, top, IM_MUL);
539 else 544 else
540 nvalue(top-2) *= nvalue(top-1); 545 nvalue(top-2) *= nvalue(top-1);
@@ -542,7 +547,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) {
542 break; 547 break;
543 548
544 case OP_DIV: 549 case OP_DIV:
545 if (tonumber(top-1) || tonumber(top-2)) 550 if (tonumber(top-2) || tonumber(top-1))
546 call_arith(L, top, IM_DIV); 551 call_arith(L, top, IM_DIV);
547 else 552 else
548 nvalue(top-2) /= nvalue(top-1); 553 nvalue(top-2) /= nvalue(top-1);
@@ -550,7 +555,8 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) {
550 break; 555 break;
551 556
552 case OP_POW: 557 case OP_POW:
553 call_binTM(L, top, IM_POW, "undefined operation"); 558 if (!call_binTM(L, top, IM_POW))
559 lua_error(L, "undefined operation");
554 top--; 560 top--;
555 break; 561 break;
556 562