Ver Fonte

Built-in functions

Roberto Ierusalimschy há 28 anos atrás
pai
commit
26c5f56ad1
4 ficheiros alterados com 418 adições e 431 exclusões
  1. 0 405
      inout.c
  2. 0 26
      inout.h
  3. 404 0
      lbuiltin.c
  4. 14 0
      lbuiltin.h

+ 0 - 405
inout.c

@@ -1,405 +0,0 @@
-/*
-** inout.c
-** Provide function to realise the input/output function and debugger 
-** facilities.
-** Also provides some predefined lua functions.
-*/
-
-char *rcs_inout="$Id: inout.c,v 2.71 1997/07/29 13:33:15 roberto Exp roberto $";
-
-#include <stdio.h>
-#include <string.h>
-
-#include "auxlib.h"
-#include "fallback.h"
-#include "hash.h"
-#include "inout.h"
-#include "lex.h"
-#include "lua.h"
-#include "luamem.h"
-#include "luamem.h"
-#include "opcode.h"
-#include "table.h"
-#include "tree.h"
-#include "undump.h"
-#include "zio.h"
-
-
-/* Exported variables */
-Word lua_linenumber;
-TaggedString *lua_parsedfile;
-
-
-char *luaI_typenames[] = { /* ORDER LUA_T */
-  "userdata", "line", "cmark", "mark", "function",
-  "function", "table", "string", "number", "nil",
-  NULL
-};
-
-
-
-void luaI_setparsedfile (char *name)
-{
-  lua_parsedfile = luaI_createstring(name);
-}
-
-
-int lua_doFILE (FILE *f, int bin)
-{
-  ZIO z;
-  luaZ_Fopen(&z, f);
-  if (bin)
-    return luaI_undump(&z);
-  else {
-    lua_setinput(&z);
-    return lua_domain();
-  }
-}                      
-
-
-int lua_dofile (char *filename)
-{
-  int status;
-  int c;
-  FILE *f = (filename == NULL) ? stdin : fopen(filename, "r");
-  if (f == NULL)
-    return 2;
-  luaI_setparsedfile(filename?filename:"(stdin)");
-  c = fgetc(f);
-  ungetc(c, f);
-  if (c == ID_CHUNK) {
-    f = freopen(filename, "rb", f);  /* set binary mode */
-    status = lua_doFILE(f, 1);
-  }
-  else
-    status = lua_doFILE(f, 0);
-  if (f != stdin)
-    fclose(f);
-  return status;
-}                      
-
-
-
-#define SIZE_PREF 20  /* size of string prefix to appear in error messages */
-
-
-int lua_dobuffer (char *buff, int size)
-{
-  int status;
-  ZIO z;
-  luaI_setparsedfile("(buffer)");
-  luaZ_mopen(&z, buff, size);
-  status = luaI_undump(&z);
-  return status;
-}
-
-
-int lua_dostring (char *str)
-{
-  int status;
-  char buff[SIZE_PREF+25];
-  char *temp;
-  ZIO z;
-  if (str == NULL) return 1;
-  sprintf(buff, "(dostring) >> %.20s", str);
-  temp = strchr(buff, '\n');
-  if (temp) *temp = 0;  /* end string after first line */
-  luaI_setparsedfile(buff);
-  luaZ_sopen(&z, str);
-  lua_setinput(&z);
-  status = lua_domain();
-  return status;
-}
-
-
-
-
-static int passresults (void)
-{
-  int arg = 0;
-  lua_Object obj;
-  while ((obj = lua_getresult(++arg)) != LUA_NOOBJECT)
-    lua_pushobject(obj);
-  return arg-1;
-}
-
-
-static void packresults (void)
-{
-  int arg = 0;
-  lua_Object obj;
-  lua_Object table = lua_createtable();
-  while ((obj = lua_getresult(++arg)) != LUA_NOOBJECT) {
-    lua_pushobject(table);
-    lua_pushnumber(arg);
-    lua_pushobject(obj);
-    lua_rawsettable();
-  }
-  lua_pushobject(table);
-  lua_pushstring("n");
-  lua_pushnumber(arg-1);
-  lua_rawsettable();
-  lua_pushobject(table);  /* final result */
-}
- 
-/*
-** Internal function: do a string
-*/
-static void lua_internaldostring (void)
-{
-  lua_Object err = lua_getparam(2);
-  if (err != LUA_NOOBJECT) {  /* set new error method */
-    luaL_arg_check(lua_isnil(err) || lua_isfunction(err), 2,
-                   "must be a valid error handler");
-    lua_pushobject(err);
-    err = lua_seterrormethod();
-  }
-  if (lua_dostring(luaL_check_string(1)) == 0)
-    if (passresults() == 0)
-      lua_pushuserdata(NULL);  /* at least one result to signal no errors */
-  if (err != LUA_NOOBJECT) {  /* restore old error method */
-    lua_pushobject(err);
-    lua_seterrormethod();
-  }
-}
-
-/*
-** Internal function: do a file
-*/
-static void lua_internaldofile (void)
-{
- char *fname = luaL_opt_string(1, NULL);
- if (lua_dofile(fname) == 0)
-    if (passresults() == 0)
-      lua_pushuserdata(NULL);  /* at least one result to signal no errors */
-}
- 
-
-static char *tostring (lua_Object obj)
-{
-  TObject *o = luaI_Address(obj);
-  switch (ttype(o)) {
-    case LUA_T_NUMBER:  case LUA_T_STRING:
-      return lua_getstring(obj);
-    case LUA_T_ARRAY: case LUA_T_FUNCTION:
-    case LUA_T_CFUNCTION: case LUA_T_NIL:
-      return luaI_typenames[-ttype(o)];
-    case LUA_T_USERDATA: {
-      char *buff = luaI_buffer(30);
-      sprintf(buff, "userdata: %p", o->value.ts->u.v);
-      return buff;
-    }
-    default: return "<unknown object>";
-  }
-}
-
-static void luaI_tostring (void)
-{
-  lua_pushstring(tostring(lua_getparam(1)));
-}
-
-static void luaI_print (void)
-{
-  int i = 1;
-  lua_Object obj;
-  while ((obj = lua_getparam(i++)) != LUA_NOOBJECT)
-    printf("%s\n", tostring(obj));
-}
-
-static void luaI_type (void)
-{
-  lua_Object o = lua_getparam(1);
-  luaL_arg_check(o != LUA_NOOBJECT, 1, "no argument");
-  lua_pushstring(luaI_typenames[-ttype(luaI_Address(o))]);
-  lua_pushnumber(lua_tag(o));
-}
-
-/*
-** Internal function: convert an object to a number
-*/
-static void lua_obj2number (void)
-{
-  lua_Object o = lua_getparam(1);
-  if (lua_isnumber(o))
-    lua_pushnumber(lua_getnumber(o));
-}
-
-
-static void luaI_error (void)
-{
-  char *s = lua_getstring(lua_getparam(1));
-  if (s == NULL) s = "(no message)";
-  lua_error(s);
-}
-
-static void luaI_assert (void)
-{
-  lua_Object p = lua_getparam(1);
-  if (p == LUA_NOOBJECT || lua_isnil(p))
-    lua_error("assertion failed!");
-}
-
-static void luaI_setglobal (void)
-{
-  lua_Object value = lua_getparam(2);
-  luaL_arg_check(value != LUA_NOOBJECT, 2, NULL);
-  lua_pushobject(value);
-  lua_setglobal(luaL_check_string(1));
-  lua_pushobject(value);  /* return given value */
-}
-
-static void luaI_rawsetglobal (void)
-{
-  lua_Object value = lua_getparam(2);
-  luaL_arg_check(value != LUA_NOOBJECT, 2, NULL);
-  lua_pushobject(value);
-  lua_rawsetglobal(luaL_check_string(1));
-  lua_pushobject(value);  /* return given value */
-}
-
-static void luaI_getglobal (void)
-{
-  lua_pushobject(lua_getglobal(luaL_check_string(1)));
-}
-
-static void luaI_rawgetglobal (void)
-{
-  lua_pushobject(lua_rawgetglobal(luaL_check_string(1)));
-}
-
-static void luatag (void)
-{
-  lua_pushnumber(lua_tag(lua_getparam(1)));
-}
-
-
-static int getnarg (lua_Object table)
-{
-  lua_Object temp;
-  /* temp = table.n */
-  lua_pushobject(table); lua_pushstring("n"); temp = lua_gettable();
-  return (lua_isnumber(temp) ? lua_getnumber(temp) : MAX_WORD);
-}
-
-static void luaI_call (void)
-{
-  lua_Object f = lua_getparam(1);
-  lua_Object arg = lua_getparam(2);
-  int withtable = (strcmp(luaL_opt_string(3, ""), "pack") == 0);
-  int narg, i;
-  luaL_arg_check(lua_isfunction(f), 1, "function expected");
-  luaL_arg_check(lua_istable(arg), 2, "table expected");
-  narg = getnarg(arg);
-  /* push arg[1...n] */
-  for (i=0; i<narg; i++) {
-    lua_Object temp;
-    /* temp = arg[i+1] */
-    lua_pushobject(arg); lua_pushnumber(i+1); temp = lua_gettable();
-    if (narg == MAX_WORD && lua_isnil(temp))
-      break;
-    lua_pushobject(temp);
-  }
-  if (lua_callfunction(f))
-    lua_error(NULL);
-  else if (withtable)
-    packresults();
-  else
-    passresults();
-}
-
-static void luaIl_settag (void)
-{
-  lua_Object o = lua_getparam(1);
-  luaL_arg_check(lua_istable(o), 1, "table expected");
-  lua_pushobject(o);
-  lua_settag(luaL_check_number(2));
-}
-
-static void luaIl_newtag (void)
-{
-  lua_pushnumber(lua_newtag());
-}
-
-static void rawgettable (void)
-{
-  lua_Object t = lua_getparam(1);
-  lua_Object i = lua_getparam(2);
-  luaL_arg_check(t != LUA_NOOBJECT, 1, NULL);
-  luaL_arg_check(i != LUA_NOOBJECT, 2, NULL);
-  lua_pushobject(t);
-  lua_pushobject(i);
-  lua_pushobject(lua_rawgettable());
-}
-
-static void rawsettable (void)
-{
-  lua_Object t = lua_getparam(1);
-  lua_Object i = lua_getparam(2);
-  lua_Object v = lua_getparam(3);
-  luaL_arg_check(t != LUA_NOOBJECT && i != LUA_NOOBJECT && v != LUA_NOOBJECT,
-                 0, NULL);
-  lua_pushobject(t);
-  lua_pushobject(i);
-  lua_pushobject(v);
-  lua_rawsettable();
-}
-
-
-static void luaI_collectgarbage (void)
-{
-  lua_pushnumber(lua_collectgarbage(luaL_opt_number(1, 0)));
-}
-
-
-/*
-** Internal functions
-*/
-static struct {
-  char *name;
-  lua_CFunction func;
-} int_funcs[] = {
-  {"assert", luaI_assert},
-  {"call", luaI_call},
-  {"collectgarbage", luaI_collectgarbage},
-  {"dofile", lua_internaldofile},
-  {"dostring", lua_internaldostring},
-  {"error", luaI_error},
-  {"getglobal", luaI_getglobal},
-  {"newtag", luaIl_newtag},
-  {"next", lua_next},
-  {"nextvar", luaI_nextvar},
-  {"print", luaI_print},
-  {"rawgetglobal", luaI_rawgetglobal},
-  {"rawgettable", rawgettable},
-  {"rawsetglobal", luaI_rawsetglobal},
-  {"rawsettable", rawsettable},
-  {"seterrormethod", luaI_seterrormethod},
-#if LUA_COMPAT2_5
-  {"setfallback", luaI_setfallback},
-#endif
-  {"setglobal", luaI_setglobal},
-  {"settagmethod", luaI_settagmethod},
-  {"gettagmethod", luaI_gettagmethod},
-  {"settag", luaIl_settag},
-  {"tonumber", lua_obj2number},
-  {"tostring", luaI_tostring},
-  {"tag", luatag},
-  {"type", luaI_type}
-};
-
-#define INTFUNCSIZE (sizeof(int_funcs)/sizeof(int_funcs[0]))
-
-
-void luaI_predefine (void)
-{
-  int i;
-  Word n;
-  for (i=0; i<INTFUNCSIZE; i++) {
-    n = luaI_findsymbolbyname(int_funcs[i].name);
-    s_ttype(n) = LUA_T_CFUNCTION; s_fvalue(n) = int_funcs[i].func;
-  }
-  n = luaI_findsymbolbyname("_VERSION");
-  s_ttype(n) = LUA_T_STRING; s_tsvalue(n) = luaI_createstring(LUA_VERSION);
-}
-
-

