From 9a21e81907e49b79ec44677660acf9e35ad308bb Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Thu, 31 Aug 2000 18:01:43 -0300 Subject: more builtin functions using official API --- lbuiltin.c | 159 +++++++++++++++++++++++++++---------------------------------- 1 file changed, 69 insertions(+), 90 deletions(-) (limited to 'lbuiltin.c') diff --git a/lbuiltin.c b/lbuiltin.c index 348214e4..4f75a5bc 100644 --- a/lbuiltin.c +++ b/lbuiltin.c @@ -1,5 +1,5 @@ /* -** $Id: lbuiltin.c,v 1.126 2000/08/31 16:52:06 roberto Exp roberto $ +** $Id: lbuiltin.c,v 1.127 2000/08/31 20:23:40 roberto Exp roberto $ ** Built-in functions ** See Copyright Notice in lua.h */ @@ -270,71 +270,15 @@ int luaB_dofile (lua_State *L) { return passresults(L, lua_dofile(L, fname), oldtop); } -/* }====================================================== */ - - -/* -** {====================================================== -** Functions that could use only the official API but -** do not, for efficiency. -** ======================================================= -*/ - -#include "lapi.h" -#include "ldo.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" -#include "lvm.h" - - -/* -** {====================================================== -** Auxiliary functions -** ======================================================= -*/ - -static Number getsize (const Hash *h) { - Number max = 0; - int i = h->size; - Node *n = h->node; - while (i--) { - if (ttype(key(n)) == TAG_NUMBER && - ttype(val(n)) != TAG_NIL && - nvalue(key(n)) > max) - max = nvalue(key(n)); - n++; - } - return max; -} - - -static Number getnarg (lua_State *L, const Hash *a) { - const TObject *value = luaH_getstr(a, luaS_new(L, "n")); /* value = a.n */ - return (ttype(value) == TAG_NUMBER) ? nvalue(value) : getsize(a); -} - - -static Hash *gettable (lua_State *L, int arg) { - luaL_checktype(L, arg, "table"); - return hvalue(luaA_index(L, arg)); -} - -/* }====================================================== */ - - - int luaB_call (lua_State *L) { int oldtop; - const Hash *arg = gettable(L, 2); const char *options = luaL_opt_string(L, 3, ""); int err = 0; /* index of old error method */ - int n = (int)getnarg(L, arg); int i, status; + int n; + luaL_checktype(L, 2, "table"); + n = lua_getn(L, 2); if (!lua_isnull(L, 4)) { /* set new error method */ lua_getglobal(L, LUA_ERRORMESSAGE); err = lua_gettop(L); /* get index */ @@ -345,9 +289,12 @@ int luaB_call (lua_State *L) { /* push function */ lua_pushobject(L, 1); /* push arg[1...n] */ - luaD_checkstack(L, n); - for (i=0; itop++) = *luaH_getnum(arg, i+1); + luaL_checkstack(L, n, "too many arguments"); + for (i=0; i