aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1994-11-21 16:22:58 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1994-11-21 16:22:58 -0200
commit609392ff2e02eb44fa48c8563faf5994fc55297c (patch)
treeae4d3a4094a795a3c04583895007f0d6119da52a
parent96ea2e0fb462789015824823801ba34782364b68 (diff)
downloadlua-609392ff2e02eb44fa48c8563faf5994fc55297c.tar.gz
lua-609392ff2e02eb44fa48c8563faf5994fc55297c.tar.bz2
lua-609392ff2e02eb44fa48c8563faf5994fc55297c.zip
fallback for "call expression not a function" errors
-rw-r--r--fallback.c11
-rw-r--r--fallback.h3
-rw-r--r--opcode.c22
3 files changed, 29 insertions, 7 deletions
diff --git a/fallback.c b/fallback.c
index a41712cc..0076da24 100644
--- a/fallback.c
+++ b/fallback.c
@@ -3,7 +3,7 @@
3** TecCGraf - PUC-Rio 3** TecCGraf - PUC-Rio
4*/ 4*/
5 5
6char *rcs_fallback="$Id: fallback.c,v 1.7 1994/11/18 19:46:21 roberto Exp roberto $"; 6char *rcs_fallback="$Id: fallback.c,v 1.8 1994/11/21 13:30:15 roberto Exp roberto $";
7 7
8#include <stdio.h> 8#include <stdio.h>
9 9
@@ -21,6 +21,7 @@ static void arithFB (void);
21static void concatFB (void); 21static void concatFB (void);
22static void orderFB (void); 22static void orderFB (void);
23static void GDFB (void); 23static void GDFB (void);
24static void funcFB (void);
24 25
25 26
26/* 27/*
@@ -34,7 +35,8 @@ struct FB luaI_fallBacks[] = {
34{"order", {LUA_T_CFUNCTION, orderFB}}, 35{"order", {LUA_T_CFUNCTION, orderFB}},
35{"concat", {LUA_T_CFUNCTION, concatFB}}, 36{"concat", {LUA_T_CFUNCTION, concatFB}},
36{"settable", {LUA_T_CFUNCTION, gettableFB}}, 37{"settable", {LUA_T_CFUNCTION, gettableFB}},
37{"gc", {LUA_T_CFUNCTION, GDFB}} 38{"gc", {LUA_T_CFUNCTION, GDFB}},
39{"function", {LUA_T_CFUNCTION, funcFB}}
38}; 40};
39 41
40#define N_FB (sizeof(luaI_fallBacks)/sizeof(struct FB)) 42#define N_FB (sizeof(luaI_fallBacks)/sizeof(struct FB))
@@ -103,6 +105,11 @@ static void orderFB (void)
103 105
104static void GDFB (void) { } 106static void GDFB (void) { }
105 107
108static void funcFB (void)
109{
110 lua_reportbug("call expression not a function");
111}
112
106 113
107/* 114/*
108** Lock routines 115** Lock routines
diff --git a/fallback.h b/fallback.h
index 33c22b0d..8da9dd2e 100644
--- a/fallback.h
+++ b/fallback.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: fallback.h,v 1.5 1994/11/18 19:46:21 roberto Exp roberto $ 2** $Id: fallback.h,v 1.6 1994/11/21 13:30:15 roberto Exp roberto $
3*/ 3*/
4 4
5#ifndef fallback_h 5#ifndef fallback_h
@@ -20,6 +20,7 @@ extern struct FB {
20#define FB_CONCAT 5 20#define FB_CONCAT 5
21#define FB_SETTABLE 6 21#define FB_SETTABLE 6
22#define FB_GC 7 22#define FB_GC 7
23#define FB_FUNCTION 8
23 24
24void luaI_setfallback (void); 25void luaI_setfallback (void);
25int luaI_lock (Object *object); 26int luaI_lock (Object *object);
diff --git a/opcode.c b/opcode.c
index 55a41ee1..0e8a8598 100644
--- a/opcode.c
+++ b/opcode.c
@@ -3,7 +3,7 @@
3** TecCGraf - PUC-Rio 3** TecCGraf - PUC-Rio
4*/ 4*/
5 5
6char *rcs_opcode="$Id: opcode.c,v 3.18 1994/11/18 19:46:21 roberto Exp roberto $"; 6char *rcs_opcode="$Id: opcode.c,v 3.19 1994/11/21 13:30:15 roberto Exp $";
7 7
8#include <setjmp.h> 8#include <setjmp.h>
9#include <stdio.h> 9#include <stdio.h>
@@ -209,6 +209,20 @@ static int callC (lua_CFunction func, int base)
209 return firstResult; 209 return firstResult;
210} 210}
211 211
212/*
213** Call the fallback for invalid functions (see do_call)
214*/
215static void call_funcFB (Object *func, int base, int nResults, int whereRes)
216{
217 int i;
218 /* open space for first parameter (func) */
219 for (i=top-stack; i>base; i--)
220 stack[i] = stack[i-1];
221 top++;
222 stack[base] = *func;
223 do_call(&luaI_fallBacks[FB_FUNCTION].function, base, nResults, whereRes);
224}
225
212 226
213/* 227/*
214** Call a function (C or Lua). The parameters must be on the stack, 228** Call a function (C or Lua). The parameters must be on the stack,
@@ -224,9 +238,9 @@ static void do_call (Object *func, int base, int nResults, int whereRes)
224 else if (tag(func) == LUA_T_FUNCTION) 238 else if (tag(func) == LUA_T_FUNCTION)
225 firstResult = lua_execute(bvalue(func), base); 239 firstResult = lua_execute(bvalue(func), base);
226 else 240 else
227 { 241 { /* func is not a function */
228 lua_reportbug ("call expression not a function"); 242 call_funcFB(func, base, nResults, whereRes);
229 return; /* to avoid warnings */ 243 return;
230 } 244 }
231 /* adjust the number of results */ 245 /* adjust the number of results */
232 if (nResults != MULT_RET && top - (stack+firstResult) != nResults) 246 if (nResults != MULT_RET && top - (stack+firstResult) != nResults)