aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ltests.c217
1 files changed, 101 insertions, 116 deletions
diff --git a/ltests.c b/ltests.c
index a3304c87..a8aafcb9 100644
--- a/ltests.c
+++ b/ltests.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltests.c,v 1.35 2000/08/28 17:57:04 roberto Exp roberto $ 2** $Id: ltests.c,v 1.36 2000/08/29 14:57:10 roberto Exp roberto $
3** Internal Module for Debugging of the Lua Implementation 3** Internal Module for Debugging of the Lua Implementation
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -239,6 +239,89 @@ static int string_query (lua_State *L) {
239} 239}
240 240
241 241
242static int tref (lua_State *L) {
243 luaL_checktype(L, 1, "any");
244 lua_pushobject(L, 1);
245 lua_pushnumber(L, lua_ref(L, luaL_opt_int(L, 2, 1)));
246 return 1;
247}
248
249static int getref (lua_State *L) {
250 if (lua_getref(L, luaL_check_int(L, 1)))
251 return 1;
252 else
253 return 0;
254}
255
256static int unref (lua_State *L) {
257 lua_unref(L, luaL_check_int(L, 1));
258 return 0;
259}
260
261static int newuserdata (lua_State *L) {
262 lua_pushusertag(L, (void *)luaL_check_int(L, 1), luaL_check_int(L, 2));
263 return 1;
264}
265
266static int udataval (lua_State *L) {
267 luaL_checktype(L, 1, "userdata");
268 lua_pushnumber(L, (int)lua_touserdata(L, 1));
269 return 1;
270}
271
272static int newstate (lua_State *L) {
273 lua_State *L1 = lua_newstate(luaL_check_int(L, 1), luaL_check_int(L, 2));
274 if (L1)
275 lua_pushuserdata(L, L1);
276 else
277 lua_pushnil(L);
278 return 1;
279}
280
281static int closestate (lua_State *L) {
282 luaL_checktype(L, 1, "userdata");
283 lua_close((lua_State *)lua_touserdata(L, 1));
284 return 0;
285}
286
287static int doremote (lua_State *L) {
288 lua_State *L1;
289 const char *code = luaL_check_string(L, 2);
290 int status;
291 luaL_checktype(L, 1, "userdata");
292 L1 = (lua_State *)lua_touserdata(L, 1);
293 status = lua_dostring(L1, code);
294 if (status != 0) {
295 lua_pushnil(L);
296 lua_pushnumber(L, status);
297 return 2;
298 }
299 else {
300 int i = 0;
301 while (!lua_isnull(L1, ++i))
302 lua_pushstring(L, lua_tostring(L1, i));
303 return i-1;
304 }
305}
306
307static int settagmethod (lua_State *L) {
308 luaL_checktype(L, 3, "any");
309 lua_settagmethod(L, luaL_check_int(L, 1), luaL_check_string(L, 2));
310 return 1;
311}
312
313static int pushbool (lua_State *L, int b) {
314 if (b) lua_pushnumber(L, 1);
315 else lua_pushnil(L);
316 return 1;
317}
318
319static int equal (lua_State *L) {
320 return pushbool(L, lua_equal(L, 1, 2));
321}
322
323
324
242/* 325/*
243** {====================================================== 326** {======================================================
244** function to test the API with C. It interprets a kind of "assembler" 327** function to test the API with C. It interprets a kind of "assembler"
@@ -321,34 +404,9 @@ static int testC (lua_State *L) {
321 else if EQ("pushnum") { 404 else if EQ("pushnum") {
322 lua_pushnumber(L, getnum); 405 lua_pushnumber(L, getnum);
323 } 406 }
324 else if EQ("newtable") {
325 lua_newtable(L);
326 }
327 else if EQ("pushobject") { 407 else if EQ("pushobject") {
328 lua_pushobject(L, getnum); 408 lua_pushobject(L, getnum);
329 } 409 }
330 else if EQ("getglobal") {
331 lua_getglobal(L, getname);
332 }
333 else if EQ("getglobals") {
334 lua_getglobals(L);
335 }
336 else if EQ("ref") {
337 reg[getreg] = lua_ref(L, 0);
338 }
339 else if EQ("reflock") {
340 reg[getreg] = lua_ref(L, 1);
341 }
342 else if EQ("getref") {
343 int n = getreg;
344 reg[n] = lua_getref(L, getnum);
345 }
346 else if EQ("unref") {
347 lua_unref(L, getnum);
348 }
349 else if EQ("setglobal") {
350 lua_setglobal(L, getname);
351 }
352 else if EQ("pushstring") { 410 else if EQ("pushstring") {
353 lua_pushstring(L, getname); 411 lua_pushstring(L, getname);
354 } 412 }
@@ -357,98 +415,9 @@ static int testC (lua_State *L) {
357 int nres = getnum; 415 int nres = getnum;
358 if (lua_call(L, narg, nres)) lua_error(L, NULL); 416 if (lua_call(L, narg, nres)) lua_error(L, NULL);
359 } 417 }
360 else if EQ("gettable") {
361 lua_gettable(L);
362 }
363 else if EQ("rawget") {
364 lua_rawget(L);
365 }
366 else if EQ("settable") {
367 lua_settable(L);
368 }
369 else if EQ("rawset") {
370 lua_rawset(L);
371 }
372 else if EQ("tag") {
373 int n = getreg;
374 reg[n] = lua_tag(L, getnum);
375 }
376 else if EQ("type") { 418 else if EQ("type") {
377 lua_pushstring(L, lua_type(L, getnum)); 419 lua_pushstring(L, lua_type(L, getnum));
378 } 420 }
379 else if EQ("isnil") {
380 lua_pushnumber(L, lua_isnil(L, getnum));
381 }
382 else if EQ("isnull") {
383 lua_pushnumber(L, lua_isnull(L, getnum));
384 }
385 else if EQ("isnumber") {
386 lua_pushnumber(L, lua_isnumber(L, getnum));
387 }
388 else if EQ("isstring") {
389 lua_pushnumber(L, lua_isstring(L, getnum));
390 }
391 else if EQ("istable") {
392 lua_pushnumber(L, lua_istable(L, getnum));
393 }
394 else if EQ("isfunction") {
395 lua_pushnumber(L, lua_isfunction(L, getnum));
396 }
397 else if EQ("iscfunction") {
398 lua_pushnumber(L, lua_iscfunction(L, getnum));
399 }
400 else if EQ("isuserdata") {
401 lua_pushnumber(L, lua_isuserdata(L, getnum));
402 }
403 else if EQ("equal") {
404 int n1 = getreg;
405 int n2 = getnum;
406 int n3 = getnum;
407 reg[n1] = lua_equal(L, n2, n3);
408 }
409 else if EQ("pushusertag") {
410 int val = getnum;
411 int tag = getnum;
412 lua_pushusertag(L, (void *)val, tag);
413 }
414 else if EQ("udataval") {
415 int n = getreg;
416 reg[n] = (int)lua_touserdata(L, getnum);
417 }
418 else if EQ("settagmethod") {
419 int n = getnum;
420 lua_settagmethod(L, n, getname);
421 }
422 else if EQ("newstate") {
423 int stacksize = getnum;
424 lua_State *L1 = lua_newstate(stacksize, getnum);
425 if (L1)
426 lua_pushuserdata(L, L1);
427 else
428 lua_pushnil(L);
429 }
430 else if EQ("closestate") {
431 (lua_close)((lua_State *)lua_touserdata(L, getnum));
432 }
433 else if EQ("doremote") {
434 int ol1 = getnum;
435 int str = getnum;
436 lua_State *L1;
437 int status;
438 if (!lua_isuserdata(L, ol1) || !lua_isstring(L, str))
439 lua_error(L, "bad arguments for `doremote'");
440 L1 = (lua_State *)lua_touserdata(L, ol1);
441 status = lua_dostring(L1, lua_tostring(L, str));
442 if (status != 0) {
443 lua_pushnil(L);
444 lua_pushnumber(L, status);
445 }
446 else {
447 int i = 0;
448 while (!lua_isnull(L1, ++i))
449 lua_pushstring(L, lua_tostring(L1, i));
450 }
451 }
452 else luaL_verror(L, "unknown instruction %.30s", buff); 421 else luaL_verror(L, "unknown instruction %.30s", buff);
453 } 422 }
454 return 0; 423 return 0;
@@ -467,12 +436,28 @@ static const struct luaL_reg tests_funcs[] = {
467 {"querystr", string_query}, 436 {"querystr", string_query},
468 {"querytab", table_query}, 437 {"querytab", table_query},
469 {"testC", testC}, 438 {"testC", testC},
439 {"ref", tref},
440 {"getref", getref},
441 {"unref", unref},
442 {"newuserdata", newuserdata},
443 {"udataval", udataval},
444 {"newstate", newstate},
445 {"closestate", closestate},
446 {"doremote", doremote},
447 {"settagmethod", settagmethod},
448 {"equal", equal},
470 {"totalmem", mem_query} 449 {"totalmem", mem_query}
471}; 450};
472 451
473 452
474void luaB_opentests (lua_State *L) { 453void luaB_opentests (lua_State *L) {
475 luaL_openl(L, tests_funcs); 454 lua_newtable(L);
455 lua_getglobals(L);
456 lua_pushobject(L, -2);
457 lua_setglobals(L);
458 luaL_openl(L, tests_funcs); /* open functions inside new table */
459 lua_setglobals(L); /* restore old table of globals */
460 lua_setglobal(L, "T"); /* set new table as global T */
476} 461}
477 462
478#endif 463#endif