+ 0 - 26
inout.h

@@ -1,26 +0,0 @@
-/*
-** $Id: inout.h,v 1.20 1997/06/19 18:04:34 roberto Exp roberto $
-*/
-
-
-#ifndef inout_h
-#define inout_h
-
-#include "types.h"
-#include "tree.h"
-#include <stdio.h>
-
-
-extern Word lua_linenumber;
-extern Word lua_debugline;
-extern TaggedString *lua_parsedfile;
-
-void luaI_setparsedfile (char *name);
-
-void luaI_predefine (void);
-
-int lua_dobuffer (char *buff, int size);
-int lua_doFILE (FILE *f, int bin);
-
-
-#endif

+ 404 - 0
lbuiltin.c

@@ -0,0 +1,404 @@
+/*
+** $Id: $
+** Built-in functions
+** See Copyright Notice in lua.h
+*/
+
+
+#include <stdio.h>
+
+#include "lapi.h"
+#include "lauxlib.h"
+#include "lbuiltin.h"
+#include "lglobal.h"
+#include "lmem.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "ltm.h"
+#include "lua.h"
+
+
+static void nextvar (void)
+{
+  int i = luaG_nextvar(lua_isnil(lua_getparam(1)) ? 0 :
+                             luaG_findsymbolbyname(luaL_check_string(1))+1);
+  if (i >= 0) {
+    lua_pushstring(luaG_global[i].varname->str);
+    luaA_pushobject(&s_object(i));
+  }
+}
+
+
+static void next (void)
+{
+  lua_Object o = lua_getparam(1);
+  lua_Object r = lua_getparam(2);
+  Node *n;
+  luaL_arg_check(lua_istable(o), 1, "table expected");
+  luaL_arg_check(r != LUA_NOOBJECT, 2, "value expected");
+  n = luaH_next(luaA_Address(o), luaA_Address(r));
+  if (n) {
+    luaA_pushobject(&n->ref);
+    luaA_pushobject(&n->val);
+  }
+}
+
+
+static void internaldostring (void)
+{
+  lua_Object err = lua_getparam(2);
+  if (err != LUA_NOOBJECT) {  /* set new error method */
+    lua_pushobject(err);
+    err = lua_seterrormethod();
+  }
+  if (lua_dostring(luaL_check_string(1)) == 0)
+    if (luaA_passresults() == 0)
+      lua_pushuserdata(NULL);  /* at least one result to signal no errors */
+  if (err != LUA_NOOBJECT) {  /* restore old error method */
+    lua_pushobject(err);
+    lua_seterrormethod();
+  }
+}
+
+
+static void internaldofile (void)
+{
+  char *fname = luaL_opt_string(1, NULL);
+  if (lua_dofile(fname) == 0)
+    if (luaA_passresults() == 0)
+      lua_pushuserdata(NULL);  /* at least one result to signal no errors */
+}
+
+
+static char *to_string (lua_Object obj)
+{
+  char *buff = luaM_buffer(30);
+  TObject *o = luaA_Address(obj);
+  switch (ttype(o)) {
+    case LUA_T_NUMBER:  case LUA_T_STRING:
+      return lua_getstring(obj);
+    case LUA_T_ARRAY: {
+      sprintf(buff, "table: %p", o->value.a);
+      return buff;
+    }
+    case LUA_T_FUNCTION: {
+      sprintf(buff, "function: %p", o->value.cl);
+      return buff;
+    }
+    case LUA_T_CFUNCTION: {
+      sprintf(buff, "cfunction: %p", o->value.f);
+      return buff;
+    }
+    case LUA_T_USERDATA: {
+      sprintf(buff, "userdata: %p", o->value.ts->u.v);
+      return buff;
+    }
+    case LUA_T_NIL:
+      return "nil";
+    default: return "<unknown object>";
+  }
+}
+
+static void bi_tostring (void)
+{
+  lua_pushstring(to_string(lua_getparam(1)));
+}
+
+
+static void luaI_print (void)
+{
+  int i = 1;
+  lua_Object obj;
+  while ((obj = lua_getparam(i++)) != LUA_NOOBJECT)
+    printf("%s\n", to_string(obj));
+}
+
+
+static void luaI_type (void)
+{
+  lua_Object o = lua_getparam(1);
+  luaL_arg_check(o != LUA_NOOBJECT, 1, "no argument");
+  lua_pushstring(luaO_typenames[-ttype(luaA_Address(o))]);
+  lua_pushnumber(lua_tag(o));
+}
+
+
+static void lua_obj2number (void)
+{
+  lua_Object o = lua_getparam(1);
+  if (lua_isnumber(o))
+    lua_pushnumber(lua_getnumber(o));
+}
+
+
+static void luaI_error (void)
+{
+  char *s = lua_getstring(lua_getparam(1));
+  if (s == NULL) s = "(no message)";
+  lua_error(s);
+}
+
+
+static void luaI_assert (void)
+{
+  lua_Object p = lua_getparam(1);
+  if (p == LUA_NOOBJECT || lua_isnil(p))
+    lua_error("assertion failed!");
+}
+
+
+static void setglobal (void)
+{
+  lua_Object value = lua_getparam(2);
+  luaL_arg_check(value != LUA_NOOBJECT, 2, NULL);
+  lua_pushobject(value);
+  lua_setglobal(luaL_check_string(1));
+  lua_pushobject(value);  /* return given value */
+}
+
+static void rawsetglobal (void)
+{
+  lua_Object value = lua_getparam(2);
+  luaL_arg_check(value != LUA_NOOBJECT, 2, NULL);
+  lua_pushobject(value);
+  lua_rawsetglobal(luaL_check_string(1));
+  lua_pushobject(value);  /* return given value */
+}
+
+static void getglobal (void)
+{
+  lua_pushobject(lua_getglobal(luaL_check_string(1)));
+}
+
+static void rawgetglobal (void)
+{
+  lua_pushobject(lua_rawgetglobal(luaL_check_string(1)));
+}
+
+static void luatag (void)
+{
+  lua_pushnumber(lua_tag(lua_getparam(1)));
+}
+
+
+static int getnarg (lua_Object table)
+{
+  lua_Object temp;
+  /* temp = table.n */
+  lua_pushobject(table); lua_pushstring("n"); temp = lua_gettable();
+  return (lua_isnumber(temp) ? lua_getnumber(temp) : MAX_WORD);
+}
+
+static void luaI_call (void)
+{
+  lua_Object f = lua_getparam(1);
+  lua_Object arg = lua_getparam(2);
+  int withtable = (strcmp(luaL_opt_string(3, ""), "pack") == 0);
+  int narg, i;
+  luaL_arg_check(lua_isfunction(f), 1, "function expected");
+  luaL_arg_check(lua_istable(arg), 2, "table expected");
+  narg = getnarg(arg);
+  /* push arg[1...n] */
+  for (i=0; i<narg; i++) {
+    lua_Object temp;
+    /* temp = arg[i+1] */
+    lua_pushobject(arg); lua_pushnumber(i+1); temp = lua_gettable();
+    if (narg == MAX_WORD && lua_isnil(temp))
+      break;
+    lua_pushobject(temp);
+  }
+  if (lua_callfunction(f))
+    lua_error(NULL);
+  else if (withtable)
+    luaA_packresults();
+  else
+    luaA_passresults();
+}
+
+
+static void settag (void)
+{
+  lua_Object o = lua_getparam(1);
+  luaL_arg_check(lua_istable(o), 1, "table expected");
+  lua_pushobject(o);
+  lua_settag(luaL_check_number(2));
+}
+
+
+static void newtag (void)
+{
+  lua_pushnumber(lua_newtag());
+}
+
+
+static void rawgettable (void)
+{
+  lua_Object t = lua_getparam(1);
+  lua_Object i = lua_getparam(2);
+  luaL_arg_check(t != LUA_NOOBJECT, 1, NULL);
+  luaL_arg_check(i != LUA_NOOBJECT, 2, NULL);
+  lua_pushobject(t);
+  lua_pushobject(i);
+  lua_pushobject(lua_rawgettable());
+}
+
+
+static void rawsettable (void)
+{
+  lua_Object t = lua_getparam(1);
+  lua_Object i = lua_getparam(2);
+  lua_Object v = lua_getparam(3);
+  luaL_arg_check(t != LUA_NOOBJECT && i != LUA_NOOBJECT && v != LUA_NOOBJECT,
+                 0, NULL);
+  lua_pushobject(t);
+  lua_pushobject(i);
+  lua_pushobject(v);
+  lua_rawsettable();
+}
+
+
+static void settagmethod (void)
+{
+  lua_Object nf = lua_getparam(3);
+  luaL_arg_check(nf != LUA_NOOBJECT, 3, "value expected");
+  lua_pushobject(nf);
+  lua_pushobject(lua_settagmethod((int)luaL_check_number(1),
+                                  luaL_check_string(2)));
+}
+
+
+static void gettagmethod (void)
+{
+  lua_pushobject(lua_gettagmethod((int)luaL_check_number(1),
+                                  luaL_check_string(2)));
+}
+
+
+static void seterrormethod (void)
+{
+  lua_Object nf = lua_getparam(1);
+  luaL_arg_check(nf != LUA_NOOBJECT, 1, "value expected");
+  lua_pushobject(nf);
+  lua_pushobject(lua_seterrormethod());
+}
+
+
+static void luaI_collectgarbage (void)
+{
+  lua_pushnumber(lua_collectgarbage(luaL_opt_number(1, 0)));
+}
+
+
+/*
+** =======================================================
+** some DEBUG functions
+** =======================================================
+*/
+#ifdef DEBUG
+
+static void testC (void)
+{
+#define getnum(s)	((*s++) - '0')
+#define getname(s)	(nome[0] = *s++, nome)
+
+  static int locks[10];
+  lua_Object reg[10];
+  char nome[2];
+  char *s = luaL_check_string(1);
+  nome[1] = 0;
+  while (1) {
+    switch (*s++) {
+      case '0': case '1': case '2': case '3': case '4':
+      case '5': case '6': case '7': case '8': case '9':
+        lua_pushnumber(*(s-1) - '0');
+        break;
+
+      case 'c': reg[getnum(s)] = lua_createtable(); break;
+      case 'P': reg[getnum(s)] = lua_pop(); break;
+      case 'g': { int n=getnum(s); reg[n]=lua_getglobal(getname(s)); break; }
+      case 'G': { int n = getnum(s);
+                  reg[n] = lua_rawgetglobal(getname(s));
+                  break;
+                }
+      case 'l': locks[getnum(s)] = lua_ref(1); break;
+      case 'L': locks[getnum(s)] = lua_ref(0); break;
+      case 'r': { int n=getnum(s); reg[n]=lua_getref(locks[getnum(s)]); break; }
+      case 'u': lua_unref(locks[getnum(s)]); break;
+      case 'p': { int n = getnum(s); reg[n] = lua_getparam(getnum(s)); break; }
+      case '=': lua_setglobal(getname(s)); break;
+      case 's': lua_pushstring(getname(s)); break;
+      case 'o': lua_pushobject(reg[getnum(s)]); break;
+      case 'f': lua_call(getname(s)); break;
+      case 'i': reg[getnum(s)] = lua_gettable(); break;
+      case 'I': reg[getnum(s)] = lua_rawgettable(); break;
+      case 't': lua_settable(); break;
+      case 'T': lua_rawsettable(); break;
+      default: luaL_verror("unknown command in `testC': %c", *(s-1));
+    }
+  if (*s == 0) return;
+  if (*s++ != ' ') lua_error("missing ` ' between commands in `testC'");
+  }
+}
+
+#endif
+
+
+/*
+** Internal functions
+*/
+static struct luaL_reg int_funcs[] = {
+#if LUA_COMPAT2_5
+  {"setfallback", luaT_setfallback},
+#endif
+#ifdef DEBUG
+  {"testC", testC},
+  {"totalmem", luaM_query},
+#endif
+  {"assert", luaI_assert},
+  {"call", luaI_call},
+  {"collectgarbage", luaI_collectgarbage},
+  {"dofile", internaldofile},
+  {"dostring", internaldostring},
+  {"error", luaI_error},
+  {"getglobal", getglobal},
+  {"newtag", newtag},
+  {"next", next},
+  {"nextvar", nextvar},
+  {"print", luaI_print},
+  {"rawgetglobal", rawgetglobal},
+  {"rawgettable", rawgettable},
+  {"rawsetglobal", rawsetglobal},
+  {"rawsettable", rawsettable},
+  {"seterrormethod", seterrormethod},
+  {"setglobal", setglobal},
+  {"settagmethod", settagmethod},
+  {"gettagmethod", gettagmethod},
+  {"settag", settag},
+  {"tonumber", lua_obj2number},
+  {"tostring", bi_tostring},
+  {"tag", luatag},
+  {"type", luaI_type}
+};
+
+
+#define INTFUNCSIZE (sizeof(int_funcs)/sizeof(int_funcs[0]))
+
+
+void luaB_predefine (void)
+{
+  int i;
+  Word n;
+  /* pre-register mem error messages, to avoid loop when error arises */
+  luaS_newfixedstring(tableEM);
+  luaS_newfixedstring(memEM);
+  for (i=0; i<INTFUNCSIZE; i++) {
+    n = luaG_findsymbolbyname(int_funcs[i].name);
+    s_ttype(n) = LUA_T_CFUNCTION;
+    fvalue(&s_object(n)) = int_funcs[i].func;
+  }
+  n = luaG_findsymbolbyname("_VERSION");
+  s_ttype(n) = LUA_T_STRING;
+  tsvalue(&s_object(n)) = luaS_new(LUA_VERSION);
+}
+
+

+ 14 - 0
lbuiltin.h

@@ -0,0 +1,14 @@
+/*
+** $Id: $
+** Built-in functions
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lbuiltin_h
+#define lbuiltin_h
+
+
+void luaB_predefine (void);
+
+
+#endif